#include?stdio.h
成都網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù)團隊是一支充滿著熱情的團隊,執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標準與要求,同時竭誠為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)公司把每個網(wǎng)站當(dāng)做一個產(chǎn)品來開發(fā),精雕細琢,追求一名工匠心中的細致,我們更用心!
int?main()
{
int?i,j,n,m,r=0,s,t=0;
printf("輸入正整數(shù)m和n(mn):");
scanf("%d?%d",m,n);
if(mn)
{
for(i=m;i=n;i++)
{
j=i,s=0;
while(j)
{
s+=j%10;
j/=10;
}
if(s==7){r++;t+=i;}
}
printf("%d?%d\n",r,t);
}
return?0;
}
一.學(xué)好C語言的運算符和運算順序
這是學(xué)好《C程序設(shè)計》的基礎(chǔ),C語言的運算非常靈活,功能十分豐富,運算種類遠多于其它程序設(shè)計語言。在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單,但初學(xué)者往往會覺的這種表達式難讀,關(guān)鍵原因就是對運算符和運算順序理解不透不全。當(dāng)多種不同運算組成一個運算表達式,即一個運算式中出現(xiàn)多種運算符時,運算的優(yōu)先順序和結(jié)合規(guī)則顯得十分重要。在學(xué)習(xí)中,只要我們對此合理進行分類,找出它們與我們在數(shù)學(xué)中所學(xué)到運算之間的不同點之后,記住這些運算也就不困難了,有些運算符在理解后更會牢記心中,將來用起來得心應(yīng)手,而有些可暫時放棄不記,等用到時再記不遲。
先要明確運算符按優(yōu)先級不同分類,《C程序設(shè)計》運算符可分為15種優(yōu)先級,從高到低,優(yōu)先級為1 ~ 15,除第2、3級和第14級為從右至左結(jié)合外,其它都是從左至右結(jié)合,它決定同級運算符的運算順序.
二.學(xué)好C語言的四種程序結(jié)構(gòu)
(1)順序結(jié)構(gòu)
順序結(jié)構(gòu)的程序設(shè)計是最簡單的,只要按照解決問題的順序?qū)懗鱿鄳?yīng)的語句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行。
例如;a = 3,b = 5,現(xiàn)交換a,b的值,這個問題就好像交換兩個杯子水,這當(dāng)然要用到第三個杯子,假如第三個杯子是c,那么正確的程序為: c = a; a = b; b = c; 執(zhí)行結(jié)果是a = 5,b = c = 3如果改變其順序,寫成:a = b; c = a; b = c; 則執(zhí)行結(jié)果就變成a = b = c = 5,不能達到預(yù)期的目的,初學(xué)者最容易犯這種錯誤。 順序結(jié)構(gòu)可以獨立使用構(gòu)成一個簡單的完整程序,常見的輸入、計算,輸出三步曲的程序就是順序結(jié)構(gòu),例如計算圓的面積,其程序的語句順序就是輸入圓的半徑r,計算s = 3.14159*r*r,輸出圓的面積s。不過大多數(shù)情況下順序結(jié)構(gòu)都是作為程序的一部分,與其它結(jié)構(gòu)一起構(gòu)成一個復(fù)雜的程序,例如分支結(jié)構(gòu)中的復(fù)合語句、循環(huán)結(jié)構(gòu)中的循環(huán)體等。
(2) 分支結(jié)構(gòu)
順序結(jié)構(gòu)的程序雖然能解決計算、輸出等問題,但不能做判斷再選擇。對于要先做判斷再選擇的問題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句。分支結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計算,設(shè)計這類程序時往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫出源程序,這樣做把程序設(shè)計分析與語言分開,使得問題簡單化,易于理解。程序流程圖是根據(jù)解題分析所繪制的程序執(zhí)行流程圖。
學(xué)習(xí)分支結(jié)構(gòu)不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執(zhí)行的功能,嵌套結(jié)構(gòu)也就不難了。嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。下面我介紹幾種基本的分支結(jié)構(gòu)。
①if(條件)
{
分支體
}
這種分支結(jié)構(gòu)中的分支體可以是一條語句,此時“{ }”可以省略,也可以是多條語句即復(fù)合語句。它有兩條分支路徑可選,一是當(dāng)條件為真,執(zhí)行分支體,否則跳過分支體,這時分支體就不會執(zhí)行。如:要計算x的絕對值,根據(jù)絕對值定義,我們知道,當(dāng)x=0時,其絕對值不變,而x0時其絕對值是為x的反號,因此程序段為:if(x0) x=-x;
②if(條件)
{分支1}
else
{分支2}
這是典型的分支結(jié)構(gòu),如果條件成立,執(zhí)行分支1,否則執(zhí)行分支2,分支1和分支2都可以是1條或若干條語句構(gòu)成。如:求ax^2+bx+c=0的根
分析:因為當(dāng)b^2-4ac=0時,方程有兩個實根,否則(b^2-4ac0)有兩個共軛復(fù)根。其程序段如下:
d=b*b-4*a*c;
if(d=0)
{x1=(-b+sqrt(d))/2a; br/x1=(-b-sqrt(d))/2a; br/printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2); br/}
else
{r=-b/(2*a); br/i =sqrt(-d)/(2*a); br/printf(“x1=%8.4f+%8.4fi\n”r, i); br/printf(“x2=%8.4f-%8.4fi\n”r,i) br/}
③嵌套分支語句:其語句格式為:
if(條件1) {分支1};
else if(條件2) {分支2}
else if(條件3) {分支3}
……
else if(條件n) {分支n}
else {分支n+1}
嵌套分支語句雖可解決多個入口和出口的問題,但超過3重嵌套后,語句結(jié)構(gòu)變得非常復(fù)雜,對于程序的閱讀和理解都極為不便,建議嵌套在3重以內(nèi),超過3重可以用下面的語句。
④switch開關(guān)語句:該語句也是多分支選擇語句,到底執(zhí)行哪一塊,取決于開關(guān)設(shè)置,也就是表達式的值與常量表達式相匹配的那一路,它不同if…else 語句,它的所有分支都是并列的,程序執(zhí)行時,由第一分支開始查找,如果相匹配,執(zhí)行其后的塊,接著執(zhí)行第2分支,第3分支……的塊,直到遇到break語句;如果不匹配,查找下一個分支是否匹配。這個語句在應(yīng)用時要特別注意開關(guān)條件的合理設(shè)置以及break語句的合理應(yīng)用。
(3)循環(huán)結(jié)構(gòu):
循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書寫的工作量,用來描述重復(fù)執(zhí)行某段算法的問題,這是程序設(shè)計中最能發(fā)揮計算機特長的程序結(jié)構(gòu),C語言中提供四種循環(huán),即goto循環(huán)、while循環(huán)、do –while循環(huán)和for循環(huán)。四種循環(huán)可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環(huán),因為強制改變程序的順序經(jīng)常會給程序的運行帶來不可預(yù)料的錯誤,在學(xué)習(xí)中我們主要學(xué)習(xí)while、do…while、for三種循環(huán)。常用的三種循環(huán)結(jié)構(gòu)學(xué)習(xí)的重點在于弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環(huán)的格式和執(zhí)行順序,將每種循環(huán)的流程圖理解透徹后就會明白如何替換使用,如把while循環(huán)的例題,用for語句重新編寫一個程序,這樣能更好地理解它們的作用。特別要注意在循環(huán)體內(nèi)應(yīng)包含趨于結(jié)束的語句(即循環(huán)變量值的改變),否則就可能成了一個死循環(huán),這是初學(xué)者的一個常見錯誤。
在學(xué)完這三個循環(huán)后,應(yīng)明確它們的異同點:用while和do…while循環(huán)時,循環(huán)變量的初始化的操作應(yīng)在循環(huán)體之前,而for循環(huán)一般在語句1中進行的;while 循環(huán)和for循環(huán)都是先判斷表達式,后執(zhí)行循環(huán)體,而do…while循環(huán)是先執(zhí)行循環(huán)體后判斷表達式,也就是說do…while的循環(huán)體最少被執(zhí)行一次,而while 循環(huán)和for就可能一次都不執(zhí)行。另外還要注意的是這三種循環(huán)都可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán),而goto語句與if構(gòu)成的循環(huán),是不能用break和 continue語句進行控制的。
順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)并不彼此孤立的,在循環(huán)中可以有分支、順序結(jié)構(gòu),分支中也可以有循環(huán)、順序結(jié)構(gòu),其實不管哪種結(jié)構(gòu),我們均可廣義的把它們看成一個語句。在實際編程過程中常將這三種結(jié)構(gòu)相互結(jié)合以實現(xiàn)各種算法,設(shè)計出相應(yīng)程序,但是要編程的問題較大,編寫出的程序就往往很長、結(jié)構(gòu)重復(fù)多,造成可讀性差,難以理解,解決這個問題的方法是將C程序設(shè)計成模塊化結(jié)構(gòu)。
(4)模塊化程序結(jié)構(gòu)
C語言的模塊化程序結(jié)構(gòu)用函數(shù)來實現(xiàn),即將復(fù)雜的C程序分為若干模塊,每個模塊都編寫成一個C函數(shù),然后通過主函數(shù)調(diào)用函數(shù)及函數(shù)調(diào)用函數(shù)來實現(xiàn)一大型問題的C程序編寫,因此常說:C程序=主函數(shù)+子函數(shù)。 因此,對函數(shù)的定義、調(diào)用、值的返回等中要尤其注重理解和應(yīng)用,并通過上機調(diào)試加以鞏固。
由外到內(nèi),逐層完成,for循環(huán)的方法你應(yīng)該知道了吧,我就不一一說了。
首先進行最外面的循環(huán),第一次
i=1
,進入循環(huán)體,由于他的循環(huán)體是另一個循環(huán),也就是執(zhí)行另一個循環(huán),
首先由
j=0
開始,然后有進入循環(huán)體。。。也就是執(zhí)行第三層循環(huán),在你上面的程序來說
,完成第三個循環(huán)一共要循環(huán)
7次
,k
從
2
到
10
(等于10的時候跳出去,實際執(zhí)行9次)。
然后,第二層循環(huán)進行了
1
次
,j
由
變成
1
,繼續(xù)循環(huán),也就是從新開始
第三層循環(huán)。這樣一直下去,知道
j=10
跳出了第二層循環(huán)
,第一個循環(huán)才
完成了
1次
,i
由1變成
2,繼續(xù)又進入到第二層,第三層循環(huán),在一層一層跳出來,直到跳出最外層循環(huán)為止。
用一句話來說就是
逐層進入,逐層完成,逐層跳出。
#include
int
func(int
i);
//函數(shù)的原型定義
int
main(void)
{
int
n;
float
y;
scanf_s("%d",n);
//n沒有被初始化,為任意值,此時是讀取一個值給n,刪去,直接給n初始化為5也可以
scanf_s是vs2013編譯器專用的,請自行改成scanf
y
=
func(n);
/*函數(shù)的調(diào)用*/
printf("%d!=%f",
n,
y);
/*for語句多余*/
return
0;
}
int
func(int
i)
{
int
sum=0;
if
((i
==
0)
||
(i
==
1))
sum
=
1;
else
sum
=
func(i-1)
*
i;
//
i的值沒有變化,一直都是讀入的值,不會終止遞歸。
return
sum;
}
從for循環(huán)開始:
i=1,對于b=i4?i:8-i這個語句,由于?:這是個條件運算符,它的優(yōu)先級高于賦值運算符=。所以,先進性后面的運算。由于i=1,所以i4為真,于是b=i=1。然后執(zhí)行第二個for循環(huán)。j從1到b,由于b=1,所以只循環(huán)一次,輸出一個“o”,最后執(zhí)行第三個for循環(huán)。和第二個一樣只循環(huán)一次。輸出一個“A”。i=1的循環(huán)結(jié)束。
i=2和i=3同上。只是第二次和第三次for循環(huán)循環(huán)2次。
i=4,由于i4為假,所以,b=8-i=4。然后執(zhí)行第二個for循環(huán),j從1到b,由于b=2,所以循環(huán)進行2次。輸出2個“o”,最后執(zhí)行第三個for循環(huán)。和第二個一樣循環(huán)2次,輸出2個“A”。
i=5和i=6和i=7同上。
里面的for循環(huán)相當(dāng)于外部for循環(huán)的循環(huán)體,舉一個例子:
for(i=1;i=10;i++)
{for(j=1;j=5;j++)
k=k+1;}
這是一個嵌套循環(huán),執(zhí)行時,外循環(huán)開始第一次循環(huán),i=1,當(dāng)內(nèi)循環(huán)的五次循環(huán)全部執(zhí)行完后,外循環(huán)進行第二次,此時i=2,然后內(nèi)循環(huán)執(zhí)行……,如此循環(huán)往復(fù),直到外層的for循環(huán)10次全部執(zhí)行完畢