目录
- 31.找出学生的最高分,由函数值返回
- 32.计算并输出下列多项式的值
- 33.将一个数字字符串转换成与其面值相同的长整型整数。可调用strlen函数求字符串的长度
- 34.将字符串中的前导*号全部移到字符串的尾部。函数fun中给出的语句仅供参考
- 35.将一组得分中,去掉一个最高分和一个最低分,然后求平均值,并通过函数返回
- 36.将具有n个元素的形参数组x中的偶数依原顺序输出到字符数组str中,每个数字后面加一个小数点,并生成一个结果字符串str由函数返回
- 37.分别统计形参t所指二维数组中字母A和C的个数
- 38.查找x在s所指数组中下标的位置作为函数值返回,若x不存在,则返回-1
- 39.判断形参n中的正整数是几位数(输入数据的位数不超过4位),并将结果通过函数值返回
- 40.除了字符串前导的`*`号之外,将串中其它*号全部删除
31.找出学生的最高分,由函数值返回
N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:找出学生的最高分,由函数值返回。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
#include <stdlib.h>
#define N 8
struct slist
{ double s;struct slist *next;
};
typedef struct slist STREC;//声明了一个自定义类型名STREC
double fun( STREC *h )
{}STREC * creat( double *s)//创建链表
{ STREC *h,*p,*q; int i=0;h=p=(STREC*)malloc(sizeof(STREC));p->s=0;//开辟了节点空间,while(i<N)//创建n个节点{ q=(STREC*)malloc(sizeof(STREC));//开辟空间q->s=s[i]; i++; p->next=q; p=q;//把数组s的元素存入q节点,把q节点接在p节点后,再把q节点赋给p,也就是让指针p后移}p->next=0;//设p的指针域为空,也就是后面没有节点了return h;//返回头节点
}
outlist( STREC *h)//输出链表
{ STREC *p;p=h->next; printf("head");//设p为头节点h的下一节点do{ printf("->%2.0f",p->s);p=p->next;}//在循环中指针p后移来输出节点while(p!=0);printf("\n\n");
}
main()
{ double s[N]={85,76,69,85,91,72,64,87}, max;void NONO ();STREC *h;/头节点h=creat( s ); outlist(h);//创建链表,然后输出链表max=fun( h );//fun函数返回最高分printf("max=%6.1f\n",max);NONO();getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i,j ; double s[N],max;STREC *h ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {//有10组测试数据for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;//从文件指针in指向的文件in.dat中获取数组sh=creat( s );//创建链表max=fun( h );fprintf(out, "%6.1lf\n", max) ;//结果输出到文件指针out指向的文件out.dat中}fclose(in) ;//关闭fclose(out) ;
}
解题思路:
遍历链表,比较节点中成员s的大小,找出最大的返回
设一节点p为头节点h的下一节点,再设一节点q为p节点的下一节点,用一while循环,循环为q不为NULL就好了
答案:
1.自己做的
#include <stdio.h>
#include <stdlib.h>
#define N 8
struct slist
{ double s;struct slist *next;
};
typedef struct slist STREC;
double fun( STREC *h )
{
STREC *p=h->next,*q;//p节点为头节点h的下一节点
q=p->next;//q节点为p节点的下一节点
while(q)//循环条件q节点不为NULL
{if(p->s<q->s)//如果q节点的s大于p节点的,则让指针p指向此时的q节点p=q;q=q->next;//指针q后移
}
return p->s;//返回最大的
}STREC * creat( double *s)
{ STREC *h,*p,*q; int i=0;h=p=(STREC*)malloc(sizeof(STREC));p->s=0;while(i<N){ q=(STREC*)malloc(sizeof(STREC));q->s=s[i]; i++; p->next=q; p=q;}p->next=0;return h;
}
outlist( STREC *h)
{ STREC *p;p=h->next; printf("head");do{ printf("->%2.0f",p->s);p=p->next;}while(p!=0);printf("\n\n");
}
main()
{ double s[N]={85,76,69,85,91,72,64,87}, max;void NONO ();STREC *h;h=creat( s ); outlist(h);max=fun( h );printf("max=%6.1f\n",max);NONO();getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i,j ; double s[N],max;STREC *h ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;h=creat( s );max=fun( h );fprintf(out, "%6.1lf\n", max) ;}fclose(in) ;fclose(out) ;
}
2。题库答案:
#include <stdio.h>
#include <stdlib.h>
#define N 8
struct slist
{ double s;struct slist *next;
};
typedef struct slist STREC;
double fun( STREC *h )
{STREC *c;//设一指针cdouble max;c=h->next;//让c指向头节点h的下一节点max=c->s; //把c节点的s赋给maxwhile (c->next!=0)//c节点的下一节点不为空{c=c->next;//指针c后移if (max<c->s) max=c->s; //c节点的s大于max,则赋给max}return max;
}STREC * creat( double *s)
{ STREC *h,*p,*q; int i=0;h=p=(STREC*)malloc(sizeof(STREC));p->s=0;while(i<N){ q=(STREC*)malloc(sizeof(STREC));q->s=s[i]; i++; p->next=q; p=q;}p->next=0;return h;
}
outlist( STREC *h)
{ STREC *p;p=h->next; printf("head");do{ printf("->%2.0f",p->s);p=p->next;}while(p!=0);printf("\n\n");
}
main()
{ double s[N]={85,76,69,85,91,72,64,87}, max;void NONO ();STREC *h;h=creat( s ); outlist(h);max=fun( h );printf("max=%6.1f\n",max);NONO();getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i,j ; double s[N],max;STREC *h ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;h=creat( s );max=fun( h );fprintf(out, "%6.1lf\n", max) ;}fclose(in) ;fclose(out) ;
}
测试:
main函数的:
in.dat:
out.dat:
32.计算并输出下列多项式的值
请编写函数fun,其功能是:计算并输出下列多项式的值:
例如,在主函数中从键盘给n输入50后,输出为: s=1.718282。
注意:要求n的值大于1但不大于100。
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
PROG1.C:
#include <stdio.h>
#pragma warning (disable:4996)
double fun(int n)
{}
main()
{ int n; double s;void NONO( );printf("\nInput n: "); scanf("%d",&n);s=fun(n);printf("\n\ns=%f\n\n",s);NONO();
}
void NONO()//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */FILE *rf, *wf ; int n, i ; double s ;rf = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {//有10组测试数据fscanf(rf, "%d", &n) ;//从文件指针rf指向的文件in.dat中获取ns = fun(n) ;fprintf(wf, "%lf\n", s) ;//结果输出到文件指针wf指向的文件out.dat中}fclose(rf) ; fclose(wf) ;//关闭
}
解题思路:
这种题找清楚规律就好了,在题目的公式中可看出分母是阶乘,需要注意的题目说n的范围最大可为100,那int
显然是不够的
好吧,这题有些离谱了,这个n的最大可达100,也即是100!,那就算long long
也存不下,但是吧我又发现当n=9时,再往后的分式结果非常的小,后面的值基本定在了1.718282,放个图看下
这张图用的是20!
总之反正你用double在out.dat
中也没出现inf
表示爆了,
答案:
1.自己做的:
#include <stdio.h>
#pragma warning (disable:4996)
double fun(int n)
{
double i=1,a=1;//a是求阶乘也就是分母的中间变量,用long long 在out.dat中会出现inf
double s=0;
while(i<=n)
{
a*=i;
s+=1.0/a;
i++;
}
return s;
}
main()
{ int n; double s;void NONO( );printf("\nInput n: "); scanf("%d",&n);s=fun(n);printf("\n\ns=%f\n\n",s);NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */FILE *rf, *wf ; int n, i ; double s ;rf = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {fscanf(rf, "%d", &n) ;s = fun(n) ;fprintf(wf, "%lf\n", s) ;}fclose(rf) ; fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#pragma warning (disable:4996)
double fun(int n)
{ int i;double sum=0.0,tmp=1.0; if(n<=1||n>100){ printf("Input n(n>1&&n<=100): "); scanf("%d",&n);}//他加了对输出的限制,符合题目for(i=1;i<=n;i++){ tmp*=i; sum+=1.0/tmp; }return sum;
}
main()
{ int n; double s;void NONO( );printf("\nInput n: "); scanf("%d",&n);s=fun(n);printf("\n\ns=%f\n\n",s);NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */FILE *rf, *wf ; int n, i ; double s ;rf = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {fscanf(rf, "%d", &n) ;s = fun(n) ;fprintf(wf, "%lf\n", s) ;}fclose(rf) ; fclose(wf) ;
}
测试:
main函数:
in.dat:
out.dat:
看到这样,不用惊讶,解题思路那里说过了
33.将一个数字字符串转换成与其面值相同的长整型整数。可调用strlen函数求字符串的长度
请编函数fun,其功能是将一个数字字符串转换成与其面值相同的长整型整数。可调用strlen函数求字符串的长度。
例如:在键盘输入字符串2345210,函数返回长整型数2345210。
注意:部分源程序存在PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun指定的部位填入所编写的若干语句。
PROG1.C:
#include <stdio.h>
#include <string.h>
void NONO();long fun( char *s )
{}
main()
{ char s[10]; long r;printf("请输入一个长度不超过9个字符的字符串 : "); gets(s);r = fun( s );printf(" r = %ld\n" , r );NONO();getchar();
}void NONO()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i;long r;char s[10], *p;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {//有10组测试数据fgets(s, 10, fp);//从文件指针fp指向的文件in.dat中获取字符数组sp=strchr(s,'\n');//又是这个,使指针p指向字符数组的中换行符if(p) *p=0;//把换行符变为字符空r = fun(s);fprintf(wf, "%ld\n", r);//结果输出到文件指针wf指向的文件out.dat中}fclose(fp) ;/关闭fclose(wf) ;
}
解题思路:
就是把数字字符串转换为整数,只要知道数字字符减取去字符’0’就是整数了就很简单,这个很好理解
答案:
1.自己做的:
#include <stdio.h>
#include <string.h>
void NONO();long fun( char *s )
{
long r=0;//这里很容易理解,就不多说了
while(*s!='\0')
{r=r*10+*s-'0';s++;
}
return r;
}
main()
{ char s[10]; long r;printf("请输入一个长度不超过9个字符的字符串 : "); gets(s);r = fun( s );printf(" r = %ld\n" , r );NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i;long r;char s[10], *p;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {fgets(s, 10, fp);p=strchr(s,'\n');if(p) *p=0;r = fun(s);fprintf(wf, "%ld\n", r);}fclose(fp) ;fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#include <string.h>
void NONO();long fun( char *s )
{ int i,n;long a,r;a=0;r=0;n=strlen(s);//他选择用了strlen()for(i=0;i<n;i++){a=*(s+i)-48;//字符0的ASCII码就是48r=r*10+a;}return r;
}
main()
{ char s[10]; long r;printf("请输入一个长度不超过9个字符的字符串 : "); gets(s);r = fun( s );printf(" r = %ld\n" , r );NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i;long r;char s[10], *p;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {fgets(s, 10, fp);p=strchr(s,'\n');if(p) *p=0;r = fun(s);fprintf(wf, "%ld\n", r);}fclose(fp) ;fclose(wf) ;
}
测试:
main函数:
in.dat:
有趣,这次输出out.dat不出所料又出了问题,放张图
可以看到有个0,这显然错了
本因为是如往常只是p=strchr(s,'\n');
这句话的问题,因为windows系统里换行符会识别为\r\n
,这句话的功能只把\n
转换为了'\0'
,那就把\r
算入了字符串里,导致了错误,但这次不同,还有其他的因素,
如果仅仅只是把p=strchr(s,'\n');
改成p=strchr(s,'\r');
的话,就会出现,下图的情况
出现了-38的情况
下断点会发现,
\n
没有出现,换行符是由\r\n
组成的,\r
是把光标移至行尾,\n
是实现换行,
再看获取的下一个字符串
\n
跑到了下一字符串的开头处,这说明上一字符串少获取了一字符
这里看下正常字符串的获取,
通过对比更明显看出那个字符串少获取了一字符,那就应该还要在fgets(s, 10, fp);
这句话,让获取的最大字符数加1即可,也就是改成fgets(s,11,fp);
好了,将这两处都改好后,再看out.dat就是正确的了
out.dat:
34.将字符串中的前导*号全部移到字符串的尾部。函数fun中给出的语句仅供参考
假定输入的字符串中只包含字母和号。请编写函数fun,它的功能是:将字符串中的前导号全部移到字符串的尾部。函数fun中给出的语句仅供参考。
例如,字符串中的内容为:*******A*BC*DEF*G****
,移动后,字符串中的内容应当是:ABCDEF*G***********。在编写函数时,不得使用C语言提供的字符串函数。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
void fun( char *a )这个函数中给出的部分他注释很清楚了
{/* 以下代码仅供参考 */char *p,*q;int n=0;p=a;while(*p=='*') /* 统计串头'*'个数n */{n++; p++;}q=a;/* 向前复制字符串,请填写相应的语句完成其功能 */for(;n>0;n--) /* 在串尾补n个'*' */*q++='*';//指针后移再解引,等同于*(t+1)='*';*q='\0';
}main()
{ char s[81]; int n=0; void NONO ();printf("Enter a string:\n");gets(s);fun( s );printf("The string after moveing:\n");puts(s);NONO();getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i ; char s[81] ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {//有10组测试数据fscanf(in, "%s", s) ;//从文件指针in指向的文件in.dat中获取字符串sfun(s) ;fprintf(out, "%s\n", s) ; //结果输出到文件指针out指向的文件out.dat中 }fclose(in) ;//关闭fclose(out) ;
}
解题思路:
题目代码中的思路是先用while循环统计出了*
个数n,也使指针p指向了前导*
结束后的第一个字符,就以题目中例子p指向了字符串中的A,再下一句q=a,就应该知道应该是*p=*q,两个指针都向后移的方式来实现向前复制字符串,字符串前移完后,此时q为字符串的末尾,接上*
答案:
1.自己做的:
#include <stdio.h>
void fun( char *a )
{/* 以下代码仅供参考 */char *p,*q;int n=0;p=a;while(*p=='*') /* 统计串头'*'个数n */{n++; p++;}q=a;/* 向前复制字符串,请填写相应的语句完成其功能 */while(*p!='\0')//就跟我在解题思路里说的一样的{*q=*p;q++;p++;}for(;n>0;n--) /* 在串尾补n个'*' */*q++='*';*q='\0';
}main()
{ char s[81]; int n=0; void NONO ();printf("Enter a string:\n");gets(s);fun( s );printf("The string after moveing:\n");puts(s);NONO();getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i ; char s[81] ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {fscanf(in, "%s", s) ;fun(s) ;fprintf(out, "%s\n", s) ; }fclose(in) ;fclose(out) ;
}
2.题库答案:
#include <stdio.h>
void fun( char *a )
{/* 以下代码仅供参考 */char *p,*q;int n=0;p=a;while(*p=='*') /* 统计串头'*'个数n */{n++; p++;}q=a;/* 向前复制字符串,请填写相应的语句完成其功能 */while(*p)//他循环条件简写了下{*q=*p;q++;p++;}for(;n>0;n--) /* 在串尾补n个'*' */*q++='*';*q='\0';
}main()
{ char s[81]; int n=0; void NONO ();printf("Enter a string:\n");gets(s);fun( s );printf("The string after moveing:\n");puts(s);NONO();getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i ; char s[81] ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {fscanf(in, "%s", s) ;fun(s) ;fprintf(out, "%s\n", s) ; }fclose(in) ;fclose(out) ;
}
测试:
main函数:
in.dat:
out.dat:
35.将一组得分中,去掉一个最高分和一个最低分,然后求平均值,并通过函数返回
请编写函数fun,其功能是:将一组得分中,去掉一个最高分和一个最低分,然后求
平均值,并通过函数返回。函数形参a指向存放得分的数组,形参n中存放得分个数(n>2) 。
例如,若输入9.9 8.5 7.6 8.5 9.3 9.5 8.9 7.8 8.6 8.4十个得分,则输出结果为:8.687500。
注意:部分源程序存在PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
PROG1.C:
#include <stdio.h>
void NONO();
double fun(double a[ ] , int n)
{}main()
{ double b[10], r; int i;printf("输入10个分数放入b数组中 : ");for (i=0; i<10; i++) scanf("%lf",&b[i]);printf("输入的10个分数是 : ");for (i=0; i<10; i++) printf("%4.1lf ",b[i]); printf("\n");r = fun(b, 10);printf("去掉最高分和最低分后的平均分 : %f\n", r );NONO();getchar();
}void NONO()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j ;double b[10], r ;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {//有10组测试数据for(j = 0 ; j < 10 ; j++) {fscanf(fp, "%lf ", &b[j]) ;//从文件指针fp指向的文件in.dat中获取数组b}r = fun(b, 10) ;//返回平均值fprintf(wf, "%f\n", r) ;//结果输出到文件指针wf指向的文件out.dat中}fclose(fp) ;//关闭fclose(wf) ;
}
解题思路:
设两个变量,一个存最大值max,一个存最小值min,再设个avg,这三个变量都初始化为a[0],还有注意这三个变量都要设为浮点型,要筛出max和min要设一个循环遍历所有得分,在此之中可以让avg累加为所有得分之和,之后再减去max和min,再除以n-2即为平均值了
答案:
1.自己做的:
#include <stdio.h>
void NONO();
double fun(double a[ ] , int n)
{
double max=a[0],min=a[0];
double avg=a[0];
for(int i=1;i<n;i++)//因为初始化为a[0]了,下标从1开始
{if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];avg+=a[i];
}
avg=avg-max-min;
avg=avg/(n-2);
return avg;
}main()
{ double b[10], r; int i;printf("输入10个分数放入b数组中 : ");for (i=0; i<10; i++) scanf("%lf",&b[i]);printf("输入的10个分数是 : ");for (i=0; i<10; i++) printf("%4.1lf ",b[i]); printf("\n");r = fun(b, 10);printf("去掉最高分和最低分后的平均分 : %f\n", r );NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j ;double b[10], r ;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {for(j = 0 ; j < 10 ; j++) {fscanf(fp, "%lf ", &b[j]) ;}r = fun(b, 10) ;fprintf(wf, "%f\n", r) ;}fclose(fp) ;fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
void NONO();
double fun(double a[ ] , int n)//大差不差,还是我那个思路
{double min,max,s,avg;int i;min=a[0];max=a[0];s=0.0;avg=0.0;for(i=0;i<n;i++){if(min>a[i])min=a[i];if(max<a[i])max=a[i];s+=a[i];}avg=(s-min-max)/(n-2);return avg;
}main()
{ double b[10], r; int i;printf("输入10个分数放入b数组中 : ");for (i=0; i<10; i++) scanf("%lf",&b[i]);printf("输入的10个分数是 : ");for (i=0; i<10; i++) printf("%4.1lf ",b[i]); printf("\n");r = fun(b, 10);printf("去掉最高分和最低分后的平均分 : %f\n", r );NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j ;double b[10], r ;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {for(j = 0 ; j < 10 ; j++) {fscanf(fp, "%lf ", &b[j]) ;}r = fun(b, 10) ;fprintf(wf, "%f\n", r) ;}fclose(fp) ;fclose(wf) ;
}
测试:
main函数:
in.dat:
out.dat:
36.将具有n个元素的形参数组x中的偶数依原顺序输出到字符数组str中,每个数字后面加一个小数点,并生成一个结果字符串str由函数返回
请编写函数fun,其功能是:将具有n个元素的形参数组x中的偶数依原顺序输出到字符数
组str中,每个数字后面加一个小数点,并生成一个结果字符串str由函数返回。
例如:当数组x内容为1, 4, 19, 82, 61,2,输出结果是: 4. 82.2.
注意:部分源程序在文件PROG1. C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
PROG1. C:
#include <stdio.h>
#include <string.h>/* 函数int_to_str的功能是将参数n中的整数转换成字符串,存入s指内存中 */
void int_to_str(int n,char *s)
{sprintf(s,"%d",n); //这个函数我还是第一次见,就是打印到字符串,在解题思路细讲
}char *fun(int x[], int n)
{static char str[200],s[10];int i;*str = 0;/* 请在这里填入你编写的代码*/return str;
}int main()
{void NONO();int x[] = {1,4,19,82,61,2};printf("str=%s\n", fun(x, 6));NONO();return 0;
}void NONO()//系统用于评分测试的函数
{int i;int x[10][20] = {{11,5,6,8,9,18,54},{1,4,19,82,61,2},{87,78,54,32},{9,1,2,3,4,67,8,12},{91,12,33,55,66},{9,7,8,5,6,4,3,2,1,12},{12,13,14,15,11,16,17,18},{21,23,22,24,25,26,27,28,29},{33,32,31,41,42,43,51,42,53,54,66},{71,72,81,82,91,92}};//这回没有弄in.dat这样的输出,直接弄了个10行的数组,也就是10组测试数据,int y[10] ={7,6,4,8,5,10,8,9,11,6};//数组y里的元素是每组测试数据的元素个数FILE *fp;fp = fopen("out.dat","w") ;for(i = 0; i< 10; i++)//10组测试fprintf(fp, "str=%s\n", fun(x[i], y[i]));//结果输出到文件指针fp指向的文件out.dat中fclose(fp);}
解题思路:
int sprintf(char *str, const char *format, ...)
str – 这是指向一个字符数组的指针,该数组存储了 C 字符串。
format – 这是字符串,包含了要被写入到字符串 str 的文本。
嗯,用中文形容参数就是
int sprintf(指向字符串的指针,“输出到字符串的”);
sprintf()函数的头文件是#include<stdio.h>
,sprintf函数打印到字符串中(要注意字符串的长度要足够容纳打印的内容,否则会出现内存溢出),sprintf()函数在我们完成其他诗句类型转换成字符串类型的操作中应用广泛
呃,举个例子吧,就以题目这个sprintf(s,"%d",n)
,如果n=65,
执行sprintf(s,"%d",65);
,那字符串s=“65”,
如果执行sprintf(s,“%c”,65),那打印入字符串的就是A
,举了例子这样应该好理解多了吧
回到题目,设一指针p指向数组str,筛出数组x中的偶数,用题目给的int_to_str存入数组str,且求出该数的长度len,然后执行p=p+len,题目说每个数字后毒药价格小数点,*p='.'
,然后如此循环存入就可以了
答案:
1.自己做的:
#include <stdio.h>
#include <string.h>/* 函数int_to_str的功能是将参数n中的整数转换成字符串,存入s指内存中 */
void int_to_str(int n,char *s)
{sprintf(s,"%d",n);
}char *fun(int x[], int n)
{static char str[200],s[10];int i;*str = 0;/* 请在这里填入你编写的代码*/char *p=str;
for(i=0;i<n;i++)
{if(x[i]%2==0)//筛出偶数{int_to_str(x[i],p);int len=0;//该数长度while(x[i]){x[i]/=10;len++;}p+=len;//指针后移*p='.';//在数的末尾加小数点p++;//指针再后移一位}
}*p='\0';//字符串结束符return str;
}int main()
{void NONO();int x[] = {1,4,19,82,61,2};printf("str=%s\n", fun(x, 6));NONO();return 0;
}void NONO()
{int i;int x[10][20] = {{11,5,6,8,9,18,54},{1,4,19,82,61,2},{87,78,54,32},{9,1,2,3,4,67,8,12},{91,12,33,55,66},{9,7,8,5,6,4,3,2,1,12},{12,13,14,15,11,16,17,18},{21,23,22,24,25,26,27,28,29},{33,32,31,41,42,43,51,42,53,54,66},{71,72,81,82,91,92}};int y[10] ={7,6,4,8,5,10,8,9,11,6};FILE *fp;fp = fopen("out.dat","w") ;for(i = 0; i< 10; i++)fprintf(fp, "str=%s\n", fun(x[i], y[i]));fclose(fp);}
再来个借助函数的,思路是一样的,但方式有些不同:
#include <stdio.h>
#include <string.h>/* 函数int_to_str的功能是将参数n中的整数转换成字符串,存入s指内存中 */
void int_to_str(int n,char *s)
{sprintf(s,"%d",n);
}char *fun(int x[], int n)
{static char str[200],s[10];int i;*str = 0;/* 请在这里填入你编写的代码*/char *p=str;for(i=0;i<n;i++)//看起来比上面那个清爽多了{if(x[i]%2==0)//筛出偶数{int_to_str(x[i],s);//存入字符串,不过是先存入字符串s,用字符串s做一个过渡int len=strlen(s);//获取字符串s的长度,也就是获取当前这数的长度strcpy(p,s);//将字符串s复制给字符串strp+=len;//指针后移*p='.';//这些还是一样的p++;}}
*p='\0';return str;
}int main()
{void NONO();int x[] = {1,4,19,82,61,2};printf("str=%s\n", fun(x, 6));NONO();return 0;
}void NONO()
{int i;int x[10][20] = {{11,5,6,8,9,18,54},{1,4,19,82,61,2},{87,78,54,32},{9,1,2,3,4,67,8,12},{91,12,33,55,66},{9,7,8,5,6,4,3,2,1,12},{12,13,14,15,11,16,17,18},{21,23,22,24,25,26,27,28,29},{33,32,31,41,42,43,51,42,53,54,66},{71,72,81,82,91,92}};int y[10] ={7,6,4,8,5,10,8,9,11,6};FILE *fp;fp = fopen("out.dat","w") ;for(i = 0; i< 10; i++)fprintf(fp, "str=%s\n", fun(x[i], y[i]));fclose(fp);}
2.题库答案:
#include <stdio.h>
#include <string.h>/* 函数int_to_str的功能是将参数n中的整数转换成字符串,存入s指内存中 */
void int_to_str(int n,char *s)
{sprintf(s,"%d",n);
}char *fun(int x[], int n)
{static char str[200]={'\0'};//呃,原来是可以改动外边的吗,他这里初始化字符串str,后面就不用加字符串结束符int i,j;char* strP = str;//还是是用指针的/* 请在这里填入你编写的代码*///获取数组中的偶数for (i = 0;i < n;i++){if (x[i] % 2 == 0){int temp = x[i];char s[10]={'\0'};char* strP2 = s;//呃,令人疑惑的操作,感觉多此一举//获取整数的每一位并记录在s[10]中while (temp) {int_to_str(temp % 10, strP2++);//他是每次存入一位数,这样就不用去判断该数的长度了temp /= 10;}//反向取出每一位并赋值给str[200]这个里面for ( j=(strP2-s-1);j>=0;j--){*strP = s[j];++strP;}//添加小数点*strP = '.';++strP;}}return str;
}int main()
{void NONO();int x[] = {1,4,19,82,61,2};printf("str=%s\n", fun(x, 6));NONO();return 0;
}void NONO()
{int i;int x[10][20] = {{11,5,6,8,9,18,54},{1,4,19,82,61,2},{87,78,54,32},{9,1,2,3,4,67,8,12},{91,12,33,55,66},{9,7,8,5,6,4,3,2,1,12},{12,13,14,15,11,16,17,18},{21,23,22,24,25,26,27,28,29},{33,32,31,41,42,43,51,42,53,54,66},{71,72,81,82,91,92}};int y[10] ={7,6,4,8,5,10,8,9,11,6};FILE *fp;fp = fopen("out.dat","w") ;for(i = 0; i< 10; i++)fprintf(fp, "str=%s\n", fun(x[i], y[i]));fclose(fp);}
测试:
main函数:
out.dat:
37.分别统计形参t所指二维数组中字母A和C的个数
请编写函数fun,其功能是分别统计形参t所指二维数组中字母A和C的个数。
注意:部分源程序存在PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
PROG1.C:
#include <stdio.h>
#include <stdlib.h>
#define M 14
void NONO();
void fun( char (*t)[M], int *a ,int *c)
{}void get( char (*s)[M] )//这个函数是获取二维数组的
{ int i, j;for( i=0; i<M; i++ ){ for( j=0; j<M; j++){ s[i][j]=65+rand()%12; printf( "%c ",s[i][j]); }//元素是用随机数函数rand()得出的,范围65+为0到11,printf("\n");}
}main()
{ char a[M][M];int x, y;get (a);fun ( a, &x,&y );printf("A = %d C = %d\n",x,y);NONO();getchar();
}void NONO()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j, x, y ;char a[M][M];fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for( i=0; i<M; i++ )//就一组测试数据{ for( j=0; j<M; j++){ fscanf(fp, "%c ", &a[i][j]); }//从文件指针fp指向的文件in.dat中获取数组a}fun ( a, &x,&y );fprintf(wf, "A=%d\n", x) ;//结果输出到文件指针wf指向的文件out.dat中fprintf(wf, "C=%d\n", y) ;fclose(fp) ;//关闭fclose(wf) ;
}
解题思路:
随机数函数公式:rand()%(n-m+1)+m,随机数范围为[m,n]
题目很简单,就是遍历二维数组筛出字符’A’,'C’的个数,但要注意*a,*c可都没有初始化,要先初始化为0,
答案:
1.自己做的:
#include <stdio.h>
#include <stdlib.h>
#define M 14
void NONO();
void fun( char (*t)[M], int *a ,int *c)
{*a=0,*c=0;//初始化for(int i=0;i<M;i++)
{for(int j=0;j<M;j++){if(t[i][j]=='A')(*a)++;//记得打个括号,让其先执行解引符*if(t[i][j]=='C')(*c)++;}
}}void get( char (*s)[M] )
{ int i, j;for( i=0; i<M; i++ ){ for( j=0; j<M; j++){ s[i][j]=65+rand()%12; printf( "%c ",s[i][j]); }printf("\n");}
}main()
{ char a[M][M];int x, y;get (a);fun ( a, &x,&y );printf("A = %d C = %d\n",x,y);NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j, x, y ;char a[M][M];fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for( i=0; i<M; i++ ){ for( j=0; j<M; j++){ fscanf(fp, "%c ", &a[i][j]); }}fun ( a, &x,&y );fprintf(wf, "A=%d\n", x) ;fprintf(wf, "C=%d\n", y) ;fclose(fp) ;fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#include <stdlib.h>
#define M 14
void NONO();
void fun( char (*t)[M], int *a ,int *c)
{int i,j;*a=0;*c=0;for(i=0;i<M;i++){for(j=0;j<M;j++){if(t[i][j]==67){//这里他用ASCII码*c=*c+1;}else if(t[i][j]==65){*a=*a+1;}elsecontinue;//continue是跳过了当前循环,算是提速了}}
}void get( char (*s)[M] )
{ int i, j;for( i=0; i<M; i++ ){ for( j=0; j<M; j++){ s[i][j]=65+rand()%12; printf( "%c ",s[i][j]); }printf("\n");}
}main()
{ char a[M][M];int x, y;get (a);fun ( a, &x,&y );printf("A = %d C = %d\n",x,y);NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j, x, y ;char a[M][M];fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for( i=0; i<M; i++ ){ for( j=0; j<M; j++){ fscanf(fp, "%c ", &a[i][j]); }}fun ( a, &x,&y );fprintf(wf, "A=%d\n", x) ;fprintf(wf, "C=%d\n", y) ;fclose(fp) ;fclose(wf) ;
}
测试:
main函数:
in.dat:
out.dat:
38.查找x在s所指数组中下标的位置作为函数值返回,若x不存在,则返回-1
请编写函数fun,函数的功能是查找x在s所指数组中下标的位置作为函数值返回,若x不存在,则返回-1。
注意:部分源程序存在PROG1.C中,请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
PROG1.C:
#include <stdio.h>
#include <stdlib.h>
#define N 15
void NONO();
int fun( int *s, int x)
{}
main()
{ int a[N]={ 29,13,5,22,10,9,3,18,22,25,14,15,2,7,27},i,x,index;printf("a数组中的数据 :\n");for(i=0; i<N; i++) printf("%4d",a[i]); printf("\n");printf("给x输入待查找的数 : "); scanf("%d",&x);index=fun( a, x );printf("index=%d\n",index);NONO();getchar();
}void NONO()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j, a[10], x, index;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {//有10组测试数据for(j = 0 ; j < 10 ; j++) {fscanf(fp, "%d ", &a[j]);//从文件指针fp指向的文件in.dat获取数组a}fscanf(fp, "%d", &x);//从文件指针指向的文件in.dat获取xindex = fun(a, x);fprintf(wf, "%d\n", index);//结果输出到文件指针wf指向的out.dat中}fclose(fp);//关闭fclose(wf);
}
解题思路:
考查从数组里筛出一个元素,返回下标,这题应该是这篇最简单的了,真希望考试是这道题
答案:
1.自己做的:
#include <stdio.h>
#include <stdlib.h>
#define N 15
void NONO();
int fun( int *s, int x)
{
for(int i=0;s[i];i++)//这么简单就不多说了
if(s[i]==x)
return i;
return -1;
}
main()
{ int a[N]={ 29,13,5,22,10,9,3,18,22,25,14,15,2,7,27},i,x,index;printf("a数组中的数据 :\n");for(i=0; i<N; i++) printf("%4d",a[i]); printf("\n");printf("给x输入待查找的数 : "); scanf("%d",&x);index=fun( a, x );printf("index=%d\n",index);NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j, a[10], x, index;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {for(j = 0 ; j < 10 ; j++) {fscanf(fp, "%d ", &a[j]);}fscanf(fp, "%d", &x);index = fun(a, x);fprintf(wf, "%d\n", index);}fclose(fp);fclose(wf);
}
2.题库答案:
#include <stdio.h>
#include <stdlib.h>
#define N 15
void NONO();
int fun( int *s, int x)
{int i;for(i=0;i<N;i++){if(s[i]==x)return i;}
return -1;
}
main()
{ int a[N]={ 29,13,5,22,10,9,3,18,22,25,14,15,2,7,27},i,x,index;printf("a数组中的数据 :\n");for(i=0; i<N; i++) printf("%4d",a[i]); printf("\n");printf("给x输入待查找的数 : "); scanf("%d",&x);index=fun( a, x );printf("index=%d\n",index);NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, j, a[10], x, index;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {for(j = 0 ; j < 10 ; j++) {fscanf(fp, "%d ", &a[j]);}fscanf(fp, "%d", &x);index = fun(a, x);fprintf(wf, "%d\n", index);}fclose(fp);fclose(wf);
}
测试:
main函数:
in.dat:
out.dat:
39.判断形参n中的正整数是几位数(输入数据的位数不超过4位),并将结果通过函数值返回
请编写函数fun,其功能是:判断形参n中的正整数是几位数(输入数据的位数不超过4位),并将结果通过函数值返回。
例如:若输入的数据为123,则输出结果为:输入的数字是3位。
注意:部分源程序存在PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
PROG1.C:
#include <stdio.h>
void NONO();
int fun(int n)
{}
main()
{ int n, place ;do{printf("请输入一个4位以内的正整数: ");scanf("%d", &n);} while (n<0 || n>9999);//do-while循环限制了输入的n为[0,9999]范围内才会跳出循环place = fun(n);printf( "输入的数字是%d位\n", place );NONO();getchar();
}void NONO()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, n, place ;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for( i=0; i<10; i++ )//有10组测试数据{fscanf(fp, "%d ", &n);//从文件指针fp指向的文件in.dat获取nplace = fun(n);fprintf(wf, "%d\n", place);//结果输出到文件指针wf指向的文件out.dat中}fclose(fp) ;//关闭fclose(wf) ;
}
解题思路:
这题很简单,不多说了ヾ(•ω•`)o
答案:
1.自己做的:
#include <stdio.h>
void NONO();
int fun(int n)
{
int i=0;
while(n)
{
n/=10;
i++;
}
return i;
}
main()
{ int n, place ;do{printf("请输入一个4位以内的正整数: ");scanf("%d", &n);} while (n<0 || n>9999);place = fun(n);printf( "输入的数字是%d位\n", place );NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, n, place ;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for( i=0; i<10; i++ ){fscanf(fp, "%d ", &n);place = fun(n);fprintf(wf, "%d\n", place);}fclose(fp) ;fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
void NONO();
int fun(int n)
{int k=0;while(n!=0){n=n/10;k++;}return k;
}
main()
{ int n, place ;do{printf("请输入一个4位以内的正整数: ");scanf("%d", &n);} while (n<0 || n>9999);place = fun(n);printf( "输入的数字是%d位\n", place );NONO();getchar();
}void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *fp, *wf ;int i, n, place ;fp = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for( i=0; i<10; i++ ){fscanf(fp, "%d ", &n);place = fun(n);fprintf(wf, "%d\n", place);}fclose(fp) ;fclose(wf) ;
}
测试:
main函数:
in.dat:
out.dat:
40.除了字符串前导的*
号之外,将串中其它*号全部删除
假定输入的字符串中只包含字母和*
号。请编写函数fun,它的功能是:除了字符串前导的*
号之外,将串中其它*
号全部删除。在编写函数时,不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。
例如,字符串中的内容为:****A*BC*DEF*G******
,删除后,字符串中的内容应当是:****ABCDEFG
。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
void fun( char *a )
{/* 以下代码仅供参考 */int i=0,k;while(a[i]=='*') i++;//把前导*遍历完了k=i;while(a[i]!='\0') /* 以下程序段实现非*字符前移 */{}a[k]='\0';
}main()
{ char s[81];void NONO ();printf("Enter a string:\n");gets(s);fun( s );printf("The string after deleted:\n");puts(s);NONO();getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i ; char s[81] ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {//有10组测试数据fscanf(in, "%s", s) ;//从文件指针in指向的文件in.dat获取字符串sfun(s) ;fprintf(out, "%s\n", s) ; //结果输出到文件指针out指向的文件out.dat中}fclose(in) ;//关闭fclose(out) ;
}
解题思路:
总之我是用前移的方式,覆盖掉*号,我的方法我感觉很笨,具体的看代码吧
1.自己做的:(我觉得我这个应该有很大的进步空间换言之写的感觉有点烂)
#include <stdio.h>
void fun( char *a )
{/* 以下代码仅供参考 */int i=0,k;while(a[i]=='*') i++;k=i;while(a[i]!='\0') /* 以下程序段实现非*字符前移 */{if(a[i]=='*'){k=i;while(a[k+1]!='\0')//数组元素前移,覆盖掉*号{a[k]=a[k+1];k++;}a[k]='\0';//看题目有的字符串后面有*,依题意这些*是要去掉的,赋予字符串末尾为空字符的方式去掉末尾*i--;//这是为了处理连续*号的情况} i++;}a[k]='\0';
}main()
{ char s[81];void NONO ();printf("Enter a string:\n");gets(s);fun( s );printf("The string after deleted:\n");puts(s);NONO();getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i ; char s[81] ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {fscanf(in, "%s", s) ;fun(s) ;fprintf(out, "%s\n", s) ; }fclose(in) ;fclose(out) ;
}
2.题库答案:
#include <stdio.h>
void fun( char *a )//他这个好,这思路对比我的简直神了,太妙了
{/* 以下代码仅供参考 */int i=0,k;while(a[i]=='*') i++;k=i;while(a[i]!='\0') /* 以下程序段实现非*字符前移 */{if(a[i]!='*') a[k++]=a[i];//这里就是把字母筛出接在前导*号后i++;}a[k]='\0';//再以空字符结束字符串
}main()
{ char s[81];void NONO ();printf("Enter a string:\n");gets(s);fun( s );printf("The string after deleted:\n");puts(s);NONO();getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i ; char s[81] ;in = fopen("in.dat","r") ;out = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {fscanf(in, "%s", s) ;fun(s) ;fprintf(out, "%s\n", s) ; }fclose(in) ;fclose(out) ;
}
没话说,这段题库答案确实好,可以多看看这个思路
测试:
main函数:
in.dat:
out.dat: