实验五教案含答案.docx
《实验五教案含答案.docx》由会员分享,可在线阅读,更多相关《实验五教案含答案.docx(26页珍藏版)》请在冰点文库上搜索。
实验五教案含答案
第五课
教学内容:
一维字符数组删除及统计类算法
教学目的:
掌握一维字符数组删除及统计类算法的考题
教学内容:
一、一维字符数组删除及统计类算法的考题特点
此类算法多以填空题和程序设计题为考试形式。
常见考点
1、在一维字符数组中删除指定的单个字符,删除符合某条件的多个字符。
2、统计一维字符数组中某个字符出现的次数,子串出现的次数。
二、课堂练习
第一套
1、程序填空题
下列给定程序中,函数fun()的功能是:
从字符串s中,删除所有小写字母’c’。
试题程序:
__1__//#include
voidfun(char*s)
{inti,j;
for(i=j=0;__2__;i++)//s[i]!
='\0'
if(s[i]!
='c')
__3__;//s[j++]=s[i];
s[j]='\0';
}
main()
{chars[80];
printf("\nEnterastring:
");gets(s);
printf("Theoriginalstring:
");puts(s);
fun(s);
printf("Thestringafterdeleted:
");
puts(s);
printf("\n\n");
}
2、程序改错题
给定程序modi.c中函数fun的功能是:
删除字符串s中的所有空白字符(包括Tab字符、回车符及换行符)。
输入字符串时用'#'结束输入。
请改正程序中的错误,使它能输出正确的结果。
注意:
不要改动main函数,
#include
#include
#include
fun(char*p)
{inti,t;charc[80];
/************found************/
For(i=0,t=0;p[i];i++)//for
if(!
isspace(*(p+i)))c[t++]=p[i];
/************found************/
c[t]="\0";//c[t]='\0';
strcpy(p,c);
}
main()
{charc,s[80];
inti=0;
printf("Inputastring:
");
c=getchar();
while(c!
='#')
{s[i]=c;i++;c=getchar();}
s[i]='\0';
fun(s);
puts(s);
}
3、程序设计题
1)规定输入的字符串中只包含字母和*号。
请编写函数fun,它的功能是:
使字符串最前面连续的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。
例如,字符串中的内容为:
*******A*BC*DEF*G****,若n的值为4,删除后,字符串中的内容应当是:
****A*BC*DEF*G****;若n的值为8,则字符串中的内容仍为:
*******A*BC*DEF*G****。
n的值在主函数中输入。
在编写函数时,不得使用C语言提供的字符串函数。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
voidfun(char*a,intn)
{inti,j,k=0;
for(i=0;a[i]=='*';i++);
if(i>n)
{for(j=i-n;a[j]!
='\0';j++)
a[k++]=a[j];
a[k]='\0';
}
}
main()
{chars[81];intn;
printf("Enterastring:
\n");gets(s);
printf("Entern:
");scanf("%d",&n);
fun(s,n);
printf("Thestringafterdeleted:
\n");puts(s);
}
2)函数fun的功能是:
将s所指字符串中下标为偶数同时ASCII值也为偶数的字符删除,s中剩余的字符形成一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为"ABCDEFG12345",其中字符B的ASCII码值虽为偶数,但在数组中的下标为奇数,因此不能删除;而字符2的ASCII码值为偶数,在数组中的下标也为偶数,因此应当删除,其它依此类推。
最后t所指的数组中的内容应是"ABCDEFG135"。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其它函数中的任何内容,在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
voidfun(char*s,chart[])
{inti,j=0;
for(i=0;s[i]!
='\0';i++)
if(!
(i%2==0&&s[i]%2==0))
t[j++]=s[i];
t[j]='\0';
}
main()
{chars[100],t[100];
printf("\nPleaseenterstringS:
");scanf("%s",s);
fun(s,t);
printf("\nTheresultis:
%s\n",t);
}
第二套
1、程序填空题(找子串)
下列给定程序中,函数fun()的功能是:
计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。
#include
#include
#include
#defineN80
intfun(char*s,char*t)
{intn;
char*p,*r;
n=0;
while(*s)
{p=s;
r=t;
while(*r)
if(*r==*p){r++;____1____;}//p++
elsebreak;
if(*r==____2____)//'\0'
n++;
__3__;//s++
}
returnn;
}
main()
{chara[N],b[N];intm;
printf("\nPleaseenterstringa:
");gets(a);
printf("\nPleaseentersubstringb:
");gets(b);
m=fun(a,b);
printf("\nTheresultis:
m=%d\n",m);
}
2、程序改错题
文件MODI.C中程序的功能是:
统计一个英文句子中各小写的元音字母出现的次数。
例如,若输入字符串:
"Iamgladwhenplayinggames",则应输出:
a4e2i1o0u0。
注意:
请改正程序中的错误,使它能计算出正确的结果。
#include
#include
intvv[26];
voidVs(char*s)
{for(;*s;s++)
/************found**********/
switch(s);//switch(*s)
{case('a'):
case('e'):
case('i'):
case('o'):
case('u'):
vv[*s-'a']++;
}
}
main()
{charstr[81],ww[6]={"aeiou"};
inti;
printf("\nPleaseenterastring:
\n");
gets(str);
Vs(str);
/************found**********/
for(i=0;i<6;i++)//for(i=0;i<5;i++)
printf("\n%c==>%2d",ww[i],vv[ww[i]-ww[0]]);
getch();
}
3、程序设计题
1)请编写函数fun,函数的功能是:
在字符串中的所有数字字符前加一个$字符。
例如,输入A1B23CD45,则输出为:
A$1B$2$3CD$4$5。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
voidfun(char*s)
{inti,j=0,t[80];
for(i=0;s[i]!
='\0';i++)
if(s[i]>='0'&&s[i]<='9')
{t[j++]='$';t[j++]=s[i];}
else
t[j++]=s[i];
t[j]='\0';
for(i=0;t[i]!
='\0';i++)
s[i]=t[i];
s[i]='\0';
}
main()
{chars[80];
printf("Enterastring:
");scanf("%s",s);
fun(s);
printf("Theresult:
%s\n",s);
}
2)请编写一个函数voidfun(char*tt,intpp[]),统计在tt字符串中'a'到'z'26个字母各自出现的次数,并由pp数组传回main函数。
运行时输入字符串:
abcdefgabcdeabc后,并且输出的结果应该是:
33322110000000000000000000
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其它函数中的任何内容,在函数fun的花括号中填入你编写的若干语句。
#include
#include
voidfun(char*tt,intpp[])
{inti;
for(i=0;i<26;i++)
pp[i]=0;
for(i=0;tt[i]!
='\0';i++)
if(tt[i]>='a'&&tt[i]<='z')
pp[tt[i]-'a']++;
}
main()
{charaa[1000];
intbb[26],k,n;
printf("\nPleaseenteracharstring:
");scanf("%s",aa);
fun(aa,bb);
for(k=0;k<26;k++)printf("%d",bb[k]);
printf("\n");
}
三、课后练习
1、程序填空题
函数char*MyDelete(char*str,charc)的功能是:
在字符串str中删除变量c中的字符,有几个删几个,并返回所删字符的个数。
例如,若输入字符串"ababcbcdef"和字符'b',则应输出字符串"aaccdef"和3(表示删了3个字符'b')。
注意:
此程序存在prog.c中。
请勿改动主程序main、函数WriteData和函数compute中的任何内容,仅在函数MyDelete中的横线处填入适当内容并删除横线。
#include
#include
intMyDelete(char*str,charc)
{inti,j=0,k=0;
for(i=0;str[i];i++)
if(str[i]!
=c)
{str[j]=str[i];___
(1)___;}//j++
else
k++;
str[j]=___
(2)___;//'\0'
return(___(3)___);//k
}
main()
{charstring[81],x;
printf("\nPleaseenterastring:
\n");
gets(string);
printf("\nPleaseenteracharacter:
");
scanf("%c",&x);
printf("\n\nAfterdeleting%d'%c'(s),thestring
becomes:
\n%s\n",MyDelete(string,x),x,string);
}
2、程序填空题
下列给定程序中,函数fun()的功能是:
删除字符串s中所有空白字符(包括Tab字符、回车符及换行符)。
输入字符串时用"#"结束输入。
#include
#include
#include
fun(char*p)
{inti,t;charc[80];
for(i=0,t=0;p[i];i++)
if(!
isspace(*(p+i)))___1___;//c[t++]=p[i]
c[t]='\0';
strcpy(p,c);
}
main()
{charc,s[80];
inti=0;
printf("Inputastring:
");
c=getchar();
while(__2___)//c!
='#'
{s[i]=c;i++;c=getchar();}
___3___;//s[i]='\0'
fun(s);
puts(s);
}
3、程序填空题
请补充main函数,该函数的功能是:
从一个字符串中截取前面若干个给定长度的子字符串。
其中,str1指向原字符串,截取后的字符存放在str2所指的字符数组中,n中存放需截取的字符个数。
例如:
当str1=“cdefghij”,然后输入4,则str2=“cdef”。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。
#include
#include
#defineLEN80
main()
{charstr1[LEN],str2[LEN];
intn,i;
printf("Enterthestring:
\n");
gets(str1);
printf("Enterthepositionofthestringdeleted:
");
scanf(【1】);//"%d",&n
for(i=0;i【2】//str2[i]=str1[i];
str2[i]='\0';
printf("Thenewstringis:
%s\n",【3】);//str2
}
4、程序填空题
给定程序的功能是判断字符ch是否与串str中的某个字符相同;若相同,什么也不做,若不同,则插在串的最后。
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
ch=’D’
ch=’K’
#include
#include
voidfun(char*str,charch)
{while(*str&&*str!
=ch)str++;
/**********found**********/
if(*str___1___ch)//!
=
{str[0]=ch;
/**********found**********/
___2___=0;//str[1]
}
}
main()
{chars[81],c;
printf("\nPleaseenterastring:
\n");
gets(s);
printf("\nPleaseenterthecharactertosearch:
");
c=getchar();
/**********found**********/
fun(___3___);//s,c调用函数填实参,需要参考对应的形参
printf("\nTheresultis%s\n",s);
}
5、程序填空题
给定程序的功能是将在字符串s中出现、而未在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符。
例如:
当s="112345",t="2467"时,u中的字符串为"1135"。
#include
#include
voidfun(char*s,char*t,char*u)
{inti,j,sl,tl;
sl=strlen(s);tl=strlen(t);
for(i=0;i{for(j=0;j/************found************/
if(s[i]==t[j])___1___;//break;若s[i]字符在t中出现则退出内循环直接处理下一个字符
if(j>=tl)//找完t中所有字符都没有相同的,则存入u所指数组中
/************found************/
*u++=___2___;//s[i]
}
/************found************/
___3___='\0';//*u最后让结果数组正常结束,常规做法
}
main()
{chars[100],t[100],u[100];
printf("\nPleaseenterstrings:
");scanf("%s",s);
printf("\nPleaseenterstringt:
");scanf("%s",t);
fun(s,t,u);
printf("theresultis:
%s\n",u);
}
6、程序改错题
给定程序modi.c中函数fun的功能是:
求出在字符串中最后一次出现的子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为NULL。
例如,当字符串中的内容为:
"abcdabfabcdx",t中的内容为:
"ab"时,输出结果应是:
abcdx。
当字符串中的内容为:
"abcdabfabcdx",t中的内容为:
"abd"时,则程序输出未找到信息:
Notfound!
。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数。
#include
#include
#include
char*fun(char*s,char*t)
{char*p,*r,*a;
/************found************/
a=Null;//a=NULL;NULL为代表0的符号常量,必须大写
while(*s)
{p=s;r=t;
while(*r)
/************found************/
if(r==p){r++;p++;}//if(*r==*p)匹配元素值,而不是地址
elsebreak;
if(*r=='\0')a=s;
s++;
}
returna;
}
main()
{chars[100],t[100],*p;
printf("\nPleaseenterstringS:
");scanf("%s",s);
printf("\nPleaseentersubstringt:
");scanf("%s",t);
p=fun(s,t);
if(p)printf("\nTheresultis:
%s\n",p);
elseprintf("\nNotfound!
\n");
}
7、程序改错题
给定程序MODI1.C中函数fun的功能是:
将s所指字符串中最后一次出现的与t1所指字符串相同的子串替换成t2所指字符串,所形成的新串放在w所指的数组中。
在此处,要求t1和t2所指字符串的长度相同。
例如,当s所指字符串中的内容为:
"abcdabfabc",t1所指子串中的内容为:
"ab",t2所指子串中的内容为:
"99"时,结果,在w所指的数组中的内容应为:
"abcdabf99c"。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
intfun(char*s,char*t1,char*t2,char*w)
{
inti;char*p,*r,*a;
strcpy(w,s);
/************found************/
while(w)//while(*w)一般是用元素值或