重新学习c语言实验《c primer plus》( c控制语句:循环)

学习方法和学习平台见第一章。

温馨提示:不看学习内容。这个部分是为了整体的了解这一章学的什么,方便以后知识点的检索,对于代码的编写没有影响

学习内容

● 关键字——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;
 } 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在变秃的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值