计算机二级上机解题技巧

更新时间:2024-01-23 02:55:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

昆明新视野教育

一、填空题

(一)链表类型题目包括:15、42、43、50、56、75、79、85、86、87 技巧解析:

1、 首先看清楚题目要求和意思。看清楚链表有没有带头结点,如果带有头结点,指向数据源的指针内容是p=h—>next;如果是不带有头结点,则填写的是p=h;

2、 如果所要填写的空在循环语句while的括号中的时候,里面的内容填写的是p或者是q,以最近出现的为主;如果是在循环语句的里面的时候,填写的是q=p—>next;

3、如果是排序的时候,从小到大的时候是大于号,从大到小的时候是小于号。

4、如果链表题目中考到调用函数,一般只需要填入实参head,例如:fun(head);在构造链表的时候都会有头结点,一般用head来表示,head指向了链表中的第一个数据的地址。 细化分类:

1. 将数据域中的数据进行排序,类似题目:15、42 void fun(NODE *h)

{ NODE *p, *q; int t; /**********found**********/

p = __1__ ;指向数据源,由于h是带头结点的链表,因此需要填入h->next while (p) {判断链表p是否已经到末尾 /**********found**********/

q = __2__ ; 比较两个数的大小,因此需要q指向p中的下一个数据需要填入p->next,也就是说p指向了第一个数据,q指向了第二个数据。 while (q) {判断q是否指向了末尾 /**********found**********/

if (p->data __3__ q->data)从小到大排序,因此填入大于符号 { t = p->data; p->data = q->data; q->data = t; }交换数据 q = q->next; q自增,目的是比较出最小的数据 }

p = p->next; p自增 } }

联想记忆分析1:对一维数组进行从小到大排序 void fun(int b[N]) { int i, j, a; for(i=0;i

if(b[i]>b[j]){a=b[i];b[i]=b[j];b[j]=a;} } }

联想记忆分析2:对结构体数组按照姓名进行从小到大排序 for(i=0;i

if(strcmp(a[i].name,a[j].name)>0){a=b[i];b[i]=b[j];b[j]=a;}

1

我们一直在用心做教育!

昆明新视野教育

2. 将数据域中的元素逆置,类似的题目:43、50

链表中数据域中的元素逆置,首先将第一个数据取出来放在最后一个位置,也就是将其next置空,表示已经到了末尾。接着将第二个数据放到第一个的前面,依次类推即可将整个数据域逆置。 void fun(NODE *h) { NODE *p, *q, *r;

/**********found**********/

p = __1__;指向数据源,由于h是带头结点的链表,因此需要填入h->next /**********found**********/

if (__2__) return;填入p==NULL,判断第一个数据是否为空,如果为空就无需逆置,执行return语句,结束函数的执行。

q = p->next; q指向了p的下一个数据,确保链表的完整性

p->next = NULL; 将第一个数据取出来放在最后一个位置,也就是将其next置空,表示已经到了末尾。 while (q)

{ r = q->next; 用来跟踪数据,指向了q的下一个数据

q->next = p; 将第二个数据放到第一个的前面,依次类推即可将整个数据域逆置。 /**********found**********/

p = q; q = __3__;这里需要将q指向后面的数据,因此可以填入q->next,或者是r都可以。 }

h->next = p; }

联想记忆分析1:数组元素的逆置 int a[10]={1,2,3,4,5,6,7,8,9,10}; int i,j=0,b[10];

for(i=9;i>=0;i--){b[j]=a[i],j++;}

数组的逆置只需从数组长度减一开始往后将元素放在另外一个数组中就行。

联想记忆分析2:字符串的逆置 void fun(char *str) { char *p; int len;

len=strlen(str); while(len) { *p=str[len-1]; len--; p++; } }

函数的功能实现了指针p指向了字符串str逆置后的首地址。

3. 输出数据,释放结点,缩短链表,类似的题目:56

2

我们一直在用心做教育!

昆明新视野教育

4. 给一个递增有序的链表插入一个新结点,并保持链表有序。类似的题目:87 5. 统计结点个数,计算结点之和。类似的题目:75、85

6. 删除链表中数据域值相同的节点,保留一个。类似的题目:79

(二)结构体类型的题目:2、9、16、22、23、30、33、47、51、78、80、82、88、92、97 1.对数据进行排序,类似的题目:2、97

注意:排序涉及到数据的经典交换,所要填写的数据有窍门。例如:t=a; a=b;____需要填空,根据交换的“三步曲”很容易确定这个空一定填入b=t。 for(i=0;i

if(strcmp(a[i].name,a[j].name)>0)考点③

{a=b[i];b[i]=b[j];b[j]=a;}

考点①中要求填入i

考点③注意两点,一是strcmp(a[i].name,a[j].name)比较a[i]和a[j]中的name谁大,二是“>”的使用,大于符号用于从小到大的排序,小于符号用于从大到小的排序。

2.将形参a所指的结构体变量中的数据赋值给结构体变量b,进行相应的修改,类似的题目:9、16、23、33、51、78、82、92

void fun(struct student a) { struct student b; int i; /**********found**********/

b = __1__;将形参a中的值赋值给结构体变量b,因此填入a进去即可 b.sno = 10002;改变结构体变量b中的sno为10002 /**********found**********/

strcpy(__2__, \将“LiSi”赋值给变量b中的name,因此填入b.name printf(\

printf(\输出变量b中的学号和姓名 /**********found**********/

for (i=0; i<3; i++) printf(\输出变量b中的成绩,因为成绩是一个数组有三个元素,因此用循环来控制输出,所以填入b.score[i] printf(\}

对比记忆:

struct student考点① fun(struct student a) { int i;

a->sno=1002;考点②

strcpy(a->name,”LiSi”);考点③ for(i=0;i<3;i++)a->scare[i]+=1;考点④ return a;}

3.结构体和文件结合,类似的题目:22、30、47、80、88

3

我们一直在用心做教育!

昆明新视野教育

void fun(char *filename, long sno) { FILE *fp;

STU n; int i;

fp = fopen(filename考点①,\/**********found**********/ while (!__1__考点②)

{ fread(&n, sizeof(STU), 1, fp);考点③ /**********found**********/ if (n.sno__2__) break; }

if (!feof(fp))

{ for (i=0; i<3; i++) n.score[i] += 3; /**********found**********/

fseek(fp, -1L*__3__, SEEK_CUR);考点④ fwrite(&n, sizeof(STU), 1, fp);考点⑤ }

fclose(fp); }

考点1需要注意打开的是哪个文件,本题目中指向的是形参filename所指向文件。 考点2 feof(fp)用于判断文件是否结束。

考点3 fread(&n, sizeof(STU), 1, fp)从文件中读取一个数据给变量n。

考点4 fseek(fp, -1L*__3__, SEEK_CUR);将指针移动到当前位置前一位,由于指针指向的是结构体,因此fseek(fp, -1L*sizeof(STU), SEEK_CUR); 考点5 写入数据fwrite(&n, sizeof(STU), 1, fp);

(三)文件类型的题目:22、28、30、32、47、63、80、88、94

1、文件类型的题目,看清楚题目意思,定义一个文件的指针,第一个位置出现fp的时候要填FILE *; 2、掌握文件中fopen、fprintf、fscanf、fputs、fputc、fgets、fgetc、fseek、fwrite、fread、rewind函数的使用的格式。

fopen(“文件名”,“打开方式”); fclose(文件指针);

fscanf(文件指针,格式控制字符串,输入列表项); fprintf(文件指针,格式控制字符串,输出列表项);

fwrite(存入数据的指针,每一个数据占有的字节,输入数据的个数,文件指针); fread(读出数据的指针,每一个数据占有的字节,输出数据的个数,文件指针); 3、文件打开之后要注意关闭文件,关闭文件的函数fclose(文件指针);

4、在循环语句中如果使用到的是while(!feof( ))空格中填写的文件指针,表明判断的是文件指针是否已经指到了文件的末尾。备注:如果文件指针指到了文件的末尾,则feof返回的是非零值,如果没有指在文件的末尾,返回的是0值。

(四)数组类型的题目:3、4、7、20、24、26、39、40、41、54、57、64、68、70、71、76、89、90、99

4

我们一直在用心做教育!

昆明新视野教育

一维数组中存在这样一些类型:

1、 求一个数值数组中的所有值的平均值和把大于或者小于平均值的数辅导例外一个数组中。在计算机平均值时,首先定义一个变量来存放平均分,平均分一般用av变量来代替,如果av已经定义但是没有赋初值,那么这个空填写的内容的为:av=0;

2、 求算平均值值时有两种方法,第一种是算出总的分数,最后再除以总的个数即可,如算1到6之间的数的平均值,首先算出1到6的和,其次用综合除以总的个数6,即可以得到平均值;第二种方法是用每一个数除以6再把所有的和加起来。即1/6+2/6+3/6+4/6+5/6+6/6;所以在执行的一维数组中算平均值时也是存在来中情况,如果在for语句的后面有av=av/N;则第二个空一般的填写时av+=s[i];如果说没有av=av/N;则填写的是:av+=s[i]/N;

3、 在后面的一个空的填写的时候要注意变量的使用情况,如果变量使用了j和i,那么这一个空的填写的内容为:j++;

4、 如果一维数组中求的是把大于或者是小于平均值的数移动到数组的首部的时候,这种题目的解答时这样的,第一个空一般填写的内容为:j++;第二个空填写的内容是-1;

5、 对数组进行排序时:如果是从大到小的排序的时候,用的是小于符号,如果是从小到大排序时使用的是大于符号。

二维数组中的题目类型以及解决的技巧:

1、 二维数组的题目,填空的时候一般是填在函数调用,函数在调用时候写的应该是而为数组的名字;在定义函数的时候使用的是函数的类型和由m各元素组成一行的指针变量,假设二维数组的名字是ss,那么填写的内容是:(*ss)[M];如果调用的是普通变量则填写的内容为:int n;

2、 二维数组遍历时,使用的是两个循环,使用的是循环的嵌套使用,第二个循环的使用的时候填写的内容为:j=0;(特殊的特殊处理)

3、 交换两个变量的值的使用的格式为: t=a;a=b;b=t; 记住交换变量的格式和顺序。

4、 如果二维数组是字符串的题目的时候,要记住字符串中函数的使用的格式;即:strlen、strcmp、strcpy、sizeof、strcat的使用格式。注意里面的格式中使用的都是和指针。 5、 特殊的特殊处理。第7题的填空的内容记住。

(五)字符串类型的题目:5、8、10、11、12、14、18、19、21、34、35、45、48、49、53、55、62、65、67、72、74、77、81、91、93、100 解题方法:

1、循环的条件是判断该字符是否和结束符(’\\0’)相等,如果相等,说明该字符串结束,否则说明没有结束,继续循环。

2、把一个数字字符转变成对应的数值的格式是:ch=ch-‘0’;把大写字母转变为小写字母的格式:ch=ch+32;把小写字母转变为大写字母的格式为: ch=ch-32;

3、 区分好字符数组中的指针(p)和指针所指的值(*p)的关系。在循环语句中,当指针往后走一个位置的时候,用的是指针的自加,而不是指针所指的值的自加。即:p++,不能是(*p)++,后者就是值的自加。 4、 掌握字符数组中的函数的使用的格式。即:strlen、strcmp、strcpy、sizeof、strcat的使用格式。注意里面的格式中使用的都是指针或是地址。

5、 字符数组结束时都有一个结束符:‘\\0’;在字符数组中的题目中的结束后要加上一个结束符。也可以用0来代替‘\\0’。

5

我们一直在用心做教育!

昆明新视野教育

6、如果考察的是字符串数组,注意函数定义中形参的定义,例如:定义的是N行M列的二维数组来存放字符串。那么void fun(char (*ss) __1__, int k)

fun函数中的形参必须填入的是char (*ss)[M],不能是char (*ss)[N]考试的时候要特别注意。

(六)数学题目:6、13、25、29、36、46、52、60、66、69、73、83、95 解题方法:

1.如果在函数中定义变量,但是没有定义成静态存储变量,即变量前面没有static,应给变量赋初值,如果以后用到的是加减运算,则赋初值为0或者是0.0;如果以后用到的是乘除运算,则赋初值为1或者是1.0;

2.循环条件的填空,分析表达式的规律,看表达式中的最后一项的值是否到了第m项或者是第n项,如果到了第m或者第n项,则在循环中的第二个表达式中用到的是i<=m或者是i<=n;

3.循环条件中如果用的是while语句,则循环变量的初值应该在while的外面定义和赋初值,在循环语句中必须给变量自加或者是自减。如果没有则一般填的是i++;

4.看表达式中的每一项的运算规则,按照运算的规则把每一项中的n值替换为i,特殊情况例外。如果是表达式中用到的是间隔相加减的运算时,注意给中间变量赋初值为1或者是1.0;在后面的运算中给变量乘以一个-1,以改变中间变量的符号。 解题分析:

(1) 看清题目中要求的题意,题目要求做什么就只需考虑什么。

(2) 找出题目中的表达式:

当n=1时,表达式变为,当n=2时,表达式为,n不断的变化,

得到的表达式值也不相同,题目中要求将n=1,n=2?n=n的值进行一个累加,最后得到一个结果赋值给变量s。

(3) 通过以上的分析我们可以得到如下的信息:

1) 需要一个变量来存储结果值。对应到程序中,我们使用s来表示,因为

计算的结果可能为小数,因此将s定义为实型。

2) 需要一个变量从1开始递增到n,对应到程序中用i表示。 3) 需要用到循环的知识。

4) 函数最后会将s的值进行返回。 double fun(int n)

{ int i; double s, t; /**********found**********/

s=__1__;需要给s赋初始值,一般赋值为0或是1,这里面有规律,在填空题中一定填入的是0。 /**********found**********/

6

我们一直在用心做教育!

昆明新视野教育

for(i=1; i<=__2__; i++)需要填入的是i变量的初始值和结束值,结束值一般是通过实参传递给形参的,因此很多时候填入形参名即可。

{ t=2.0*i; 将2*i的值赋值给变量t,因此遇到/**********found**********/

s=s+(2.0*i-1)*(2.0*i+1)/__3__; 需要在(2.0*i-1)*(2.0*i+1)/__3__;中填入适当的值来补充完整

直接用t*t代替就行。

表达式上面分析过 }

return s; }

,比较得知,(2.0*i-1)*(2.0*i+1)/__3__;缺少的是

可以用t*t来代替,因此,第三个填入t*t就行!

部分,

二改错题分类总结

改错题总的出错分为两大类:语法出错和逻辑出错,此类题目是比较简单的题型,因此也是最容易把握的知识点。

注意:错误都是出现在/**********found**********/下面的这一行。只是下面的这一行,其他行都没有错误。不能修改其他行。 做题方法:

1.首先拿到题目,先将题目详细看看,看清题目对做题时很有帮助的,特别是一些逻辑性较强的题目很有用。有的同学可能会觉得题目太难了不想去读,其实在做改错题目时即便你不会也能把题目做对。 2.按照以下的步骤解决题目中的错误的内容,对应着修改。修改完之后保存即可。 一 语法错误

1.关键字出错:在二级C语言考试中仅仅考查学生对基本的关键字掌握情况,比如:整型就是int不是Int,知识点简单。

(1)6题第二个空:If应该改为if; (2)12题第二个空:If应该改为if; (3)23题第一空:dounle应该改为double; (4)35题第二空:If应该改为if;90

(5)36题第二空:Double应该改为double。51题的第一空double (6)2题第二空:wihle应该改为while。 (7)return为小写,不能使大写的。54、86

2.格式出错:在考试中主要考查学生细心的程度,最喜欢考简单的知识点。

(1)少分号:2题第一空、28题第一空、29题第一空、34题第二空、37题第二空、48题第二空。考查的知识点:分号是语句结束的标志。59、70、79、97、

(2)for语句的格式:for( ; ; )中间用分号隔开不是用逗号隔开。3题第二空、6题第一空、14题第二空都是出现了for语句格式出错的问题。53、73

(3)if语句的格式:if(表达式),if后面必须加上小括号。37题第一空if后面必须加上小括号。 (4)命令行格式出错:17题第一空中include命令少了#,正确的形式应该是#include “stdio.h”; (5)常用函数格式:

7

我们一直在用心做教育!

昆明新视野教育

A 22题第一空中n=strlen[aa]应该改为n=strlen(aa),记住函数名后面一定是花括号,不能是方括号,方括号只有在数组下标中用到。

B 49题第一空int j,c,float xa=0.0;应该改为int j,c;float xa=0.0;记住:要同时定义两种以上不同的数据类型的时候必须在不同类型的数据中间加上分号。

C 41题第二空scanf(“%d”,a[i][j]);应该改为scanf(“%d”,&a[i][j])。考查Scanf输入函数的格式。 (6)数组:

A数组下标引用时候只能用方括号。28题第二空t(k)=b(j)应该改为t[k]=b[j]。 B二维数组中的列下标不能省略。46题第一空必须将数组列下标补充完整。 (7)常用符号出错:

A C语言中大于等于符号是“>=”,但是在考试的时候可能出现将它写为“=>”,49题第二空就是这样的错误。

B 当题目中需要比较某个字符是否是大写字母或是小写字母、数字时,必须将“与”、“或”、“非”记住。

判断某个字符是否是大写字母:char ch;if(ch>=’A’&&ch<=’Z’)printf(“%c”,ch); 判断某个字符是否是小写字母:char ch;if(ch>=’a’&&ch<=’z’) printf(“%c”,ch); 判断某个字符是否是数字:char ch;if(ch>=’0’&&ch<=’9’)printf(“%c”,ch); 判断某个数字是否能同时被5和7整除:

int i=35; if(i%5==0&&i%7==0)printf(“%d”,i); 判断某个数字是否能被5或7整除:

int i=35; if(i%5==0||i%7==0)printf(“%d”,i); 判断某个数字是否是偶数或奇数:

int i=35; if(i%2==0)printf(“%d是一个偶数”,i);

else printf(“%d是一个奇数”,i);

二 逻辑错误

1.使用了没有定义过的变量:这种题目可以通过编译查找出出错的地方并改之。

(1)0(零)和o(字母欧)的区别:19题第一空、23题第二空、43题第二空、51题第二空。77、98、 (2)P(大)和p(小)的区别:33题第一空。82 (3)普通变量大小写的区别:

A有的变量在定义的时候是小写但是在使用的时候是大写,或是在定义的时候是大写在使用的时候却是小写。

B 大小写没有出错,程序中直接使用了没有定义过的变量,要求学生更加细心的读题目。45题第二空使用到了i这个变量,但是我们在定义行中没有找到i的定义,因此在做题时候要上下结合来分析题目。22题第二空c=aa[j]中的c没有定义过,参看定义的语句不能发现应该是ch=aa[j]。38题第一空要求将后面用到的变量s1定义完整。 2.运算符号出错:

(1)C语言中除号是“/”不是“\\”

(2)赋值号(=)和等号(= =)混淆,记住在if语句中出现赋值号(=)一般是讲它改为等号(= =)。14题第一空和29题第二空都是这样的错误。87、91、94 3.表达式的取值范围出错:

8

我们一直在用心做教育!

昆明新视野教育

当遇到计算表达式的累加或是累减时,一定用到循环来完成相应的操作。例如:改错题第七题中要求计算t=1-1/2*2-1/3*3-….-1/m*m这个表达式,在这个题目中第一空有这样的for语句:for(i=2;i

4.C语言中的除法运算:

这个考点同样考查表达式的相关知识。例如:改错题第七题中要求计算t=1-1/2*2-1/3*3-….-1/m*m这个表达式,在这个题目中第一空有这样的for语句:for(i=2;i

遇到这种题目在改错题中最容易考查的是大于(>)、小于(<)等符号的变化,当你查找出错的地方没有语法错误,也没有使用了未定义的变量时,记住这个口诀:将大于改为小于,将小于改为大于!11题第二空、12题第一空和13题第二空、4题第二空都可以用这样的方法。58 6.函数的返回值及其参数:重点

int fun(int x,int y) main() { {

if(x>y)return x; int a,b,c;

else return y; scanf(“%d%d”,&a,&b); } c=fun(a,b);

printf(“最大值为:%d”,c);}

(1) 函数的返回类型:在上面的例子中fun函数的返回值是int,如果将int改为double,很明显是错误的。

从两个地方来看,首先return x;中x的类型必须和fun函数中的返回值相同,x是整型。其次c=fun(a,b);中fun函数将一个返回值赋值给了变量C,说明函数返回的值一定是整型。记住:函数调用、函数的返回值和ruturn中数据类型必须一致!1.1、3.1、16.1、19.2、34.1、36.1、40.1、48.1、71都死这样的错误,(注1.1表示第一题第一空)。78、89、90、

(2) return后面的表达式及其类型:19.2、30.2、39.2 (3) 函数传递的参数:

int fun(int *x,int *y) main() { {

if(*x>*y)return *x; int a,b,c;

else return *y; scanf(“%d%d”,&a,&b); } c=fun(&a,&b);

printf(“最大值为:%d”,c);}

一定注意:传递的是值还是地址。比较上面两个例子大家很容易区别传递的是值还是地址,第一个例子调用函数的时候传递的是值,因此在fun函数的形参中x和y仅仅是普通的变量,而第二个例子中调用函数的时候传递的是地址,因此在fun函数的形参中x和y就是两个指针变量。5.1、13.1、17.2、20.1、25.2、52.1、56、84、85、依据刚刚讲的方法很快就能找出出错点。100 (4)指针的使用:

9

我们一直在用心做教育!

昆明新视野教育

int fun(int *x,int *y) {

if(*x>*y)return *x; else return *y; }

在此例中fun函数的形参是x和y,它们的类型是整型的指针,那么在fun函数的函数体中使用到x和y的值时一定要区分:x>y比较的是x和y所存变量地址的大小,*x>*y才是比较值的大小。如果存在*x=x+y;的类似情况一定是错误的,必须要将赋值号的左右两边的类型变为一致。 5.2、5.3、20.2、24.2、35.1、44.1、72、75、一定特别注意! 7.数组:

(1)数组下标的初始值:数组下标从零开始,到长度减一结束。考试技巧:当出错行在定义部分时,先检查该定义语句有没有语法错误,再看定义语句中的变量有没有赋初始值,最后看变量赋的初始值有没有正确。 定义初始值有窍门,遇到累加时,用来存放累加和的变量一般赋值为零,遇到求阶乘时,用来存放阶乘值的变量一般赋值为一。8.1中的变量k赋值为1,但是我们说了数组的下标只能从0开始,因此将1改为0就行了。

(2)普通变量的初始值:依照上面的技巧,我们同样可以将它延伸到普通变量中。41.1中需要将变量的值进行初始化,题目中有这样的要求:“输出主对角线元素之和”,既然这样我们很肯定初始值应该为零,接着我们看看是给哪个变量赋值?看printf(“sum=%d”,sum);输出的是sum的值,说明sum就是我们要补充在横线上的变量。10.1也可以用同样的方法来分析。

(3)数组和字符串长度减一:当使用数组中的元素时,最大值只能到数组长度减一。字符串以’\\0’作为字符串的结束标志,因此取值最大也只能到字符串长度减一。25.2中输出printf(“%d”,aa[i]);分析程序知道i在此时就是数组的长度,我们要输出数组中的元素,最大就只能到aa[i-1],因此改为 printf(“%d”,aa[i-1]);就行了。4.1和38.2中考查的是字符串长度减一的问题。

(4)数组下标往后走:当题目要求将一个数组中的元素直接赋值或是以某种方式复制到另一个数组中时,接受数据的数组中的下标要自增。9.1中s[j]=s[i];将s[i]中的值复制给s[j],联系上下函数段发现i是一个变量被for语句控制,从0开始直到遇到’\\0’结束。i一直在加但是j没有变化,因此改为s[j++]=s[i];即可。类似的题目有:25.2、26.2、32.1、50.2。 8.特例:

部分题目的解答很特殊,需要根据上下文中的内容来解答题目;例如10.1,在此题目中,定义了变量t=0;根据下面程序中的循环,s=0.0,首先加的是变量t的值,即s的值是从0.0开始的,s得到的值是:s=0.0+0.0+1.0/3+??,观察表达式的值,这个少加了第一项1.0的值,所以变量t的初值不能是0.0,只能是1.0,或者是1;

21.2中的这个题目中,表达式的值是从2/1+3/2+5/3??即表达式的规律是从第一项开始,以后的每一项的分子是前一项的分子和分母的和,分母为前一项的分子。所以该题目的第二个空中的内容应该是:c=a;a+=b;b+=c;这一条语句中 a代表的变量的分子,b代表的是变量的分母,执行第一个表达式的值,把a的值赋值给变量c,第二个表达式是把分子和分母的和相加复制给变量a,第三个表达式是把原来a的值和变量b的值相加之后得到的值赋值给变量b,则变量b得到的值也为分子分母的和,不满足题意,而分母应该为原来分子的值。第三表达式的值应该改为:b=c; 类似的题目有:33.2、40.2、43.1、47.1、50.1 9.素数 11.1 、29、83 掌握求素数的格式:

10

我们一直在用心做教育!

昆明新视野教育

判断一个数是否是素数的方法很多,的是只用掌握一种即可,首先掌握判断一个素数的方法; 素数的定义:1、是自然数 2、只能被1和本身整除,2到本身减一之间的数不能整除该数。 判断m是否为素数的格式: for(i=2;i

if(m==i) 表明m是素数;

素数只能被1和m,那么用2到m-1之间的数除m,如果有一个数能整除m,说明m不是一个素数,就不用再判断后面的数值了,用一条break语句提前结束函数;如果一直都不能整除,则说明m是一个素数。那么用循环语句表示2到m-1之间的数的语句为:for(i=2;i

求素数的题目只要把格式给带进去就可以了。11.1这个题目中只用改为“==”。 29题也是一样的解答方法。 10、链表 15、27

链表的题目分为带头结点的和不带头结点的链表; 1、 带头结点的链表

带头结点的链表的第一个空的改为:p=h->next;第二个空改为:p=p->next;. 2、 不带头结点的链表

不带头结点的链表的第一个空的改为:p=h;第二个空改为:p=p->next;.

三、上机编程题目的总结

编程题目分类:

(一)、数学题目:5、6、11、14、34、48、49、67、73、76、89、91、

编程的题目中,如果是数学题目,编程时用到阶乘或者是奇数项的积,则首先给变量赋初值为1,不能赋初值为0,同时把变量的类型定义为实型而不是整型。数学题目中结果都需要返回,如果说函数的类型是void则是通过指针返回,如果不是void,则必须用return返回。

如果是表达式中的值为1,则在编写程序时用去1.0.而不能用1。C语言中的除法的运算原则是整数除以整数,结果还是整数。

数组中存储数据时以下标来存储的,在数组中下标从0开始。 解题详解 :

6、观察表达式,左边求出的是p的值的一半,所以右边的表达式的值的计算好后应该乘以2才能得到p的值,观察表达式的右边 ,右边表达式中有分子、分母以及各表达式的值的和,分子是阶乘、分母是奇数项的积,分子除以分母得到一项的值。由此定义三个变量:s1代表分子,s2代表分母、s3代表各项的和,定义一个整型变量i,让变量i从1开始。知道循环的结束。 int i;

double s1=1.0,s2=1.0,s3=0.0; for(i=1;s1/s2>=eps;i++) {

11

我们一直在用心做教育!

昆明新视野教育

s3+=s1/s2; s1*=i; s2*=(2*i+1);

} return 2*s3;

注意:此题目中要特别注意,循环语句的表达式2的判断条件是s1/s2>=eps,而不是i<=n,循环语句的语句

的顺寻不能颠倒,即先加之后再计算。

11、此题中要求能正处x,那么x应该为分子,而不是分母,把满足条件的数组放到pp所指的数组中,即pp数组应用一个整型的变量来做pp下标,数组下标从0开始,所以定义一个整形变量k并且赋初值为0;满足条件的个数通过形参传回。

int i,k=0; for(i=1;i<=x;i++) if(x%i==0&&i%2==1)

pp[k++]=i;

*n=k;

备注:此题目中不能把i初值定义为0,否则程序运行时得不到结果。

14、首先看清题意,题目中要求是小于形参n,不包括n,能被3与7整除,两者用逻辑与连接,平方根用平方根的函数sqrt;此题中要求的是自然数的和的平方根,而不是平方根的和,所以要先把满足条件的数加起来后再开方。定义一个整型变量i,让该变量由1直到n-1,用循环实现,一个整形变量s,让该变量存放的是满足条件的数的和,由于s为全局变量,故应该赋初值为0; int i,s=0; for(i=1;i

34、观察表达式,表达式的分子为x的n次冥,分母为数字的阶乘,s为表达式的累加和,定义三个变量s1为分子 ,s2为分母,s为分子除以分母的和。 float s1=1.0,s2=1.0,s=1.0; int i;

for(i=1;i<=n;i++) { s1*=x; s2*=i; s+=s1/s2;

} return s;

备注:此时s的值不能赋初值为0;如果s得初值为0,此时表达式的值中没有第一项的值。并且必须用return返回。

48、该表达式的分子均为1,分母为该项和下一项的积,s为最后表达式的累加和,定义一个整形变量I,用于代表某一项的序号,则i+1到表达的是下一项的序号。

12

我们一直在用心做教育!

昆明新视野教育

float s=0.0; int i;

for(i=1;i<=n;i++) s+=1.0/(i*(i+1)); return s; 备注:

分子为1.0,而不能是1;因为c语言中规定,整型除以整型,得到的值仍然为整型,。

i+1必须用括号括起来,如果没有用括号括起来,根据乘法运算规则,则先运算i*i,再运算i*i+1的值。

49、在该表达式中,分子分母都是阶乘,可以看做是三个数之间的运算,其中的每一个数都是另外一个数的阶乘,定义三个变量,其中s1代表的是m的阶乘,s2代表的n的阶乘,s3代表的是m-n的阶乘,表达式的值可以计算为:s1/(s2*s3);

三个变量都是代表的是阶乘,所以在赋初值时应该赋初值为1或者是1.0; float s1=1.0,s2=1.0,s3=1.0; int i;

for(i=1;i<=m;i++) s1*=i; for(i=1;i<=n;i++) s2*=i; for(i=1;i<=m-n;i++) s3*=i; return s1/(s2*s3);

(二)、把满足条件的数放到数组中 4、12、25、35、37、

在做该类题目时,看清题目的要求,根基题目的要求解题,若只是把满足条件的删除或者是保留,则该类题目首先要定义一个整型变量并且赋初值0,根据题目意思把满足条件的存放到数组中,数组的下标同时加一往后走一个位置,如果是字符串类型的题目,在最后还要加上字符串的结束符’\\0’;如果是把字母的大小写进行改变,则根据原则:小写改大写,减32,大写改小写,加32.只要涉及到数组的题目,都要定义一个整型变量i访问数组中的元素.

在循环语句中,如果是字符串时,循环的条件是判断字符是否是结束符,而不是i<=n; 判断一个字母是否是大写字母ss[i]>=’A’&&ss[i]<=’Z’ 判断是否是小写字母ss[i]>=’a’&&ss[i]<=’z’。 判断一个字符是数字字符 ss[i]>=’0’&&ss[i]<=’9’;

4、定义一个整型变量i来访问字符数组中的元素。把小写字母改写成大写字母,只用把小字母的ASCII值减去32即可。 int i ;

for(i=0;ss[i]!=’\\0’;i++)

if(i%2==1&&ss[i]>=’a’&&ss[i]<=’z’) ss[i]-=32

代码中:i代表的是访问数组下标的变量。循环的条件是ss[i]!=’\\0’,这事字符串是否结束的判断条件。从第一个字符开始,一直到遇到结束符为止。当取出一个字符后,对该字符进行判断,如果该字符满足条件的时候,执行ss[i]-=32;语句,即将小写字母改变成大写字母。

12、先定义一个整型变量k,并且赋初值0,作为数组的下标,一个整型变量i用来访问数组中的元素的下标.

int i ,k=0;

13

我们一直在用心做教育!

昆明新视野教育

for(i=0;s[i] !=’\\0’;i++) if(!(i%2==0&&s[i]%2==1)) t[k++]=s[i]; t[k]= ’\\0’;

备注:if条件中的内容是先将删除的写出来,再前面加上一个!,用来否定,则剩下的就是要保留的内容。把满足条件的存放到数组t中,t也是一个字符数组,所以要够吃呢个字符串,必须在后面赋值结束符。 (三)、素数 20、21、62

判断一个数是否是素数的方法很多,的是只用掌握一种即可,首先掌握判断一个素数的方法; 素数的定义:1、是自然数 2、只能被1和本身整除,2到本身减一之间的数不能整除该数。 判断m是否为素数的格式: for(i=2;i

if(m==i) 表明m是素数;

素数只能被1和m,那么用2到m-1之间的数除m,如果有一个数能整除m,说明m不是一个素数,就不用再判断后面的数值了,用一条break语句提前结束函数;如果一直都不能整除,则说明m是一个素数。那么用循环语句表示2到m-1之间的数的语句为:for(i=2;i

20、把素数存放到数组中,先定义一个整型变量k,并且赋值为0,小于或者等于lim的条件为:for(m=2;m<=lim;m++) 所以代码为:

int m,k=0,i;

for(m=2;m<=lim;m++) {

for(i=2;i

if(m==i) aa[k++]=m; } return k;

21、大于m的整数,m+1就大于m,,找k个素数,那么循环的条件找到k个为止,用j代表找到素数的个数,则程序的代码:

int i,j=1;

for(m=m+1;j<=k;m++) {

for(i=2;i

14

我们一直在用心做教育!

昆明新视野教育

if(m==i) xx[j++]=m; }

(四)、字符串题目的解答方法:8、9、10、19、45、54、57、61、65、71、77、90、92、93、100、56、60、72、75、85、86、

该类题目的解答方法是用简便方法。 具体步骤如下:以第8题为例。

1、单击上面的答题按钮。

2、启动好了visual c++

15

我们一直在用心做教育!

昆明新视野教育

3、单击“文件”菜单下面的“打开”

4、找到“prog1.c”,双击打开:

16

我们一直在用心做教育!

昆明新视野教育

5、不编写任何程序代码,直接编译程序,编译程序时

6、编译好程序之后直接连接程序:

17

我们一直在用心做教育!

昆明新视野教育

7、运行程序

出现运行窗口,运行程序以后 输入如果说窗口中没有出现“press any key to continue”的文字提示时,随便键入就可以了,之后按回车键结束。

18

我们一直在用心做教育!

昆明新视野教育

出现上面的窗口,再按回车键结束。

8、单击“文件”中的“打开”

9、找到“out.dat”这一个文件

19

我们一直在用心做教育!

昆明新视野教育

双击打开“out.dat”文件

将每一行中的内容根据题意进行修改。即将每一行中的星号,除了开始的外,其余的全部删除。得到的结果为:

20

我们一直在用心做教育!

昆明新视野教育

10、单击“文件”菜单中的“保存”

11、单击“文件”菜单下的“退出”

回到了开始的界面,就可以交卷了。 星号的其他题目也是一样的做法。

(五)、结构题类型 2、3、16、23、33、51、58、64、68、82、97、98、99

所有的结构题的类型的题目中都可以用简便方法进行解答,结构体的解答时要主要看程序中是否有nono()函数,如果有,要以该函数为准,如果没有该函数,则以main()函数为主。 以第2题为例:观察程序代码中的内容:

21

我们一直在用心做教育!

昆明新视野教育

首先,该程序代码中没有nono()函数,那么就以main()函数为主。根据题意观察主函数中的内容,主要看主函数中的数据,也就是结构体中的数据。

s[N]={{\

{\ {\ {\找到主函数中的fprintf 函数的内容:

求的就是80到98范围内的数据,满足的个数以及写到out.dat文件中。只用数就可以了。有8个,观察代码中的这些代码,记住这是排序的格式,如果是小于号,那么说明是降序排列,如果是大于号是升序排序。此题中是升序。

观察后米的代码的内容,都是找到fprintf 函数的内容:

该函数的把排序后的内容写到out.dat文件中。还要注意的是M的功能,这是按照格式写到文件中,只是这个是后输入的数据占有4个宽度,并且是右对齐。最后写到out.dat文件中的内容应该是:

22

我们一直在用心做教育!

昆明新视野教育

保存程序后退出程序即可。 (六)、数值平移 1、42、83、87

数值平移的题目可以用简便方法解决,其步骤和上面所写的一样,只是在打开“out.dat”文件之后的操作有所不同,具体的为:

以1题为例:

打开了“out.dat”文件之后,打开的是“in.dat”文件。

在“in.dat”这个文件中,前面的数字代表的是平移的个数。根据题目要求,是把前面的字符平移到最后,在“out.dat”文件中进行修改,最后的结果为:

23

我们一直在用心做教育!

昆明新视野教育

单击“文件”菜单下面的“保存”,单击“文件”菜单下的“退出”。 (七)、找出数组中的最大值或者最大值所在的下标 18、29、36、66、83、55

该类型题目可以用简便方法解决;解决此类题目时,首先要找到源程序中的以下内容,1、找到nono()函数,如果没有nono()函数,则找到主函数。

2、找到fprintf函数。3、打开“in.dat”文件和“out.dat”文件。4、进行相应的修改之后,保存和退出。 以18题为例。首先找到nono()函数,再找到fprintf函数

打开“in.dat”文件

根据“in.dat”文件中的内容进行选择。以第一行为例,最大的是121,所在的下表是1,所以在“out.dat”文件中的内容,根据fprintf函数的格式,应该先把下标写到文件中,再把数值写到文件中。所以“out.dat”文件中的内容为:

24

我们一直在用心做教育!

昆明新视野教育

要特别注意fprintf函数的格式:

其中的两个%d之间是用逗号隔开,所以在把满足条件的数值存放到文件中时应该必须用逗号将两河数值隔开,并且先把满足条件的数的下标写到文件中,再把该最大数写到文件中。

单击“文件”菜单下面的“保存”,单击“文件”菜单下的“退出”。 (八)、链表题目 22、80、84

链表题目很难,在解决该类问题的时候可以用简便方法。步骤和上面所写的一样;首先要找到源程序中的以下内容,1、找到nono()函数,如果没有nono()函数,则找到主函数。2、找到fprintf函数。3、打开“out.dat”文件和“in.dat”文件。4、进行相应的修改之后,保存和退出。

25

我们一直在用心做教育!

昆明新视野教育

该题目是把分数最高的学生的分数写到文件中。 fprintf(out, \%6.1lf\\n\

其中最高分在写到文件中时要注意%6.1lf,写入的数据带有一个小数,并且该数字占有6个宽度,并且为右对齐。打开“in.dat”文件

根据“in.dat”文件中的内容进行选择。以第一行为例,最大的是91,所以在“out.dat”文件中的内容,根据fprintf函数的格式,应该先把下标写到文件中,再把数值写到文件中。所以“out.dat”文件中的内容为:

单击“文件”菜单下面的“保存”,单击“文件”菜单下的“退出”。 (九)、判断是否是回文数 27

此题是判断一个字符串是否为回文;步骤和上面的一样;一直到打开“out.dat”文件,打开后根据内容进行相应的修改和操作。

26

我们一直在用心做教育!

昆明新视野教育

根据内容修改为:

单击“文件”菜单下面的“保存”,单击“文件”菜单下的“退出”。 (十)、统计单词的个数 30、53

此题是判断一个字符串是否为回文;步骤和上面的一样;一直到打开“out.dat”文件和“in.dat”文件,打开后根据内容进行相应的修改和操作。

以第一行为例,第一行中出项的单词个数为:14 ,则把“out.dat”文件的内容改为:

27

我们一直在用心做教育!

昆明新视野教育

单击“文件”菜单下面的“保存”,单击“文件”菜单下的“退出”。 (十一)、二维数组 15、17、24、26、31、32、40、41、43、50、81、

做该类题目的时候首先检查一下该源程序中是否有nono()函数,如果有则要打开“in.dat”文件,如果没有则只用看主函数中的内容。

该类题目可以用简便方法解决。步骤和上面的一样;一直到打开“out.dat”文件和“in.dat”文件,打开后根据内容进行相应的修改和操作。打开“in.dat”文件,里面的内容为:

其中第一行中的

3 4代表的是

3行

4列,那么根据题目要求应该改为:

单击“文件”菜单下面的“保存”,单击“文件”菜单下的“退出”。 (十二)、特例 37、47、59、70、74

28

我们一直在用心做教育!

昆明新视野教育

37题在答题时 只用在函数中写入的代码为:atol(p);即可;

47题该题目是本册书中的重点,本题中要求把满足条件存放到数组中,其中100岁以上的存放到数组元素d[10]中,90到100之间的存放到d[9]中,依次往后推,C语言中的除法运算,当两个对象的类型都是整型时,相除得到的结果为整型; (90——99)/10=9 ( 80——90)/10=8 ( 70——79)/10=7 ﹕ ﹕ ( 0——9) /10=0

用一个整型变量i访问数组中的元素。则a[i]代表的是某一个具体的年龄,a[i]/10得到的结果为以上的(0——9)之间的一个数值。b[a[i]/10 ]相当于b[0]——b[9]之间的数组元素。数组b是一个整型数组,数组中的元素为动态存储变量,元素的值为随机值。所以在判断之前要给数组元素赋初值。 int i,k=0;

for(k=0;k<=10;k++) b[k]=0; for(i=0;i=100) b[10]++;

else b[a[i]/10 ]++; 26、解决方法: 1、打开“in.dat”文件

将最长的那一串保留住,其余的全部删除。:

单击 “文件”菜单下面的“另存为”:

29

我们一直在用心做教育!

昆明新视野教育

在文件名中输入 out.dat:

单击“保存”。 单击“文件”菜单下面的“保存”,单击“文件”菜单下的“退出”。 (十三)将两个数字按照要求合并成一个数字:13、38、44、46、63、69、78、88、94、95、96 该类题目使用简便方法。具体的方法为: 1、 找到题目所在的位置。

30

我们一直在用心做教育!

昆明新视野教育

2、打开文件

复制in.dat文件。选择“重命名”,将名字改为:“out.dat”.

3、打开“prog1.c”

31

我们一直在用心做教育!

昆明新视野教育

根据题目的意思执行后面的语句,定义了两个文件指针,三个整型变量,一个长整型变量,执行后面的语句,

1、 打开in.dat文件。

2、 打开“out.dat”文件

32

我们一直在用心做教育!

昆明新视野教育

从in.dat文件中读出两个数字,分别赋值给变量a,b.那么得到的值分别为:45、12 执行fun函数,之后c的值为:2415; 将数据写到out.dat文件中,

按照格式写到文件中,得到的值

33

我们一直在用心做教育!

昆明新视野教育

单击保存,把后面的每一行都改为一样,保存,即可;最后关闭程序。

34

我们一直在用心做教育!

本文来源:https://www.bwwdw.com/article/0f7o.html

Top