C语⾔初学者该如何着⼿写代码
我有⼀些相对初学编程的⼈想说的话,写在这⾥,希望可以给有缘看到这些内容的⼊门级编程⼈员⼀些帮助。
C语⾔难吗?
第⼀个问题,C语⾔难吗?或者说编程难吗?在⽬前的环境⾥,第⼀次接触 C 语⾔的⼈应该⼤多数都是⼤学⽣了。你们⼤部分⼈已经经历过中国的⾼考,⽽且⼤部分⼈都在⾼考中取得了不错的成绩,说实话,编程⽐起很多⾼中的课程都简单,举两个真实的例⼦:
⽐尔·盖茨出⽣于1955年,但是他在1971年,已经开始为湖畔中学编写程序,其中包括⼀款课表安排软件【来源百度百科】。⼤家可以算⼀下,他在 1971 年应该是 16 岁。另⼀个⼈就更厉害了,来⾃芬兰的 Linus,也是在⾼中的时候就写出了 Linux 操作系统最初的版本。(Android 可以说就是 Linux 在⼿机上的⼀个分⽀)
虽然这两个⼈都是天才,我们可能没办法和他们⽐,但是仔细想想你们现在做的题,题⽬中要解决的问题真的很难吗?
写代码的⼀般步骤
今天以⾥⼀个⼩伙伴的题⽬,讲⼀下写代码的⼀般步骤,我把题⽬内容摘抄在这⾥:
“键盘输⼊⼀个3⾏4列的整型⼆维数组a[3][4]的数据,到鞍点。所谓鞍点,就是该位置上的数,在它所在⾏最⼤(没有跟它相等的数),在它所在列最⼩(没有跟它相等的数)。注意:也可能没有鞍点。若没有鞍点,输出:“not exist””
这道题涉及到了多位数组,有些同学就有点害怕了,但是如果抛开写代码,假如你⾃⼰就是⼀个程序,如果别⼈给你⼀个⼆维数组,你能从中出鞍点吗?我相信⼤部分⼈都是可以吧?甚⾄于个⼩学四五年级的学⽣,只要你把什么是鞍点给他解释清楚,他也能给你出给定数字中的鞍点。
假如你⾃⼰就是⼀个程序,说点题外话,我这样说是希望你们可以设⾝处地的站在计算机的⾓度考虑问题,举个简单的例⼦,⽐如scanf("%d,%d", &a, &b);这句代码,⾥⾯的“%d,%d”被称为格式化字符串,就是计算机希望你在输⼊的时候以这种格式输⼊,⽐如这个地⽅的格式就是两个数之间有个逗号,所以输⼊a和b的值时,最好是输⼊“3,4”这样的。
看到⼀个题⽬,⾸先要做的事就是想思路,⽽不是直接写代码。⽐如我看到这道题,我脑海⾥出现的思路是这样的:
1. 到第⼀⾏最⼤的数,看⼀下它是不是在所在列最⼩。
2. 到第⼆⾏最⼤的数,看⼀下它是不是在所在列最⼩。
3. 到第三⾏最⼤的数,看⼀下它是不是在所在列最⼩。
当然了,因为每个⼈思考问题的⽅式不⼀样,所以每个⼈的思路也是不⼀样的,这也就导致我们每个⼈写出来的代码也会不⼀样,所以编程的题⽬是没有标准答案的。
想思路是写代码最重要的步骤,如果没有思路,肯定写不出代码。⽐如这道题的这个思路,相信⼤部分⼈都能想出来,但是就是写不出来是不是?这就是另⼀项能⼒,把⾃⼰的思路转换成代码的能⼒,这项能⼒没有捷径,只能通过多写多练来达成。最怕的就是眼⾼⼿低,觉得⾃⼰有思路,代码就不写了。另外,多思考也是⾮常重要的,脑⼦这个东西⼀定要多⽤,不要⼀遇到问题就在⾥问,说不定⾃⼰离成功就差⼀点点了。
编写代码
接下来就是把我们的思路写成代码,说难也难,说不难也不难。
#include <stdio.h>
int main()
{
// 为了可读性,这⾥定义了变量 line 和 column 代表数和列数。
int lineCount = 3, columnCount = 4;
// 定义数组
int array[lineCount][columnCount];
// 输⼊⼆维数组的值
for (int line = 0; line < lineCount; ++line)
{
for (int column = 0; column < columnCount; ++column)
{
scanf("%d", &array[line][column]);
}
}
// 定义⼀个变量存储是否存在鞍点
int exist = 0;
// ⼀⾏⼀⾏的查鞍点
for (int line = 0; line < lineCount; ++line)
{
// 定义⼀个变量代表⼀⾏中最⼤值所在列
int maxCol = 0;
// 定义⼀个变量代表这⾏是否存在不⽌⼀个最⼤值
int hasEqualInLine = 0;
/
/ 循环⼀个⾏中的数,出其中的最⼤值
for (int col = 1; col < columnCount; ++col)
{
if (array[line][col] > array[line][maxCol])
{
// 这个条件成⽴,说明在这⼀⾏中到⼀个更⼤的数字
maxCol = col;
hasEqualInLine = 0;
}
else if (array[line][col] == array[line][maxCol])
{
/
/ ⼜到⼀个数和当前的最⼤值相等
hasEqualInLine = 1;
}
}
// 程序⾛到这⾥就是循环完⼀⾏了,这个时候就可以判断当前⾏存不存在鞍点了
if (!hasEqualInLine)
{
// 这个变量表⽰这个数在所在列是否是最⼩数
int isMin = 1;
// 定义⼀个变量代表所在列是否有相等值
int hasEqualInColumn = 0;
for (int line2 = 0; line2 < lineCount; ++line2)
{
if (line2 == line) {
// 没必要和这个数⾃⾝⽐
continue;
}
if (array[line2][maxCol] < array[line][maxCol])
{
// 此列中其他⾏中的数⽐我们到的数⼩
isMin = 0;
break;
}
else if (array[line2][maxCol] == array[line][maxCol])
最容易上手的编程语言{
// 此列中其他⾏存在和我们到的数相等的数
hasEqualInColumn = 1;
break;
}
}
if (isMin && !hasEqualInColumn)
{
// 这个数是鞍点
exist = 1;
printf("a[%d][%d]=%d\n", line, maxCol, array[line][maxCol]);
}
}
}
if (!exist)
{
// 程序执⾏到最后都没有到鞍点
printf("not exist\n");
}
}
这就是我按照我的思路写出来的代码,在写这个代码之前,我也没想到能写这么多⾏,为了保证已读性,⾥⾯加了很多注释,⼤家可以读⼀下,验证⼀下。
写在最后
如果想学好 C 语⾔,学校发的教科书起码要看⼀遍,看⼀遍书基本上语法就都掌握了。有⼀些问问题的⼈连 switch 语句怎么写都不知道就来问怎么改,遇到这样的⼈真是不知道该从何教起。另外就是在问问题前可以先尝试在⽹上查⼀下有没有现成的解决⽅案,毕竟每个⼈的时间都是宝贵的,我希望每个问问题的⼈都是在经过⾃⼰本⼈尝试过⽆果再问问题,⽽不是⾃⼰懒得去想懒得去做就来问别⼈,没有⼈有义务来帮你去思考。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。