C和指针编程题--第四章

[toc]

第四章—编程题4.14

题目1

1

1.1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
* 编译环境:vs2022
* 题目简介:用公式计算正数 numb 的平方根
* 时间:2022/3/20
* 总结:学会使用绝对值函数,整数下用abs(),浮点数下用fabs()
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

int main()
{
    /*
    * 公式对应值;
    * n = numb,numb_next = a_1, numb_dnext = a_2
    */
	double numb, numb_next, numb_dnext;
	numb = 3;
	numb_next = 1;
	numb_dnext = 3;
    /*
    * 1.最开始想将下面的if判断用作while循环条件,
    * 调试发现,numb_next后来一直等于numb_dnext。
    * 2.近似值判定条件,即程序停止判定条件,
    * 用相邻两数相减区绝对值,然后域精确度比较。
    */
	while (1)
	{
		numb_dnext = (numb_next + numb / numb_next) / 2;
		if (fabs(numb_dnext - numb_next) < 0.00001) break;
		numb_next = numb_dnext;
	}
	printf("%f", numb_dnext);
	return 0;
}

题目2

2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
* 编译环境:vs2022
* 题目简介:打印1~100间质数
* 时间:2022/3/20
* 总结:这里也可以把内层循环做成函数,放在外面,提高阅读性
* 改进:可以将内层循环改为 for(i = (int)sqrt(n); i > 1; i--)
*		使得减小其循环次数
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

int main()
{
	int i = 1, n = 0;
	
	/*
	* 1.外层循环取出1~100间所有的整数给n
	* 2.内层循环判断出n是否是质数
	*/
	for( n = 1; n <= 100; n++)
	{
		for( i = n/2; i > 1; i--)
		{
			if( (n % i) == 0) break;
		}
		if (i == 1) printf("%d\n",n);
	}
	
	return 0;	
}

题目三

3

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
* 编译环境:vs2022
* 题目简介:判断三角形类型
* 时间:2022/3/20
* 分析:1.首先要确定其是一个三角形:任意两边之和大于第三边
*		2.再判断三角形类型:直角(勾股定理),等边,等腰
* 总结:复制完交换代码,不要忘记更改参数
* 改进:将交换单独设置为函数,提高代码可读性
*		用while循环使得用户输入失败时,重新输入
* 作者:人工智障plus	
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

int main()
{
	int a,b,c=0;
	int temp = 0;
	printf("请输入三角形三边长度:");
	scanf("%d",&a);
	scanf("%d",&b);
	scanf("%d",&c);
	/*
	* 先判断是不是三角形,
	* 分解:找出两条小边,再与长边比较
	*		或者先找最大边
	*/
	if(a < b)
	{
		temp = a;
		a = b;
		b = temp;
	}
	if(a < c)
	{
		temp = a;
		a = c;
		c = temp;
	}
	if((b+c) < a)
	{
		printf("您输入的数据不能构成一个三角形\n");
		return 0;
	}
	/*
	* 判断三角形类型
	*/
	if( (a==b)&&(b==c) )
	{
		printf("此三角形是等边三角形\n");
		return 0;
	}
	if( (a==b)||(b==c)||(a==c) )
	{
		printf("此三角形是等腰三角形\n");
		return 0;
	}
	if( (a^2)==((b^2)+(c^2)) )
	{
		printf("此三角形是直角三角形\n");
		return 0;
	}
	printf("此三角形是普通三角形\n");
	
	return 0;
}

题目四

4

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
* 编译环境:vs2022
* 题目简介:复制字符串数组到另一个数组,并且正好复制n个
* 时间:2022/3/21
* 分析:因为始终要控制其长度为n,所以外层循环控制长度,
*		循环体内控制复制字符
* 总结:了解到一种计算字符数组长度的方法:length=sizeof(a)/sizeof(a[0]);
* 改进:增加检查数组长度,以确定传值是否合法
* 作者:人工智障plus	
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

void copy_n( char dst[], char src[], int n);

int main()
{
	char a[5]={'a','b','c','d','e'};
	char b[5];
	copy_n(b,a,2);
	for(int i=0; i<2; i++)
		printf("%c",b[i]);
	
	return 0;
}

/*
* 确定 src[] 的长度
* 1.计算数组长度,失败,sizeof不能在传递参数名的函数内来获取长度
* 2.在最后检验字符串结束标志
*/
void copy_n( char dst[], char src[], int n)
{
	int i;
	for(i=0; i<n; i++)
	{
		if( src[i] != '\0' )
			dst[i] = src[i];
		else
			dst[i] = '\0';
	}

}

题目五

5

5—1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
* 编译环境:vs2022
* 题目简介:读取文件文本内容并打印
* 时间:2022/3/20
* 分析:题目提示已经分析
* 总结:strcmp()比较两个字符串,
*		两者相等返回0,不相等返回非0值
* 改进:可以将输出结果放在一个文件里
* 作者:人工智障plus
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	/*
	* 设置缓冲区,复制区
	*/
	char buffer[128] = {};
	char array[128] = {};
	
	while(1)
	{
		gets(buffer);
		if(!strcmp(array,buffer))
		{
			printf("%s\n",array);
		}
		strcpy(array,buffer);
	}
	return 0;
}

题目六

6

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
* 编译环境:vs2022
* 题目简介:提取子字符串
* 时间:2022/3/20
* 分析:题目提示已经分析
* 总结:
* 改进:增加判定函数是否执行,反馈输出提示
* 作者:人工智障plus
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int substr( char dst[], char src[], int start, int len);

int main(int argc, char *argv[])
{
	char dst[10];
	char src[10] = "sbsbdsb";
	substr(dst,src,1,2);
	printf("%s\n",dst);
	
	return 0;
}


int substr( char dst[], char src[], int start, int len)
{
	/*start或len为负数*/
	if( (start<0)||(len<0) )
		return 0;

	/*指定位置超过src数组尾部*/
	int i = 0;
	while( src[i] != '\0' )
		i++;
	if( start>i )
		return 0;

	/*提取字符串*/
	for(i=0; i<len; i++)
	{
		dst[i] = src[start+i];
	}
	return 1;

}

题目七

7

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
* 编译环境:vs2022
* 题目简介:去除空格
* 时间:2022/3/22
* 分析:见注释
* 总结:传数组名,相当于传指针,能通过函数修改实参
* 改进:增加判定函数是否执行,反馈输出提示,让用户自己输入数据
* 作者:人工智障plus
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

void deblank(char string[]);

int main(int argc, char* argv[])
{
	char string[10] = "s   bb ";
	deblank(string);
	printf("%s", string);

	return 0;
}

void deblank(char string[])
{
	int i = 0;
    /*
    * 外层循环遍历数组,
    * 通过判断当前和下一字符是否为空格,
    * 来决定是否删除后一空格
    */
	while (string[i] != '\0')
	{
		if ((string[i] == ' ') && (string[i + 1] == ' '))
		{
			int j = i;
            /*
            * 删除实现:将第一个空格后面所有的字符向前挪动一位
            * 这里有个坑:当有三个连续空格时,如果不将i自减一位,
            *	最后输出还是有两个连续的空格,
            *	原因:忽略了第一次判断的空格。
            */
			while (string[j] != '\0')
			{
				string[j] = string[j + 1];
				j++;
			}
            i--;
		}
		i++;
	}
}