计算机二级C语言的注意事项及相应真题-4-程序设计

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中获取数组s
    h=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;//设一指针c
 double max;
 c=h->next;//让c指向头节点h的下一节点
 max=c->s; //把c节点的s赋给max
 while (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中获取n
    s = 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中获取字符数组s
    p=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码就是48
	r=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中获取字符串s
    fun(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复制给字符串str
           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);

}


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;
			}else
				continue;//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获取x
    index = 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获取n
     place = 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获取字符串s
    fun(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:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值