『壹』 c語言程序 輸入一個學生的成績,若成績大於等於60,提示成績合格,否則提示需要努力學習。
#include <stdio.h>
main()
{
float i;
printf("請樓主輸入成績:");
scanf("%f",&i);
if (i>=60)
printf("\n成績合格!\n");
else
printf("\n樓主要努力學習哦!\n");
}
『貳』 求c語言表達式大全
C語言語法參考大全(流程式控制制語句) ----------------------------------------------------------------------------------------------------------01條件語句的一般形式為: if(表達式) 語句1; else 語句2; 上述結構表示: 如果表達式的值為非0(TURE)即真, 則執行語句1, 執行完語 句1從語句2後開始繼續向下執行; 如果表達式的值為0(FALSE)即假, 則跳過語句1而執行語句2。 注意: 1. 條件執行語句中"else 語句2;"部分是選擇項, 可以預設, 此時條件語句變成: if(表達式) 語句1; 表示若表達式的值為非0則執行語句1 , 否則跳過語句1繼續執行。 2. 如果語句1或語句2有多於一條語句要執行時, 必須使用"{"和"}" 把這些語句包括在其中, 此時條件語句形式為: if(表達式) { 語句體1; } else { 語句體2; } 3. 條件語句可以嵌套, 這種情況經常碰到, 但條件嵌套語句容易出錯, 其原因主要是不知道哪個if對應哪else。 例如: if(x>20||x<-10) if(y<=100&&y>x) printf("Good"); else printf("Bad"); 對於上述情況, Turbo C2.0規定: else語句與最近的一個if語句匹配, 上例中的else與if(y<=100&&y>x)相匹配。為了使else與if(x>20||x<-10)相匹配, 必須用花括弧。如下所示: if(x>20||x<-10) { if(y<=100&&y>x) printf("Good"); } else printf("Bad"); 4. 可用階梯式if-else-if結構。 階梯式結構的一般形式為: if(表達式1) 語句1; else if(表達式2) 語句2; else if(表達式3) 語句3; . . else 語句n; 這種結構是從上到下逐個對條件進行判斷, 一旦發現條件滿點足就執行與它有關的語句, 並跳過其它剩餘階梯; 若沒有一個條件滿足, 則執行最後一個else語句n。最後這個else常起著"預設條件"的作用。 同樣, 如果每一個條件中有多於一條語句要執行時, 必須使用"{"和"}"把這 些語句包括在其中。 02switch語句 在編寫程序時, 經常會碰到按不同情況分轉的多路問題, 這時可用嵌套if-else-fi語句來實現, 但if-else-if語句使用不方便, 並且容易出錯。對這種情況, Turbo C2.0提供了一個開關語句。 開關語句格式為: switch(變數) { case 常量1: 語句1或空; case 常量2: 語句2或空; . . . case 常量n; 語句n或空; default: 語句n+1或空; } 執行switch開關語句時, 將變數逐個與case後的常量進行比較, 若與其中一個相等, 則執行該常量下的語句, 若不與任何一個常量相等, 則執行default 後面的語句。 注意: 1. switch中變數可以是數值, 也可以是字元。 2. 可以省略一些case和default。 3. 每個case或default後的語句可以是語句體, 但不需要使用"{"和"}"括起來。 下例的switch中變數為整數型。 main() { int test; for(test=0; test<=10; test++) { switch(test) /*變數為整型數的開關語句*/ { case 1: printf("%d ", test); break; /*退出開關語句*/ case 2: printf("%d ", test); break; case 3: printf("%d ", test); break; default: puts("Error"); break; } } } 下例的switch中變數為字元型。 #include<stdio.h> main() { char c; while(c!=27) /*循環直到按Esc鍵結束*/ { c=getch(); /*從鍵盤不回顯接收一個字元*/ switch(c) { case A: /*接收的字元為A*/ putchar(c); break; /*退出開關語句*/ case B: putchar(c); break; default: /*接收的字元非A和B*/ puts("Error"); break; } } } 03for循環 for循環是開界的。它的一般形式為: for(<初始化>; <條件表過式>; <增量>) 語句; (1)初始化總是一個賦值語句, 它用來給循環控制變數賦初值; (2) 條件表達式是一個關系表達式, 它決定什麼時候退出循環; (3) 增量定義循環控制變數每循環一次後按什麼方式變化。這三個部分之間用";"分開。 例如: for(i=1; i<=10; i++) 語句; 上例中先給i賦初值1, 判斷i是否小於等於10, 若是則執行語句, 之後值增加1。再重新判斷, 直到條件為假, 即i>10時, 結束循環。 注意: 1. for循環中語句可以為語句體, 但要用"{"和"}"將參加循環的語句括起來。 2. for循環中的"初始化"、"條件表達式"和"增量"都是選擇項, 即可以預設, 但";"不能預設。省略了初始化, 表示不對循環控制變數賦初值。 省略了條件表達式, 則不做其它處理時便成為死循環。省略了增量, 則不對循環控制變數進行操作, 這時可在語句體中加入修改循環控制變數的語句。 3. for循環可以有多層嵌套。 例16: main() { int i, j, k; printf("i j k "); for (i=0; i<2; i++) for(j=0; j<2; j++) for(k=0; k<2; k++) printf(%d %d %d ", i, j, k); } 04while循環與do-while 循環 while循環的一般形式為: while(條件) 語句; while循環表示當條件為真時, 便執行語句。直到條件為假才結束循環。並繼續執行循環程序外的後續語句. 例17: #include<stdio.h> main() { char c; c=; /*初始化c*/ while(c!=X0D) /*回車結束循環*/ c=getche(); /*帶回顯的從鍵盤接收字元*/ } 上例中, while循環是以檢查c是否為回車符開始, 因其事先被初始化為空,所以條件為真, 進入循環等待鍵盤輸入字元; 一旦輸入回車, 則c=X0D, 條件為假, 循環便告結束。 與for循環一樣, while循環總是在循環的頭部檢驗條件, 這就意味著循環可能什麼也不執行就退出。 注意: 1. 在while循環體內也允許空語句。 例如: while((c=getche())!=X0D); 這個循環直到鍵入回車為止。 2. 可以有多層循環嵌套。 3. 語句可以是語句體, 此時必須用"{"和"}"括起來。 例18: #include<stdio.h> main() { char c, fname[13]; FILE *fp; /*定義文件指針*/ printf("File name:"); /*提示輸入文件名*/ scanf("%s", fname); /*等待輸入文件名*/ fp=fopen(fname, "r"); /*打開文件只讀*/ while((c=fgetc(fp)!=EOF) /*讀取一個字元並判斷是否到文件結束*/ putchar(c); /*文件未結束時顯示該字元*/ } 05do-while 循環 do-while 循環的一般格式為: do 語句; while(條件); 這個循環與while循環的不同在於: 它先執行循環中的語句, 然後再判斷條件是否為真, 如果為真則繼續循環; 如果為假, 則終止循環。因此, do-while循環至少要執行一次循環語句。同樣當有許多語句參加循環時, 要用"{"和"}"把它們括起來。 06continue 語句 continue語句的作用是跳過循環本中剩餘的語句而強行執行下一次循環。 continue語句只用在for、while、do-while等循環體中, 常與if條件語句一起使用, 用來加速循環。 main() { char c; while(c!=0X0D) /*不是回車符則循環*/ { c=getch(); if(c==0X1B) continue; /*若按Esc鍵不輸出便進行下次循環*/ printf("%c ", c); } } 07break語句 break語句通常用在循環語句和開關語句中。當break用於開關語句switch中時, 可使程序跳出switch而執行switch以後的語句; 如果沒有break語句, 則將成為一個死循環而無法退出。 當break語句用於do-while、for、while循環語句中時, 可使程序終止循環而執行循環後面的語句, 通常break語句總是與if語句聯在一起。 即滿足條件時便跳出循環。 main() { int i=0; char c; while(1) /*設置循環*/ { c=; /*變數賦初值*/ while(c!=13&&c!=27) /*鍵盤接收字元直到按回車或Esc鍵*/ { c=getch(); printf("%c ", c); } if(c==27) break; /*判斷若按Esc鍵則退出循環*/ i++; printf("The No. is %d ", i); } printf("The end"); }
『叄』 C語言的一些表達式
關於二十四點游戲的編程思路與基本演算法
漫長的假期對於我來說總是枯燥無味的,閑來無聊便和同學玩起童年時經常玩的二十四點牌游戲來。此游戲說來簡單,就是利用加減乘除以及括弧將給出的四張牌組成一個值為24的表達式。但是其中卻不乏一些有趣的題目,這不,我們剛玩了一會兒,便遇到了一個難題——3、6、6、10(其實後來想想,這也不算是個太難的題,只是當時我們的腦筋都沒有轉彎而已,呵呵)。
問題既然出現了,我們當然要解決。冥思苦想之際,我的腦中掠過一絲念頭——何不編個程序來解決這個問題呢?文曲星中不就有這樣的程序嗎?所以這個想法應該是可行。想到這里我立刻開始思索這個程序的演算法,最先想到的自然是窮舉法(後來發現我再也想不到更好的方法了,悲哀呀,呵呵),因為在這學期我曾經寫過一個小程序——計算有括弧的簡單表達式。只要我能編程實現四個數加上運算符號所構成的表達式的窮舉,不就可以利用這個計算程序來完成這個計算二十四點的程序嗎?確定了這個思路之後,我開始想這個問題的細節。
首先窮舉的可行性問題。我把表達式如下分成三類——
1、 無括弧的簡單表達式。
2、 有一個括弧的簡單表達式。
3、 有兩個括弧的較復4、 雜表達式。
窮舉的開始我對給出的四個數進行排列,其可能的種數為4*3*2*1=24。我利用一個嵌套函數實現四個數的排列,演算法如下:
/* ans[] 用來存放各種排列組合的數組 */
/* c[] 存放四張牌的數組 */
/* k[] c[]種四張牌的代號,其中k[I]=I+1。
用它來代替c[]做處理,考慮到c[]中有可能出現相同數的情況 */
/* kans[] 暫存生成的排列組合 */
/* j 嵌套循環的次數 */
int fans(c,k,ans,kans,j)
int j,k[],c[];char ans[],kans[];
{ int i,p,q,r,h,flag,s[4],t[4][4];
for(p=0,q=0;p<4;p++)
{ for(r=0,flag=0;r if(k[p]!=kans[r]) flag++;
if(flag==j) t[j][q++]=k[p];
}
for(s[j]=0;s[j]<4-j;s[j]++)
{ kans[j]=t[j][s[j>;
if(j==3) { for(h=0;h<4;h++)
ans[2*h]=c[kans[h]-1]; /* 調整生成的排列組合在最終的表
達式中的位置 */
for(h=0;h<3;h++)
symbol(ans,h); /* 在表達式中添加運算符號 */
}
else { j++;
fans(c,k,ans,kans,j);
j--;
}
}
}
正如上面函數中提到的,在完成四張牌的排列之後,在表達式中添加運算符號。由於只有四張牌,所以只要添加三個運算符號就可以了。由於每一個運算符號可重復,所以計算出其可能的種數為4*4*4=64種。仍然利用嵌套函數實現添加運算符號的窮舉,演算法如下:
/* ans[],j同上。sy[]存放四個運算符號。h為表達式形式。*/
int sans(ans,sy,j,h)
char ans[],sy[];int j,h;
{ int i,p,k[3],m,n; char ktans[20];
for(k[j]=0;k[j]<4;k[j]++)
{ ans[2*j+1]=sy[k[j>; /* 剛才的四個數分別存放在0、2、4、6位
這里的三個運算符號分別存放在1、3、5位*/
if(j==2)
{ ans[5]=sy[k[j>;
/* 此處根據不同的表達式形式再進行相應的處理 */
}
else
}
}
好了,接下來我再考慮不同表達式的處理。剛才我已經將表達式分為三類,是因為添加三個括弧對於四張牌來說肯定是重復的。對於第一種,無括弧自然不用另行處理;而第二種情況由以下代碼可以得出其可能性有六種,其中還有一種是多餘的。
for(m=0;m<=4;m+=2)
for(n=m+4;n<=8;n+=2)
這個for循環給出了添加一個括弧的可能性的種數,其中m、n分別為添加在表達式中的左右括弧的位置。我所說的多餘的是指m=0,n=8,也就是放在表達式的兩端。這真是多此一舉,呵呵!最後一種情況是添加兩個括弧,我分析了一下,發現只可能是這種形式才不會是重復的——(a b)(c d)。為什麼不會出現嵌套括弧的情況呢?因為如果是嵌套括弧,那麼外面的括弧肯定是包含三個數字的(四個沒有必要),也就是說這個括弧裡麵包含了兩個運算符號,而這兩個運算符號是被另外一個括弧隔開的。那麼如果這兩個運算符號是同一優先順序的,則肯定可以通過一些轉換去掉括弧(你不妨舉一些例子來試試),也就是說這一個括弧沒有必要;如果這兩個運算符號不是同一優先順序,也必然是這種形式((a+-b)*/c)。而*和/在這幾個運算符號中優先順序最高,自然就沒有必要在它的外面添加括弧了。
綜上所述,所有可能的表達式的種數為24*64*(1+6+1)=12288種。哈哈,只有一萬多種可能性(這其中還有重復),這對於電腦來說可是小case喲!所以,對於窮舉的可行性分析和實現也就完成了。
接下來的問題就是如何對有符號的簡單表達式進行處理。這是棧的一個著名應用,那麼什麼是棧呢?棧的概念是從日常生活中貨物在貨棧種的存取過程抽象出來的,即最後存放入棧的貨物(堆在靠出口處)先被提取出去,符合「先進後出,後進先出」的原則。這種結構猶如子彈夾。
在棧中,元素的插入稱為壓入(push)或入棧,元素的刪除稱為彈出(pop)或退棧。
棧的基本運算有三種,其中包括入棧運算、退棧運算以及讀棧頂元素,這些請參考相關數據結構資料。根據這些基本運算就可以用數組模擬出棧來。
那麼作為棧的著名應用,表達式的計算可以有兩種方法。
第一種方法——
首先建立兩個棧,操作數棧OVS和運算符棧OPS。其中,操作數棧用來記憶表達式中的操作數,其棧頂指針為topv,初始時為空,即topv=0;運算符棧用來記憶表達式中的運算符,其棧頂指針為topp,初始時,棧中只有一個表達式結束符,即topp=1,且OPS(1)=『;』。此處的『;』即表達式結束符。
然後自左至右的掃描待處理的表達式,並假設當前掃描到的符號為W,根據不同的符號W做如下不同的處理:
1、 若W為操作數
2、 則將W壓入操作數棧OVS
3、 且繼續掃描下一個字元
4、 若W為運算符
5、 則根據運算符的性質做相應的處理:
(1)、若運算符為左括弧或者運算符的優先順序大於運算符棧棧頂的運算符(即OPS(top)),則將運算符W壓入運算符棧OPS,並繼續掃描下一個字元。
(2)、若運算符W為表達式結束符『;』且運算符棧棧頂的運算符也為表達式結束符(即OPS(topp)=』;』),則處理過程結束,此時,操作數棧棧頂元素(即OVS(topv))即為表達式的值。
(3)、若運算符W為右括弧且運算符棧棧頂的運算符為左括弧(即OPS(topp)=』(『),則將左括弧從運算符棧談出,且繼續掃描下一個符號。
(4)、若運算符的右不大於運算符棧棧頂的運算符(即OPS(topp)),則從操作數棧OVS中彈出兩個操作數,設先後彈出的操作數為a、b,再從運算符棧OPS中彈出一個運算符,設為+,然後作運算a+b,並將運算結果壓入操作數棧OVS。本次的運算符下次將重新考慮。
第二種方法——
首先對表達式進行線性化,然後將線性表達式轉換成機器指令序列以便進行求值。
那麼什麼是表達式的線性化呢?人們所習慣的表達式的表達方法稱為中綴表示。中綴表示的特點是運算符位於運算對象的中間。但這種表示方式,有時必須藉助括弧才能將運算順序表達清楚,而且處理也比較復雜。
1929年,波蘭邏輯學家Lukasiewicz提出一種不用括弧的邏輯符號體系,後來人們稱之為波蘭表示法(Polish notation)。波蘭表達式的特點是運算符位於運算對象的後面,因此稱為後綴表示。在對波蘭表達式進行運算,嚴格按照自左至右的順序進行。下面給出一些表達式及其相應的波蘭表達式。
表達式 波蘭表達式
A-B AB-
(A-B)*C+D AB-C*D+
A*(B+C/D)-E*F ABCD/+*EF*-
(B+C)/(A-D) BC+AD-/
OK,所謂表達式的線性化是指將中綴表達的表達式轉化為波蘭表達式。對於每一個表達式,利用棧可以把表達式變換成波蘭表達式,也可以利用棧來計算波蘭表達式的值。
至於轉換和計算的過程和第一種方法大同小異,這里就不再贅述了。
下面給出轉換和計算的具體實現程序——
/* first函數給出各個運算符的優先順序,其中=為表達式結束符 */
int first(char c)
{ int p;
switch(c)
{ case '*': p=2; break;
case '/': p=2; break;
case '+': p=1; break;
case '-': p=1; break;
case '(': p=0; break;
case '=': p=-1; break;
}
return(p);
}
/* 此函數實現中綴到後綴的轉換 */
/* M的值宏定義為20 */
/* sp[]為表達式數組 */
int mid_last()
{ int i=0,j=0; char c,sm[M];
c=s[0]; sm[0]='='; top=0;
while(c!='\0')
{ if(islower(c)) sp[j++]=c;
else switch(c)
{ case '+':
case '-':
case '*':
case '/': while(first(c)<=first(sm[top]))
sp[j++]=sm[top--];
sm[++top]=c; break;
case '(': sm[++top]=c; break;
case ')': while(sm[top]!='(')
sp[j++]=sm[top--];
top--; break;
default :return(1);
}
c=s[++i];
}
while(top>0) sp[j++]=sm[top--];
sp[j]='\0'; return(0);
}
/* 由後綴表達式來計算表達式的值 */
int calc()
{ int i=0,sm[M],tr; char c;
c=sp[0]; top=-1;
while(c!='\0')
{ if(islower(c)) sm[++top]=ver[c-'a'];/*在轉換過程中用abcd等來代替數,
這樣才可以更方便的處理非一位數,
ver數組中存放著這些字母所代替的數*/
else switch(c)
{ case '+': tr=sm[top--]; sm[top]+=tr; break;
case '-': tr=sm[top--]; sm[top]-=tr; break;
case '*': tr=sm[top--]; sm[top]*=tr; break;
case '/': tr=sm[top--];sm[top]/=tr;break;
default : return(1);
}
c=sp[++i];
}
if(top>0) return(1);
else
}
這樣這個程序基本上就算解決了,回過頭來拿這個程序來算一算文章開始的那個問題。哈哈,算出來了,原來如此簡單——(6-3)*10-6=24。
最後我總結了一下這其中容易出錯的地方——
1、 排列的時候由於一個數只能出現一次, 所以必然有一個判斷語句。但是用什麼來判斷,用大小顯然不行,因為有可能這四個數中有兩個或者以上的數是相同的。我的方法是給每一個數設置一個代號,在排列結束時,通過這個代號找到這個數。
2、在應用嵌套函數時,需仔細分析程序的執行過程,並對個別變數進行適當的調整(如j的值),程序才能正確的執行。
3、在分析括弧問題的時候要認真仔細,不要錯過任何一個可能的機會,也要盡量使程序變得簡單一些。不過我的分析可能也有問題,還請高手指點。
4、在用函數對一個數組進行處理的時候,一定要注意如果這個數組還需要再應用,就必須將它先保存起來,否則會出錯,而且是很嚴重的錯誤。
5、在處理用戶輸入的表達式時,由於一個十位數或者更高位數是被分解成各位數存放在數組中,所以需對它們進行處理,將它們轉化成實際的整型變數。另外,在轉化過程中,用一個字母來代替這個數,並將這個數存在一個數組中,且它在數組中的位置和代替它的這個字母有一定的聯系,這樣才能取回這個數。
6、由於在窮舉過程難免會出現計算過程中有除以0的計算,所以我們必須對calc函數種對於除的運算加以處理,否則程序會因為出錯而退出(Divide by 0)。
7、最後一個問題,本程序尚未解決。對於一些比較著名的題目,本程序無法解答。比如說5、5、5、1或者8、8、3、3。這是由於這些題目在計算的過程用到了小數,而本程序並沒有考慮到小數。
『肆』 下偽代碼,寫一個小程序,大於等於60分的輸出「合格」,小於60分的輸出「不合格」(C語言作業不懂求教!)
#include <stdio.h>
int main()
{
float f;
printf("輸入分數: ");
scanf("%f",f);
if(f>=60)
{
printf("及格");//可以換成自己的操作
}
else
{
printf("不及格");//可以換成自己的操作
}
return 0;
}
『伍』 合法的C語言表達式
引用 頭文件 #include <math.h>
const double pi=3.41592654;
再寫上double tt= sin(pi/6);
sin(30°)在C語言中的表示為 sin(30*3.1415926/180)
『陸』 c語言編程,輸入學號和成績,90到100為優秀,80到89為良好,70到79為中等,60到69及格,0到59不及格
你這個程序沒任何問題啊,「但每個階段人數總是0,百分比也為0,請高手指導一下。」
我想,你是不是輸入錯誤啊,就是輸入的時候ID和分數之間要空開來,並且每輸入一個學生的成績後,還要敲一次回車確認!
下面是我的程序運行截圖。(點擊圖片可以放大)
『柒』 問怎麼用C語言表達式表示60≤m80
優先順序: +,- > && > || 結合律:都是左結合 所以a||b+c&&b-c等價於a || ( (b+c) && (b-c) ) 由於||和&&具有短路求值的特點,所以計算順序是: 1. 先算a,如果a非0,則後面的表達式不用算了,整個表達式直接為1 2. a為0,則仍需計算後面的表達式,...
『捌』 c語言編程,60以下不合格,60以上到75合格,75以上到85為良,85以上到100為優秀。
#include<stdio.h>
intslv(intn)
{
if(n<60)return0;
if(60<=n&&n<=75)return1;
if(75<n&&n<=85)return2;
if(85<n)return3;
}
intmain()
{
intn;
char*lv[4]={"不合格","合格","良","優秀"};
scanf("%d",&n);
printf("%s ",lv[slv(n)]);
return0;
}
『玖』 怎樣用C語言程序編輸入一個學生的成績,若成績大於等於60提示成績合格,否則提示需要努力學習的程序
#include<stdio.h>
main()
{
floati;
printf("請樓主輸入成績:");
scanf("%f",&i);
if(i>=60)
printf(" 成績合格! ");
else
printf(" 樓主要努力學習哦! ");
}
『拾』 C語言程序設計條件表達式
++x,--x;;符號在前可以理解為先加一或者減一在使用x的值;
x++,x--;符號在後可理解為先使用x的值,使用完在加一或者減一;
a = (--x == y++)? --x : ++y;這一句的意思是x的值減一後是否和y的值相等(注意這里比較完之後y的值就加一了),如果相等x的值再次減一,然後賦值給a;如果不相等y的值再次加一,然後賦值給a;顯然這里條件是相等的,執行玩這條語句a和x的值都是8;y的值變成10;
b = x--;先把x的值賦值給b,然後再減一;執行玩這條語句b的值是8,x的值是7;
c = y;y的值是10,執行完這條語句c的值是10;