针对在校大学生的C语言入门学习——编码示例

针对在校大学生的C语言入门学习——编码示例

  • 学习编程最重要的就是练习,对于新手而言练习也是最痛苦的。编程没有思路、编译出错不会改等问题让很多人止步学习编程的大门。编程是需要训练的,训练就要讲究方法。方法不外乎“循序渐进”四个字。今天我就拿一个非常常见的编程入门习题带大家分析一下,希望能够帮助大家成功开启学习编程的大门。
  • 这次我使用的编译器是GCC 4.6.3,向大家介绍编译器版本是因为后面我会和大家分享一下如何解决编译报错问题。不同的编译器版本对于同一个错误报错可能有一些差别,但是差别不大。

练习

  • 题目:输入10个整数输出最大值。
  • 我们就从这个老掉牙的题开始吧。有些同学做这道题的思路是先把10个数保存起来,然后排序。我们认真审题就会发现这道题其实没有那么麻烦。对于一个问题,如果我们不做充分的分析就盲目出手,很可能写出逻辑过于冗余甚至错误的代码。这道题最终的要求是找到最大值,并没有要找第二大第三大的值,所以完全没有必要排序。
  • 我们把这个问题回归到现实中,比如我给你微信转账,转10次,每次转不同的钱数,然后你告诉我我最多的一次给你转了多少?你会怎么做?是不是把我给你转的第一笔钱先记住,然后接下来给你转的钱数和你记住的钱数做对比,如果比你之前记住的钱数多,那么就记住这次给你转的钱数。接下来的操作就是重复这个逻辑。这个问题就算没有系统学习过数学的小孩应该都会。所以大家不要对编程心生畏惧,至少入门还是很简单的。请看下面伪代码:
	记住第一次转账的钱
 	for(循环9) //因为第一次已经转完了
 	{
    
    
		查看新转入的钱数
		if(记住的钱数 < 新转入的钱数)
		{
    
    
			记住新转入的钱数
		}
	}
	循环结束后记住的钱数就是最多那次转账
  • 有没有一点思路了呢?如果想自己尝试一下的话,就先不要往下面看我的答案,自己试试看!
#include <stdio.h>

int main()
{
    
    
	int max;//记住当前输入的最大值
	scanf("%d",&max);
	int i;
	for(i = 0;i < 9;i++)
	{
    
    
		int input;//记住新输入的数
		scanf("%d",&input);
		if(max < input)
		{
    
    
			max = input;
		}
	}
	printf("%d\n",max);
	return 0;
}
  • 分析一下这段代码,我说过我不会带大家梳理语法,因为那完全是浪费时间,你们有大量的资料可以去查。我只说一些容易出问题的地方。
  • scanf

  • scanf这个函数的双引号中不要乱写东西,哪怕是空格都尽量不要乱写,还有就是同学们习惯的逗号,甚至\n。因为scanf是格式化输入,原则上你在双引号里写了什么,输入的时候就得写什么,完全按照双引号中的格式输入。比如scanf("%d,%d",&a,&b),运行的时候输入就要写:“10,20”。并不建议大家花时间在研究scanf这个函数上,因为它本身就并不是一个非常安全的函数。
  • 还有一个有意思的地方就是你会发现scanf的变量参数前面要加&符号进行取地址的操作。如果你有系统学习过C语言你会知道这里是使用的指针,关于指针后面我会专门和大家好好聊聊。如果你还没有听说过指针那就太好了,这里会更好理解。相信同学们都有过网购或者订外卖的经历,那么在你向商家下订单后是不是要留下你的地址呢,为什么要留下地址?这显然是一个愚蠢的问题,因为没有地址的话商家要把货物发到哪里呢,他又不认识我们。一样的道理,现在我们想让scanf函数把输入的值存放到我指定的变量中,我是不是得告诉它变量在哪里呢!这就是指针的本质意义!
  • 编码规范

  • 在第一课里我和大家分享过变量命名要有含义的意义。变量命名规范知识编码规范的一部分。今天我要说说关于结构对齐的问题。请对比下面一段代码:
#include <stdio.h>

int main()
{
    
    
int max;//记住当前输入的最大值
scanf("%d",&max);
int i;
for(i = 0;i < 9;i++)
{
    
    
int input;//记住新输入的数
scanf("%d",&input);
if(max < input)
{
    
    
	max = input;
}
printf("%d\n",max);
return 0;
}
  • 这段代码看上去仅仅是把我的答案写的乱一些而已,但是如果你编译这段代码会发现有报错:
    test1.c: In function ‘main’:
    test1.c:18:1: error: expected declaration or statement at end of input
    我先来说说这个错误说的是什么意思。首先大家看到报错不要惊慌,认真的去读每个单词的含义。单词不会怎么办!这个问题放在我上大学的时候可能还算是个问题,现在这个翻译软件随处可见的时代,翻译不是问题。我可以很负责人的告诉大家,所有的报错你只要从左到右撸单词,一定能看懂这个报错的含义!!!
  • test1.c: In function ‘main’:这句话是告诉我们错误在test1.c文件的main函数中,是的,我把用来给大家演示代码的文件命名为test1.c了。
  • test1.c:18:1: error这句话的意思是说在test1.c文件的18行1列出现了一个错误。
  • expected declaration or statement at end of input这句话是说具体的错误是什么。使用有道词典的翻译是“预期的声明或语句在输入结束”,在这里同学们可能还是懵了,这是说啥呢,是人话吗?所以我刚才说我们要撸单词,最好不要整句翻译。这个报错可以判断出是缺少结构的花括号。记住,对于缺少结构的花括号就是这么报错的!这样的错误往往不能够准确的报出错误所在的行号,因为整个代码结构都是乱套的!遇到这种错误我们只能从报错的18开始网上一个一个结构去找,看看哪个结构的花括号没写全(所谓的写全就是左右两半花括号都要写 )。仔细查找你会发现代码中有3个左花括号,2个右花括号,在if结构或者for结构缺少了一个右括号。根据代码逻辑补上就可以了。
  • 如果这段错误的代码我是按照正确的编码规范来写的:
#include <stdio.h>

int main()
{
    
    
	int max;//记住当前输入的最大值
	scanf("%d",&max);
	int i;
	for(i = 0;i < 9;i++)
	{
    
    
		int input;//记住新输入的数
		scanf("%d",&input);
		if(max < input)
		{
    
    
			max = input;
		}
	printf("%d\n",max);
	return 0;
}

错误是不是很显然。

  • 这里我想强调的规范就是在C语言中,一个结构的左右花括号要写在同一列上,并且要和所属的结构对齐。
    正确
if()
{
    
    

}

错误

if()
		{
    
    

		}

并且花括号中的代码要使用tab键缩进
正确

if()
{
    
    
	if()
	{
    
    
		a = 10;
	}
}

错误

if()
{
    
    
	if()
	{
    
    
	a = 10;
	}
}

常见的编译报错

  1. expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘return’ 这个错误的意思一般是缺少一些必要符号,比如逗号,分号。这个错误的代码如下
#include <stdio.h>

int main()
{
    
    
	int max
	return 0;
}

在int max后面没有写分号。

  1. ‘max’ undeclared (first use in this function) 这个错误是说max没有声明。错误代码如下:
#include <stdio.h>

int main()
{
    
    
	max = 10;
	return 0;
}

在max = 10 之前应该先定义max。比如改成:

#include <stdio.h>

int main()
{
    
    
	int max;
	max = 10;
	return 0;
}
  1. stray ‘\357’ in program这个报错一般在代码中出现了中文字符。错误代码如下:
#include <stdio.h>

int main()
{
    
    
	max = 10return 0;
}

很明显在max = 10后面的分号是中文的,中文的符号在使用鼠标扩上以后,会发现占位一般都比较宽!大家可以在上面的代码中自己把两个分号扩上试试看。

  1. expected ‘;’ before ‘)’ token
    expected expression before ‘)’ token
    这是同一个错误报了两行,一般是表达式的结构内容写错了。错误代码如下:
#include <stdio.h>

int main()
{
    
    
	int i;
	for(i = 0,i < 10,i++)
	{
    
    }
	return 0;
}

for循环中的3个表达式应该是用分号隔间,这里使用了逗号。

  1. warning: ‘return’ with a value, in function returning void 首先这是一个警告并不是错误,有警告也会编译成功。但是关于警告我们不能置之不理。就算不想把警告消除,但是至少要做到心中有数。
    这个警告的意思是函数的返回值类型与实际的返回值类型不符,错误代码如下:
#include <stdio.h>

void main()
{
    
    
	return 0;
}

这里main函数的返回值定义为void,本来是不需要返回值的,但是我却偏偏返回了一个整数0,类型不符所以警告。

  • 以上是我教学时在初期经常遇到的学生错误,如果大家还有什么在学习中的问题欢迎留言。
  • 篇幅有限,这次就只分享一道题,大家在挑选练习题的时候要尽量避免复杂的数学问题。理由很简单,我们编程之前必须得把思路搞清楚,如果一个数学题自己算都不会算,那何谈编程呢?我早期是做游戏开发的,这并不代表我很会玩游戏,但是我至少得做到我对游戏的玩法了如指掌!
  • 下面给大家准备了一些我认为比较适合新手练习的题,当然都不是我原创的练习题,在这里感谢线上的各位大神献题!

1、输入两个数 打印 最大公约数 最小公倍数
2、打印100~200之间质数
3、求s = a+aa+aaa+aaaa+… 输入a 和 n
4、阶乘求和 1!+2!+3!+…
5、打印1000以内所有完数
完数:一个数所有约数的和等于这个数
6、输入n,求sum=1/1!-1/2!+1/3!-1/4!..

猜你喜欢

转载自blog.csdn.net/seamancsdn/article/details/112058295
今日推荐