C Primer Plus 第六章 C控制语句:循环
复习题:
1.
quack=7;
quack=70;
quack=64;
quack=8;
quack=2;
36 18 9 4 2 1;如果是double型会陷入无限循环//补充:循环会一直执行
到浮点数下溢生成0为止,另外double型用%3d转换说明也会产生错误
a.x>5
b.(scanf("%lf",&x)==0)
c.x==5;
a.(scanf("%d",&x)==1)
b.x!=5
c.x>=20
第四行的数组声明中标明数组元素的个数应该用[]而不是();
第六行的for语句中三个表达式用分号隔开,不能用逗号;
//第十一行漏了一个外层for循环的花括号,第九行的
j>=i的条件应该改成j<=1,否则会在里面的那个循环里面重复循环
#include<stdio.h>
int main(void)
{
int i,j;
for(i=1;i<=4;i++)
{
for(j=1;j<=8;j++)
{
printf("$");
}
printf("\n");
}
}
a.
Hi! Hi! Hi! Bye! Bye! Bye! Bye! Bye!
b.
ACGM
a.
Go west, youn
b.
o west, young
c.
$o west, youn
31|32|33|30|31|32|33|
***
1
5
9
13
17//没有17
***
2 6
4 8
8 10
16 12//没有16 12
***
======
=====
====
===
==
a.mint
b.10
c.double
c.ii
看不出来//因为第一个元素的索引是0,所以循环的范围应该是0~SIZE-1,而不是1~SIZE,但是如果只改了这一个地方,会导致赋给第一个元素的值是0,所以两个循环应该这样写:
for(index=0;index<SIZE;index++)
by_twos[index]=2*(index+1);
for(index=0;index<SIZE;index++)
printf("%d",by_twos[index]);
返回值类型、函数名、返回值变量名//该函数应声明为返回类型为long,并包含一个long类型的return语句
把num的类型强制转换成long类型,确保计算使用long类型而不是int类型。在int为16位的系统中,两个int类型值的乘积在返回之前会被截断为一个int类型的值。这可能会丢失数据。
long square(int num)
{
return((long)num*num;
}
1:HI!
k=1
k is 1 in the loop
Now k is 3
3:HI!
k=3
k is 3 in the loop
Now k is 5
5:HI!
k=5
k is 5 in the loop
Now k is 7
7:HI!
k=7
编程练习:
1.编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小写字母。然后打印数组的所有内容。
#include<stdio.h>
int main(void)
{
char ch[26];
int i;
for(i=0;i<=25;i++)
{
ch[i]='A'+i;
printf("%c",ch[i]);
}
return 0;
}
2.使用嵌套循环,按照下面的格式打印字母:
$
$$
$$$
$$$$
$$$$$
#include<stdio.h>
int main(void)
{
int i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=i;j++)
{
printf("$");
}
printf("\n");
}
return 0;
}
3.使用嵌套循环,按照下面的格式打印字母:
F
FE
FED
FEDC
FEDCB
FEDCBA
#include<stdio.h>
int main(void)
{
int i,j;
char ch;
for(i=1;i<=6;i++)
{
for(j=1,ch='F';j<=i;j++,ch--)
{
printf("%c",ch);
}
printf("\n");
}
return 0;
}
4.使用嵌套循环,按照下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
#include<stdio.h>
int main(void)
{
int i,j;
char ch='A';
for(i=1;i<=6;i++)
{
for(j=1;j<=i;j++)
{
printf("%c",ch);
ch++;
}
printf("\n");
}
return 0;
}
5.使用嵌套循环,提示用户输入大写字母,按照下面的格式打印字母:
(提示:打印这样的图形,要根据用户输入的大写字母决定。例如,下面的图形是在用户输入E之后的输出结果。用外层循环处理行,美航适用三个内层循环,分别处理空格、以升序打印字母、以降序打印字母。)
A
ABA
ABCBA
ABCDCBA
ABCDEDEBA
#include<stdio.h>
int main(void)
{
char ch,line;
int blank;
char positive,inverted;
printf("Please enter a charactor:");
scanf("%c",&ch);
for(line='A';line<=ch;line++)
{
for(blank=ch-line;blank>=0;blank--)
{
printf(" ");
}
for(positive='A';positive<=line;positive++)
{
printf("%c",positive);
}
for(inverted=line-1;inverted>='A';inverted--)
{
printf("%c",inverted);
}
printf("\n");
}
return 0;
}
6.编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。要求用户输入表格的上下限。使用一个for循环。
#include<stdio.h>
int main(void)
{
int min,max;
int i;
printf("Please enter an integer as a minimum:");
scanf("%d",&min);
printf("Please enter an integer as a maximum:");
scanf("%d",&max);
printf("整数 平方 立方\n");
for(i=min;i<=max;i++)
{
printf("%4d%8d%8d\n",i,i*i,i*i*i);
}
return 0;
}
7.编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。(提示:strlen()函数可以计算数组最后一个字符的下标)
#include<stdio.h>
#include<string.h>//提供strlen()函数的原型
int main(void)
{
char ch[40];
int i;
printf("Please enter a word:");
scanf("%s",ch);//使用%s转换说明时,scanf语句不用&前缀
printf("The inverted sequence of this word is:");
for(i=strlen(ch);i>=0;i--)
{
printf("%c",ch[i]);
}
printf("\n");
return 0;
}
8.编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每队值。
#include<stdio.h>
int main(void)
{
float num1,num2;
printf("Please enter two float(q to quit):");
while(scanf("%f %f",&num1,&num2)!=0)
{
printf("The result of (num1-num2)/(num1*num2) is: %.2f\n",(num1-num2)/(num1*num2));
printf("Please enter two float(q to quit):");
scanf("%f %f",&num1,&num2);
}
printf("bye");
return 0;
}
9.修改练习8,使用一个函数返回计算结果。
#include<stdio.h>
float count(float x1,float x2);
int main(void)
{
float num1,num2,result;
printf("Please enter two float(q to quit):");
while(scanf("%f %f",&num1,&num2)!=0)
{
result=count(num1,num2);
printf("The result of (num1-num2)/(num1*num2) is: %.2f\n",result);
printf("Please enter two float(q to quit):");
scanf("%f %f",&num1,&num2);
}
printf("bye");
return 0;
}
float count(float x1,float x2)
{
float y;
y=(x1-x2)/(x1*x2);
return y;
}
10.编写一个程序,要求用户输入一个上限整数和一个下限整数,计算从上限整数到下限整数范围内所有整数的平方和,并显示计算结果。然后再提示用户输入上限整数和下限整数,直到用户输入的上限整数小于或等于下限整数为止。
#include<stdio.h>
int main(void)
{
int min,max;
int i;
long s;
printf("Enter lower and upper integer limit:");
scanf("%d %d",&min,&max);
while(min<max)
{
s=0;//s=0如果放while循环外面的话,s会计算每次的输入后计算出来的和
for(i=min;i<=max;i++)
{
s=s+i*i;
}
printf("The sums of the squares from %d to %d is %ld\n",min*min,max*max,s);//long类型的转换符要用%ld
printf("Enter lower and upper integer limit:");
scanf("%d %d",&min,&max);
}
printf("Bye");
return 0;
}
11.编写一个程序,在数组中读取8个整数,然后倒序打印这8个整数。
#include<stdio.h>
int main(void)
{
int array[8];
int i;
for(i=1;i<=8;i++)//整型数组一定要用循环逐个数字读入?跟字符串数组不一样
{
printf("Please enter the integer%d:",i);
scanf("%d",&array[i-1]);
}
printf("The inverted sequence of the numbers you have entered right now:");
for(i=7;i>=0;i--)
{
printf("%d ",array[i]);
}
printf("That's all.");
}
12.考虑下面两个无限序列:
1.0+1.0/2.0+1.0/3.0+1.0/4.0+…
1.0-1.0/2.0+1.0/3.0-1.0/4.0+…
编写一个程序分别计算这两个无限序列的和,直到到达某次数。让用户交互地输入指定的次数,当用户输入0或负数的时候结束输入。查看运行100项、1000项、10000项后的总和,看是否收敛于某个数值。
#include<stdio.h>
int main(void)
{
int n,i;
double s1,s2;
int sign;
printf("Please enter the calculation times(0 or negative number to quit):");
scanf("%d",&n);
while(n>0)
{
s1=0.0;
s2=0.0;
sign=1;
for(i=1;i<=n;i++)
{
s1+=(1.0/i);//此处要求i必须是浮点型,否则整型除以整型得到的结果也会是整型 ,或1/i要写成1.0/i
s2+=sign*(1.0/i);
sign=-sign;
}
printf("The result of these sequences are: %lf %lf\n",s1,s2);
printf("Please enter the calculation times(0 or negative number to quit):");
scanf("%d",&n);
}
printf("Bye");
return 0;
}
13.编写一个程序,创建一个包含8个元素的int类型数组,分别把数组元素设置为2的前8次幂。用for循环设置数组元素的值,使用do while循环显示数组的值。
#include<stdio.h>
int main(void)
{
int a[8];
int i;
for(i=0;i<=6;i++)
{
a[0]=2;
a[i+1]=a[i]*2;
}
do
{
printf("%d ",a[i]);
i--;
}while(i>=0);
return 0;
}
14.编写一个程序,
#include<stdio.h>
int main(void)
{
int i;
double a1[8],a2[8];
for(i=0;i<=7;i++)
{
printf("Please enter the float%d:",i+1);
scanf("%lf",&a1[i]);
}
for(i=0;i<=7;i++)
{
a2[0]=a1[0];
a2[i+1]=a2[i]+a1[i+1];
printf("%5.2lf ",a1[i]);
}
printf("\n");
for(i=0;i<=7;i++)
{
printf("%5.2lf ",a2[i]);
}
printf("\n");
}
#include<stdio.h>
#include<string.h>
int main(void)
{
char ch[255];
int i;
printf("Please enter a string:");
scanf("%s",ch);
for(i=strlen(ch)-1;i>=0;i--)
{
printf("%c",ch[i]);
}
printf("\n");
return 0;
}
#include<stdio.h>
int main(void)
{
double mDaphne=100,mDeirdre=100;
int i=0;
while(mDaphne>=mDeirdre)
{
mDaphne+=10;
mDeirdre+=mDeirdre*0.05;
i++;
}
printf("%d years later Deirdre will be richer than Daphne.\n",i);
printf("And at that time Deirdre would has $%.2lf, Daphne whould has $%.2lf.\n",mDeirdre,mDaphne);
return 0;
}
#include<stdio.h>
int main(void)
{
double m=1000000;
int i=0;
while(m>0)
{
m=m+m*0.08-100000;
i++;
}
printf("After %d years, the money in bank would all be taken away.\n",i);
return 0;
}
#include<stdio.h>
int main(void)
{
int fr=5;
int i=1;
while(fr<=150)
{
printf("Week%d, Dr.Rabnud has %d friends.\n",i-1,fr);
fr=(fr-i)*(fr-i);
i++;
}
printf("Too many.\n");
return 0;
}