美文网首页
2019-03-07 计算机二级C语言程序设计之课后习题(4)

2019-03-07 计算机二级C语言程序设计之课后习题(4)

作者: NoelleMu | 来源:发表于2019-03-07 10:38 被阅读0次

    参考资料:高教版《全国计算机等级考试二级教程——C语言程序设计》

    P110 填空题

    8.15

    题目:

    若有定义: char ch;

    1. 使指针p可以指向字符型变量的定义语句是__[1]__。
    2. 使指针p指向变量ch的赋值语句是__[2]__。
    3. 通过指针p给变量ch读入字符的scanf函数调用语句是__[3]__。
    4. 通过指针p给变量ch赋字符A的语句是__[4]__。
    5. 通过指针p输出ch中字符的语句是__[5]__。

    题解:

    思路:

    1. 使指针p指向字符型变量,需要将这个指针定义为char类型。
    2. 要使指针p指向ch变量,可以在定义它的时候初始化它,也可以单独赋值。
    3. scanf函数把从终端读入的数据依次放入各输入项所代表的存储单元中,而输入项中的(&变量名)可以用指向这个变量的指针来代替。(不知道为什么答案还给了*p = getchar();,题目中不是说scanf函数吗?)
    4. 可以使用间址运算符“*”来实现通过指针p给变量ch赋字符A的功能,这条语句与ch = 'A';等价。
    5. 在printf函数中也可以使用间址运算符,通过指针p来输出ch中的内容。因为ch是char类型,所以也可以用putchar()函数来输出。

    答案如下:

    1. char *p;
    2. p = &ch;
    3. scanf("%c", p);或*p = getchar();
    4. *p = 'A';
    5. printf("%c", *p);或putchar(*p);
    

    8.16

    题目:

    若有如下表所示的五个连续的int类型的存储单元并赋值如表,且已定义int *p, *s;其中p指向存储单元a[1]。

    a[0] a[1] a[2] a[3] a[4]
    10 20 30 40 50
    p↑
    1. 通过指针p,给s赋值,使其指向最后一个存储单元a[4]的语句是__[1]__。

    2. s指向存储单元a[4],移动指针s,使之指向中间的存储单元a[2]的表达式是__[2]__。

    3. 已知k = 2,指针s已指向存储单元a[2],表达式*(s + k)的值是__[3]__。

    4. 指针s已指向存储单元a[2],不移动指针s,通过s引用存储单元a[3]的表达式是__[4]__。

    5. 指针s指向存储单元a[2],p指向存储单元a[0],表达式s - p的值是__[5]__。

    6. 若p指向存储单元a[0],则以下语句的输出结果是__[6]__。

      for(i = 0; i < 5; i++)
          printf("%d", *(p + i));
      printf("\n");
      

    题解:

    其实这五个连续的存储单元就是一个有五个元素的一维数组。

    1. s = p是让两个指针都指向a[2],所以在这种情况下只要让p向高地址移动3个存储单元,再赋值给p就可以。
    2. s指向a[4]时,要想让s指向a[2],只需要让s向低地址移动2个存储单元。
    3. s + k是让指针s向高地址移动两个存储单元,即让s指向a[4];间址运算符*表示通过指针来引用该地址的存储单元。*(s + k)的值即为a[4]中存储的内容,即50。
    4. 要求不移动指针s,可以通过间址运算符引用存储单元a[3]的内容。
    5. 两个指针指向一串连续的存储单元,所以可以相减。由于s与p相差两个存储单元,所以s - p的值为2。
    6. p指向a[0],则p + i指向a[i]。这段语句的作用是依次读取这五个存储单元的内容,再输出,最后输出一个换行符。

    答案如下:

    1. s = p + 3;
    2. s = s - 2;(也可以写 s--, s--;或 s -= 2;)
    3. 50
    4. *(s + 1)
    5. 2
    6. 10 20 30 40 50 (换行)
    

    P110 编程题

    8.17

    题目:

    请编写函数,其功能是对传送过来的两个浮点数求出和值与差值,并通过形参传送回调用函数。

    题解:

    这道题的原理很简单,考察点主要是如何通过指针把多个结果传回主函数。

    由于这个函数不需要返回值,所以定义为void类型。

    定义函数fun()如下:

    void fun(int x, int y, int *h, int *c)
    {
        *h = x + y;         //将两数之和存储在x中
        *c = x - y;         //将两数之差存储在y中
    }
    

    在这个函数中,声明了两个临时指针h和c,将x+y的内容存入变量x所在的地址,将x-y的内容存入变量y的地址,从而达到返回多个数据的目的。

    运行测试:

    完整程序如下:

    #include <stdio.h>
    
    void fun(int, int, int*, int*);     //函数fun()的声明语句
    
    int main(void)
    {
        int x = 0, y = 0;
    
        scanf_s("%d%d", &x, &y);        //读入x和y
        fun(x, y, &x, &y);              //调用fun()函数求两数之和和两数之差
        //由于在fun函数中,将两数之和放在了x中,将两数之差放在了y中,所以输出时两数之和为x,两数之差为y
        printf("两数之和为:%d, 两数之差为: %d\n", x, y);
    
        return 0;
    }
    
    void fun(int x, int y, int* h, int* c)
    {
        *h = x + y;
        *c = x - y;
    }
    

    输入输出:

    1 2
    两数之和为:3, 两数之差为: -1
    

    8.18

    题目:

    请编写函数,对传送过来的三个数选出最大数和最小数,并通过形参传回调用函数。

    题解:

    这个问题的原理也是比较简单的,关键还是如何利用指针传回最大数和最小数。

    因为没有返回值,同样将其定义为void类型。

    这里在主函数单独定义了两个整型变量max和min来存放最大值和最小值,当然用a和b来存放也是可以的,原理差不多。

    定义fun()函数如下:

    void fun(int a, int b, int c, int* max, int* min)
    {
        *max = a;
        *min = a;
    
        //判断最大值
        if (b > * max)
            * max = b;
        
        if (c > * max)
            * max = c;
        
        //判断最小值
        if (b < *min)
            * min = b;
        
        if (c < *min)
            * min = c;
    }
    

    运行测试:

    完整程序如下:

    #include <stdio.h>
    
    void fun(int, int, int, int*, int*);                //函数fun()的说明语句
    
    int main(void)
    {
        int a = 0, b = 0, c = 0, max = 0, min = 0;
    
        scanf_s("%d%d%d", &a, &b, &c);
        fun(a, b, c, &max, &min);                       //调用fun函数来求最大最小值
        printf("最大的数为:%d, 最小的数为: %d\n", max, min);
    
        return 0;
    }
    
    void fun(int a, int b, int c, int* max, int* min)
    {
        *max = a;
        *min = a;
    
        if (b > * max)
            * max = b;
        
        if (c > * max)
            * max = c;
        
        if (b < *min)
            * min = b;
        
        if (c < *min)
            * min = c;
    }
    

    输入输出:

    1 3 2
    最大的数为:3, 最小的数为: 1
    

    P145 填空题

    9.25

    题目:

    以下findmax返回s所指数组中最大元素的下标,数组中元素的个数由t传入,请填空。

    int findmax(int s[], int t)
    {
        int k, p;
        
        for(p = 0, k = p; p < t; p++)
            if(s[p] > s[k])
                __[1]__;
        
        return __[2]__;
    }
    

    题解:

    要判断最大元素的下标,只需要将元素逐个与最大的元素比较,然后将最大下标存储在变量k中,最后将变量k返回。

    具体看注释吧。

    int findmax(int s[], int t)
    {
        int k, p;                       //声明两个整型变量
        
        for(p = 0, k = p; p < t; p++)   //利用for循环来对数组的元素逐个比较
            //这个if将下标最大的元素存储在s[k]中,如果找到更大的,就进行替换
            if(s[p] > s[k])             
                __[1]__;
       
        return __[2]__;                 //把最大元素的下标返回
    }
    

    完整的函数如下:

    int findmax(int s[], int t)
    {
        int k, p;
        for(p = 0, k = p; p < t; p++)
            if(s[p] > s[k])
                k = p;
        return k;
    }
    

    9.26

    题目:

    用以下程序统计从终端输入的字符中每个大写字母的个数,num[0]中统计字母A的个数,其他以此类推。用#号结束输入。请填空。

    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
        int num[26] = {0}, i;
        char c;
        
        while(__[1]__ != '#')
            if( isupper( c ) )
                num[__[2]__] += 1;
        
        for(i = 0; i < 26; i++)
            if( num[i] )
                printf("%c: %d\n", i + 'A', num[i]);
        
        return 0;
    }
    

    题解:

    看注释吧。

    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
        int num[26] = {0}, i;       //声明计数用的数组num[26]并初始化为0,声明一个循环变量
        char c;
        
        while(__[1]__ != '#')       //用#号结束输入,这里应该是用getchar()函数判断输入是否为#
            if( isupper( c ) )      //用ctype.h的函数isupper()判断大小写
                num[__[2]__] += 1;  //用数组来统计大写字母的个数,这个空中应该填写计算出的数组下标
        
        for(i = 0; i < 26; i++)     //用for循环依次输出每个大写字母的个数
            if( num[i] )            //如果num[i]不等于0,即这个大写字母存在,将它的个数输出
                printf("%c: %d\n", i + 'A', num[i]);
        
        return 0;
    }
    

    完整的程序如下:

    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
        int num[26] = {0}, i;
        char c;
        
        while((getchar()) != '#')
            if( isupper( c ) )
                num[c - 'A'] += 1;
        
        for(i = 0; i < 26; i++)
            if( num[i] )
                printf("%c: %d\n", i + 'A', num[i]);
        
        return 0;
    }
    

    P145 编程题

    9.27

    题目:

    输入一行数字字符,请用数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符‘0’的个数,用下标为1的元素统计字符‘1’的个数……

    题解:

    跟9.26用相同的方法实现即可。

    #include <stdio.h>
    
    int main(void)
    {
        int num[10] = { 0 }, i;             //定义一个有10个元素的数组作为计数器
        char c;
    
        while ((c = getchar()) != '\n')     //判断输入结束
                num[c - '0'] += 1;          //计算每个数字的个数
    
        for (i = 0; i < 10; i++)            //使用for循环输出计算结果
            if (num[i])                     //如果这个数字存在(计数不为0)就输出
                printf("%d: %d\n", i , num[i]);
    
        return 0;
    }
    

    输入输出:

    1223334444555556666667777777888888889999999990
    0: 1
    1: 1
    2: 2
    3: 3
    4: 4
    5: 5
    6: 6
    7: 7
    8: 8
    9: 9
    

    相关文章

      网友评论

          本文标题:2019-03-07 计算机二级C语言程序设计之课后习题(4)

          本文链接:https://www.haomeiwen.com/subject/qggqpqtx.html