• 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);",所以允许调用该函数,原型说明采用"先复制该函数首部,再加一个分号"方法.

  • 相关阅读:
    基于麦克风阵列的声源定位算法之GCC-PHAT
    Parametric and Non-parametric Algorithms
    MATLAB中运算符优先级
    [HAOI2018]染色
    [SHOI2016]黑暗前的幻想乡
    [SCOI2012]滑雪
    [PA2014]Kuglarz
    Stroll
    [SDOI2010]大陆争霸
    解决IDEA Gradle构建报错"Cause: zip END header not found"
  • 原文地址:https://www.cnblogs.com/zero-jh/p/5029275.html
Copyright © 2020-2023  润新知