学习方法和学习平台见第一章。
温馨提示:不看学习内容。这个部分是为了整体的了解这一章学的什么,方便以后知识点的检索,对于代码的编写没有影响。
学习内容
● 关键字——for、while、do while;
● 运算符——<、>、>=、<=、!=、==、+=、*=、-=、/=、%=;
● 函数——fabs();
● C语言有3种循环——for、while、do while;
● 使用关系运算符构建控制循环的表达式;
● 其他运算符;
● 循环常用的数组;
● 编写有返回值的函数。
大多数人都希望自己是体格强健、天资聪颖、多才多艺的能人。虽然有时事与愿违,但至少我们用C能写出这样的程序。诀窍是控制程序流。对于计算机科学(是研究计算机,不是用计算机做研究)而言,一门语言应该提供以下3种形式的程序流:
● 执行语句序列;
● 如果满足某些条件就重复执行语句序列(循环);
● 通过测试选择执行哪一个语句序列(分支)。
读者对第一种形式应该很熟悉,前面学过的程序中大部分都是由语句序列组成。while循环属于第二种形式。本章将详细讲解while循环和其他两种循环:for和do while。第三种形式用于在不同的执行方案之间进行选择,让程序更“智能”,且极大地提高了计算机的用途。不过,要等到下一章才介绍这部分的内容。本章还将介绍数组,可以把新学的知识应用在数组上。另外,本章还将继续介绍函数的相关内容。首先,我们从while循环开始学习。
本章的主题是程序控制。C语言为实现结构化的程序提供了许多工具。while语句和for语句提供了入口条件循环。for语句特别适用于需要初始化和更新的循环。使用逗号运算符可以在for循环中初始化和更新多个变量。有些场合也需要使用出口条件循环,C为此提供了do while语句。
这些循环都使用测试条件来判断是否继续执行下一次迭代。一般而言,如果对测试表达式求值为非0,则继续执行循环;否则,结束循环。通常,测试条件都是关系表达式(由关系运算符和表达式构成)。表达式的关系为真,则表达式的值为1;如果关系为假,则表达式的值为0。C99新增了_Bool类型,该类型的变量只能存储1或0,分别表示真或假。除了关系运算符,本章还介绍了其他的组合赋值运算符,如+=或*=。这些运算符通过对其左侧运算对象执行算术运算来修改它的值。接下来还简单地介绍了数组。声明数组时,方括号中的值指明了该数组的元素个数。数组的第1个元素编号为0,第2个元素编号为1,以此类推。
创建了一个有20个元素的数组hippos,其元素从hippos[0]~hippos[19]。利用循环可以很方便地操控数组的下标。最后,本章演示了如何编写和使用带返回值的函数
不要看学习内容那么多知识点。但其实有些全部看下来对于编码一点用都没有。(自己全部已经看完)
就比如逗号运算符这一节讲了差不多几百字,但是总结下来就两句话。1.for(;;)语句;前面有不同的条件的时候来用。2.当出现很多表示的时候用。(如int a,b;)但是仔细看看这不是说废话吗?,这在平时的编码练习中不是很常见吗。所以就不介绍。
剥离的精华
1就看这三个示意图,就解决了所有循环的问题
for循环
for(count=1;count<=number;count++)
while循环
while(count++<limit)
{printf("tra la la la !\n");}
do while 循环
do
{printf("tra la la la !\n");}
while(count++<limit);
2i--和--i的用法(与上一章所讲的++i和i++的原理相同)
#include<stdio.h> int main(void) { int a; for (a=5;a>-2;a--)//比较以下两个代码就可以发现我说的规律。 printf("%d\n",a); //规律就是当先输出,再相加或者相减的时候往往是结尾条件-1 //就比如这个例子来说。5 到 ( -1) //如果想要显示到截至条件。加上等于号 //就比如这个例子来说讲a>-2改成a>=-2即可 //另一个规律在上一章。这里就不再赘述了。 return 0; }
#include<stdio.h> int main(void) { int a; for (a=5;a>=-2;a--) printf("%d\n",a); return 0; }
3while循环和for循环的一些小技巧
while(test)和for(;2;)他们的截至条件是整体为0或者为假的时候才结束,而不是其中的一个表达式为0.
#include<stdio.h> int main(void) { int a; for (a=5;a>-2;a--) printf("%d\n",a); return 0; }
while(test)当test为非零数值的时候,系统就以为这是真的,依然可以进行下去。
#include<stdio.h> int main(void) { int i; printf("请输入一个数值让这个控制系统运行下去.输入0的时候结束\n"); scanf("%d",&i); while(i) { printf("be my valentine\n"); printf("请输入一个数值让这个控制系统运行下去\n"); scanf("%d",&i); } printf("we are not suitable\n"); printf("舔狗是没有好下场\n"); return 0; }
4.循环中的表达式怎么书写。见代码分析的2
代码练习
1.编写一个程序,创建一个包含26个元素的数组,并在其中存储26个小写字母。然后打印数组的所有内容
#include<stdio.h> #define num 26 int main(void) { char array[num]; int i; printf("请输入26个小写字母\n"); for (i=0;i<num;i++) { array[i]='a'+i; }//我再想数组的初始化他不想香吗? for (i=0;i<num;i++) { printf("%c",array[i]); } return 0; }
2.使用嵌套循环,按下面的格式打印字符
#include <stdio.h> int main(void) { const int h=5; int i,j; for (i=1;i<=5;i++) { for (j=1;j<=i;j++) printf("$"); printf("\n"); } return 0; }
3.使用嵌套循环,按下面的格式打印字母
#include<stdio.h> #define line 6; #define r 6 int main(void) { int i,j; char ch;//像按照标准,结果自己硬生生忘了。 for (i=1;i<=6;i++) { for (ch='F';ch>('F'-i);ch--) printf("%c",ch); printf("\n"); } return 0; }
4.使用嵌套循环,按下面的格式打印字母
#include<stdio.h> int main(void) { int i,j; char ch; j=0; for(i=1;i<=6;i++) { for(ch='A'+j;ch<'A'+j+i;ch++) printf("%c",ch); printf("\n"); j=j+i; } return 0; }
5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:
#include<stdio.h> int main(void) { char end,begin,s,y; int i,j,k; printf("请输入最终大写字母\n"); scanf("%c",&end); j=end-'A'+1;//j才是真正的次数 for(i=1;i<=j;i++)//1---j次数 { for(k=1;k<=j-i;k++) { printf(" "); }//输出空格 for(s='A';s<'A'+i;s++)//输出升序打印字母 printf("%c",s); for(y='A'+i-2;y>='A';y--)//输出降序打印字母 printf("%c",y); printf("\n"); } return 0; }
打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。
6.编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。要求用户输入表格的上下限。使用一个for循环
#include <stdio.h> int main(void) { int i,k,l; printf("请输入这个表格的上下限,前者为上限后者为下限\n"); scanf("%d%d",&i,&k); printf("以下内容即为表格\n"); printf("一个数,一个数的平方,一个数的立方\n"); for(l=k;l<=i;l++) { printf("%5d%5d%5d\n",l,l*l,l*l*l); } return 0; }
7.编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下标。
#include<stdio.h> #include <string.h> #define len 20 int main(void) { char word[len]; int i,k,j; printf("请输入这个单词\n"); scanf("%s",word); k=strlen(word); for(j=k-1;j>=0;j--) printf("%c",word[j]); return 0; }
8.编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。
#include<stdio.h> int main(void) { double i,j; printf("请输入一个浮点数,中间用空格或者换位符隔开\n"); while(scanf("%lf%lf",&i,&j)==2) { printf("%lf",(i-j)/(i*j)); printf("请再次输入两个浮点数,输入字母退出\n"); } printf("结束了\n"); return 0; }
9.修改练习8,使用一个函数返回计算的结果。
#include<stdio.h> double result(double i,double j); int main(void) { double i,j; printf("请输入两个浮点数,中间用空格或者换位符隔开\n"); while(scanf("%lf%lf",&i,&j)==2) { printf("结果就是%lf\n",result(i,j)); printf("请再次输入两个浮点数,输入字母退出\n"); } printf("结束了\n"); return 0; } double result(double i,double j) { return (i-j)/i*j; }
10.编写一个程序,要求用户输入一个上限整数和一个下限整数,计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入的上限整数等于或小于下限整数为止。程序的运行示例如下:
#include<stdio.h> int main(void) { int low,high,sum,k; sum=0; printf("请依次输入两个整数,第一个为下限,另一个为上限\n"); scanf("%d%d",&low,&high); while(low<high) { for(k=low;k<=high;k++) { sum=sum+k*k; } printf("所有整数的平方和为%d\n",sum); printf("请依次输入两个整数,一个为下限一个为上限.直到用户输入的"); scanf("%d%d",&low,&high); sum=0; } printf("结束了\n"); return 0; }
11.编写一个程序,在数组中读入8个整数,然后按倒序打印这8个整数
#include<stdio.h> int main(void) { int num[8]; int i; for(i=0;i<8;i++) scanf("%d",&num[i]); for(i=7;i>=0;i--) printf("%d\n",num[i]); return 0; }
12.考虑下面两个无限序列:
编写一个程序计算这两个无限序列的总和,直到到达某次数。提示:奇数个-1相乘得-1,偶数个-1相乘得1。让用户交互地输入指定的次数,当用户输入0或负值时结束输入。查看运行100项、1000项、10000项后的总和,是否发现每个序列都收敛于某值?
#include<stdio.h> #include <math.h> int main(void) { double n1,n2,sum1,sum2,dishu; int time,t,i; sum1=0.0; i=1; printf("请输入次数\n"); scanf("%d",&time); while(i<=time) { dishu=1.0*i; sum1=sum1+1.0/dishu; sum2=sum2+pow(-1,i)*1.0/dishu; i++; } printf("第一个序列的和为%lf\n",sum1); printf("第二个序列的和为%lf\n",sum2); return 0; }
13.编写一个程序,创建一个包含8个元素的int类型数组,分别把数组元素设置为2的前8次幂。使用for循环设置数组元素的值,使用do while循环显示数组元素的值。
#include<stdio.h> #include <math.h> int main(void) { int a[8]; int i; for(i=0;i<8;i++) a[i]=pow(2,i); i=0; do { printf("%d\n",a[i]); i++; }while(i<8); return 0; }
14.编写一个程序,创建两个包含8个元素的double类型数组,使用循环提示用户为第一个数组输入8个值。第二个数组元素的值设置为第一个数组对应元素的累积之和。例如,第二个数组的第4个元素的值是第一个数组前4个元素之和,第二个数组的第5个元素的值是第一个数组前5个元素之和(用嵌套循环可以完成,但是利用第二个数组的第5个元素是第二个数组的第4个元素与第一个数组的第5个元素之和,只用一个循环就能完成任务,不需要使用嵌套循环)。最后,使用循环显示两个数组的内容,第一个数组显示成一行,第二个数组显示在第一个数组的下一行,而且每个元素都与第一个数组各元素相对应。
#include<stdio.h> int main(void) { double a[8],b[8]; int i; printf("请为第一个数组输入8个值\n"); printf("温馨提示数组的元素的输入换行符和空格\n"); for(i=0;i<8;i++)//这是第一个数组的输入 scanf("%lf",&a[i]); b[0]=a[0]; for (i=1;i<8;i++) { b[i]=b[i-1]+a[i]; } printf("这是第一个数组的值\n"); for(i=0;i<8;i++) { printf("%10.2lf",a[i]); } printf("\n"); printf("这是第二个数组的值\n"); for(i=0;i<8;i++) printf("%10.2lf",b[i]); return 0; }
15.编写一个程序,读取一行输入,然后把输入的内容倒序打印出来。可以把输入存储在char类型的数组中,假设每行字符不超过255。回忆一下,根据%c转换说明,scanf()函数一次只能从输入中读取一个字符,而且在用户按下Enter键时scanf()函数会生成一个换行字符(\n)。
#include<stdio.h> #include <string.h> #define max 255 int main(void) { char num[max]; int t,k; printf("请输入一组内容\n"); scanf("%s",num); t=strlen(num); printf("倒叙的内容是\n"); for(k=t-1;k>=0;k--) printf("%c",num[k]); return 0; }
16.Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资的10%)。Deirdre以5%的复合利息投资了100美元(也就是说,利息是当前余额的5%,包含之前的利息)。编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并显示那时两人的投资额。
#include<stdio.h> int main(void) { int year; double account1,account2,sum2;//1代表daphne 2代表deirdre for(account1=account2=100.0,year=1.0;account1>=account2;year++) { account1=100.0+100.0*year*0.1; account2=account2+account2*0.05 ; } printf("历经了%d年\n",year); printf("deirdre的投资额是%lf\ndaphne的投资额是%lf",account1,account2); return 0; }
17.Chuckie Lucky赢得了100万美元(税后),他把奖金存入年利率8%的账户。在每年的最后一天,Chuckie取出10万美元。编写一个程序,计算多少年后Chuckie会取完账户的钱?
#include<stdio.h> int main(void) { int year=1,accountbalance=100; while(accountbalance>10) { accountbalance=accountbalance+accountbalance*0.08-10; year++; } printf("历经%d年,100万花完了\n",year); return 0; }
18.Rabnud博士加入了一个社交圈。起初他有5个朋友。他注意到他的朋友数量以下面的方式增长。第1周少了1个朋友,剩下的朋友数量翻倍;第2周少了2个朋友,剩下的朋友数量翻倍。一般而言,第N周少了N个朋友,剩下的朋友数量翻倍。编写一个程序,计算并显示Rabnud博士每周的朋友数量。该程序一直运行,直到超过邓巴数(Dunbar’s number)。邓巴数是粗略估算一个人在社交圈中有稳定关系的成员的最大值,该值大约是150。
#include<stdio.h> int main(void) { int sum,time,i; for (i=1,sum=5;sum<150;i++) { sum=(sum-i)*2; printf("第%d周达到了朋友数%d\n",i,sum); } printf("第%d周超过邓巴数。达到了%d\n",i-1,sum); return 0; }
代码分析
这里就上面的所有代码练习
可以分为两种类型
1.图形输出型
5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:
打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。
#include<stdio.h> int main(void) { char end,begin,s,y; //1 int i,j,k; //2 printf("请输入最终大写字母\n"); //3 scanf("%c",&end); //4 j=end-'A'+1;//j才是真正的次数 //5 for(i=1;i<=j;i++)//1---j次数 //6 { for(k=1;k<=j-i;k++) //7 { printf(" "); //8 }//输出空格 for(s='A';s<'A'+i;s++)//输出升序打印字母 //9 printf("%c",s); //10 for(y='A'+i-2;y>='A';y--)//输出降序打印字母 //11 printf("%c",y); //12 printf("\n"); //13 } return 0; }
就拿最难的为例分析
我们要明白for()嵌套循环的关键就是
外层循环输出行。
内层循环输出行对应的每一个列数的值
整个程序的流程就是1.一个输入函数接收最后的字母
2.三个for循环分别处理空格,升序打印字母,降序打印字母
这道题的难点就是
就是for循环的数据表达式
1.第五行的j的意思就是j=就是包括自己在内的前面所有字母的个数。
2.第六行的表达式输出行数。应该很好理解
3.第7,9,11行的表达式因为你必须先找到规律。空格数。每一行的空格数1---(j-i)个
同理下面的9.11行的数据表示一样
2.数据递增型和数据不跟据之前递增型
整个具体例子就是代码练习中的15.16.17。就选一个代表性的16来进行表达式的书写。
#include<stdio.h> int main(void) { int year; double account1,account2,sum2;//1代表daphne 2代表deirdre for(account1=account2=100.0,year=1.0;account1>=account2;year++) { account1=100.0+100.0*year*0.1; account2=account2+account2*0.05 ; } printf("历经了%d年\n",year); printf("deirdre的投资额是%lf\ndaphne的投资额是%lf",account1,account2); return 0; }