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
69
/*
* 编译环境: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
35
/*
* 编译环境: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++;
}
}