计算机等级考试培训教案主讲夏敏捷Word文件下载.docx
《计算机等级考试培训教案主讲夏敏捷Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机等级考试培训教案主讲夏敏捷Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
}
if(flag)
{
sum+=i;
【3】;
}
}
printf("
\n***primenumber***\n"
for(i=0;
k;
if(i%10==0)
printf("
\n"
printf("
%4d"
aa[i]);
\nsum=%d"
sum);
【1】flag=1
【2】flag=0
【3】aa[k++]=i
【解析】填空1:
由后面的if语句可以看出,当flag为1时,当前数是素数,所以此处先假设当前数为素数,即置flag为1,再进行判断,如果不是素数,则再将flag清零。
填空2:
如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。
如果当前数不是素数,则将flag清零。
填空3:
如果当前数是素数,则将它保存在数组bb
2.改错题
下列给定程序中,函数fun()的功能是:
利用插入排序法对字符串中的字符按从小到大的顺序进行排序。
插入法的基本方法是:
先对字符串中的头两个元素进行排序,然后把第3个字符插入到前两个字符中,插入后前3个字符依然有序;
再把第4个字符插入到前3个字符中,待排序的字符串已在主函数中赋予。
请改正程序中的错误,使它能得出正确的结果。
不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include<
string.h>
#defineN80
voidinsert(char*aa)
{inti,j,n;
charch;
n=strlen(aa);
for(i=1;
n;
/**********************found***********************/
{c=aa[i];
j=i-1;
while((j>
=0)&
(ch<
aa[j]))
{aa[j+1]=aa[j];
j--;
aa[j+1]=ch;
}
{chara[N]="
QWERTYUIOPASDFGHJKLMNBVCXZ"
;
Theoriginalstring:
%s\n"
a);
insert(a);
Thestringaftersorting:
%s\n\n"
错误:
c=aa[i];
正确:
ch=aa[i];
【解析】对长度为n的数组元素进行排列,可先对数组的前m-1项进行排序,之后再对前m项进行排序,如此循环直到数组全部元素完成排序。
对前m项的子数列进行排序的方法是,将该子数列的末尾元素与前m-1项的元素相比较,由于前m-1项已经完成排序,可以找到某一位置,使得将该末尾元素插入该位置之后,前m项仍然保持升序。
这样循环后,就可以得到全部元素的排序。
3.编程题
编写函数fun(),它的功能是:
计算和输出下列级数的和。
S=1/(1×
2)+1/(2×
3)+…+1/(n×
(n+1))
例如,当n=10时,函数值为0.909091。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
conio.h>
doublefun(intn)
{
%f\n"
fun(10));
inti;
doubles=0.0;
=n;
s=s+1.0/(i*(i+1));
/*求级数的和*/
returns;
【解析】解决数学序列的问题,我们的思路依然是"
数学先行"
,即先看清楚题目的数学逻辑,然后再根据C语言来"
翻译"
出来。
本题中,每一项的值都是n*(n+1)的倒数。
当输入n时,从1开始循环,注意,此处for(i=1;
i++)中的"
="
号必须要有,另外,表达式1.0/(i*(i+1))中的两对小括号一个都不能少。
若写成1.0/i*(i+1)则相当于(i+1)/i,结果就差之千里。
第二套
从键盘输入两上字符串并分别保存在字符数组str1和str2中,用字符串str2替换字符串str1前面的所有字符,注意,str2的长度不大于str1,否则需要重新输入。
例如,如果输入str1="
abced"
,str2="
fk"
,则输出"
fkced"
。
charstr1[81],str2[81];
char*p1=str1,*p2=str2;
do
Inputstr1\n"
gets(str1);
Inputstr2\n"
gets(str2);
}while(【1】);
while(【2】)
*p1++=*p2++;
Displaystr1\n"
puts(【3】);
【1】strlen(str1)<
strlen(str2)
【2】*p2
【3】str1
如果字符串str2的长度大于字符串str1的长度,则要重新输入,即继续执行do-while循环。
如果p2所指的字符不为′\0′,即还没有执行到str2的最后一个字符,则将这个字符赋给字符串str1的对应字符。
函数puts()的功能是将一个字符串输出到终端设备,由程序可以知道,此时应该输出字符串str1。
输出M行N列整数方阵,然后求两条对角线上的各元素之和,返回此和数。
#defineM5
intfun(intn,intxx[][])
{inti,j,sum=0;
\nThe%dx%dmatrix:
M,M);
M;
{for(j=0;
%4f"
xx[i][j]);
sum+=xx[i][i]+xx[i][n-i-1];
return(sum);
{intaa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}};
system("
printf("
\nThesumofallelementson2diagnalsis%d"
fun(M,aa));
(1)错误:
intfun(intn,intxx[][])
intfun(intn,intxx[][M])
(2)错误:
【解析】该题错误比较隐蔽,一般的C语言上机考试很少涉及printf函数中的错误,在这里,我们只要明白"
d"
和"
f"
的区别就OK了。
格式字符d表示:
以带符号的十进制形式输出整数(正整数不输出符号);
格式字符f表示:
以小数形式输出单、双精度,隐含输出6位小数。
请编写函数fun(),该函数的功能是:
将两个两位数的正整数a,b合并形成一个整数放在c中。
合并的方式是:
将a数的十位和个位数依次放在c数的十位和千位上,b数的十位和个位数依次放在c数的百位和个位上。
例如,当a=45时,b=12,调用到该函数后,c=5142。
voidfun(inta,intb,long*c)
inta,b;
longc;
Inputa,b:
"
scanf("
%d%d"
&
a,&
b);
fun(a,b,&
c);
Theresultis:
%ld\n"
c);
*c=a%10*1000+b/10*100+a/10*10+
b%10;
/*将a数的十位和个位数依次放在c
数的十位和千位上,b数的十位和
个位数依次放在c数的百位和个位上*/
【解析】本题中主要的问题是怎么取出a和b的个位数和十位数,取出后怎么表示成c中相应的位数。
由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。
如45/10结果为4而不是4.5(这是由于两个数都为整型,所以结果也为整型),45%10结果为5。
若a为45,则a/10*10的结果为40而非45。
乘1000,乘100和乘10的作用是分别使其前面的数成为*c的千位数、百位数和十位数。
注意要使用c时要注意进行指针运算,即*c,不能少了*号。
第三套
从键盘输入若干字符放到一个字符数组中,当按回车键时结束输入,最后输出这个字符数组中的所有字符。
ctype.h>
inti=0;
chars[81];
char*p=s;
system("
Inputastring\n"
80;
s[i]=getchar();
if(s[i]=='
\n'
)
【1】;
s[i]=【2】;
displaythestring\n"
while(*p)
putchar(【3】);
【1】break
【2】′\0′
【3】*p++
当输入的字符是回车符时,使用break语句跳出for循环,结束输入。
结束输入后,在字符串s最后要加上结束标记符′\0′。
最初指针p指向字符串s的首字符,通过p++逐一指向后面的每个字符,调用putchar()函数输出字符。
将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中。
高位仍在高位,低位仍在低位。
例如,当s中的数为87653142时,t中的数为8642。
voidfun(longs,long*t)
{intd;
longs1=1;
*t=0;
while(s>
0)
{d=s%10;
if(d%2=0)
{*t=d*s1+*t;
s1*=10;
s\=10;
{longs,t;
\nPleaseenters:
%ld"
s);
fun(s,&
t);
t);
intd;
longd;
if(d%2=0)
if(d%2==0)
(3)错误:
s\=10;
s/=10;
【解析】其实,不论取出偶数还是奇数,思路应该是一样的。
我们在刚开始学习C语言的时候就学习过强制类型转换以及运算级别的问题,所以,这里的int就没有存在的理由。
错误2中的问题是怎么表达一个偶数的问题,归根结底还是"
=="
的区别问题。
请编写函数fun(),其功能是:
将s所指字符串中下标为偶数的字符删除,串中剩余字符形成的新串放在t所指数组中。
例如,当s所指字符串中的内容为ABCDEFGHIJK,则在t所指数组中的内容应是BDFHJ。
voidfun(char*s,chart[])
chars[100],t[100];
\nPleaseenterstringS:
%s"
s);
fun(s,t);
\nTheresultis:
%s\n"
inti,j=0,k=strlen(s);
/*k为字符串的长度*/
i=i+2)
/*将s所指字符串中下标为奇数的
字符存入t所指字符串中*/
t[j++]=s[i];
t[j]='
\0'
/*在字符串最后加上结束标志*/
【解析】本题使用了一种i永远是奇数的循环方法,即for(i=1;
i=i+2),因为开始时i的值为1,当i+2循环时,此值永远是奇数。
第四套
把一个二维字符数组每行字符串最大的字符拷贝到字符数组s中。
例如,如果str[3]={"
efjh"
,"
efknls"
owys"
},则s="
jsy"
char*str[3]={"
efjh"
"
"
};
char**p;
chars[8];
【1】;
3;
s[i]=*p[i];
while(*p[i])
if(s[i]<
*p[i])
s[i]=*p[i];
【2】;
【3】;
newstring\n"
puts(s);
【1】p=str
【2】p[i]++
【3】s[i]=′\0′
str是一个大小为3的指针数组,每个指针指向一个字符串,p是指向指针的指针,首先要使指针p指向数组str的首地址。
通过p[i]++使p[i]指向第i个字符串的下一个字符。
将每行字符串的最大字符都拷贝到字符数组s中后,不要忘了在数组s最后加上字符串结束标记符′\0′。
判断一个整数m是否是素数,若是返回1,否则返回0。
在main()函数中,若fun()返回1则输出YES,若fun()返回0则输出NO!
intfun(intm)
{intk=2;
while(k<
=m&
(m%k))
k++
if(m=k)
return1;
elsereturn0;
{intn;
\nPleaseentern:
%d"
n);
if(fun(n))printf("
YES\n"
elseprintf("
NO!
k++
k++;
if(m=k)
if(m==k)
【解析】函数fun()的功能是判断m是否为素数:
m从2开始作为除数,并对m取余,若不存在一个数使得余数为0,则m为素数,程序的错误在于if(m=k)语句中的逻辑表达式写成了赋值表达式。
将s所指字符串中ASCⅡ值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为ABCDEFG12345,其中字符B的ASCⅡ码值为偶数、…、字符2的ASCⅡ码值为偶数、…,都应当删除,其他依次类推。
最后t所指的数组中的内容应是ACEG135。
voidfun(char*s,chart[])
%s"
\nTheresultis:
%s\n"
for(;
*s!
='
s++)
/*找出ASCII值为奇数的字符依次
存入数组t中*/
if(*s%2==1)
t[i++]=*s;
t[i]='
/*在字符串的末尾加上串结束符*/
【解析】要删除ASCII值为偶数的字符,也就是要留下ASCII值为奇数的字符,由于最终是要求求出剩余字符(即ASCII值为奇数)形成的新串,所以本题程序的算法是从原字符串的头到尾扫描并找出ASCII值为奇数的字符依次存入数组t中。
此外,还要注意数组t的下标变化和下标的初值(初值必须为0,即i=0),t[i++]的作用是先使用t[i]然后再使i自增1。
任何字符串的末尾都要有串结束符。
这种算法在很多题中都要用到,学习者可以举一反三地找一些其他相关习题练习一下。
第五套
把一个整数插入到一个已经按从小到大排序的数组中。
插入后,数组仍然有序。
例如,在数组bb[N]={12,23,31,44,51,63,71,79,85,95}中插入93,结果为:
bb[N]{11,21,31,41,51,61,71,79,81,93,95}
#defineN10
inti,j;
intn;
intbb[N+1]={12,23,31,44,51,63,71,
79,85,95};
printf(