汇编程序上机.docx
《汇编程序上机.docx》由会员分享,可在线阅读,更多相关《汇编程序上机.docx(39页珍藏版)》请在冰点文库上搜索。
![汇编程序上机.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/6dbb6e65-edf8-4a0d-984c-bd5f88b73757/6dbb6e65-edf8-4a0d-984c-bd5f88b737571.gif)
汇编程序上机
s为一个字符序列,请补充fun函数,该函数的功能是:
查找s中值为a的元素,返回找到值为a的元素个数,并把这些值为a的元素下标依次保存在数组str中。
例如,在"testtest"中查找"e",结果为2,下标依次为1、5。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
#include
#defineM100
intstr[M];
intfun(char*s,charch)
{
inti=0,n=0;
chart=ch;
char*p=s;
while(*p)
{
if(___1___)
___2___;
p++;
i++;
}
return___3___;
}
main()
{
chars[M];
charch;
inti,n;
printf("PleaseInputtheoriginalstring\n");
gets(s);
printf("TheOriginalstringis:
\n");
puts(s);
printf("Inputcharacter\n");
scanf("%c",&ch);
n=fun(s,ch);
printf("\nThenumberofcharacteris:
%d\n",n);
printf("Thepositionofcharacter:
\n");
for(i=0;iprintf("%d",str[i]);
}
【答案】
(1)*p==t
(2)str[n++]=i(3)n
【解析】
(1)本题中函数功能是查找s中值为a的元素。
(2)从已给部分源程序的main主函数开始入手,"n=fun(s,ch);"语句调用fun函数,实现本题要求。
(3)进入fun函数,利用while循环对字符串中的每一个字符进行判断。
第一空:
判断字符串s中的字符是否等于输入的字符ch,根据while循环中的循环条件"*p"和fun函数中的t、p定义、赋值,得知这里的if判断表达式应该是"*p==t"。
第二空:
如果符合上面的if判断表达式,这里应该根据题干要求对字符标识存储在数组str中,即"str[n++]=i"。
第三空:
函数fun返回的是在字符串中查找到相同字符的个数,根据语句"str[n++]=i;"知道,相同的字符个数为数组str的大小,即第三空填"n"。
请编写函数fun,该函数的功能是:
删除一维数组中所有相同的数,使之只剩一个。
数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
例如,若一维数组中的数据是:
1,1,1,2,2,3,3,3,3,4
删除后,数组中的内容应该是:
1,2,3,4
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#defineM100
intfun(intb[],intm)
{
}
main()
{
intb[M]={1,1,1,2,2,3,3,3,3,4},i,m=10;
FILE*out;
printf("Theoriginaldata:
\n");
for(i=0;iprintf("%3d",b[i]);
m=fun(b,m);
printf("\nThedataafterdeleted:
\n");
out=fopen("outfile.dat","w");
for(i=0;i{
printf("%3d",b[i]);
fprintf(out,"%d\n",b[i]);
}
fclose(out);
}
【答案】
inti,t,j=0,*p=b;
t=p[0];//设置临时变量t初值指向第一数组值
for(i=0;i<=m;i++)
if(t==p[i])//当临时变量与数组中的某个值相同则跳出,比较下一个元素
;
else//如果临时变量与数组中值不同,则对临时变量重新赋值
{
b[j]=t;
t=p[i];
j++;
}
if(i>=m)
b[j]=t;
returnj;
【解析】该程序功能是删去一维数组中所有相同的数,使之只剩一个。
解题思路是,首先在函数中定义临时变量指向每一个元素,然后在循环过程中将临时值和其他元素进行比较,如果相同,那么跳过相同字符。
(1)首先,设置一个临时变量,初值设置为一维数组的第一个元素。
(2)然后,依次将数组的元素与临时变量比较,如果相同,则继续取数组下一个元素与临时变量比较;如果不同,则将临时变量的值赋值到数组的第一个元素,同时将此与临时变量不同的数组元素赋值给临时变量。
(3)循环执行,直到所有的数据处理完毕。
给定程序中,函数fun的功能:
将s所指字符串中的所有非数字字符移到所有数字字符之后,并保持数字字符串和非数字字符串原有的先后次序。
例如,形参s所指的字符串为:
asf34fgrt5657gngjh78。
则执行结果为:
34565778asffgrtgngjh。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
voidfun(char*str)
{
inti,j=0,k=0;
chartemp1[80],temp2[80];
for(i=0;str[i]!
='\0';i++)
if(str[i]>='a'&&str[i]<='z')
{
___1___;
j++;
}
else
{
temp1[k++]=str[i];
}
temp2[j]=0;
temp1[k]=0;
for(i=0;i___2___;
for(i=0;i<___3___;i++)
str[k+i]=temp2[i];
}
main()
{
charstr[100]="asf34fgrt5657gngjh78";
printf("\nTheoriginalstringis:
%s\n",str);
fun(str);
printf("\nTheresultis:
%s\n",str);
}
【答案】
(1)temp2[j]=str[i]
(2)str[i]=temp1[i](3)j
【解析】本题中函数功能是将指定字符串中的所有非数字字符移到所有数字字符之后。
对于字符串中某种字符的操作,通常首先要执行的都是对字符串进行遍历,查找符合题目要求的字符。
从已给部分源程序的main主函数开始入手,"fun(str);"语句调用fun函数,实现本题要求。
第一空:
首先函数对字符串进行遍历,判断字符是否为非数字字符,若是,则将该字符存入串temp2中,否则存入串temp1中,所以第一空填"temp2[j]=str[i]"。
第二空:
根据题目要求,将数字字符放在串的前面,所以要先将存放数字字符的串temp1的内容首先赋值给字符串str,所以这里"str[i]=temp1[i]"。
第三空:
这个for循环是将存放非数字的串temp2的内容,接在temp1赋值后,继续赋值给str,从而形成非数字字符在数字字符的后面,根据生成temp2的循环,知道temp2中字符的个数为j个,所以这里填"j"。
请编写函数fun,该函数的功能是:
将放在字符串数组中的M个字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。
例如,若字符串数组中的M个字符串是:
1111
2222222
33
4444
则合并后的字符串的内容应是11112222222334444。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#defineM4
#defineN20
voidfun(charstr[M][N],char*a)
{
}
main()
{
charmatrix[M][N]={"1111","2222222",
"33","4444"},i;
charstr[100]={"****************"};
FILE*out;
printf("Thestring:
\n");
for(i=0;iputs(matrix[i]);
printf("\n");
fun(matrix,str);
printf("Thestring:
\n");
printf("%s",str);
printf("\n\n");
out=fopen("outfile.dat","w");
fprintf(out,"%s",str);
fclose(out);
}
【答案】
inti,j,k=0;
for(i=0;i{
for(j=0;jif(*(*(str+i)+j))//如果不指向行的尾
{
a[k]=*(*(str+i)+j);//将行中的值赋值给数组a
k++;//数组下标加1
}
else//如果指向尾,则跳出这一行
break;
a[k]='\0';//数组加尾符
}
【解析】该程序功能是将放在字符串数组中的M个字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。
其中,存储在二维字符数组中的每一行,都是一个字符串;在每个字符串的结尾处,各有一个字符串结束符'\0'。
(1)二维字符数组第i行j列元素str[i][j],就是指针形式的*(*(str+i)+j)。
因此,如果字符*(*(str+i)+j)是串的结束符,则说明该字符串已经结束。
(2)当一维字符数组存放完字符串中各字符后,必须在一维字符数组的尾字符处加一个结束符'\0',才能把字符数组变成字符串。
否则,字符数组就只能是非字符串的一般字符数组。
在给定程序中,函数fun的功能是:
在形参s所指字符串中的每个非数字字符之后插入一个"*"号。
例如,形参s所指的字符串为:
a1bc45sdtg56f,则执行结果为a*1b*c*45s*d*t*g*56f*。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
voidfun(char*str)
{
inti,j,n;
for(i=0;str[i]!
='\0';i++)
if(str[i]>='a'___1___str[i]<='z')
{
n=0;
while(str[i+1+n]!
=___2___)
n++;
for(j=i+n+1;j>i;j--)
str[j+1]=___3___;
str[j+1]='*';
i=i+1;
}
}
main()
{
charstr[100]="a1bc45sdtg56f";
printf("\nTheoriginalstringis:
%s\n",str);
fun(str);
printf("\nTheresultis:
%s\n",str);
}
【答案】
(1)&&
(2)0(3)str[j]
【解析】本题中函数功能是在指定字符串中每个非数字字符之后插入一个*号。
其解题思路是首先判断是否为非数字字符,然后根据判断结果进行插入操作。
从已给部分源程序的main主函数开始入手,"fun(str);"语句调用fun函数,实现本题要求。
第一空:
首先函数对字符串进行遍历,判断字符是否为非数字字符,判断条件应是该字符在字符'a'与'z'之间,所以第一空填"与"运算符"&&"。
第二空:
当一个字符是非数字字符时,要在其后插入一个"*"号,while语句是求非数字字符的个数,以便在下面for循环操作中插入"*"号,while执行的条件是字符串不指向字符尾,所以第二空填"0"。
第三空:
这个循环中是将符合非数字字符后面的所有字符,从后向前的依次向后移动一位,以便在查到的i位置后插入"*"号,所以第三空填"str[j]"。
编写一个函数fun,它的功能是:
实现两个字符串的连接(不使用库函数strcat),即把str2所指的字符串连接到str1所指的字符串后。
例如,分别输入下面两个字符串:
just--
test
则程序输出:
just--test
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
voidfun(charstr1[],charstr2[])
{
}
main()
{
chars1[100],s2[50];
FILE*out;
printf("Enters1ands2:
\n");
scanf("%s%s",s1,s2);
printf("s1=%s\n",s1);
printf("s2=%s\n",s2);
fun(s1,s2);
printf("Afterinvoking:
\n");
printf("%s\n",s1);
out=fopen("outfile.dat","w");
strcpy(s1,"Hello");
fun(s1,"World!
");
fprintf(out,"%s\n",s1);
strcpy(s1,"This");
fun(s1,"is");
fun(s1,"a");
fun(s1,"test");
fun(s1,"string.");
fprintf(out,"%s\n",s1);
fclose(out);
}【答案】
inti=0,n=0;//初始化串1个数n,下标i
char*p=str1,*q=str2;//定义指针p,q指向串1、串2
while(*p)//循环求第一个串中字符个数
{
p++;//指向下一个字符
n++;//字符个数加1
}
i=n;//i赋值为串1的最后位置
while(*q)//循环中将串2放在串1后面
{
str1[i]=*q;//将q指向的字符依次放在串str1后面
q++;//指向下一个字符
i++;//下标加1
}
str1[i]='\0';//在新串后加尾符
【解析】该程序功能是实现两个字符串的连接。
本题要把串2连接到串1之后,则需要把串2的第一个字符放到串1的尾符的位置上,把串2的后面的字符放到串1的后面的位置。
(1)先求出串1的元素个数。
(2)然后把串2的元素放到串1最后的位置,依次把串2中的所有字符全部放到串1之后。
请补充fun函数,该函数的功能是求能整除k且是偶数的数,把这些数保存在数组a中,并按从大到小输出。
例如,当k=40时,依次输出402010842。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
#include
voidfun(intk,inta[])
{inti;
intj=0;
for(___1___;i<=k;i++)
if(k%i==0___2___i%2==0)
a[j++]=i;
printf("\n\n");
for(i=___3___;i>=0;i--)
printf("%d",a[i]);
}
main()
{
intk=1;
inta[100];
printf("\nPleaseinputk\n");
scanf("%d",&k);
fun(k,a);
}
【答案】
(1)i=1
(2)&&(3)--j
【解析】本题中函数功能是求能整除k的偶数。
此类题的解题思路,是在循环中判断能整除k的数基础上增加对其偶数的判断。
从已给部分源程序的main主函数开始入手,从键盘输入整数k,"fun(k,a);"语句调用fun函数,实现本题要求。
第一空:
求能整除k的偶数,应该从1开始到k,逐个对其判断,所以这里循环条件中应补全"i=1"。
第二空:
根据题干要求,当前的i不但要能整除k,而且要求它是偶数,所以这里的逻辑关系应该是"&&"。
第三空:
在fun函数中,通过for循环输入结果,根据已给出的循环条件中的已有代码"i>=0;i--",可知,这个循环是从最后一个元素到第一个元素的输出,根据结果数组a中元素的个数,第三空填"--j"。
假定输入的字符串中只包含字母和"#"号。
请编写函数fun,它的功能是:
除了字符串前导和尾部的"#"号之外,将串中其他"#"号全部删除。
形参r已指向字符串中第一个字母,形参v已指向字符串中最后一个字母。
在编写函数时,不得使用C语言提供的字符串函数。
例如,若字符串中的内容为"####a#bc#def##g#####",删除后,字符串中的内容则应当是"####abcdefg#####"。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
#include
voidfun(char*s,char*r,char*v)
{
}
main()
{
charstr[100],*p,*q;
FILE*out;
printf("Enterastring:
\n");
gets(str);
p=q=str;
while(*p)
p++;
p--;
while(*p=='#')
p--;
while(*q=='#')
q++;
fun(str,q,p);
printf("Thestringafterdeleted:
\n");
puts(str);
out=fopen("outfile.dat","w");
strcpy(str,"#####a#b#c#d######");
fun(str,str+4,str+13);
fprintf(out,"%s",str);
fclose(out);
}
【答案】
inti=0;
char*q=s;
while(q{
s[i]=*q;
q++;
i++;
}
while(q{
if(*q!
='#')
{
s[i]=*q;
i++;
}
q++;
}
while(*q)
{
s[i]=*q;
i++;
q++;
}
s[i]='\0';
【解析】该程序功能是除了字符串前导和尾部的#号之外,将串中其他"#"号全部删除。
本题的解题过程首先对小于主函数给出第一个字母的"#"进行复制赋值,然后对将小于最后一个字母内的所有字符进行判断,如果是"#"则删除,否则复制赋值,最后对最后一个字母到串尾的"#"进行复制赋值。
(1)设置一个指针变量q指向字符串的头位置,并使用循环,将从字符串头开始到第一个字母的"#"复制到字符串s。
(2)对第一个字母到最后一个字母之间的字符进行循环判断是否为"#",如果是则跳过,否则复制到字符串s。
(3)将最后一个字母到串尾的"#"复制到s,然后在新生成的字符串尾加'\0'。
请补充函数fun,该函数的功能是:
统计所有小于等于x(x>2)的素数的个数,素数的个数作为函数值返回。
例如,输入x=20,结果:
2,3,5,7,11,13,17,19。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
intfun(intx)
{
inti,j,count=0;
printf("\nTheprimenumberbetween2to%d\n",x);
for(i=2;i<=x;i++)
{
for(___1___;j
if(___2___%j==0)
break;
if(___3___>=i)
{
count++;
printf(count%15?
"%5d":
"\n%5d",i);
}
}
returncount;
}
main()
{
intx=20,result;
result=fun(x);
printf("\nThenumberofprimeis:
%d\n",result);
}
【答案】
(1)j=2
(2)i(3)j
【解析】本题中函数功能是求所有小于等于x(x>2)的素数的个数。
此类题的解题思路是,首先判定素数,然后根据判断结果进行统计。
从已给部分源程序的main主函数开始入手,"result=fun(x);"语句调用fun函数,实现本题要求。
第一空:
根据素数的解题思路,素数从2开始,所以这里应该填"j=2"。
第二空:
for(i=2;i<=x;i++)循环中判断i是否为素数,所以第二空填"i"。
第三空:
是对i为素数的个数的统计,所以这里填"j"。
学生的记录由学生和成绩组成,M名学生的数据已在主函数中放入结构体数组stu中,请编写函数fun,它的功能是把分数最高的学生数据放在high所指的数组中.注意:
分数最高的学生可能不止一个,函数返回分数最高的学生的人数。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#defineM10
typedefstruct
{
charnum[10];
ints;
}SCORE;
intfun(SCORE*p,SCORE*q)
{
}
main()
{
SCOREstu[M]={{"02",69},{"04",85},{"01",91},{"08",64},{"06",
87},{"015",85},{"013",91},{"012",64},{"011",91},{"017",64}};
SCOREhigh[M];
inti,n;
FILE*out;
n=fun(stu,high);
printf("The%dhighscore:
\n",n);