C语言上机解题技巧.docx

上传人:b****5 文档编号:3229240 上传时间:2022-11-20 格式:DOCX 页数:39 大小:1.30MB
下载 相关 举报
C语言上机解题技巧.docx_第1页
第1页 / 共39页
C语言上机解题技巧.docx_第2页
第2页 / 共39页
C语言上机解题技巧.docx_第3页
第3页 / 共39页
C语言上机解题技巧.docx_第4页
第4页 / 共39页
C语言上机解题技巧.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

C语言上机解题技巧.docx

《C语言上机解题技巧.docx》由会员分享,可在线阅读,更多相关《C语言上机解题技巧.docx(39页珍藏版)》请在冰豆网上搜索。

C语言上机解题技巧.docx

C语言上机解题技巧

一、填空题

(一)链表类型题目包括:

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

voidfun(NODE*h)

{NODE*p,*q;intt;

/**********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:

对一维数组进行从小到大排序

voidfun(intb[N])

{inti,j,a;

for(i=0;i

for(j=i;j

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

}

}

联想记忆分析2:

对结构体数组按照姓名进行从小到大排序

for(i=0;i

for(j=i;j

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

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

43、50

链表中数据域中的元素逆置,首先将第一个数据取出来放在最后一个位置,也就是将其next置空,表示已经到了末尾。

接着将第二个数据放到第一个的前面,依次类推即可将整个数据域逆置。

voidfun(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:

数组元素的逆置

inta[10]={1,2,3,4,5,6,7,8,9,10};

inti,j=0,b[10];

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

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

联想记忆分析2:

字符串的逆置

voidfun(char*str)

{char*p;

intlen;

len=strlen(str);

while(len)

{*p=str[len-1];

len--;

p++;

}

}

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

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

56

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

for(j=i;j

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

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

考点①中要求填入i

考点②必须填入i

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

2.将形参a所指的结构体变量中的数据赋值给结构体变量b,进行相应的修改,类似的题目:

9、16、23、33、51、78、82、92

voidfun(structstudenta)

{structstudentb;inti;

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

b=__1__;将形参a中的值赋值给结构体变量b,因此填入a进去即可

b.sno=10002;改变结构体变量b中的sno为10002

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

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

printf("\nThedataaftermodified:

\n");

printf("\nNo:

%ldName:

%s\nScores:

",b.sno,b.name);输出变量b中的学号和姓名

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

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

printf("\n");

}

对比记忆:

structstudent考点①fun(structstudenta)

{inti;

a->sno=1002;考点②

strcpy(a->name,”LiSi”);考点③

for(i=0;i<3;i++)a->scare[i]+=1;考点④

returna;}

3.结构体和文件结合,类似的题目:

22、30、47、80、88

voidfun(char*filename,longsno)

{FILE*fp;

STUn;inti;

fp=fopen(filename考点①,"rb+");

/**********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所指向文件。

考点2feof(fp)用于判断文件是否结束。

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

考点4fseek(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

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

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1