循環(huán)結(jié)構(gòu)程序設(shè)計(jì)
求1000以內(nèi)所有的水仙花數(shù)
任務(wù):求1000以內(nèi)所有的水仙花數(shù)。若一個 3 位整數(shù)的各位數(shù)字的立方之和等于這個整數(shù),稱之為“水仙花數(shù)”。
#include <stdio.h>
int main()
{
//掌握水仙花數(shù)算法,關(guān)鍵在于提取百位、十位、個位的方法
/********** Begin **********/
int a,b,c,x;
for(x=100;x<1000;x++)
{
a=x%10;//a為x個位數(shù)
b=x/10%10;//b為x十位數(shù)
c=x/100;//c為x的百位數(shù)
if(a*a*a+b*b*b+c*c*c==x)
printf("%d ",x);
}
/********** End **********/
return 0;
}
注:
- 前面題目寫過,取余可以提取刀整數(shù)的末尾數(shù)字,只要逐步提取出來判斷就行。
- 不能改變x的值(如x<10),否則循環(huán)一直無法達(dá)到x<1000,會陷入死循環(huán)。
用for循環(huán)求s=a+aa+aaa+aaaa+…的值
任務(wù):輸入正整數(shù)a和n,計(jì)算s=a+aa+aaa+aaaa+aa…a(n個a)的值。注意不是乘而是如這樣的5+55+555
#include <stdio.h>
int main(void)
{
// 請?jiān)诖颂砑哟a
/********** Begin *********/
int a,n,sum,num,i;
scanf("%d%d",&a,&n);
for(i=1,sum=0,num=0;i<=n;i++)
{
num+=a*pow(10,i-1);
sum+=num;
}
printf("%d",sum);
/********** End **********/
return 0;
}
- 這里設(shè)置i是為了更好的控制循環(huán),保證有n個a。
- num是記錄每次a的值(即,a,aa,aaa…)然后加給sum。
輸入某班C語言考試成績,人數(shù)未知,用-1作為結(jié)束標(biāo)志,若大于100分,則重新輸入,計(jì)算全班的最高分、最低分與平均分
任務(wù):輸入某班C語言考試成績,該班人數(shù)未知,用 -1 作為結(jié)束標(biāo)志,若輸入大于 100 分或小于 0 分,則重新輸入,然后計(jì)算全班的最高分、最低分與平均分。
#include <stdio.h>
int main()
{
double temp,sum,avg,max,min;
int i=0;
/*********Begin*********/
max=0;
min=100;
while(temp!=-1)
{
scanf("%lf",&temp);
if(temp>100||temp<0)
continue;
i++;
sum+=temp;
avg=sum/i;
max=(temp>max)?temp:max;
min=(temp<min)?temp:min;
}
/*********End**********/
if(i!=0)
{
avg=sum/i;
printf("全班一共有學(xué)生:%d\n",i);
printf("全班平均分:%.1lf\n",avg);
printf("全班最高分:%.1lf\n",max);
printf("全班最低分:%.1lf\n",min);
}
else
printf("輸入了0個合法的分?jǐn)?shù)\n");
return 0;
}
注:
- 輸入要大于100,小于0,所以再scanf后接著條件判斷接continue,直接篩掉不符合條件的值,一定要馬上接條件判斷,不影響后面的值。
- 輸入一個正確值,i就遞增,循環(huán)結(jié)束就能知道班級人數(shù),用總分除人數(shù)得平均分。
- max=0,min=100,先設(shè)置好,這樣在后面不斷比較中,替換掉max,min值。
- 這里運(yùn)用了條件運(yùn)算符()?:,當(dāng)然也可以用if else條件句代替,只是這樣做代碼更簡潔。
打印九九乘法口訣表
任務(wù):根據(jù)提示,在右側(cè)編輯器補(bǔ)充代碼,輸出上三角的的乘法口訣表。
#include <stdio.h>
int main()
{
/********** Begin **********/
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
if(j>=i)
printf("%d*%d=%d",i,j,i*j);
printf("\t");
}
printf("\n");
}
/********** End **********/
return 0;
}
注:觀察可知,上三角里面的j>=i,設(shè)置一個if條件判斷就行,但是制表符要提出來,如果不提出來,制表符也會受if條件限制,只要j<i就不打印制表符,打印制表符數(shù)量大大減少,就會打印為左上三角,如圖:
求正整數(shù)n之內(nèi)的所有完數(shù)
任務(wù):練習(xí)-輸入正整數(shù)n,求n之內(nèi)的所有完數(shù)。(練習(xí)-輸入正整數(shù)n,求n之內(nèi)的所有完數(shù)。因子是質(zhì)數(shù)或1)
#include <stdio.h>
int main()
{ //完數(shù)等于因子之和,因子包括質(zhì)數(shù)和1
/********** Begin **********/
int m,n,i,sum;//變量m為質(zhì)數(shù)
scanf("%d",&n);
for(m=1;m<=n;m++)//第一個循環(huán)更新m,第二個循環(huán)更新i
{
for(i=1,sum=0;i<m;i++)
{
if(m%i==0)
sum+=i;
}
if(sum==m)
printf("%d ",sum);
}
/********** End **********/
return 0;
}
-
判斷質(zhì)數(shù):設(shè)置變量m,檢測n以內(nèi)的所有質(zhì)數(shù),所以n<=m,且m++。設(shè)置內(nèi)部循環(huán),判斷質(zhì)數(shù),質(zhì)數(shù)是只有本身和1能除盡,所以令i++,設(shè)置i<m且i=1,這樣遍歷所有數(shù)直到m的前一個值。若無可以除盡的就說明這個數(shù)是質(zhì)數(shù)。
-
內(nèi)循環(huán)每次將sum設(shè)置為0保證sum不會將前面的值加進(jìn)來
sum就是從1開始的質(zhì)數(shù)的和,若有質(zhì)數(shù)m等于sum,那么這個質(zhì)數(shù)就是完數(shù)。
輸入兩個正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)
任務(wù):輸入兩個正整數(shù) m 和 n,求其最大公約數(shù)和最小公倍數(shù)。
相關(guān)知識:
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int m,n,t,m1,n1;
scanf("%d%d",&m,&n);
m1=m;
n1=n;
t = m % n;
while( t )
{
m = n;
n = t;
t = m%n;
}
printf("最大公約數(shù)是:%d\n最小公倍數(shù)是:%d",n,m1*n1/n);
/*********End**********/
return 0;
}
注:這里設(shè)置m1,n1是保留m,n原來的值
用while循環(huán)求1+2+3+…+n之和
任務(wù):輸入 n,使用 while 循環(huán)語句求1+2+3+…+n之和。
#include <stdio.h>
int main()
{
int i=1,sum=0,n;
scanf("%d",&n);
/********** Begin **********/
while(i<=n)
{
sum+=i;
i++;
}
/********** End **********/
printf("sum=%d\n",sum);
return 0;
}
輸入正整數(shù),判斷該數(shù)是否是完數(shù)
任務(wù):一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為完數(shù)。例如6=1+2+3
,編程判斷n
是否是完數(shù),n
從鍵盤輸入。
#include <stdio.h>
int main()
{ //完數(shù)等于因子之和,因子包括質(zhì)數(shù)和1
/********** Begin **********/
int m,n,i,sum;//變量m為質(zhì)數(shù)
scanf("%d",&n);
for(m=1;m<=n;m++)
{
for(i=1,sum=0;i<m;i++)
{
if(m%i==0)
sum+=i;
}
if(sum==n)
printf("Yes\n");
}
if(sum!=n)
printf("No\n");
/********** End **********/
return 0;
}
注:判斷完數(shù)的原理和前面題目相同,但是這里完數(shù)判斷出來,并不將其打印,而是打印YES。不能直接用else打印NO因?yàn)橛匈|(zhì)數(shù)出現(xiàn)出外層循環(huán)時會打印NO,放在循環(huán)外則不會有這種風(fēng)險(xiǎn)。
求Fibonacci數(shù)列的前12個數(shù)
任務(wù):求Fibonacci數(shù)列的前12個數(shù)。Fibonacci數(shù)列有如下特點(diǎn):第1、2 兩個數(shù)為1、1,從第 3 個數(shù)開始,該數(shù)是其前面兩個數(shù)之和,即為: 1,1,2,3,5,8,13,21,……。
輸出格式:
#include <stdio.h>
int main()
{
/********** Begin **********/
int month,sum,s1,s2,i;
for(month=1,sum=1,s1=1;month<=12;month++)
{
s2=sum;
if(month>2)
{
s2=s1;
s1=sum;
sum=s1+s2;
}
printf("第%d月:%d\n",month,sum);
}
/********** End **********/
return 0;
}
-
因?yàn)榈降谌齻€月才開始變化,設(shè)置if進(jìn)行限制。
-
條件s1的值賦給s2,再將sum作為值賦給s1,sum是s1+s2得到的新值,這樣不斷更新保證賦值前s1,s2是sum前兩個值,賦值后s1再和s2相加得到下一個sum值。
隨機(jī)輸入一批整數(shù),編程計(jì)算并且輸出這批整數(shù)中5個正整數(shù)的和
任務(wù):隨機(jī)輸入一批整數(shù),有正整數(shù),負(fù)整數(shù)和零,計(jì)算并且輸出這批整數(shù)中 5 個正整數(shù)的和,當(dāng)讀入的數(shù)據(jù)為負(fù)數(shù)或 0 時,程序忽略此次輸入,直到讀入 5 個正整數(shù)時程序才停止。
#include <stdio.h>
int main()
{
int i, n, sum=0;
/*********Begin*********/
i=0;
while(i<5)
{
scanf("%d",&n);
if(n>0)
{
i++;
sum+=n;
}
else
continue;
}
/*********End**********/
printf("sum=%d\n",sum);
return 0;
}
注:i為正數(shù)的計(jì)數(shù)器,n為輸入的值,如果為正數(shù)就遞增i,并且將正數(shù)加到sum里面。
輸入正整數(shù)n,輸出n以內(nèi)的全部素?cái)?shù),并輸出n以內(nèi)所有素?cái)?shù)個數(shù)
任務(wù):輸入正整數(shù) n,輸出 n 以內(nèi)的全部素?cái)?shù),并輸出 n 以內(nèi)所有素?cái)?shù)個數(shù)。(素?cái)?shù)就是質(zhì)數(shù),一個大于1的自然數(shù),除了1和它自身外,不能被其他自然數(shù)整除的數(shù)叫做質(zhì)數(shù))
#include<stdio.h>
int main()
{
int m,i,n=0,num=0;
scanf("%d",&n);
/*********Begin*********/
for(m=2;m<=n;m++)
{
int is_Prime=1;
for(i=2;i<m;i++)
{
if(m%i==0)
{
is_Prime=0;
break;
}
}
if(is_Prime==1)
{
printf("%d,",m);
num++;
}
}
/*********End**********/
printf("\n%d以內(nèi)共有%d個素?cái)?shù)\n",n,num);
return 0;
}
質(zhì)數(shù)不包括1,所以m,i的初始值都設(shè)為2,設(shè)置is_Prime的目的是為了輸出質(zhì)數(shù),如果不是質(zhì)數(shù)即m%i==0為真,將is_Prime變?yōu)?就防止其輸出,而且直接跳出循環(huán),也不用繼續(xù)內(nèi)層循環(huán)占用空間。如果m%i ==0在內(nèi)層循環(huán)中一直為假,那么is_Prime的值不變,這個數(shù)為質(zhì)數(shù)就會輸出。
輸入正整數(shù)m,判斷m是否是素?cái)?shù)
任務(wù):輸入正整數(shù) m ,判斷 m 是否是素?cái)?shù)。
#include<stdio.h>
int main()
{
int m,i;
scanf("%d",&m);
/*判斷m是否能被2~ m-1之中任何一個整數(shù)整除*/
/*********Begin*********/
int is_Prime=1;
for(i=2;i<m;i++)
{
if(m%i==0)
{
is_Prime=0;
break;
}
}
if(is_Prime==1)
{
printf("%d is a prime number",m);
}
else
printf("%d is not a prime number",m);
/*********End**********/
/*判斷上述循環(huán)語句是否是提前結(jié)束循環(huán)*/
/*********Begin*********/
/*********End**********/
return 0;
}
參照上一題
輸入一行字符,分別統(tǒng)計(jì)出其中的英文字母、空格、數(shù)字和其他字符的個數(shù)
任務(wù):輸入一行字符,以'#'
作為結(jié)束標(biāo)志,分別統(tǒng)計(jì)出其中的英文字母、空格、數(shù)字和其他字符的個數(shù)。
#include <stdio.h>
int main()
{
int letter=0,space=0,digit=0,other=0;
char ch;
//字母、數(shù)字、空格、其它字符的判定方法
/********** Begin **********/
do
{
ch=getchar();
if(ch>=97&&ch<=122||ch>=60&&ch<=95)
letter++;
else if(ch==32)
space++;
else if(ch>=48&&ch<=57)
digit++;
else if(ch=='#')
continue;
else other++;
}
while(ch!='#');
/********** End **********/
printf("字母有%d個,空格有%d個,數(shù)字有%d個,其他字符有%d個\n",letter,space,digit,other);
return 0;
}
-
讀取字符可以選擇getchar()函數(shù)每次讀取一個字符,將他放在循環(huán)里面便可一個一個字符的讀取。
-
選擇do…while循環(huán),可以保證有字符輸入,循環(huán)先執(zhí)行一次,再進(jìn)行條件判斷。
-
使用else if要將#號情況剔除,否則會出現(xiàn)other數(shù)目不對的情況,只需判斷字符輸入輸入中的#利用continue直接進(jìn)行while里面的條件判斷。
用do…while循環(huán)實(shí)現(xiàn)輸入一批整數(shù)統(tǒng)計(jì)正負(fù)數(shù)個數(shù)
任務(wù):用do…while循環(huán)實(shí)現(xiàn)輸入一批整數(shù),以零為結(jié)束標(biāo)志,統(tǒng)計(jì)正負(fù)數(shù)個數(shù)。
#include <stdio.h>
int main()
{
int num,zsum=0,fsum=0;
//循環(huán)輸入與求和
/********** Begin **********/
do{
scanf("%d",&num);
if(num>0) zsum++;
else if(num==0) continue;
else fsum++;
}
while(num!=0);
printf("正數(shù)個數(shù)為%d\n負(fù)數(shù)個數(shù)為%d",zsum,fsum);
/********** End **********/
return 0;
}
do…while循環(huán)中continue會直接跳到while處進(jìn)行條件判斷。
用do…while循環(huán)按公式e=1+1/1!+1/2!+1/3!+…+1/n!計(jì)算 e 的值(精度為 1e-6)
任務(wù):編寫程序用do-while循環(huán)按公式e=1+1/1!+1/2!+1/3!+…+1/n!計(jì)算 e 的值,要求直到最后一項(xiàng)的絕對值小于精度值eps時,計(jì)算終止。輸出e的值并統(tǒng)計(jì)累加的項(xiàng)數(shù)。
#include <stdio.h>
int main()
{
/********** Begin **********/
int i=1;
double e=1.0,sum=1.0,eps;
scanf("%lf",&eps);
do
{
sum*=i;
e+=(1.0/sum);
i++;
}
while((1/sum)>=eps);
printf("i=%d\ne=%.6lf\n",i,e);
/********** End **********/
return 0;
}
思路:
-
i=1,利用循環(huán)將i++,并累乘(sum*=i;),循環(huán)結(jié)束時i就是項(xiàng)數(shù)。
-
由e的公式可知,利用循環(huán)逐漸累加:e+=(1/sum);
-
當(dāng)1/sum>=eps時計(jì)算中止。
注:
- 1e-6是科學(xué)記數(shù)法表示負(fù)六次方的精度。
- 階乘前面還有個1不要漏掉。
- sum要設(shè)置為浮點(diǎn)數(shù),因?yàn)閑為浮點(diǎn)數(shù),因?yàn)閏語言中整數(shù)除法相除得到一個浮點(diǎn)數(shù),小數(shù)部分會丟失。
用for循環(huán)求分?jǐn)?shù)序列:2/1,3/2,5/3,8/5,13/8,21/13,…,前n項(xiàng)之和
任務(wù):用for
循環(huán)求分?jǐn)?shù)序列:2/1,3/2,5/3,8/5,13/8,21/13,…,
前n
項(xiàng)之和。
#include <stdio.h>
int main()
{
/********** Begin **********/
float a=2,b=3,c=1,d=2,t,n,i,sum;
scanf("%f",&n);
sum+=a/c;
for(i=1;i<n;i++)
{
sum+=b/d;
t=b;
b=a+b;
a=t;
t=d;
d=c+d;
c=t;
}
printf("sum=%.2f",sum);
/********** End ***********/
return 0;
}
注:
- 因?yàn)檫@里優(yōu)先加了一個值,所以i只能遞增到n的前一個值。
- 需要設(shè)置t作為中間變量交換值,使4個值保持為更新的兩個值。
- 也可以嘗試“后一項(xiàng)分?jǐn)?shù)是前一項(xiàng)分?jǐn)?shù)的倒數(shù)加1”這個思路的寫法。
用for循環(huán)求 s=1!+ 2!+ 3!+ …+n!的值
任務(wù):編寫程序輸入n
,用for
循環(huán)求 s=1!+ 2!+ 3!+ …+n!
的值并輸出。
#include <stdio.h>
int main()
{
int i=1,n;
long s=1,sum=0;
scanf("%d",&n);
/********** Begin **********/
for(;i<=n;i++)
{
s*=i;
sum+=s;
printf("%d!=%ld\n",i,s);
}
printf("1!+2!+ …+%d!=%ld\n",n,sum);
/********** End **********/
return 0;
}
注:for循環(huán)三個式子可以不寫表達(dá)式,但是要帶上分號。
用while循環(huán)求s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n) 的值
任務(wù):用while
循環(huán)求編寫求s=1+(1+2)+(1+2+3)+....+(1+2+3+....+n)
值的小程序。文章來源:http://www.zghlxwxcb.cn/news/detail-447339.html
#include <stdio.h>
int main()
{
int i,n,sum=0,result=0;
scanf("%d",&n);
/********** Begin *********/
i=1;
while(i<=n)
{
result+=i;
i++;
sum+=result;
}
printf("sum=%d",sum);
/********** End **********/
return 0;
}
result儲存每一個括號的值,再累加到sum。文章來源地址http://www.zghlxwxcb.cn/news/detail-447339.html
到了這里,關(guān)于頭歌:《C語言程序設(shè)計(jì)編程實(shí)踐任務(wù)》循環(huán)結(jié)構(gòu)程序設(shè)計(jì) 教學(xué)團(tuán)隊(duì):祁文青的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!