对于通信工程专业的学生而言,本章内容是绝对的重磅知识点。因为信号处理离不开数组的使用,而我们专业的主要方向之一就是通信信号处理。所以这章的知识一定要学懂哦!2025年了,有了AI 的普及应用,大家确实可以加速学习,但切莫一味依赖!
AI辅助编程的时代已经到来,代码生成工具触手可及。这本应是开发效率的巨大飞跃,但一个令人不安的问题却浮出水面:我们是否正在培养出一批只会「复 制粘贴」,却对代码底层逻辑一知半解的程序员?当便捷的AI工具取代了艰苦的学习和思考过程,我们是否在无意中扼杀了真正的技术创新和深度理解?2025年,著名软件开发者Namanyay发表了一篇名为「New Junior Developers Can’t Actually Code」(新入门的开发者根本不会写代码)的博客,表达了对现在AI加持下的软件开发模式的担忧。我也有这样的担忧!
从 AI 拷贝而来的代码是能运行,但是问拷贝者为什么要这样而不是那样实现?则是鸦雀无声。当被问到边界情况时?更是一脸茫然。过去通过艰难解决问题而获得的基础知识就这样……消失了。我们正在用快速解决方案换取深度理解,虽然当下感觉很好,但我们将来必定要为此付出代价。
回想那些需要真正动脑思考的日子,我最近意识到,现在有一整代新程序员甚至不知道StackOverflow是什么。AI能给你答案,但获得的知识往往很浅薄。在StackOverflow上,你必须阅读多个专家的讨论才能获得完整的认识。这样虽然更慢,但你最终不仅知道什么可行,还明白为什么可行。想想你认识的每个优秀开发者,他们是通过复 制解决方案变得优秀的吗?显然不是——他们是通过深入理解系统和领会其他开发者的思维过程才达到这个水平的。而这正是我们正在逐渐失去的东西。我不是想做那种抱怨「现在的年轻人」的老古董。我每天都在使用AI工具,甚至正在利用AI开发产品。但我们需要诚实地面对,为了这种便利,我们正在付出什么样的代价。也许很快就会发生这样的现象:新一代码农不会写代码了,AI正培养「文盲程序员」!
AI正在让程序员失去对事物的理解能力。互联网只是替代了查找事实的过程,还会提供解释;而AI却替代了所有的思考过程。
我一直在尝试各种方法来应对这个问题(因为让我们面对现实,AI注定会继续存在)。以下是一些确实有效的方法:以学习的心态使用AI。当它给你答案时,多问几个为什么。没错,这样会花更多时间,但这正是重点所在。找到你的技术社群。可以是Reddit、Discord、Mastodon——只要高手们在那里聚集。那里才有真正的技术讨论,那些能让你恍然大悟的观点交流。改变代码审查的方式。不要只检查代码是否可用,要和团队展开深入对话。了解他们考虑过哪些其他方案?为什么最终选择这个方案?让理解思路和最终结果同等重要。时不时从零开始构建项目。是的,AI可以为你生成认证系统。但不妨先试着自己动手做一个,你写的代码可能不够优雅,但你会理解每一行代码的含义。这种知识会逐渐积累。
先给出之前题目的答案!用程序"说话"!
此时结果应该明了吧!
Python和MATLAB语言中的下标呢?
给出Python示例!
讲的非常透彻,此时写出完整程序也是水到渠成!课后还需复习才能真正掌握。等到同学们到大二学习《数据结构与算法》的时候,还会再次接触此类算法!
如何推广到任意个数排序?试着写程序吧!
7. 下列运算符中优先级最低的是( )。
A. *= B. && C. + D.!=
函数正确与否,编个程序测试一下即可!
再看看23级通信工程的小王同学编写的程序!他在课堂上被我硬压着解题,虽然是被迫勤奋,但这也是一种勤奋,学到了知识也能提升能力!看看他写的程序!这是在他自学了二维数组以后写的代码!
#include <stdio.h>
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;
}
至此,所有题目解答完毕!之前选择题的解题程序为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)。
修订记录
20240330 完成初稿;
20250402 修订内容;