C语言成长学习题(十五)

66.编写字符串复制的程序(用指针变量处理).

 1 #include <stdio.h>
 2 
 3 void main(void)
 4 {
 5     char a[50], b[80], *p, *q;
 6 
 7     p = a;
 8     q = b;
 9     printf("Input data: ");
10     gets(a);
11     while (*p != '')
12         *q++ = *p++;
13     *q = '';
14     puts(b);
15 }
View Code

Mark:

  复制操作结束后,需要在b数组有效字符后面添加"",否则在按字符串输出b数组时会出现乱码.

67.编写字符串连接的程序(用指针变量处理).

 1 #include <stdio.h>
 2 
 3 void main(void)
 4 {
 5     char a[80], b[30], *p, *q;
 6 
 7     p = a;
 8     q = b;
 9     gets(a);
10     gets(b);
11     while (*p != '')
12         p++;
13     while (*q != '')
14         *p++ = *q++;
15     *p = '';
16     puts(a);
17 }
View Code

68.(1)定义一个二维数组a[3][2].

  C语言规定,a表示a[0][0]的地址,a+1表示下一行第一个元素a[1][0]的地址,而a+2表示a[2][0]的地址.

  int (*p)[2]定义为p为行指针,p的变化是按行进行的,放[]里的取值必须与指针变量p所指的数组的列数(即数组每行元素的个数).

  如果p不指向a或者定义(*p)[2]中,[]中的值与a数组的列不相同,这时不能用p[i][j]代替a[i][j].

  (2)C语言在处理二维数组时,将其看成一个包含特殊元素的一维数组,而这特殊元素既是一个一维数组.如有了定义"char a[3][4];"后,可将二维数组a看作是由3个元素a[0],a[1],a[2]组成的一维数组,而每个元素又可以看作是存放4个字符的一维数组.

  C语言规定,a[0],a[1],a[2]分别代表第一,第二,第三行的首地址,因此程序"for (i = 0; i < 3; i++) puts(a[i]);"等价于"for (p = a; p < a + 3; p++) puts(p);".

69.int a[3][2], (*p)[2]; p = a;

  (1)二维数组a元素可分别用以下形式表示:

    a[i][j], p[i][j], (*(a+i))[j], *(a[i]+j), *(p[i]+j), *(*(a+i)+j), *(*(p+i)+j).(其中0 <= i < 3, 0 <= j < 2)

  (2)二维数组a元素的地址可分别用以下形式表示:

    &a[i][j], &p[i][j], &((*(a+i))[j]), &((*(p+i))[j]), a[i]+j, p[i]+j, *(a+i)+j, *(p+i)+j.(其中0 <= i < 3, 0 <= j < 2)

  

70.编写函数myswap1,该函数实现两个数值的交换.

 1 #include <stdio.h>
 2 
 3 void myswap1 (int x, int y)
 4 {
 5     int z;
 6     z = x;
 7     x = y;
 8     y = z;
 9 }
10 
11 void main (void)
12 {
13     int x = 3, y = 5;
14 
15     printf("Before: x = %d, y = %d
", x, y);
16     myswap1(x, y);
17     printf("After: x = %d, y = %d
", x, y);
18 }
View Code

结果:

Before: x = 3, y = 5

After: x = 3, y = 5

解释:

  当执行语句"myswap1(x, y);"的时候,程序的流程转到myswap1函数,这时系统又为两个形参x,y分配两个存储单元,同时把实参x,y的值3和5分别传递给对应的形参x,y,在被调函数中交换形参x和y的值,当遇到函数最后的"}"时调用结束,形参x,y所占的存储单元被释放,形参x,y消失.函数调用完毕,流程回到main函数中调用myswap1函数的地方,然后继续执行其后面的语句,输出x和y的值3和5.

  在C语言中数据是"按值"单向传递的,即数据只能从实质单方向传递给形参,形参值的改变不会反向影响对应实参的值.不过,当形参是能指向实参的指针变量时,形参可以影响实参.重新编写函数myswap2如下.

 1 #include <stdio.h>
 2 
 3 void myswap2 (int *x, int *y)
 4 {
 5     int z;
 6     z = *x;
 7     *x = *y;
 8     *y = z;
 9 }
10 
11 void main (void)
12 {
13     int x = 3, y = 5;
14 
15     printf("Before: x = %d, y = %d
", x, y);
16     myswap2(&x, &y);
17     printf("After: x = %d, y = %d
", x, y);
18 }
View Code

结果:

Before: x = 3, y = 5

After: x = 5, y = 3

71.编写函数,求1-1/2+1/3-1/4+...-1/n的值.

 1 #include <stdio.h>
 2 
 3 float mycal (int n);
 4 
 5 void main (void)
 6 {
 7     int n;
 8     float sum;
 9 
10     printf("Input data: ");
11     scanf("%d", &n);
12     sum = mycal(n);
13     printf("1-1/2+1/3-1/4+...-1/n = %f
", sum);
14 }
15 
16 float mycal (int n)
17 {
18     int i, sign = 1;
19     float sum = 0.0;
20 
21     for (i = 1; i <= n; i++)
22     {
23         sum = sum + (float)sign / i;
24         sign = -sign;
25     }
26     return sum;
27 }
View Code

  虽然mycal函数的定义在主函数之后,但因为前面有函数原型说明"float mycal (int n);",所以允许调用该函数,原型说明采用"先复制该函数首部,再加一个分号"方法.

原文地址:https://www.cnblogs.com/zero-jh/p/5029275.html