首页/文章/ 详情

《C语言程序设计》第五章 数组(完结篇)

4月前浏览5952

对于通信工程专业的学生而言,绝对的重磅知识点。因为信号处理离不开数组,而我们专业的主要方向之一就是通信信号处理。所以这章的知识一定要学懂哦!

先给出之前题目的答案!用程序说话!

此时结果应该明了吧!

Python和MATLAB语言中的下标呢?

给出Python示例!

听听课堂上的讲解!再来学习两个非常有代表性的示例!
下面的程序涉及到算法!
通信工程专业的学生后面会接触到相关的课程!到时候会详细讲解查找和排序算法!
例6: 用冒泡排序法对6个数进行升序排序(从小到大)!

讲的非常透彻,此时写出完整程序也是水到渠成!课后还需复习才能真正掌握。等到同学们到大二学习《数据结构与算法》的时候,还会再次接触此类算法!

如何推广到任意个数排序?试着写程序吧!

看着算法,能不能写出程序呢?这是增长能力的过程,切莫找AI帮忙!投机取巧只会害了自己!如果用MATLAB编写如何实现选择排序呢?几句话就能完成!大家此时觉得整个软件好用吗?学通信的人离不开它。早学早起飞!
a = [ 1 2 -3 4 -1 -8];
for i=1:length(a)
   [value site] = max(a(i:end));
   a(i+site-1)=a(i);
   a(i) = value;
end
查找算法很重要,必须让同学们在课堂上进行练习。在现场查看同学们编程的过程中,发现了很多语法错误,及时纠正!比如循环体的语法写错和数组定义出错等等!希望同学们考试的时候不要出错!下堂课会详细讲解排序算法,这对于大一的本科生而言,算是有些难度!因此要讲透彻,不让他们会后续的学习产生恐怖心理。但在课上,我一直强调专业学习的难度,希望他们不要松懈。毕竟不努力就想学好是不可能的!

请同学们听听课堂上的讲解!
至此,本章已经讲解了8个课时!希望细致的讲解和课堂编程训练能让大家掌握数组的使用!

下面的内容在课程《数据结构》中会再次遇到!

那时会是单独一章!

大量的函数知识来啦!
为下一章的学习做好铺垫!

熟悉函数的过程其实就是多次使用函数的过程!

历时三周,终于讲完本章内容!

最后我们开始习题解答!

先做一些选择题,然后再来编程题练习。要想考试顺利通过,必要的做题还是需要的!答案通过程序给出!

1. 以下程序输出结果是( )。
main() {    int m=5;    if(m++>5)
        printf("%d\n", m);    else
        printf("%d\n", m--);}A. 7    B. 6    C. 5    D. 4

2. 以下程序的输出结果为( )。
#include <stdio.h>main ( ) {    int i=0, j=0, a=6;    if ((++i>0) &&(++j>0)) a++;    printf ("i=%d, j=%d, a=%d\n", i, j, a);}A. i=0, j=0, a=6    B. i=1, j=1, a=7C. i=1, j=0, a=7    D. i=0, j=1, a=7

3. 有如下程序。
main() {    int a=2, b=-1, c=2;    if(a<b) if(b<0)
        c=0;    else
        c++;    printf("%d\n", c);}该程序的输出结果是( )。
A. 0    B. 1    C. 2    D. 3

4. 能正确表示逻辑关系:“0≤a≤10”的 C 语言表达式是( )。
A. 0<=a<=10                 B. a>=0,a<=10C. a>=0 && a<=10        D. a>= 0

5. 在 C 语言中,if 语句后的一对圆括号中,用以决定分支流程的表达式( )。
A. 只能用逻辑表达式B. 只能用逻辑表达式或关系表达式C. 只能用关系表达式D. 可用任意表达式
6. 为避免嵌套的条件语句 if-else 的二义性,C 语言规定:else 与( )配对。
A. 缩排位置相同的 ifB. 其之前最近的 ifC. 其之后最近 ifD. 同一行上的 if

7. 下列运算符中优先级最低的是( )。

A. *=     B. &&    C. +     D.!=

8. 设 a=4,b=3,c=2,d=1,则表达式 a<b?b:c<d?a:d 的结果为( )。
A. 4    B. 3    C. 2    D. 1
9. 能正确表示 a、b 不能同时为零的逻辑表达式是( )。
A. a==0&&b!=0||a!=0&&b==0B. (a==0)||(b==0)C. (a!=0)||(b!=0)D. a*b==0
为什么程序没有打印字母A出来呢?
请大家留言告诉我原因吧!
10. 读程序,程序运行结果是( )。
#include <stdio.h>void main() {    int a=5,b=4,c=3,d=2;    if (a>b>c) printf("%d\n", d);    else if ((c-1>=d) ==1) printf("%d\n", d+1);    else printf("%d\n", d+2);}A. 2    B. 3    C. 4    D. 5

编程题来了!

1.输入5个学生5门功课的成绩,分别用函数实现下列功能:
(1)编写函数aver_stu(int t[][5])。函数功能是计算并输出每个学生的平均分;
(2)编写函数aver_course(int t[][5])。函数功能是计算并输出每门课的平均分;
(3)编写函数highest(int t[][5])。函数功能是找出所有25个分数中最高的分数所对应的学生和课程,并将最高分数及对应的学生号、课程号输出;

函数正确与否,编个程序测试一下即可!

再看看23级通信工程的小王同学编写的程序!他在课堂上被我硬压着解题,虽然是被迫勤奋,但这也是一种勤奋,学到了知识也能提升能力!看看他写的程序!这是在他自学了二维数组以后写的代码!

#include <stdio.h>

int main()
{   int i,j,score[5][5],*max_score;
    float *aver_score_stu,*aver_score_course;
//用于存放学生平均成绩的数组和学科平均成绩的数组
 for (i = 0; i < 5; i++)//录入学生成绩
     { printf("输入第%d个学生的5门功课的成绩", i+1);
         for (j = 0; j < 5; j++)
          {
           scanf_s("%d";score[i][j]);
           }
     }
 printf(“----------------------------------\n”);     
aver_score_stu = aver_stu(score);//调用函数
aver_score_course = aver_course(score);
max_score = higest(score);
for (i = 0; i < 5; i++)//输出平均值
 {
  printf("第%d个学生的平均分为:%.2f\n", i + 1,aver_score_stu[i]);
}
printf("----------------------------------\n");

for (i = 0; i < 5; i++)//输出平均分
{
printf("课程%d的平均分为%.2f\n", i + 1, aver_score_course[i]);
}
printf("----------------------------------\n");

printf("最高成绩为:%d,是学生%d的课程%d", max_score[0], max_score[1], max_score[2]);

return 0;
//输出最高分,对应学号和课程号

}

int* higest(int arr[5][5])
{ int k, l;
static int max[3];//此处的max数组存放了三个数据:最大值,学号,课程号
max[0] = 0;
for (k = 0; k < 5; k++)//寻求最大值

      for (l = 0; l &lt; 5; l++)
    {
    if (arr[k][l]<max[0]) { max[0] = arr[k][l];
    max[1] = k + 1;//学号,此处加1更符合实际
    max[2] = l + 1;//课程号 }
    }
}
return max;
}

float* aver_course(int arr[5][5])//计算每一门课程的成绩
{ int k, l;
static float aver2[5];
 for (k = 0; k < 5; k++)
{
   for (l = 0; l < 5; l++)
    {
     aver2[k] = arr[l][k] * 0.2 + aver2[k];
    }
 }
return aver2;
}

float* aver_stu(int arr[5][5])//计算每个学生分数的平均值,返回一个一维数组
{ int k, l;
static float aver[5];
for (k = 0; k < 5; k++)//将每行的元素除5并求和
 { for (l = 0; l < 5; l++)
    { aver[k] = arr[k][l] * 0.2 + aver[k]; }
 }
return aver;
}

注意:为什么程序里面用的是scanf_s函数,而我们课本里面用的是scanf函数。原因通过百度查找吧!还有,函数名前为什么要加*?
2.不要用strcat函数编写程序,实现两个字符串连接。

至此,所有题目解答完毕!之前选择题的解题程序为23级通信工程专业的小吕所写,再看看他同学小王给出的习题解答!同学们看后也可以留言进行补充讲解!

1.B  根据m++是后缀式自加,先使用m的值再进行自加。自处if后表达式m++的值为5,所以执行else中的语句,需要注意的是此时m完成了m++的自加,其值为6。所以最后打印m--的值时,输出的结果为6.如果此时再添加一行语句输出m的值,则结果为5。

2.B 注意到if后表达式中为前缀式自加,所以先执行自加,再使用自加后变量的值。又因为是与运算,所以两个表达式均需要进行判断,即两个自加都需要执行,如果改为或运算,此处只会进行前一个表达式的判断,发现其值为真后直接执行分支的语句块。由于此处只进行a++,所以其效果与++a相同,即a完成自加,所以最后输出a的值为7。
3.C 此处同一行上两个if语句为if语句的嵌套,此处发现外层if表达式的值为False,所以直接执行else中的语句吗?并不是。在C语言中,在没有花括号时,else与最近的if匹配,在这里就是第二个if了,所以此处直接输出c的值为2。
4.C C语言不像Python等其他语言可以直接使用连续的关系式来判断变量间的关系。就取题目的例子:0 <= a <=10,如果这样输入,c语言不会报错,但其判断方式并不像python那样。根据运算符的优先级,这里先进行( 0<=a )的判断,如果为真则将整个表达式赋值为1与10进行比较,反之赋值为0与10进行比较,最后给出整个连续关系式的逻辑值(0和非0)。

5.D 任意表达式,现阶段我们需要知道的是:C语言中,0为假,非0为真。
6.B 
7.A 根据C语言中运算符的优先级可知。
8.D 该表达式为一个连续的条件表达式(’?:‘,可以实现相当于if-else的作用。),可以视作(a<b?b:c)<d?a:d。现解释下具体过程,首先判断a<b发现其为假,则将c的值赋值给括号内的表达式,将该表达式的值与d进行比较,发现仍为假,则将d的值赋值给整个表达式,所以结果为1。
9.A 其他选项均会出现ab同时为0的情况。
10.B 首先进行a>b>c的判断,可以视作(a>b)>c的判断,即先判断表达式a>b的逻辑值为1,然后将逻辑值与c进行比较,发现不成立,所以if后的条件为假。执行else if中的条件表达式先计算出关系表达式。
本章完结!

来源:通信工程师专辑
MATLABpython通信
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-06-16
最近编辑:4月前
算法工匠
博士后 | 高级工程师 诚信做事 认真讲课 传播知识
获赞 395粉丝 2573文章 316课程 40
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈