学习心得——LinuxC的三种基本程序结构

 通过这节内容的学习,让我了解到对于一个程序来说,它的内在逻辑是非常重要的。只要肯静下心来仔细推敲,找到它的关键逻辑。整个程序就已经完成了一大半,剩下的都是一些格式与规定。

这节课程中让我最感兴趣的就是第四部分,习题部分找凶手的例题。看见题目的时候整个傻眼了,这个也能用代码编出来并找到凶手吗?事实证明是可以的。在通过老师的讲解之后能自己写出来,那一刻是非常有成就感的。

学习C我还在起步阶段,如果你在看这篇文章时发现了什么错误,希望可以评论一下。不过还是觉得每个人自己的总结会更适合自己看,因为每个人掌握知识的程度不一样,总结里的一些易错点可能你们已经不会发生,或者你们会发生的 错误我没有出现过。

下面附上这节课程学习的例题代码,结果及一些总结。希望对同时在学习C语言的你能有一些帮助,如果你是程序大神,那就不用细看我这篇文章啦~

一.顺序结构

例1:

财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少。例如,某职工工资为3436元,发放方案为:100元34张,20元1张,10元1张,5元1张,1元1张。

程序:

结果:

总结:

(1)因为要求总张数最少,所以最好先拿最大数额的钱来支付工资,则顺序为100元→50元→20元→10元→5元→1元。

(2)每次只要能除以相关的数额得到的整数就是它的张数(m100=money/100),相除之后余下的部分留给下一级数额再相除      (money%=100;m50=mone/50;),一直除到5,剩下的都是1元能解决的部分(...m5=money/5;money%=5;printf("m1=%d",money);)。

(3)m1只出现在了printf打印里,且值该等于money%=5,所以不用对它进行定义。

(4)要处理的变量是金钱,所以数据类型是整型int,scanf与printf时加%d

  (5)30行最后一个斜杠表示承接下一行

例2:

从键盘输入一个大写字母,要求改用小写字母输出。

程序:

结果:

总结:

(1)涉及到的变量是大小写字母,所以数据类型是字符型char。scanf与printf时加%s

(2)判断输入的字符是否为大写,是则进入小写转换,不是则提醒输入错误。A~Z的ASCII值为65~90,不知道也没关系,用字符型表示计算机自己知晓则有第9行的表示。&&间的两个Ch的判断加了括号是为了方便阅读,不加也可以,因为>= ,<=(关系运算符)的优先级比&&(与)的高。

(3)大写转换为小写:第11行。A与a的ASCII值相差了32,所以也可以写成ch = ch + 32 ;本程序中的11行为通用写法,用于不清楚大写之间的ASCII差值的时候。

二.选择结构

1.if语句

例1:

输入两个实数a,b,如果a比b大,则将两个数数值交换,按代数值由小到大次序输出这两个数。

程序:

结果:

总结:

(1)输出时(16行)先输出a再输出b,且要求由小到大一次输出,所以如果输入时a的值比b大时就要进行交换(10~15行)。

(2)temp是用来交换a,b的中间载体,先将a中的内容给a,现在a是空的,紧接着就可以把b中的内容给a;现在b是空的,然后再把a放在temp中的内容给b(谁空给谁赋值),就实现了a与b的交换。注意顺序不要写错,不可写成:temp=a;b=temp;a=b。

 

例2:

输入三个实数a,b,c,按代数值由小到大次序输出这三个数。

程序:

结果:

总结:

(1)与上个例题差不多,只是判断的数增加到了三个,再把不符合a<b<c的情况列出来进行值的交换即可。

(2)29行中%5.2f意思为:以宽度为5,显示两位小数的形式输出。

(3)与上一个例题一样都是涉及到实数,一个用的int,一个用了float。其实都可以,因为实数的定义如下:

有理数中整数部分是int型,分数(小数)部分是float型。

例3:

有一函数如下,编一程序,输入一个x值,输出y值。
                                        -1              (x<0)
                                y=     0               (x=0)
                                         1               (x>0)

程序:

结果:

总结:

(1)易错点:14行else if 里面不要写成x = 0。平时书写时是x=0,可在计算机中 =赋值运算符,==关系运算符,与<,>一样。

例4:

写程序,判某一年是否闰年。
输入:年(year)
计算:判是否闰年
输出:闰年或非闰年(leap)
闰年条件:
能被4整除,但不能被100整除。
能被4整除,又能被400整除。

程序:

结果:

总结:

(1)外循环的选择:因为条件是1.能被4整除,但不能被100整除。2.能被4整除,又能被400整除。都有能被4整除,所以最好放  在外循环。

(2)第2,3循环的选择:由于能被400整除的数肯定能被100整除,但能被100整除的数不一定能被400整除,所以最好被100整除放在第2循环里,能被400整除放在最内。

(3)flag为标志位,用来判断当前情况下是否为闰年,为1时输出为闰年,由于为闰年的情况比不是闰年的要少,所以定义时给flag赋值为0,在很多个不是闰年的情况下就不再标注flag=0,使程序更简洁。

2.switch语句:

格式:switch(表达式)

                       {

                         case  常量表达式1:语句序列1

                         case  常量表达式2:语句序列2            

                         case  常量表达式i:语句序列i

                         case  常量表达式n:语句序列n

                         default: 语句序列n+1

                         }

执行过程为:当表达式的值等于常量表达式i的值,则从语句序列i开始执行到语句序列n+1为止 。若表达式的值不等于任何一个常量表达式的值,则只执行default后面的语句。

   一般在每个语句序列之后加一个break语句,这样在执行语句序列i之后,使流程跳出switch结构,实现多分支选择结构。

 

例1:

编写一个能进行两个操作数加减乘除四则运算的计数器模拟程序

输入:两个操作数和运算符

计算:根据运算符确定运算

输出:运算结果

程序:

结果:

总结:

(1)switch(op)不能写成switch(‘op’)。

(2)做除法的时候要考虑被除数不能为0的情况。

(3)%5.2f指的是以宽度为5,显示小数点后位来输出。

 

例2:

给出一百分制成绩,要求输出成绩等级‘A’、’B’、‘C’、‘D’、‘E’。90分以上为‘A’ ,80~89分为’B’ ,70~79分为‘C’,60~69分为’D’,其他为‘E’...

程序:用if写

结果:

总结:

一个if之后,最好用else if,其他的用else。

if (条件句1)+执行句
elseif (条件句2)+执行句
else +执行句

如果条件句1成立,则执行if后面的执行句,如果条件句1不成立,然后条件句2成立,则执行elseif后面的执行句,如果条件句1和条件句2都不成立,则执行else后面的执行句。

 

程序:用switch写

结果:

与上一个一致。

总结:

(1)因为case后接的是常量表达式,不能出现case:90~100,所以将分数除以10,用case:10,case:9...来表示。

(2)101~109除以10也是case:10的情况,会输出A,所以加一个判断语句:if(0 <= score && 100 >= score),过滤掉101~109之后再进行 score /= 10。

 

三.循环结构

1.while语句:支持“当型”循环控制结构的语句。

一般格式为: 

while  (表达式)  

{

    语句;

 }

 

例1:

输入:n

计算:1+2+3+L+n

输出:计算的和

程序:

结果:

总结:

(1)while是先判断再执行,给i赋初值为1,sum为0,第1次进入循环时sum=0+1,而程序要实现sum=0+1+2+...+n,且i也要由0自增到n,所以有while(i<=n)。

 

例2:

计算一条语句中的空格、字母、数字的个数。

程序:

结果:

总结:

(1)该程序是要输入一条语句来计算字母,数字及空格的个数,用 while(ch != '\n')来判断语句输入结束(即按下空格之后将输出对应个数)。

(2) if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))用来判断是否是字母,包含大小写

(3)if(ch == ' ')用来判断输入的是否是空格,‘’单引号之间有空格

 

2.do_while语句:“直到型”循环控制结构的语句。

一般格式为: 

do

{

    语句;

} while (表达式);

 

例1:

输入:无

计算:1+2+3+L+100

输出:计算的和

程序:

结果:

总结:

与while相比,do_while先执行后判断,它的赋初值和条件判断都和while一致,只是顺序不同。

 

3.for语句:比while语句更加灵活的循环控制语句。

一般格式为: 

for (表达式1;表达式2;表达式3)  

语句;

先求解表达式1;解表达式2,若为真(0)值,则执行语句,然后求解表达式3,再转到求解表达式2。若为假(0)值,则结束for语句的执行。

 

例1:

输入:无

计算:1+2+3+L+100

输出:计算的和

程序:

结果:

总结:

(1)赋初值和条件判断都一致,只是i的赋初值与i的自增都写在for的固定表达式中了。

 

例2:

for语句编写一个计算1+3+5+ ...+(2*i-1)的程序,其中  i=1, 2, 3, ..., 100

程序:

结果:

 

例3:

输入:n

计算: 1!+2!+3!+ L+n!

输出:计算的和

程序:

结果:

总结:

(1)计算的流程图如下:

(2)由计算机制可给j赋初值为1,sum赋初值为0;也可因为 j 要进行运算所以初值最好为1sum进行运算,最好为0

例4:

判断数字m是否为素数(质数)。

程序:

结果:

总结:

(1)素数一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除

(2)for循环中i从2开始直至小于它本身的那个数,即除了能被1和它本身除之外只要能被其他数整除不是素数,将这种情况定义一个标志位flag=1。

(3) 1也是素数,且它进不了for循环,最好在循环外给flag赋0值,则输入1时,会输出0也是素数。

例5:

100200之间的素数。

输入:无

计算: 求素数

输出: 输出素数 每4个一行 每个数占4位

程序:

结果:

总结:

(1) 由于只用输出素数,与上一个程序相比,只用输出count为0时的情况。

  (2)第22行%4d以宽度为4 。

4. break和continue语句 

1.break语句

switch语句中使流程跳出switch结构。

在循环语句中使流程跳出当前循环

 

例1:

将从键盘上输入的若干个正整数求和,遇到负数则终止

程序,并且输入的数不超过10个。

输入:正整数

计算:求累加和

输出:和

程序:

结果:

 

2.continue语句:

在循环语句中使本次循环结束,即跳过循环体中下面尚未执行的语句,接着进行下次是否执行循环的判断。

例1:

100~200之间的不能被3整除的数输出。

程序:

结果:

 

四.习题

例1:

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。

A说:不是我。

B说:是C

C说:是D

D说:C在胡说

已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手

程序:

结果:

总结:

(1)因为已知3个人说了真话,1个人说的是假话。认为的可以判断出凶手在C和D之间,但是电脑不会有这种想法,所以还是由这个已知条件来进行判断。

(2)A~D依次设为说假话(假为0)(9~11行),sum里放的是每个人说的话的真假,当sum为3时,说明其他三个人都说的是真话(真为1,所以有1+1+1=3)。

(3)sum实际上不是数与数的加法,而是真假情况的判断结果:3个人说了真话,1个人说的是假话。

(4)A说:不是我。killer != 'A';B说:是C。killer == 'C';C说:是D。killer == 'D';D说:C在胡说(C的对立情况)。killer != 'D'

习题2:

题目:通过编程实现,统计0~n有多少个9

提示:n通过参数传入

程序:

结果:

 

猜你喜欢

转载自blog.csdn.net/lishasha5/article/details/81195611
今日推荐