二級C語言上機填空題技巧總結_第1頁
二級C語言上機填空題技巧總結_第2頁
二級C語言上機填空題技巧總結_第3頁
二級C語言上機填空題技巧總結_第4頁
二級C語言上機填空題技巧總結_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、上機填空題技巧總結一、 填空題之方法1. 上機填空題占30分,一般有3個空需要填寫,每個空為10分;2. 填空題做題之前必須弄清題目含義,抓住關鍵字,例如:要求對數組進行從小到大排序,則將會出現(xiàn)大于符號,如果是從大到小排序則出現(xiàn)小于符號;3. 填空題中出現(xiàn)頻率最高的就是函數的調用、函數的首部、函數的返回值等和函數相關的問題,因此必須牢牢掌握祝函數的基本特征;4. 填空題中有的“空”比較難,考生除了掌握必須的C語言知識之外,還需要很好的邏輯思路,如果一個空將花很多時間來解決,那么建議使用“死記硬背”的方法來縮短復習時間;5. 上機題庫中100題有部分題目是重復的或是相似的題目很多,同學們要使用比

2、對的方法盡量去理解;6. 多練習,多思考,多總結二、 填空題與結構體相關1. 結構體成員引用:上機題庫P18第9題(和92題一致),P27第23題(和51題一樣)讀清楚題目要求:(1) 要求將形參a所指結構體變量的數據賦值給函數中的結構體變量b(2) 從例如可以看出來:結構體中的學號和姓名變?yōu)榱?002和“LiSi”,但是3門課成績沒有變化#include <stdio.h>#include <string.h>struct student long sno; char name10; float score3;void fun(struct student a) st

3、ruct student b; int i;/*found*/ b = _1_;à題目要求將形參a的值賦值給結構體變量b,因此填:a b.sno = 10002;à學號變?yōu)榱?0002/*found*/ strcpy(_2_, "LiSi");à姓名要變?yōu)椤盠iSi”,則要引用b中的name成員 printf("nThe data after modified :n");/*講解是一句帶過不用多講*/ printf("nNo: %ld Name: %snScores: ",b.sno, );

4、/*講解是一句帶過不用多講*/*found*/ for (i=0; i<3; i+) printf("%6.2f ", b._3_);à分析:這個是一個循環(huán)語句,執(zhí)行3次循環(huán),printf("%6.2f ", b._3_)要求輸出是一個實型數據的成員,因此可以得知是score成員,因為score是一個數組,因此填:b.scorei,當i變化就可以取出第一門、第二門、第三門課的成績 printf("n");main() struct student s=10001,"ZhangSan", 95, 80

5、, 88; int i; printf("nnThe original data :n"); printf("nNo: %ld Name: %snScores: ",s.sno, ); for (i=0; i<3; i+) printf("%6.2f ", s.scorei); printf("n"); fun(s);23題:(1) 從例如中可以看出:變化的是結構體中的學號和姓名#include <stdio.h>#include <string.h>struct stud

6、ent long sno; char name10; float score3;void fun( struct student *b) int i;/*found*/ b_1_ = 10004;à題目中t的學號變化為了10004,因此填寫:b->sno,不能填寫b.sno,因為b是一個指針/*found*/ strcpy(b_2_, "LiJie");àt的姓名變?yōu)榱恕盠iJie”,因此填寫:b->namemain() struct student t=10002,"ZhangQi", 93, 85, 87; int i

7、; printf("nnThe original data :n"); printf("nNo: %ld Name: %snScores: ",t.sno, ); for (i=0; i<3; i+) printf("%6.2f ", t.scorei); printf("n");/*found*/ fun(_3_);à此處為函數調用,根據形參的類型來判定實參,形參struct student *b為結構體指針,聯(lián)系main函數定義部分只有struct student t和b的類型相同,

8、因此可知需要填的是:&t printf("nThe data after modified :n"); printf("nNo: %ld Name: %snScores: ",t.sno, ); for (i=0; i<3; i+) printf("%6.2f ", t.scorei); printf("n");2. 函數調用and結構體:上機題庫P22第16題(和78、82題一樣)重點注意:(1)把a中地址作為函數返回值返回函數(2)觀察可知a中的學號、姓名邊為了10002和“zhang

9、San”,每門課的成績增加了1分#include <stdio.h>#include <string.h>struct student long sno; char name10; float score3;/*found*/_1_ fun(struct student *a)à根據函數調用t = fun(&s);可知函數返回類型和t的類型相同,struct student s=10001,"ZhangSan", 95, 80, 88, *t;可知t的類型為struct student * int i; a->sno = 10

10、002; strcpy(a->name, "LiSi");/*found*/ for (i=0; i<3; i+) _2_ += 1;à題目要求將每門課成績增加1分,因此填為:a->scorei,不能為a.scorei或是a.score/*found*/ return _3_ ;à題目要求返回a的地址,a本身就是一個指針,因此填入a即可main() struct student s=10001,"ZhangSan", 95, 80, 88, *t; int i; printf("nnThe original

11、 data :n"); printf("nNo: %ld Name: %snScores: ",s.sno, ); for (i=0; i<3; i+) printf("%6.2f ", s.scorei); printf("n"); t = fun(&s); printf("nThe data after modified :n"); printf("nNo: %ld Name: %snScores: ",t->sno, t->name); fo

12、r (i=0; i<3; i+) printf("%6.2f ", t->scorei); printf("n");3. 結構體和排序:上機題庫P14第2題 重點注意:(1)排序的格式:紅色部分為考試中的重點,必須記住從小到大排序:for(i=0;i<n-1;i+)for(j=i+1;j<n;j+) if(ai>aj) t=ai;ai=aj;aj =t;從大到小排序:for(i=0;i<n-1;i+)for(j=i+1;j<n;j+) if(ai<aj) t=ai;ai=aj;aj =t; void fun

13、(struct student a, int n)/*found*/ _1_ t;à此處要求填入t的類型,可以從t = ai;中得知t和a數組的類型必須一致,void fun(struct student a, int n)中得知a為結構體類型,因此填寫:struct student int i, j;/*found*/ for (i=0; i<_2_; i+)à根據排序的格式填空,因此記住是關鍵 for (j=i+1; j<n; j+)/*found*/ if (strcmp(_3_) > 0)à按照姓名字典順序從小到大排序,因此:strcmp

14、(,),此處需要特別注意 t = ai; ai = aj; aj = t; main() struct student s4=10001,"ZhangSan", 95, 80, 88,10002,"LiSi", 85, 70, 78, 10003,"CaoKai", 75, 60, 88, 10004,"FangFang", 90, 82, 87; int i, j; printf("nnThe original data :nn"); for (j=0; j<

15、4; j+) printf("nNo: %ld Name: %-8s Scores: ",sj.sno, ); for (i=0; i<3; i+) printf("%6.2f ", sj.scorei); printf("n"); fun(s, 4); printf("nnThe data after sorting :nn"); for (j=0; j<4; j+) printf("nNo: %ld Name: %-8s Scores: ",sj.sno, sj.n

16、ame); for (i=0; i<3; i+) printf("%6.2f ", sj.scorei); printf("n"); 三、 填空題與鏈表相關1. 帶頭結點的鏈表:p=h->next,上機題庫P21第15題考點分析:(1)帶頭結點鏈表的表現(xiàn)形式:headabcABCNULL帶頭結點的鏈表,頭結點head不存放任何的數據,從頭結點的下一個結點開始存放數據,因此考試中如果出現(xiàn) p = _1_ ;則填入p=h->next(2)鏈表數據排序對數組元素從小到大排序:for(i=0;i<n-1;i+)for(j=i+1;j<

17、;n;j+) if(ai>aj) t=ai;ai=aj;aj =t;對鏈表元素進行從小到大排序:while (p) /*相當于數組排序中的for(i=0;i<n-1;)*/ q = p->next;/*相當于j=i+1*/ while (q) /*相當于for(;j<n;) if (p->data > q->data) /*相當于if(ai>aj)*/ t = p->data; p->data = q->data; q->data = t; /*如果ai>aj成立,則交換數據元素,讓數據變成從小到大排序*/ q =

18、q->next;/*相當于q+*/ p = p->next;/*相當于p+*/ 15題:#include <stdio.h>#include <stdlib.h>#define N 6typedef struct node int data; struct node *next; NODE;void fun(NODE *h) NODE *p, *q; int t;/*found*/ p = _1_ ;à鏈表為帶頭結點,因此填寫:p=h->next while (p) /*found*/ q = _2_ ;à比較兩個鏈表中元素的大小,

19、因此q=p->next,這樣q指向了p的下一位 while (q) /*found*/ if (p->data _3_ q->data)>從小到大排序,因此使用大于符號,填寫:> t = p->data; p->data = q->data; q->data = t; q = q->next; p = p->next; main() NODE *head; int aN= 0, 10, 4, 2, 8, 6 ; head=creatlist(a); printf("nThe original list:n")

20、; outlist(head); fun(head); printf("nThe list after sorting :n"); outlist(head);2. 不帶頭結點的鏈表:p=h(1) 不帶頭結點鏈表的表示形式:abcABCNULL不帶頭結點的鏈表沒有頭結點,鏈表的第一個結點存儲的就是數據,因此考試中如果出現(xiàn) p = _1_ ;則填入p=h(2) 講解P38第42題(和15題類似)void fun(NODE *h) NODE *p, *q; int t; p = h;à不帶頭結點的鏈表 while (p) /*found*/ q = _1_ ;

21、4;q指向p的下一位,因此填入:q=p->next/*found*/ while (_2_)à判斷q有沒有到末尾,因此填入p或是p!=NULL if (p->data > q->data) t = p->data; p->data = q->data; q->data = t; q = q->next; /*found*/ p = _3_ ;à while (p)為循環(huán)條件,要構成循環(huán)p就得自加或是自減,從循環(huán)體中得知沒有進行p+之類的操作,因此此處填入:p=p->next或是p+ main() NODE *hea

22、d; int aN= 0, 10, 4, 2, 8, 6 ; head=creatlist(a); printf("nThe original list:n"); outlist(head); fun(head);3. 鏈表的返回值:P43第50題(和43題類似)/*found*/_1_ fun(NODE *h)à根據函數調用head=fun(head);和 NODE *head; 知道函數的返回值為NODE * NODE *p, *q, *r; p = h; if (p = NULL)>如果p數據位空,則表示p中沒有任何的數據,因此就無需再進行逆置,故re

23、turn NULL; return NULL; q = p->next; p->next = NULL;/*found*/ while (_2_)à此空判斷q有沒有為空,講解時候不容易理解,考生記住即可,填入:while(q)或是while(q!=NULL) r = q->next; q->next = p; p = q;/*found*/ q = _3_ ;à填入:q=r;次空理解起來較難,因此考生必須認真記憶,老師無需多講 return p;main() NODE *head; int aN=2,4,6,8,10; head=creatlist(

24、a); printf("nThe original list:n"); outlist(head); head=fun(head); printf("nThe list after inverting :n"); outlist(head);四、 填空題與文件相關1. 文件指針定義(1) 文件定義的形式:FILE *fp;(課本P115)(2) 舉例:上機題庫P30第28題第一空/*found*/ _1_ fp;分析:在涉及文件類型的上機題目時fp指的就是文件指針,因此在前面填寫類型時候直接寫入:FILE *fp;(3) 類似題目:P32第32題第1個空

25、、P67第88題第2個空2. 文件打開(1) 文件打開的格式:fopen(“文件名”,“打開方式”);(課本P115)(2) 舉例:P31第30題第1個空void fun(char *filename, STU n) FILE *fp;/*found*/fp = fopen(_1_, "rb+");分析:缺少了文件名,形參filename是實參傳過來的文件名,因此這里直接填入:fp = fopen(filename, "rb+");表示以“讀和寫”的方式打開一個二進制文件filename(3) 類似的題目:P41第47題第1個空、P71第94題第1個空、

26、P72第96題第3空3. 文件關閉(1) 文件關閉的格式:fclose(文件指針);(課本P117)(2) 舉例:上機題庫P30第28題第2空fp = fopen("file1.txt", "w");/*第一次以寫的形式打開文件file1.txt*/ fprintf(fp, "%s %d %fn", s, a, f);/*found*/ _2_ ;fp = fopen("file1.txt", "r");/*第二次以讀的形式打開文件file1.txt*/分析:打開文件以后必須將它關閉,因此該空要

27、填:fclose(fp);(3) 類似題目:P72第96題第2空4. 測試文件結束(1) 判斷文件結束的feof函數形式:feof(fp)(課本P118)(2) 經常出現(xiàn)在while()的表達式里面,常見形式為:while(!feof(fp)測試指針fp有沒有結束(3) 舉例:上機題目P26第22題第1空FILE *fp; STU n; int i; fp = fopen(filename,"rb+");/*found*/ while (!_1_)分析:填寫feof(fp)測試fp指針又沒有結束(4) 類似題目:P32第32題第2個空、P61第80題第1個空、P71第94題

28、第2個空5. 設置文件位置函數(1) fseek設置文件位置:fseek(文件指針,位移量,移動起始點)(課本P118)(2) 考試一般考查的是移動的起始點:SEEK_SET表示文件開始,SEEK_CUR表示文件當前位置,SEEK_END表示文件末尾(3) 舉例:上機題庫P31第30題第2個空/*found*/fseek(fp, -1L*sizeof(STU), _2_);分析:題目要求:重寫形參filename所指文件中最后一個學生的數據,因此文件指針fp要指向最后的位置,則填入:fseek(fp, -1L*sizeof(STU), SEEK_END);(4) 類似題目:P26第22題第3空

29、、P61第80第3空、6. 讀二進制文件(1) fwrite(存入數據的指針,每一個數據占有的字節(jié),輸入數據的個數,文件指針);(課本P120)(2) 舉例:P31第30題第3空void fun(char *filename, STU n) FILE *fp;/*found*/ fp = fopen(filename, "rb+");/*打開文件filename*/*found*/ fseek(fp, -1L*sizeof(STU), SEEK_END);/*定位到最后一個學生的位置*/*found*/ fwrite(_3_, sizeof(STU), 1, fp);/*將

30、形參n新學生的數據覆蓋最后一個學生的數據,因為fp已經定位到了最后一個學生的位置*/ fclose(fp);分析:題目要求用新數據覆蓋最后一個學生的數據,因此填入:fwrite(&n, sizeof(STU), 1, fp);填入的是地址,不能是:fwrite(n, sizeof(STU), 1, fp);(3) 類似題目:P41第47題第3空,P67第88題第3空、7. 寫二進制文件函數(1) fread(讀出數據的指針,每一個數據占有的字節(jié),輸出數據的個數,文件指針);(2) 上機考試填空題沒有出現(xiàn)需要填寫的空,考生作一般的了解8. fcanf函數數和fprintf函數(1) fs

31、canf(文件指針,格式控制字符串,輸入列表項);(2) fprintf(文件指針,格式控制字符串,輸出列表項);(3) fscanf函數和fprintf函數在上機編程題中詳細介紹,這里不作重點講解,了解即可五、 填空題與函數相關1. 函數調用:P13第1題#include <stdio.h>double f1(double x)定義了f1函數,有一個形參 return x*x; double f2(double x, double y) 定義了f2函數,有兩個形參 return x*y; /*found*/_1_ fun(int i, double x, double y)

32、24;根據函數調用r = fun(1, x1, x2);可知函數返回值和r類型一致,double x1=5, x2=3, r;r為doule類型,則函數返回double if (i=1)/*found*/ return _2_(x);à此處為函數調用,實參數為1,根據實參和形成個數一致可知,調用的為f1函數 else/*found*/ return _3_(x, y);à此處的實參數為2,則調用f2函數 main() double x1=5, x2=3, r; r = fun(1, x1, x2); r += fun(2, x1, x2);printf("nx1=

33、%f, x2=%f, x1*x1+x1*x2=%fnn",x1, x2, r);六、 填空題與數組相關1. 類似題目:3、4、7、20、24、26、39、40、41、54、57、64、68、70、71、76、89、90、992. 一維數組中存在這樣一些類型:(1) 求一個數值數組中的所有值的平均值和把大于或者小于平均值的數輔導例外一個數組中。在計算機平均值時,首先定義一個變量來存放平均分,平均分一般用av變量來代替,如果av已經定義但是沒有賦初值,那么這個空填寫的內容的為:av=0;(2) 求算平均值值時有兩種方法,第一種是算出總的分數,最后再除以總的個數即可,如算1到6之間的數的平

34、均值,首先算出1到6的和,其次用綜合除以總的個數6,即可以得到平均值;第二種方法是用每一個數除以6再把所有的和加起來。即1/6+2/6+3/6+4/6+5/6+6/6;所以在執(zhí)行的一維數組中算平均值時也是存在來中情況,如果在for語句的后面有av=av/N;則第二個空一般的填寫時av+=si;如果說沒有av=av/N;則填寫的是:av+=si/N;(3) 在后面的一個空的填寫的時候要注意變量的使用情況,如果變量使用了j和i,那么這一個空的填寫的內容為:j+;(4) 如果一維數組中求的是把大于或者是小于平均值的數移動到數組的首部的時候,這種題目的解答時這樣的,第一個空一般填寫的內容為:j+;第二

35、個空填寫的內容是-1;(5) 對數組進行排序時:如果是從大到小的排序的時候,用的是小于符號,如果是從小到大排序時使用的是大于符號。3. 二維數組中的題目類型以及解決的技巧:(1) 二維數組的題目,填空的時候一般是填在函數調用,函數在調用時候寫的應該是而為數組的名字;在定義函數的時候使用的是函數的類型和由m各元素組成一行的指針變量,假設二維數組的名字是ss,那么填寫的內容是:(*ss)M;如果調用的是普通變量則填寫的內容為:int n;(2) 二維數組遍歷時,使用的是兩個循環(huán),使用的是循環(huán)的嵌套使用,第二個循環(huán)的使用的時候填寫的內容為:j=0;(特殊的特殊處理)(3) 交換兩個變量的值的使用的格

36、式為: t=a;a=b;b=t; 記住交換變量的格式和順序。(4) 如果二維數組是字符串的題目的時候,要記住字符串中函數的使用的格式;即:strlen、strcmp、strcpy、sizeof、strcat的使用格式。注意里面的格式中使用的都是和指針。(5) 特殊的特殊處理。第7題的填空的內容記住。七、 填空題與數學公式相關1. 解題方法:(1) 如果在函數中定義變量,但是沒有定義成靜態(tài)存儲變量,即變量前面沒有static,應給變量賦初值,如果以后用到的是加減運算,則賦初值為0或者是0.0;如果以后用到的是乘除運算,則賦初值為1或者是1.0;(2) 循環(huán)條件的填空,分析表達式的規(guī)律,看表達式中

37、的最后一項的值是否到了第m項或者是第n項,如果到了第m或者第n項,則在循環(huán)中的第二個表達式中用到的是i<=m或者是i<=n;(3) 循環(huán)條件中如果用的是while語句,則循環(huán)變量的初值應該在while的外面定義和賦初值,在循環(huán)語句中必須給變量自加或者是自減。如果沒有則一般填的是i+;(4) 看表達式中的每一項的運算規(guī)則,按照運算的規(guī)則把每一項中的n值替換為i,特殊情況例外。如果是表達式中用到的是間隔相加減的運算時,注意給中間變量賦初值為1或者是1.0;在后面的運算中給變量乘以一個-1,以改變中間變量的符號。2. 解題分析:(1) 看清題目中要求的題意,題目要求做什么就只需考慮什么。

38、(2) 找出題目中的表達式:當n=1時,表達式變?yōu)?,當n=2時,表達式為,n不斷的變化,得到的表達式值也不相同,題目中要求將n=1,n=2n=n的值進行一個累加,最后得到一個結果賦值給變量s。(3) 通過以上的分析我們可以得到如下的信息:1) 需要一個變量來存儲結果值。對應到程序中,我們使用s來表示,因為計算的結果可能為小數,因此將s定義為實型。2) 需要一個變量從1開始遞增到n,對應到程序中用i表示。3) 需要用到循環(huán)的知識。4) 函數最后會將s的值進行返回。double fun(int n) int i; double s, t;/*found*/ s=_1_;需要給s賦初始值,一般賦值為

39、0或是1,這里面有規(guī)律,在填空題中一定填入的是0。/*found*/ for(i=1; i<=_2_; i+)需要填入的是i變量的初始值和結束值,結束值一般是通過實參傳遞給形參的,因此很多時候填入形參名即可。 t=2.0*i; 將2*i的值賦值給變量t,因此遇到直接用t*t代替就行。/*found*/s=s+(2.0*i-1)*(2.0*i+1)/_3_; 需要在(2.0*i-1)*(2.0*i+1)/_3_;中填入適當的值來補充完整表達式,比較得知,(2.0*i-1)*(2.0*i+1)/_3_;缺少的是部分,上面分析過可以用t*t來代替,因此,第三個填入t*t就行! return s

40、;3. 類似題目:6、13、25、29、36、46、52、60、66、69、73、83、95八、 填空題與字符串相關1. 刪除字符串(1) 主要考查二維字符數組與字符串的操作(2) 舉例1:P18第8題(和65題一樣)#define N 5#define M 10int fun(char (*ss)M, int k)/*char (*ss)M行指針,下標與二維數組x的列下標相同,k通過實參傳遞過來后為7*/ int i,j=0,len;/*found*/ for(i=0; i< _1_ ; i+)/*根據len=strlen(ssi);可知i代表的是行,因此填入for(i=0; i<

41、; N ; i+)*/ len=strlen(ssi);/*found*/ if(len<= _2_);/*題目要求將串長超過k的字符串刪除,換個說法就是將串小于等于k的字符串留下,因此該空填寫if(len<= k)*/*found*/ strcpy(ssj+,_3_);/*將ssi行的值賦值到sj中,該空出現(xiàn)頻率很高,因此要牢記。strcpy(ssj+,ssi)*/ return j;main() char xNM="Beijing","Shanghai","Tianjing","Nanjing",&

42、quot;Wuhan" /*定義了一個5行10列的二維字符數組x*/ int i,f; printf("nThe original stringnn"); for(i=0;i<N;i+)puts(xi); printf("n"); f=fun(x,7);/*將二維數組x傳給fun函數的第一個形參,將7傳遞給fun函數的第二個形參*/ printf("The string witch length is less than or equal to 7 :n"); for(i=0; i<f; i+) puts(xi)

43、;printf("n");(3) 舉例2:P19第10題(和93題一樣)#define N 5#define M 10/*found*/void fun(char (*ss) _1_, int k)/*根據函數調用可知,char (*ss) _1_和實參二維數組x對應,因此必須與列下標對應,故填寫char (*ss)M*/ int i=0 ;/*found*/ while(i< _2_) /* ssik可知,i處于行的位置,因此i要小于最大行長度,因此填入:while(i<N)*/*found*/ssik=_3_; i+; /*將所有串長超過K的字符串右邊的字符刪除,請看分析可知,如果在k位置加一個0則所有字符串的長度為k,因此填寫:ssik=0;*/ABC00001234000abcdef0AB000001204000ab0def0main() char xNM="Create","Modify","Sort","skip","Delete" int i; printf("nThe original stringnn"); for(i=0;i<N;i+)puts(xi); printf(&quo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論