循环结构程序设计
P115 5.1 用while计算1至100的合.
#include
int main()
{
int i=1,sum=0;
while(i<=100) //对于需要运算的值,要么在运算前可以赋值,要么一开始要指定.
{
sum=sum+i;
i++;
}
printf("The sum is %d .\n",sum);
return 0;
}
#include
int main()
{
int i=1,sum=0;
do// do-while可以做的事,用while都可以做到.
{ //do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行.
sum=sum+i;
i++;
}while(i<=100);
printf("The sum is %d .\n",sum);
return 0;
}
P118 5.3 比较do-while与while的差别.
#include
{
int i,sum=0;
printf("Please input a number :");
scanf("%d",&i); //输入10以内,正常,11的话,则sum仍然是0.
while(i<=10)
{
sum=sum+i;
i++;
}
printf("The sum of 1-10 is %d .\n",sum);
return 0;
}
#include
int main()
{
int i,sum=0;
printf("Please input a number :");
scanf("%d",&i); //输入10以内,结果一样.输入11的话,先做操作,所以sum=11.
do
{
sum=sum+i;
i++;
}while(i<=10); //此重点在于理解二者的差别.
printf("The sum of 1-10 is %d .\n",sum);
return 0;
}
#include
int main()
{
int i,b=0,a,c;
for(i=0;i<=1000;i++)
{
printf("Please input amount :"); //循环体内套有输出语句以及跳出语句.
scanf("%d",&a);
b=b+a;
if(b>=100)
break; //break是用于跳出循环,对if无效,对while for switch 这一类.
}
}
c=b/i;
printf("conut is %d , aver is %d ",i+1,c); //注意%号后的形式,否则可能输出错误.
return 0;
}
P127 5.5 continue的例子.
#include
int main()
{
int i;
for(i=1;i<20;i++)
{
if(i%3!=0)
{
continue; //跳过本次I,执行下一个i.
}
printf("%d ",i);
}
printf("\n");
return 0;
}
P128 5.6 形成一个4*5的矩阵.
#include
int main()
{
int i,j,a=0; //没有给初值,会出现警告: 使用了未初始化的局部变量“a”.
for(i=1;i<=4;i++)
{
for(j=1;j<=5;j++,a++) // a用来控制换行.
{
if(a%5==0)
{
printf("\n");
}
printf("%d\t",i*j);
}
}
printf("\n");
return 0;
}
P131 5.7 用一个交错的式子求哌的近似值.
#include
#include
int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).
{
float s=1,n=1,m,sum=0,t;
for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去.
{ //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环.
t=(s)*(n/m); //这是第一项,s是符号,
if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去.
{
break;
}
sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了.
s=s*(-1); //变号一次.
}
printf("四分之一哌的值是%f.\n",sum);
printf("一个完整哌的值是%f.\n",sum*4);
return 0;
}
//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.
//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.
//#include
//
//int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 warning C4305: “=”: 从“double”到“float”截断.
//{
// float m,a,b,c; //一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0.
// int d,e,f;
// m=1;
// a=1.0/3;
// b=1/3;
// c=m/3;
// d=1.0;
// e=1/4;
// f=1.0/4;
// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c); //不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.
// printf("%d\n%d\n%d\n",d,e,f); //但是,不相应的int型不可以用%f来输出的.因为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的!!!!
// return 0;
//}
P133 5.8 著名的Fibonacci(费波那契数列问题)
#include
int main() //这个就是著名的Fibonacci(费波那契数列问题)
{
int f1=1,f2=1,f3,i;
printf("%12d\n%12d\n",f1,f2);
for(i=1;i<=38;i++) //注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!!
{
f3=f1+f2;
printf("%12d\n",f3); //这个问题同样适用于"一对兔子一个月生一对"的问题.,
f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是.
f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.
}
return 0;
}
#include
#include
int main()
{
double num;
int i;
printf("Please input a number :");
scanf("%lf",&num); //因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换.
for(i=2;i<=sqrt(num);i++) //这边是<=号没错.
{
if((int)num%i==0) //如果在这期间有任何一个可以为零的话,则不是素数.
{
break; //当然跳出.
}
} //执行到这里的时候,i=5,已经变成了!!
if(i<=sqrt(num))
{
printf("Not %d",(int)num);
}
else//如上所述,i=5,超出了求根的值,所以是素数.
{
printf("Yes %d",(int)num);
}
return 0;
}
#include
#include
int main()
{
double j;
int i,k=0;
for(j=100;j<=200;j++)
{
for(i=2;i<=sqrt(j);i++)
{
if((int)j%i==0)
{
break;
}
}
k=k+1; //这里是布局的开头.学习一下,有助逻辑.
if(i<=sqrt(j))
{
printf("Not %d ",(int)j);
if(k%5==0) //5个换一次行.
{
printf("\n");
}
}
else
{
printf("Yes %d ",(int)j);
if(k%5==0)
{
printf("\n");
}
}
}
return 0;
}
P139 5.11 密码转换.
#include
int main()
{
char c;
c=getchar();
while(c!='\n') //这也可以用数组来实现.
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
{
if((c>='w'&&c<='z')||(c>='W'&&c<='Z'))
{
c=c-22;
}
else
{
c=c+4;
}
printf("%c",c);
c=getchar(); //套在循环里,依次得到字母,而while中判断回车为结束.
}
}
printf("\n"); //这是布局问题.
return 0;
}
P140 0.3 最大公约数和最小公倍数.
#include
main ()
{
int m, n, c, d;
int gcd(); //这是最大公约数的缩写,此处调用函数,可以不写里面的实参.
int lcm(); //这是最小公倍数的缩写,此处调用函数,可以不写里面的实参.
printf("Please input two number :\n");
scanf("%d %d",&m,&n);
c=gcd(m,n); //c获取最大公约数
d=lcm(m,n); //d获取最小公倍数
printf("The GCD of %d and %d is : %d !\n", m, n, c);
printf("The LCM of %d and %d is : %d !\n", m, n, d);
return 0;
}
int gcd(int x, int y) //最大公约数Greatest Common Divisor
{
int temp;
while(x%y!=0)
{
temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去.
y=x%y; //x,y的余数作为下一轮中的Y,由x%y来取得.
x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用.
}
return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理. }
int lcm(int x, int y) //最小公倍数Lowest Common Multiple
{
int i, temp;
if(x { //以下为经典三行码,实现两个数的互换. temp=x; x=y; y=temp; } for(i=1; i<=y; i++) //设定一个区间,从1至大的数之间的循环. { if(!((x*i)%y)) //此式子如有余数,加上"!"号,会是假,则不返回,进行下一轮. { //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数. return x*i; } } } P140 0.4 判断一串输入的字符. #include int main() { char ch; int a=0,b=0,c=0,d=0,e=0; printf("Please input the string\n"); while((ch=getchar())!='\n') //直到回车. { if(ch<='z'&&ch>='a') { a++; } else if(ch==' ') { c++; } else if(ch<58&&ch>47) { d++; } else if(ch<='Z'&&ch>='A') { b++; } else { e++; } } printf("大写%d 小写%d 空格%d 数字%d 其它%d\n",a,b,c,d,e); } #include int main() //想办法既快速做完,又要消化理解!!! { int temp,i,a,n,sum=0; //主逻辑,友好性暂时放松. scanf("%d %d",&a,&n); //a是数字,n是要乘的个数. temp=a; //先把第一阶的值存起来. for(i=0;i { sum=sum+a; printf("%d + ",a); //事关布局. a=a*10+temp; //重点是每次乘,然后加上上一个数. } printf("= %d .",sum); return 0; } P140 0.6 1!+2!+3!+4!.....的值. #include int main() //1!+2!+3!+4!..... { int i,j,k,sum=0,m=1; scanf("%d",&k); //比如设定为,值为. for(i=1;i<=k;i++) //第一层循环,指定到. { for(j=1;j<=i;j++) //第二层循环,指定至当前数. { m=m*j; } //到此是阶乘的结构. sum=sum+m; m=1; } printf("%d",sum); //完全不理解时,搜索并参考. return 0; //尝试自己做,第一次做出来就是自己的东西了. } #include int main() { int a,b; double c,asum=0,bsum=0,csum=0; for(a=1;a<=100;a++) //三个块分别注释验证结果. { asum=asum+a; } for(b=1;b<=50;b++) //在VS运行中,注意*.cpp为C++语言. { bsum=bsum+b*b; //为了避免语言差别,请注意文件名为*.c. } for(c=1;c<=10;c++) //c作浮点运算,所以定义在double类型中. { csum=csum+1/c; } printf("%lf",asum+bsum+csum); return 0; } P P #include #include int main() { int j,k,s[6],x=100,y,sum=0; for(j=153;j<=154;j++) { for(k=2;k>=0;k--) { s[k]=j%(int)pow(10,k+1)/(int)pow(10,k); y=pow(s[k],3); sum+=y; printf("%d-%d--%d\t",k,s[k],j); } printf("%d\n",sum); } return 0; } P140 0.8 水仙花数. //#include // //int main() //在%和/号之间,以前pow.以后再做. //{ // int i,j,k,a,b,c,sum=0; //这里逻辑对,算出来却错了. // for(i=2;i<=4;i++) //计算机在想什么,看来它的大脑难以模拟. // { // for(j=pow(10,i);j<=pow(10,i+1)-1;j++) //我不完全明白它遵守的逻辑. // { // for(k=0;k<=i;k++) // { // sum+=pow((j%pow(10,i+1)/pow(10,i)),3); // } // if(sum==j) // { // printf("%d 是水仙花数!\n",j); // } // sum=0; // } // } // return 0; //} //为什么还是无法实现?! #include #include int main() { int a,b,c,i,sum=0; //这里只计算三位数的. for(i=100;i<1000;i++) { a=i/100; b=i%100/10; c=i%10; sum+=a*a*a+b*b*b+c*c*c; if(sum==i) { printf("%d 是水仙花数.\n",i); } sum=0; } return 0; } P141 0.9 完数. #include int main() { int i,j,r; for(i=1;i<=1000;i++) //零是个临界值,不能包括它. { r=0; //每次清零重来.类似水仙中的sum. for(j=1;j { if(i%j==0) //除得尽即是因子. { r=r+j; //然后累加进去. } } if(r==i) //若相等. { printf("%d 是完数.\n",i); } } return 0; } P141 0.10 2/1+3/2+5/3+8/5+13/8…#include int main() //10.007051 { double i,a=2,b=1,c,s=0; //a是分子,b是分母. for(i=0;i<6;i++) //二十可以用户指定. { s+=a/b; //中间储值变量. c=a+b; b=a; a=c; } printf("%lf\n",s); return 0; } #include int main() //从一百开始,减一半再自加两次,下降一次,反弹一次. { double sum=100,high=100,up,donw,i; for(i=1;i<10;i++) //不管指定到哪个数,都不会超过三百. { up=high/2; donw=up; high=donw; //自咬尾巴问题. sum+=donw*2; } printf("%lf %lf\n",donw,sum); return 0; } P141 0.12 猴子吃桃子. #include int main() //从一百开始,减一半再自加两次,下降一次,反弹一次. { int i,sum=1; for(i=1;i<=10;i++) //临界要清楚,结果要与手算的前几个实例相匹配. { printf("倒数第%d天还剩有%d个桃子.\n",i,sum); sum=(sum+1)*2; } //printf("%d\n",sum); return 0; } P141 0.16 输出星号棱形图案. #include #include main() //只关注左半部分.右半部分无视空格. { int i,j,k,m=6; //m可指定,指定中心点位置.可任意奇偶. for(i=1;i<=m;i++) //上半部分.其实也是正三角. { for(j=1;j<=m-i;j++) //一到中心点前i个位置填充空格. printf(" "); for(k=1;k<2*i;k++) //空格后向前填充星号的个数.是奇数.一,三,五... printf("*"); printf("\n"); } for(i=m-1;i>0;i--) //下半部分.其实也是倒三角. { //减一是因为行数问题.这是中心行以下的. for(j=m-1;j>=i;j--) printf(" "); for(k=1;k<2*i;k++) printf("*"); printf("\n"); } getch(); //用户反应后结束.但,没必要. } 第一章 1.5题 #include C语言程序设计谭浩强第四版期末复习重点 Newly compiled on November 23, 2020 第一章 程 序设计和C 语言 .什么是计算机程序 程序.. :一组计算机能识别和执行的指令。只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作 计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成。 什么是计算机语言 计算机语言:人和计算机交流信息的、计算机和人都能识别的语言。 计算机语言发展阶段:机器语言(由0和1组成的指令) 符号语言(用英文字母和数字表示指令) 高级语言(接近于人的自然语言和数学语言) 面向过程的语言(非结构化的语言、结构化语言);面向对象的语言 语言的发展及其特点 C 语言是一种用途广泛、功能强大、使用灵活的过程性编程语言,既可用于编写应用软件,又能用于编写系统软件。因此C 语言问世以后得到迅速推广。 C 语言主要特点: 语言简洁、紧凑,使用方便、灵活。(只有37个关键字、9种控制语句;程序书写形式 自由,源程序短) 运算符丰富。(34种运算符;把括号、赋值、强制类型转换等都作为运算符处理;表达 式类型多样化) 数据类型丰富。(包括:整型、浮点型、字符型、数组类型、指针类型、结构体类型、共用体类型;C99又扩充了复数浮点类型、超长整型、布尔类型;指针类型数据,能用来实现各种复杂的数据结构的运算。) 具有结构化的控制语句。(如if…else语句、while语句、do…while语句、switch语句、for语句用函数作为程序的模块单位,便于实现程序的模块化;C语言是完全模块化和结构化的语言) 语法限制不太严格,程序设计自由度大。(对数组下标越界不做检查;对变量的类型使用比较灵活,例如,整型量与字符型数据可以通用;C语言允许程序编写者有较大的自由度,因此放宽了语法检查) 允许直接访问物理地址,能进行位操作,可以直接对硬件进行操作。(C语言具有高级语言的功能和低级语言的许多功能,可用来编写系统软件;这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言) 用C语言编写的程序可移植性好。(C的编译系统简洁,很容易移植到新系统;在新系统上运行时,可直接编译“标准链接库”中的大部分功能,不需要修改源代码;几乎所有计算机系统都可以使用C语言) 生成目标代码质量高,程序执行效率高。 1.C语言允许用两种注释方式:计算法 3.编写程序 4.对源程序进行编辑、编译和连接 5. 运行程序,分析结 6.编写程序文档 第二章算法——程序的灵魂 一个程序主要包括以下两方面的信息: (1) 对数据的描述。在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,这就是数据结构。 (2) 对操作的描述。即要求计算机进行操作的步骤,也就是算法。 数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。 着名计算机科学家沃思(Nikiklaus Wirth)提出一个公式:算法 + 数据结构 = 程序 谭浩强c++程序设计课后答案 娄警卫《c++程序设计》谭浩强课后习题答案
C语言程序设计谭浩强第四版期末复习重点
(完整版)谭浩强c程序设计课后习题答案