引言
小伙伴们好~~因博主的大学所在地出现了疫情,现阶段都已转成网课教学,一天天课贼满= =,抱歉延迟了这么多天才发,愿大家多多理解,也祝大家考试顺利!
*注:本人思路与答案在文章末尾,建议先做做再进行比较;本人能力有限,如有更优解或不懂的地方可私信。
---程序填空题
下列给定程序中,函数fun的功能是 : 把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符将绕回放到第一个奇数位置,下标为偶数的字符不动(注:字符串的长度大于等于2)。
例如,形参s所指字符串为"abcdefgh",执行结果为"ahcbedgf"。
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
void fun(char *s)
{ int i, n, k; char c;
n=0;
for(i=0; s[i]!='\0'; i++) n++;
/**********found**********/
if(n%2==0) k=n-___1___ ;
else k=n-2;
/**********found**********/
c=___2___ ;
for(i=k-2; i>=1; i=i-2) s[i+2]=s[i];
/**********found**********/
s[1]=___3___ ;
}
main()
{ char s[80]="abcdefgh";
printf("\nThe original string is : %s\n",s);
fun(s);
printf("\nThe result is : %s\n",s);
}
---程序修改题
下列给定程序中fun函数的功能是:求表达式
S=aa... aa-""" -aaa-aa-a
(此处aa... aa表示n个a,a和n的值在1至9之间)例如,a=3,n=6,则以上表达式为;
s=333333-33333-3333-333-33-3 其值是 296298。
a和n是fun函数的形参,表达式的值作为函数值传回main函数。
请改正程序中的错误,使它能计算出正确的结果。
注意:部分源程序在文件MOD11.C中,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
long fun (int a, int n)
{ int j ;
/**************found**************/
long s = 0, t = 1 ;
for ( j = 0 ; j < n ; j++)
t = t * 10 + a ;
s = t ;
for ( j = 1 ; j < n ; j++) {
/**************found**************/
t = t % 10 ;
s = s - t ;
}
return(s) ;
}
main( )
{ int a, n ;
printf( "\nPlease enter a and n:") ;
scanf( "%d%d", &a, &n ) ;
printf( "The value of function is: %ld\n", fun ( a, n ) );
}
---程序设计题
编写函数void fun(char *tt, int pp[),统计在tt所指的字符串中 ' a ' 到 ' z ' 26个小写字母各自出现的次数,并依次放在pp所指的数组中。
例如,当输入字符串abcdefgabcdeabc后,程序的输出结果应该是:
3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h>
#include <string.h>
void fun(char *tt, int pp[])
{
}
main( )
{ char aa[1000] ;
int bb[26], k ;
void NONO ( );
printf( "\nPlease enter a char string:" ) ; scanf("%s", aa) ;
fun(aa, bb ) ;
for ( k = 0 ; k < 26 ; k++ ) printf ("%d ", bb[k]) ;
printf( "\n" ) ;
NONO ( ) ;
}
void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
char aa[1000] ;
int bb[26], k, i ;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%s", aa) ;
fun(aa, bb) ;
for ( k = 0 ; k < 26 ; k++ ) fprintf (wf, "%d ", bb[k]) ;
fprintf(wf, "\n" ) ;
}
fclose(rf) ;
fclose(wf) ;
}
解析
程序填空题:
第一空中,k为最后一个位置的奇数下标,n为字符串长度;即判断n在不同情况下k的下标。
第二空中,c为字符类型,前面的k中又求出了奇数下标的最后一个位置,再结合题目来理解。
第三空中,s[1]是第一个奇数下标,应填最右边被移出字符串的字符。
1. 1 2. s[k] 3. c
程序修改题:
第一处错误:t=1;若t=1,那么数字中最大位上的数便都是1,与题目不相符。
(起初我认为t=a,但这样就会多*10一次,也不能改其他位置的代码,害)
第二处错误:t%10;若t%10,得到的都是个位数上的值,运算符错误。
1. t=0 2. t/10
程序设计题:
才看这题原本想用俩for循环写的,在数组每个元素中查是26个字母中的哪一个,再让它们进行相加,但这样会很浪费时间空间,不太可取。
例子中给出的没有字母出现时为0,而主函数并没有赋值,所以要先进行赋值操作;
代码中导入了string.h头文件,显然是要用的(题目所给代码中并没有用,于是博主去网上找了下,发现并没有找到有返回子串在字符串中出现次数的函数= =);
因为是查找小写字母出现次数,a 的ASCII码为97,那么当任意一个字母减去97得到的0-25之间的数,再以这个数为下标使pp数组中对应位置的数值+1即可。
void fun(char *tt, int pp[])
{
int i;
for(i=0;i<26;i++) pp[i]=0;
for(i=0;i<strlen(tt);i++) pp[(tt[i]-97)]++;
}
大家可以将对题目的看法私信或写到评论区吼,我会回复大家,一起学习进步🥰