《C语言程序设计》第五章 数组(完结篇)
对于通信工程专业的学生而言,绝对的重磅知识点。因为信号处理离不开数组,而我们专业的主要方向之一就是通信信号处理。所以这章的知识一定要学懂哦!

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



此时结果应该明了吧!




Python和MATLAB语言中的下标呢?
给出Python示例!


听听课堂上的讲解!再来学习两个非常有代表性的示例!通信工程专业的学生后面会接触到相关的课程!到时候会详细讲解查找和排序算法!例6: 用冒泡排序法对6个数进行升序排序(从小到大)!讲的非常透彻,此时写出完整程序也是水到渠成!课后还需复习才能真正掌握。等到同学们到大二学习《数据结构与算法》的时候,还会再次接触此类算法!

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

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



至此,本章已经讲解了8个课时!希望细致的讲解和课堂编程训练能让大家掌握数组的使用!下面的内容在课程《数据结构》中会再次遇到!













最后我们开始习题解答!
先做一些选择题,然后再来编程题练习。要想考试顺利通过,必要的做题还是需要的!答案通过程序给出!
main() { int m=5; if(m++>5) printf("%d\n", m--);}A. 7 B. 6 C. 5 D. 4
#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
main() { int a=2, b=-1, c=2; if(a<b) if(b<0) c++; printf("%d\n", c);}该程序的输出结果是( )。
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 的结果为( )。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#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 < 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中的条件表达式先计算出关系表达式。