當前位置:編程學習大全網 - 編程語言 - 二級C語言

二級C語言

******這裏有壹些資料希望對妳有幫助《包括基礎知識和例題》:

壹.基礎知識

C 語言總復習C六月,

總體上必須清楚的:

1)程序結構是三種:順序結構,循環結構(三個循環結構),選擇結構(if 和 switch)

2)讀程序都要從main()入口, 然後從最上面順序往下讀(碰到循環做循環,碰到選擇做選擇)。

3)計算機的數據在電腦中保存是以 二進制的形式. 數據存放的位置就是 他的地址.

4)bit是位 是指為0 或者1。 byte 是指字節, 壹個字節 = 八個位.

5)壹定要記住 二進制 如何劃成 十進制。

概念常考到的:

1、編譯預處理不是C語言的壹部分,不再運行時間。C語言編譯的程序稱為源程序,它以ASCII數值存放在文本文件中。

2、每個C語言程序中main函數是有且只有壹個。

3、在函數中不可以再定義函數。

4、算法的是壹定要有輸出的,他可以沒有輸入。

5、break可用於循環結構和switch語句。

6、逗號運算符的級別最低。

第壹章

1)合法的用戶標識符考查:

合法的要求是由字母,數字,下劃線組成。有其它元素就錯了。

並且第壹個必須為字母或則是下劃線。第壹個為數字就錯了。

關鍵字不可以作為用戶標識符號。main define scanf printf 都不是關鍵字。迷惑妳的地方If是可以做為用戶標識符。因為If中的第壹個字母大寫了,所以不是關鍵字。

2)實型數據的合法形式:

2.333e-1 就是合法的,且數據是2.333×10-1。

考試口訣:e前e後必有數,e後必為整數。.

3)字符數據的合法形式::

'1' 是字符占壹個字節,"1"是字符串占兩個字節(含有壹個結束符號)。

'0' 的ASCII數值表示為48,'a' 的ASCII數值是97,'A'的ASCII數值是65。

4) 整型壹般是兩個字節, 字符型是壹個字節,雙精度壹般是4個字節:

考試時候壹般會說,在16位編譯系統,或者是32位系統。碰到這種情況,不要去管,壹樣做題。掌握整型壹般是兩個字節, 字符型是壹個字節,雙精度壹般是4個字節就可以了。

5)轉義字符的考查:

在程序中 int a = 0x6d,是把壹個十六進制的數給變量a 註意這裏的0x必須存在。

在程序中 int a = 06d, 是壹個八進制的形式。

在轉義字符中,’\x6d’ 才是合法的,0不能寫,並且x是小寫。

‘\141’ 是合法的, 0是不能寫的。

‘\108’是非法的,因為不可以出現8。

6)算術運算符號的優先級別:

同級別的有的是從左到右,有的是從右到左。

7)強制類型轉換:

壹定是 (int)a 不是 int(a),註意類型上壹定有括號的。

註意(int)(a+b)和(int)a+b 的區別。 前是把a+b轉型,後是把a轉型再加b。

8)表達式的考查:

是表達式就壹定有數值。

賦值表達式:表達式數值是最左邊的數值,a=b=5;該表達式為5,常量不可以賦值。

自加、自減表達式:假設a=5,++a(是為6), a++(為5);

運行的機理:++a 是先把變量的數值加上1,然後把得到的數值放到變量a中,然後再用這

個++a表達式的數值為6,而a++是先用該表達式的數值為5,然後再把a的數值加上1為6,

再放到變量a中。 進行了++a和a++後在下面的程序中再用到a的話都是變量a中的6了。

考試口訣:++在前先加後用,++在後先用後加。

逗號表達式:優先級別最低 ;表達式的數值逗號最右邊的那個表達式的數值。

(2,3,4)的表達式的數值就是4。

9)位運算的考查:

會有壹到二題考試題目。

總的處理方法:幾乎所有的位運算的題目都要按這個流程來處理(先把十進制變成二進制再變成十進制)。

例1:char a = 6, b;

b = a<<2; 這種題目的計算是先要把a的十進制6化成二進制,再做位運算。

例2:壹定要記住,

例3:在沒有舍去數據的時候,<<左移壹位表示乘以2;>>右移壹位表示除以2。

10)018的數值是非法的,八進制是沒有8的,逢8進1。

11)%符號兩邊要求是整數。不是整數就錯了。

12)三種取整丟小數的情況:

1、int a =1.6;

2、(int)a;

3、

第二章

1)printf函數的格式考查:

%d對應整型;%c對應字符;%f對應單精度等等。寬度的,左對齊等修飾。

%ld對應 long int;%lf 對應double。

2)scanf函數的格式考察:

註意該函數的第二個部分是&a這樣的地址,不是a;

Scanf(“%d%d%*d%d”,&a,&b,&c); 跳過輸入的第三個數據。

3)putchar ,getchar 函數的考查:

char a = getchar() 是沒有參數的,從鍵盤得到妳輸入的壹個字符給變量a。

putchar(‘y’)把字符y輸出到屏幕中。

4)如何實現兩個變量x ,y中數值的互換(要求背下來)

不可以把 x=y ,y=x; 要用中間變量 t=x;x=y;y=t。

5)如何實現保留三位小數,第四位四舍五入的程序,(要求背下來)

這個有推廣的意義,註意 x = (int)x 這樣是把小數部分去掉。

第三章

特別要註意:c語言中是用非0表示邏輯真的,用0表示邏輯假的。

1)關系表達式:

表達式的數值只能為1(表示為真),或0(表示假)

當關系的表達是為真的時候得到1。如 9>8這個是真的,所以表達式的數值就是1;

2)邏輯表達式:

只能為1(表示為真),或0(表示假)

a) ***有&& || ! 三種邏輯運算符號。

b) !>&&>|| 優先的級別。

c) 註意短路現象。考試比較喜歡考到。

d) 要表示 x 是比0大,比10小的方法。0<x<10是不可以的(壹定記住)。是先計算0<x 得到的結果為1或則0;再用0,或1與10比較得到的總是真(為1)。所以壹定要用(0<x)&&(x<10)表示比0大比10小。

3)if 語句

else 是與最接近的if且沒有else的相組合的。

4)條件表達式:

表達式1 ?表達式2 :表達式3

註意是當非0時候是表達式2的數值,當為0是就是表達式2的數值。

考試口訣:真前假後。

5)switch語句:

a)壹定要註意 有break 和沒有break的差別,書上(34頁)的兩個例子,沒有break時候,只要有壹個case匹配了,剩下的都要執行,有break則是直接跳出了swiche語句。

b)switch只可以和break壹起用,不可以和continue用。

第四章

1)三種循環結構:

a)for() ; while(); do- while()三種。

b)for循環當中必須是兩個分號,千萬不要忘記。

c)寫程序的時候壹定要註意,循環壹定要有結束的條件,否則成了死循環。

d) do-while()循環的最後壹個while();的分號壹定不能夠丟。(當心上機改錯)

2) break 和 continue的差別

記憶方法:

break:是打破的意思,(破了整個循環)所以看見break就退出真個壹層循環。

continue:是繼續的意思,(繼續循環運算),但是要結束本次循環,就是循環體內剩下的語句不再執行,跳到循環開始,然後判斷循環條件,進行新壹輪的循環。

3)嵌套循環

就是有循環裏面還有循環,這種比較復雜,要壹層壹層壹步壹步耐心的計算,壹般記住兩層是處理二維數組的。

4) while((c=getchar())!=’\n’) 和 while(c=getchar() !=’\n’)的差別

先看a = 3 != 2 和(a=3)!=2 的區別:

(!=號的級別高於=號所以第壹個先計算 3!=2)第壹個a的數值是得到的1;第二個a的數值是3。

考試註意點:括號在這裏的重要性。

第五章

函數:是具有壹定功能的壹個程序塊;

1) 函數的參數,返回數值(示意圖):

main()

{

int a = 5,b=6,c;

c =add(a,b);

printf(“%d”,c);

}

調用函數

a,b是實參

整個函數得到壹個數值就是

Add函數的返回數值。

int add ( int x, int y)

{

int z;

z=x+y;

return z;

}

被調用函數

x,y是形式參數

函數返回數值是整型

z就是這個add函數計算後得到的結果,就是函數返回給主程序的返回數值。

程序是在從上往下順序執行,當碰到了函數add後,把a,b的數值穿給調用函數,程序暫時中斷等待返回數值。當得到了返回數值後,再順序的往下執行

2)壹定要註意參數之間的傳遞

實參和形參之間傳數值,和傳地址的差別。(考試的重點)

傳數值的話,形參的變化不會改變實參的變化。

傳地址的話,形參的變化就會有可能改變實參的變化。

3)函數聲明的考查:

壹定要有:函數名,函數的返回類型,函數的參數類型。

不壹定要有:形參的名稱。

第六章

指針變量的本質是用來放地址,而壹般的變量是放數值的。

int *p 中 *p和p的差別:

*p可以當做變量來用;*的作用是取後面地址p裏面的數值

p是當作地址來使用。

*p++ 和 (*p)++的之間的差別:改錯題目中很重要

*p++是 地址會變化。

(*p)++ 是數值會要變化。

三名主義:(考試的重點)

數組名:表示第壹個元素的地址。數組名不可以自加,他是地址常量名。(考了很多次)

函數名:表示該函數的入口地址。

字符串常量名:表示第壹個字符的地址。

第七章

1壹維數組的重要概念:

對a[10]這個數組的討論。

1、a表示數組名,是第壹個元素的地址,也就是元素a[10]的地址。

2、a是地址常量,所以只要出現a++,或者是a=a+2賦值的都是錯誤的。

3、a是壹維數組名,所以它是列指針,也就是說a+1是跳壹列。

對a[3][3]的討論。

1、a表示數組名,是第壹個元素的地址,也就是元素a[10]的地址。

2、a是地址常量,所以只要出現a++,或者是a=a+2賦值的都是錯誤的。

3、a是二維數組名,所以它是行指針,也就是說a+1是跳壹行。

4、a[0]、a[1]、a[2]也都是地址常量,不可以對它進行賦值操作,同時它們都是列指針,a[0]+1,a[1]+1,a[2]+1都是跳壹列。

5、註意a和a[0] 、a[1]、a[2]是不同的,它們的基類型是不同的。前者是壹行元素,後三者是壹列元素。

二維數組做題目的技巧:

如果有a[3][3]={1,2,3,4,5,6,7,8,9}這樣的題目。

步驟壹:把他們寫成:第壹列第二列第三列

a[0]à 1 2 3 ->第壹行

a[1]à 4 5 6 —>第二行

a[2]à 7 8 9 ->第三行

步驟二:這樣作題目間很簡單:

*(a[0]+1)我們就知道是第壹行的第壹個元素往後面跳壹列,那麽這裏就是a[0][1]元素,所以是1。

*(a[1]+2)我們就知道是第二行的第壹個元素往後面跳二列。那麽這裏就是a[1][2]元素,所以是6。

壹定記住:只要是二維數組的題目,壹定是寫成如上的格式,再去做題目,這樣會比較簡單。

數組的初始化,壹維和二維的,壹維可以不寫,二維第二個壹定要寫

int a[]={1,2} 合法。 int a[][4]={2,3,4}合法。 但int a[4][]={2,3,4}非法。

二維數組中的行指針

int a[1][2];

其中a現在就是壹個行指針,a+1跳壹行數組元素。 搭配(*)p[2]指針

a[0],a[1]現在就是壹個列指針。a[0]+1 跳壹個數組元素。搭配*p[2]指針數組使用

還有記住脫衣服法則:

a[2] 變成 *(a+2) a[2][3]變成 *(a+2)[3]再可以變成 *(*(a+2)+3)

這個思想很重要!

二.100道例題

程序1

題目:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?

1.程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去

掉不滿足條件的排列。

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

int i,j,k;

printf("\n");

for(i=1;i<5;i++) /*以下為三重循環*/

for(j=1;j<5;j++)

for (k=1;k<5;k++)

{

if (i!=k&&i!=j&&j!=k) /*確保i、j、k三位互不相同*/

printf("%d,%d,%d\n",i,j,k);

}

getch();

}

==============================================================

程序2

題目:企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高

 於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可可提

 成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於

 40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於

 100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?

1.程序分析:請利用數軸來分界,定位。註意定義時需把獎金定義成長整型。      

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

long int i;

int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;

scanf("%ld",&i);

bonus1=100000*0. 1;

bonus2=bonus1+100000*0.75;

bonus4=bonus2+200000*0.5;

bonus6=bonus4+200000*0.3;

bonus10=bonus6+400000*0.15;

if(i<=100000)

bonus=i*0.1;

else if(i<=200000)

bonus=bonus1+(i-100000)*0.075;

else if(i<=400000)

bonus=bonus2+(i-200000)*0.05;

else if(i<=600000)

bonus=bonus4+(i-400000)*0.03;

else if(i<=1000000)

bonus=bonus6+(i-600000)*0.015;

else

bonus=bonus10+(i-1000000)*0.01;

printf("bonus=%d",bonus);

getch();

}

==============================================================

程序3

題目:壹個整數,它加上100後是壹個完全平方數,再加上168又是壹個完全平方數,請問該數是多少?

1.程序分析:在10萬以內判斷,先將該數加上100後再開方,再將該數加上268後再開方,如果開方後

的結果滿足如下條件,即是結果。請看具體分析:

2.程序源代碼:

#include "math.h"

#include "stdio.h"

#include "conio.h"

main()

{

long int i,x,y,z;

for (i=1;i<100000;i++)

{

x=sqrt(i+100); /*x為加上100後開方後的結果*/

y=sqrt(i+268); /*y為再加上168後開方後的結果*/

if(x*x==i+100&&y*y==i+268) /*如果壹個數的平方根的平方等於該數,這說明此數是完全平方數*/

printf("\n%ld\n",i);

}

getch();

}

==============================================================

程序4

題目:輸入某年某月某日,判斷這壹天是這壹年的第幾天?

1.程序分析:以3月5日為例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊

情況,閏年且輸入月份大於3時需考慮多加壹天。

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

int day,month,year,sum,leap;

printf("\nplease input year,month,day\n");

scanf("%d,%d,%d",&year,&month,&day);

switch(month) /*先計算某月以前月份的總天數*/

{

case 1:sum=0;break;

case 2:sum=31;break;

case 3:sum=59;break;

case 4:sum=90;break;

case 5:sum=120;break;

case 6:sum=151;break;

case 7:sum=181;break;

case 8:sum=212;break;

case 9:sum=243;break;

case 10:sum=273;break;

case 11:sum=304;break;

case 12:sum=334;break;

default:printf("data error");break;

}

sum=sum+day; /*再加上某天的天數*/

if(year%400==0||(year%4==0&&year%100!=0)) /*判斷是不是閏年*/

leap=1;

else

leap=0;

if(leap==1&&month>2) /*如果是閏年且月份大於2,總天數應該加壹天*/

sum++;

printf("It is the %dth day.",sum);

getch();

}

==============================================================

程序5

題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。

1.程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,

然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

int x,y,z,t;

scanf("%d%d%d",&x,&y,&z);

if (x>y)

{t=x;x=y;y=t;} /*交換x,y的值*/

if(x>z)

{t=z;z=x;x=t;} /*交換x,z的值*/

if(y>z)

{t=y;y=z;z=t;} /*交換z,y的值*/

printf("small to big: %d %d %d\n",x,y,z);

getch();

}

==============================================================

程序6

題目:用*號輸出字母C的圖案。

1.程序分析:可先用'*'號在紙上寫出字母C,再分行輸出。

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

printf("Hello C-world!\n");

printf(" ****\n");

printf(" *\n");

printf(" * \n");

printf(" ****\n");

getch();

}

==============================================================

程序7

題目:輸出特殊圖案,請在c環境中運行,看壹看,Very Beautiful!

1.程序分析:字符***有256個。不同字符,圖形不壹樣。      

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

char a=176,b=219;

printf("%c%c%c%c%c\n",b,a,a,a,b);

printf("%c%c%c%c%c\n",a,b,a,b,a);

printf("%c%c%c%c%c\n",a,a,b,a,a);

printf("%c%c%c%c%c\n",a,b,a,b,a);

printf("%c%c%c%c%c\n",b,a,a,a,b);

getch();

}

==============================================================

程序8

題目:輸出9*9口訣。

1.程序分析:分行與列考慮,***9行9列,i控制行,j控制列。

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

int i,j,result;

printf("\n");

for (i=1;i<10;i++)

{

for(j=1;j<10;j++)

{

result=i*j;

printf("%d*%d=%-3d",i,j,result); /*-3d表示左對齊,占3位*/

}

printf("\n"); /*每壹行後換行*/

}

getch();

}

==============================================================

程序9

題目:要求輸出國際象棋棋盤。

1.程序分析:用i控制行,j來控制列,根據i+j的和的變化來控制輸出黑方格,還是白方格。

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

int i,j;

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

if((i+j)%2==0)

printf("%c%c",219,219);

else

printf(" ");

printf("\n");

}

getch();

}

==============================================================

程序10

題目:打印樓梯,同時在樓梯上方打印兩個笑臉。

1.程序分析:用i控制行,j來控制列,j根據i的變化來控制輸出黑方格的個數。

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

int i,j;

printf("\1\1\n"); /*輸出兩個笑臉*/

for(i=1;i<11;i++)

{

for(j=1;j<=i;j++)

printf("%c%c",219,219);

printf("\n");

}

getch();

}

.:.:經典c程序100例==11--20 :.:.

經典c程序100例==11--20

程序11

題目:古典問題:有壹對兔子,從出生後第3個月起每個月都生壹對兔子,小兔子長到第三個月

 後每個月又生壹對兔子,假如兔子都不死,問每個月的兔子總數為多少?

1.程序分析: 兔子的規律為數列1,1,2,3,5,8,13,21....

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

long f1,f2;

int i;

f1=f2=1;

for(i=1;i<=20;i++)

{

printf("%12ld %12ld",f1,f2);

if(i%2==0) printf("\n"); /*控制輸出,每行四個*/

f1=f1+f2; /*前兩個月加起來賦值給第三個月*/

f2=f1+f2; /*前兩個月加起來賦值給第三個月*/

}

getch();

}

==============================================================

程序12

題目:判斷101-200之間有多少個素數,並輸出所有素數。

1.程序分析:判斷素數的方法:用壹個數分別去除2到sqrt(這個數),如果能被整除,

則表明此數不是素數,反之是素數。     

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

#include "math.h"

main()

{

int m,i,k,h=0,leap=1;

printf("\n");

for(m=101;m<=200;m++)

{

k=sqrt(m+1);

for(i=2;i<=k;i++)

if(m%i==0)

{

leap=0;

break;

}

if(leap)

{

printf("%-4d",m);

h++;

if(h%10==0)

printf("\n");

}

leap=1;

}

printf("\nThe total is %d",h);

getch();

}

==============================================================

程序13

題目:打印出所有的“水仙花數”,所謂“水仙花數”是指壹個三位數,其各位數字立方和等於該數

 本身。例如:153是壹個“水仙花數”,因為153=1的三次方+5的三次方+3的三次方。

1.程序分析:利用for循環控制100-999個數,每個數分解出個位,十位,百位。

2.程序源代碼:

#include "stdio.h"

#include "conio.h"

main()

{

int i,j,k,n;

printf("'water flower'number is:");

for(n=100;n<1000;n++)

{

i=n/100;/*分解出百位*/

j=n/10%10;/*分解出十位*/

k=n%10;/*分解出個位*/

if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)

printf("%-5d",n);

}

getch();

}

==============================================================

程序14

題目:將壹個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。

程序分析:對n進行分解質因數,應先找到壹個最小的質數k,然後按下述步驟完成:

(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。

(2)如果n<>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作為新的正整數妳n,

 重復執行第壹步。

(3)如果n不能被k整除,則用k+1作為k的值,重復執行第壹步。

2.程序源代碼:

/* zheng int is divided yinshu*/

#include "stdio.h"

#include "conio.h"

main()

{

int n,i;

printf("\nplease input a number:\n");

scanf("%d",&n);

printf("%d=",n);

for(i=2;i<=n;i++)

while(n!=i)

{

if(n%i==0)

{

printf("%d*",i);

n=n/i;

}

else

break;

}

printf("%d",n);

getch();

}

==============================================================

**************************由於字數限制,未能提供完。

  • 上一篇:世界十大豪華車
  • 下一篇:C語言編譯器VC中的這些選項什麽意思?詳細易懂的答案給分。
  • copyright 2024編程學習大全網