目录
一.顺序结构
二.选择结构
1.if语句
2.switch语句:
三.循环结构
1.while语句:支持“当型”循环控制结构的语句。
2.do_while语句:“直到型”循环控制结构的语句。
3.for语句:比while语句更加灵活的循环控制语句。
4. break和continue语句
1.break语句:
2.continue语句:
四.习题
对于一个程序来说,它的内在逻辑是非常重要的。只要肯静下心来仔细推敲,找到它的关键逻辑。整个程序就已经完成了一大半,剩下的都是一些格式与规定。
我最感兴趣的就是第四部分,习题部分找凶手的例题。看见题目的时候整个傻眼了,这个也能用代码编出来并找到凶手吗?事实证明是可以的。
下面附上例题代码,结果及一些总结。希望对同时在学习C语言的你能有一些帮助,如果你是程序大神,那就不用细看我这篇文章啦~
财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少。例如,某职工工资为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行最后一个斜杠表示承接下一行。
从键盘输入一个大写字母,要求改用小写字母输出。
(1)涉及到的变量是大小写字母,所以数据类型是字符型char。scanf与printf时加%s。
(2)判断输入的字符是否为大写,是则进入小写转换,不是则提醒输入错误。A~Z的ASCII值为65~90,不知道也没关系,用字符型表示计算机自己知晓则有第9行的表示。&&间的两个Ch的判断加了括号是为了方便阅读,不加也可以,因为>= ,<=(关系运算符)的优先级比&&(与)的高。
(3)大写转换为小写:第11行。A与a的ASCII值相差了32,所以也可以写成ch = ch + 32 ;本程序中的11行为通用写法,用于不清楚大写之间的ASCII差值的时候。
输入两个实数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。
输入三个实数a,b,c,按代数值由小到大次序输出这三个数。
(1)与上个例题差不多,只是判断的数增加到了三个,再把不符合a
(2)29行中%5.2f意思为:以宽度为5,显示两位小数的形式输出。
(3)与上一个例题一样都是涉及到实数,一个用的int,一个用了float。其实都可以,因为实数的定义如下:
有理数中整数部分是int型,分数(小数)部分是float型。
有一函数如下,编一程序,输入一个x值,输出y值。
-1 (x<0)
y= 0 (x=0)
1 (x>0)
(1)易错点:14行else if 里面不要写成x = 0。平时书写时是x=0,可在计算机中 = 是赋值运算符,==是关系运算符,与<,>一样。
写程序,判某一年是否闰年。
输入:年(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,使程序更简洁。
格式: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)switch(op)不能写成switch(‘op’)。
(2)做除法的时候要考虑被除数不能为0的情况。
(3)%5.2f指的是以宽度为5,显示小数点后两位来输出。
给出一百分制成绩,要求输出成绩等级‘A’、’B’、‘C’、‘D’、‘E’。90分以上为‘A’ ,80~89分为’B’ ,70~79分为‘C’,60~69分为’D’,其他为‘E’...
一个if之后,最好用else if,其他的用else。
if (条件句1)+执行句
elseif (条件句2)+执行句
else +执行句
如果条件句1成立,则执行if后面的执行句,如果条件句1不成立,然后条件句2成立,则执行elseif后面的执行句,如果条件句1和条件句2都不成立,则执行else后面的执行句。
与上一个一致。
(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。
一般格式为:
while (表达式)
{
语句;
}
输入: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)。
计算一条语句中的空格、字母、数字的个数。
(1)该程序是要输入一条语句来计算字母,数字及空格的个数,用 while(ch != '\n')来判断语句输入结束(即按下空格之后将输出对应个数)。
(2) if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))用来判断是否是字母,包含大小写。
(3)if(ch == ' ')用来判断输入的是否是空格,‘’单引号之间有空格。
一般格式为:
do
{
语句;
} while (表达式);
输入:无
计算:1+2+3+L+100
输出:计算的和
与while相比,do_while是先执行后判断,它的赋初值和条件判断都和while一致,只是顺序不同。
一般格式为:
for (表达式1;表达式2;表达式3)
语句;
先求解表达式1;再解表达式2,若为真(非0)值,则执行语句,然后求解表达式3,再转到求解表达式2。若为假(0)值,则结束for语句的执行。
输入:无
计算:1+2+3+L+100
输出:计算的和
(1)赋初值和条件判断都一致,只是i的赋初值与i的自增都写在for的固定表达式中了。
用for语句编写一个计算1+3+5+ ...+(2*i-1)的程序,其中 i=1, 2, 3, ..., 100。
输入:n
计算: 1!+2!+3!+ L+n!
输出:计算的和
(1)计算的流程图如下:
(2)由计算机制可给j赋初值为1,sum赋初值为0;也可因为 j 要进行乘运算所以初值最好为1,sum进行加运算,最好为0。
判断数字m是否为素数(质数)。
(1)素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除。
(2)for循环中i从2开始直至小于它本身的那个数,即除了能被1和它本身除之外只要能被其他数整除不是素数,将这种情况定义一个标志位flag=1。
(3) 1也是素数,且它进不了for循环,最好在循环外给flag赋0值,则输入1时,会输出0也是素数。
求100到200之间的素数。
输入:无
计算: 求素数
输出: 输出素数 每4个一行 每个数占4位
(1) 由于只用输出素数,与上一个程序相比,只用输出count为0时的情况。
(2)第22行%4d以宽度为4 。
在switch语句中使流程跳出switch结构。
在循环语句中使流程跳出当前循环。
将从键盘上输入的若干个正整数求和,遇到负数则终止
程序,并且输入的数不超过10个。
输入:正整数
计算:求累加和
输出:和
在循环语句中使本次循环结束,即跳过循环体中下面尚未执行的语句,接着进行下次是否执行循环的判断。
把100~200之间的不能被3整除的数输出。
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为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'
题目:通过编程实现,统计0~n有多少个9
提示:n通过参数传入