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

前言:

  • 程序设计需要运行一遍,用.c文件是无法运行的,这时就要用.sln文件了,在考试系统提供的vs2010里调试,按ctrl+F5,也可以找到运行和保存按钮来执行在这里插入图片描述
  • 程序设计那考试系统只检测最终运行结果的对错,如果没有会是0分,当然那个运行结果是由考试系统提供的输入数据产生的,这里说下程序设计提供的文件,会较程序填空和程序修改多两个二进制文件
    in.dat:系统提供的测试数据
    out.dat:这个是你运行之后才会出现的文件了,这个文件的内容就是系统检测的答案了,

1.将ss所指字符串中所有下标为奇数位置上的字母转换成大写

请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。

例如,若输入"abc4EFG",则应输出"aBc4EFG"。

注意:部分源程序存在文件prog1.c中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

prog1.c:

#include <stdio.h>
#include <string.h>
void fun( char *ss )
{




}

void main( void )
{
   char tt[51];void NONO ();
   printf( "\nPlease enter an character string within 50 characters:\n" );
   gets( tt );
   printf( "\n\nAfter changing, the string\n  \"%s\"", tt );
   fun(tt) ;
   printf( "\nbecomes\n  \"%s\"", tt );
   NONO();//说一下,假如就是你平时想刷程序设计的题,但你又没有下载vs2010的环境,那么你可以把这句NONO()注释掉,NONO函数是系统评分的测试,你是用main函数的输入输出来判断自己是否对错的,但在考试可千万不要这么做
   getchar();
}

void NONO ()//这个函数就是考试系统进行测试,这个函数里所做的与main内容相同,只不过测试数据通过读取in.dat文件获取
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
   char tt[51], ch;
   FILE *rf, *wf ;
   int len, i=0 ;

   rf = fopen("in.dat","r") ;//r打开一个用于读取的文件,这里也就是让指针rf指向文件in.dat
   wf = fopen("out.dat","w") ;//w创建一个用于写入的空文件,如果之前已经创建过,那么会将之前的删除掉,重新创建,这里用意也就是如果你多次运行,最终也只会留下最后一次产生的out.dat文件,
   while(i < 10) {//会进行10次循环,也就是进行10次测试
     fgets( tt, 50, rf );//数组tt从文件指针rf指向的文件in.dat获取最多50个字符
     len = strlen(tt) - 1 ;//得出的len是最大下标
     ch = tt[len] ;
     if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;//给字符串结尾
     fun(tt);//执行fun函数
     fprintf( wf, "%s\n", tt );//结果输出到文件指针wf指向的out.dat中
     i++ ;
   }
   fclose(rf) ;//最后关闭两个文件指针
   fclose(wf) ;
}


解题思路:
除题干外的其他因素,我想我解释的应该很清楚了,那看题目要求

  • 题目说把字符串上下标为奇数的字母转化为大写字母,注意是下标啊,不要搞错了,还有只有字母才要转换,所以我们只要筛出字符串上下标为奇数且小写字母的元素即可,然后再将他们转换,那思路就很清晰了
  • 题目给的代码中并没有给出头文件#include<ctype.h>,那就不能用islower()toupper(),不然会方便很多
    islower(): 是判断小写字母
    toupper():把小写字母转化为大写字母

答案:
当然答案有很多种,看大家的思路了,我这一般只列两个:
1.自己做的:

#include <stdio.h>
#include <string.h>
void fun( char *ss )
{
int i=0;
for(i=0;ss[i];i++)//这里循环条件为ss[i]就是ss[i]!='\0'
{
if(i%2&&ss[i]>='a'&&ss[i]<='z')
ss[i]-=32;//小写字母和大写字母的ASCII码的差为32
}



}

void main( void )
{
   char tt[51];void NONO ();
   printf( "\nPlease enter an character string within 50 characters:\n" );
   gets( tt );
   printf( "\n\nAfter changing, the string\n  \"%s\"", tt );
   fun(tt) ;
   printf( "\nbecomes\n  \"%s\"", tt );
   NONO();
   getchar();
}

void NONO ()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
   char tt[51], ch;
   FILE *rf, *wf ;
   int len, i=0 ;

   rf = fopen("in.dat","r") ;
   wf = fopen("out.dat","w") ;
   while(i < 10) {
     fgets( tt, 50, rf );
     len = strlen(tt) - 1 ;
     ch = tt[len] ;
     if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;
     fun(tt);
     fprintf( wf, "%s\n", tt );
     i++ ;
   }
   fclose(rf) ;
   fclose(wf) ;
}


2.题库的答案:

#include <stdio.h>
#include <string.h>
void fun( char *ss )
{
 int i,n=0;
    char *p;
     p=ss;
    while(*p++!='\0')  //用指针p遍历字符串得字符串长度n,感觉应该也可以用strlen()吧,
     n++;
    for(i=1;i<n;i+=2)//i从1开始,每次自增加2,这样i一直都是奇数,也就不用在后面if中加判断if的条件了
       if(ss[i]>='a' && ss[i]<='z')   
           ss[i]=ss[i]-'a'+'A';
}

void main( void )
{
   char tt[51];void NONO ();
   printf( "\nPlease enter an character string within 50 characters:\n" );
   gets( tt );
   printf( "\n\nAfter changing, the string\n  \"%s\"", tt );
   fun(tt) ;
   printf( "\nbecomes\n  \"%s\"", tt );
   NONO();
   getchar();
}

void NONO ()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
   char tt[51], ch;
   FILE *rf, *wf ;
   int len, i=0 ;

   rf = fopen("in.dat","r") ;
   wf = fopen("out.dat","w") ;
   while(i < 10) {
     fgets( tt, 50, rf );
     len = strlen(tt) - 1 ;
     ch = tt[len] ;
     if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;
     fun(tt);
     fprintf( wf, "%s\n", tt );
     i++ ;
   }
   fclose(rf) ;
   fclose(wf) ;
}


3.看到题库的答案,那我的还可以优化下,结合双方优点:

#include <stdio.h>
#include <string.h>
void fun( char *ss )//短就是好
{
int i=0;
for(i=1;ss[i];i+=2)
{
if(ss[i]>='a'&&ss[i]<='z')
ss[i]-=32;
}



}

void main( void )
{
   char tt[51];void NONO ();
   printf( "\nPlease enter an character string within 50 characters:\n" );
   gets( tt );
   printf( "\n\nAfter changing, the string\n  \"%s\"", tt );
   fun(tt) ;
   printf( "\nbecomes\n  \"%s\"", tt );
   NONO();
   getchar();
}

void NONO ()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
   char tt[51], ch;
   FILE *rf, *wf ;
   int len, i=0 ;

   rf = fopen("in.dat","r") ;
   wf = fopen("out.dat","w") ;
   while(i < 10) {
     fgets( tt, 50, rf );
     len = strlen(tt) - 1 ;
     ch = tt[len] ;
     if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;
     fun(tt);
     fprintf( wf, "%s\n", tt );
     i++ ;
   }
   fclose(rf) ;
   fclose(wf) ;
}

测试:
在这里插入图片描述

2.若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后

请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。

例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。

注意:部分源程序存在文件prog1.c中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

prog1.c:

#include <stdio.h>
#define    N    80
void  fun(int  *w, int  p, int  n)
{



}
main()
{  int  a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
   int  i,p,n=15;void NONO ();
   printf("The original data:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\nEnter  p:  ");scanf("%d",&p);
   fun(a,p,n);
   printf("\nThe data after moving:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\n");
   NONO();
   getchar();
}
void NONO ()//考试时系统进行评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf,*wf ; int a[N], i, j, p, n ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 5 ; i++) {//循环5次,也就是进行5次测试
    fscanf(rf, "%d %d", &n, &p) ;//从文件指针rf指向的文件in.dat获取元素个数n和p
    for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;//获取数组元素
    fun(a, p, n) ;//执行fun函数
    for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;//结果输出到文件指针wf指向的文件out.dat中,最后接个换行符与下一次测试的结果隔开
  }
  fclose(rf) ; fclose(wf) ;//关闭文件指针
}


解题思路:

  • 看到这个fscanf(),想起之前见过的stdout,顺带讲一下:
    fscanf(stdout,"%d",&n)是基本与scanf("%d",&n)是一样的
    stdout 是一个标准输出流,它是 C 语言标准库中定义的一个文件指针,用于表示标准输出设备。
    在大多数操作系统中,标准输出设备通常是指显示器或终端窗口。通过将数据输出到 stdout,可以将结果显示在屏幕上

  • 我的思路是建一个新的数组把下标0到p的元素存起来,把下标为p+1到n-1的每个元素前移p+1个位置覆盖掉下标0到p的元素,再用新数组的元素覆盖原数组后p+1个元素,

  • 注意,题目说了要移动的元素是含下标p的

答案:
1.自己想的:

#include <stdio.h>
#define    N    80
void  fun(int  *w, int  p, int  n)
{
int a[n],i=0;
for(i=0;i<=p;i++)//把下标0到p的元素存起来
a[i]=w[i];
for(i=0;i<n-p-1;i++)//这里的循环条件你要看着难受,i+p+1<n,是不是看着舒服多了
w[i]=w[i+p+1];//把下标为p+1到n-1的每个元素前移p+1个位置覆盖掉下标0到p的元素
for(int j=0;j<=p;j++)//用新数组的元素覆盖原数组后p+1个元素
w[i+j]=a[j];
}
main()
{  int  a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
   int  i,p,n=15;void NONO ();
   printf("The original data:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\nEnter  p:  ");scanf("%d",&p);
   fun(a,p,n);
   printf("\nThe data after moving:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\n");
   NONO();
   getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf,*wf ; int a[N], i, j, p, n ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 5 ; i++) {
    fscanf(rf, "%d %d", &n, &p) ;
    for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
    fun(a, p, n) ;
    for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;
  }
  fclose(rf) ; fclose(wf) ;
}


2.题库答案:

#include <stdio.h>
#define    N    80
void  fun(int  *w, int  p, int  n)
{int x,j,ch;
  for(x=0;x<=p;x++)
    {ch=w[0];//在内循环中后面元素全部前移一个位置,也就是说w[0]元素是一直在更新的
     for(j=1;j<n;j++)  
       {
	 w[j-1]=w[j];
	}
     w[n-1]=ch;  //内循环中后面元素的前移也让一开始赋到数组末尾前移,最后移到n-x-1下标
    }
}
main()
{  int  a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
   int  i,p,n=15;void NONO ();
   printf("The original data:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\nEnter  p:  ");scanf("%d",&p);
   fun(a,p,n);
   printf("\nThe data after moving:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\n");
   NONO();
   getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf,*wf ; int a[N], i, j, p, n ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 5 ; i++) {
    fscanf(rf, "%d %d", &n, &p) ;
    for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
    fun(a, p, n) ;
    for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;
  }
  fclose(rf) ; fclose(wf) ;
}


测试:
在这里插入图片描述

3.计算并输出给定整数n的所有因子(不包括1与n自身)之和

请编写一个函数fun,它的功能是:计算并输出给定整数n的所有因子(不包括1与n自身)之和。规定n的值不大于1000。

例如,在主函数中从键盘给n输入的值为856,则输出为: sum=763。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句

PROG1.C:

#include <stdio.h>
#pragma warning (disable:4996)
int fun(int  n)
{


}
main()
{ int  n,sum;
  void NONO( );
  printf("Input n:  ");  scanf("%d",&n);  getchar();
  sum=fun(n);
  printf("sum=%d\n",sum);
  NONO();
  getchar();
}
void NONO()//系统进行评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ; int i, n, sum ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {//10次循环,也就是要进行10次测试
    fscanf(rf, "%d", &n) ;//从文件指针rf指向的文件in.dat获取到整数n
    sum = fun(n) ;
    fprintf(wf, "%d=%d\n", n, sum) ;//结果输出到文件指针wf指向的文件out.dat中
  }
  fclose(rf) ; fclose(wf) ;//关闭文件指针
}


解题思路:

  • 这题的头文件有些限制发挥,这题做法就是整一个循环,题目说除开了1和自身,那就是2到n-1,在这个区间筛出n的因子,然后累加,
    说一下理想解法,需要加个头文件#include<math.h>:
    思路就是对整数n取平方根,因子都是成对的,小于n的平方根的是因子对中小的因子,大于n的平方根的是因子对中大的因子,取平方根后,我们只需对2到n的平方根的范围筛出因子就可以了,每次都可以直接加上一个因子对
#include <stdio.h>
#include<math.h>//需要加个头文件,这里只是展示下,考试时可不要在fun函数外的地方做改动,以免出什么差错
#pragma warning (disable:4996)
int fun(int  n)
{
    int sum=0;
for(int i=2;i<=sqrt(n);i++)//加的头文件就是为了sqrt()这个平方根函数,
if(n%i==0)
sum=sum+i+n/i;//每次直接加上一个因子对
return sum;
}
main()
{ int  n,sum;
  void NONO( );
  printf("Input n:  ");  scanf("%d",&n);  getchar();
  sum=fun(n);
  printf("sum=%d\n",sum);
  NONO();
  getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ; int i, n, sum ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d", &n) ;
    sum = fun(n) ;
    fprintf(wf, "%d=%d\n", n, sum) ;
  }
  fclose(rf) ; fclose(wf) ;
}


答案:

1.自己想的:

#include <stdio.h>
#pragma warning (disable:4996)
int fun(int  n)
{
int sum=0;
for(int i=2;i<n;i++)
if(n%i==0)
sum+=i;
return sum;
}
main()
{ int  n,sum;
  void NONO( );
  printf("Input n:  ");  scanf("%d",&n);  getchar();
  sum=fun(n);
  printf("sum=%d\n",sum);
  NONO();
  getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ; int i, n, sum ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d", &n) ;
    sum = fun(n) ;
    fprintf(wf, "%d=%d\n", n, sum) ;
  }
  fclose(rf) ; fclose(wf) ;
}


2.题库答案:

#include <stdio.h>
#pragma warning (disable:4996)
int fun(int  n)
{
 int i,s=0;
 if(n<1000)
 {for (i=2;i<n;i++)
    if (n%i==0) s=s+i;}
  return (s);
}
main()
{ int  n,sum;
  void NONO( );
  printf("Input n:  ");  scanf("%d",&n);  getchar();
  sum=fun(n);
  printf("sum=%d\n",sum);
  NONO();
  getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ; int i, n, sum ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d", &n) ;
    sum = fun(n) ;
    fprintf(wf, "%d=%d\n", n, sum) ;
  }
  fclose(rf) ; fclose(wf) ;
}


呃,没有加n<1000的限制,不过这个题库还是算我对了

测试:
在这里插入图片描述

4.使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)

请编一个函数fun,函数的功能是使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)。

例如: 实型数为1234.567,则函数返回1234.570000;

实型数为1234.564,则函数返回1234.560000。

注意:部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

PROG1.C:

#include <stdio.h>
float fun ( float  h )
{



}

main( )
{   float  a;void NONO ();
    printf ("Enter  a:  "); scanf ( "%f", &a );
    printf ( "The original data is :   " );
    printf ( "%f \n\n", a );
    printf ( "The result :  %f\n", fun ( a ) );
    NONO( );
  getchar();
}

void NONO ()//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
    输出数据,关闭文件。 */
  int i ;
  float a ;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 20 ; i++) {//循环20次,也就是有20个数据,20次测试
    fscanf(rf, "%f", &a) ;//从文件指针rf指向的文件in.dat获取浮点数a
    fprintf(wf, "%f\n", fun(a)) ;//最后结果输出到文件指针指向的文件out.dat
  }
  fclose(rf) ;//关闭文件指针
  fclose(wf) ;
}


解题思路:
我的思路是把设一个int x等于浮点数a1000,再判断x的个位是否大于5,若大于5则x/10+1,反之x/10,也就是四舍五入了,然后x1.0/100再赋回给a,

答案:

1.自己想的:

#include <stdio.h>
float fun ( float  h )
{
int x=h*1000;
if(x%10<5)
x=x/10;
else
x=x/10+1;
h=x*1.0/100;//x*1.0是为了保证右边表达式最后结果是浮点数能够保留小数
return h;
}

main( )
{   float  a;void NONO ();
    printf ("Enter  a:  "); scanf ( "%f", &a );
    printf ( "The original data is :   " );
    printf ( "%f \n\n", a );
    printf ( "The result :  %f\n", fun ( a ) );
    NONO( );
  getchar();
}

void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
    输出数据,关闭文件。 */
  int i ;
  float a ;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 20 ; i++) {
    fscanf(rf, "%f", &a) ;
    fprintf(wf, "%f\n", fun(a)) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}


2.题库答案:

#include <stdio.h>
float fun ( float  h )
{
return (int)(h*100+0.5)/100.0;//他这思路比我快好多,加0.5就是对第三位进行四舍五入,他int类型只对分子做了处理,抹掉了后面的小数

}

main( )
{   float  a;void NONO ();
    printf ("Enter  a:  "); scanf ( "%f", &a );
    printf ( "The original data is :   " );
    printf ( "%f \n\n", a );
    printf ( "The result :  %f\n", fun ( a ) );
    NONO( );
  getchar();
}

void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
    输出数据,关闭文件。 */
  int i ;
  float a ;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 20 ; i++) {
    fscanf(rf, "%f", &a) ;
    fprintf(wf, "%f\n", fun(a)) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}


测试:
斯,一测试才发现,这出的题的代码有些问题,也有可能是这题太旧了,总之现在这个c11版本的,float会因为精度的问题,你输入1234.567,实际上编译器得到的数会是1234.56702,
在这里插入图片描述
用double就正常了
在这里插入图片描述

5.计算并输出下列多项式的值

请编写函数fun,其功能是:计算并输出下列多项式的值:
请添加图片描述
例如,在主函数中从键盘给n输入15,则输出为:s=2.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("Input n:  ");  scanf("%d",&n); getchar();
   s=fun(n);
   printf("s=%f\n",s);
   NONO();
   getchar();
}
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) ;//关闭
}


解题思路:
直接看答案吧,这种求解多项式的,都挺简单的,就是把给的公式的规律转化为循环结构

答案:

1.自己做的

#include <stdio.h>
#pragma warning (disable:4996)
double  fun(int  n)
{
double sum=1,x=1;
for(int i=1;i<=n;i++)//题目公式中通过分母可看出后面分式有n项
{
x=x*i;//阶乘
sum+=1.0/x;//累计得多项式的和
}
return sum;

}
main()
{  int  n;     double  s;
   void NONO( );
   printf("Input n:  ");  scanf("%d",&n); getchar();
   s=fun(n);
   printf("s=%f\n",s);
   NONO();
   getchar();
}
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)
{
 double m=1.0,p=1.0;
 int i;
 for(i=1;i<=n;i++)
 {  p=p*i;
    m=m+1.0/p;
 }
 return (m);
}
main()
{  int  n;     double  s;
   void NONO( );
   printf("Input n:  ");  scanf("%d",&n); getchar();
   s=fun(n);
   printf("s=%f\n",s);
   NONO();
   getchar();
}
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) ;
}


基本一样了,

测试:
在这里插入图片描述

6.统计出x所指数组中能被e整除的元素个数,通过函数值返回主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中

请编写函数fun,其功能是:统计出x所指数组中能被e整除的元素个数,通过函数值返回

主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中。

例如:当数组x内容为1, 7,8,6, 10, 15, 11, 13, 29,31,整数e内容为3时,

输出结果应该是: n=2, sum=110

注意:部分源程序存在文件PROG1. C中。

请勿更改主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

PROG1. C:

#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{



}
main()
{  
	void NONO();
	int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
	n=fun(x, e, &sum);
	printf("n=%d,sum=%d\n", n, sum);
	NONO();
}



void NONO()//系统用于评测的函数
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
    int i, j, x[10], n, e, sum;
    FILE *rf, *wf ;

    rf = fopen("in.dat","r") ;
    wf = fopen("out.dat","w") ;
    for(i=0; i<5; i++) {//有5组数据
        for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]);  fscanf(rf, "%d", &e);//从文件指针rf指向的文件in.dat获取数组元素,和e
        n = fun( x, e, &sum );
        fprintf(wf, "%d, %d\n", n, sum);//结果输出到文件指针wf指向的文件out.dat
    }
   fclose(rf) ;
   fclose(wf) ;
}


解题思路:
用一个for循环遍历数组筛选,不过注意sum在主函数里没有初始化,那我们要在fun函数里初始化为0,这算是个坑

答案:

1.自己做的:

#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{
int n=0;
*sum=0;
for(int i=0;i<N;i++)
{
if(x[i]%e==0)
n++;
else
*sum+=x[i];
}
return n;
}
main()
{  
	void NONO();
	int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
	n=fun(x, e, &sum);
	printf("n=%d,sum=%d\n", n, sum);
	NONO();
}



void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
    int i, j, x[10], n, e, sum;
    FILE *rf, *wf ;

    rf = fopen("in.dat","r") ;
    wf = fopen("out.dat","w") ;
    for(i=0; i<5; i++) {
        for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]);  fscanf(rf, "%d", &e);
        n = fun( x, e, &sum );
        fprintf(wf, "%d, %d\n", n, sum);
    }
   fclose(rf) ;
   fclose(wf) ;
}


题库答案:

#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{int i,n=0;
 *sum=0;
 for(i=0;i<N;i++)
	 if(x[i]%e==0) n++;
	 else *sum+=x[i];
 return n;

}
main()
{  
	void NONO();
	int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
	n=fun(x, e, &sum);
	printf("n=%d,sum=%d\n", n, sum);
	NONO();
}



void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
    int i, j, x[10], n, e, sum;
    FILE *rf, *wf ;

    rf = fopen("in.dat","r") ;
    wf = fopen("out.dat","w") ;
    for(i=0; i<5; i++) {
        for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]);  fscanf(rf, "%d", &e);
        n = fun( x, e, &sum );
        fprintf(wf, "%d, %d\n", n, sum);
    }
   fclose(rf) ;
   fclose(wf) ;
}


基本一样*____*

测试:
在这里插入图片描述

7.在形参指针所指的4个整数中找出最大值和最小值,最大的放在a中,最小的放在d中

请编写函数fun:在形参指针所指的4个整数中找出最大值和最小值,

最大的放在a中,最小的放在d中。

注意:部分源程序存在PROG1. C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

PROG1. C:

#include   <stdio.h>
void NONO();
void  fun(int  *a, int  *b, int  *c, int  *d)
{



}
main()
{  int  a, b, c, d;
   printf("请输入4个整数:    ");  scanf("%d%d%d%d", &a,&b,&c,&d);
   printf("输入数据:    %d,%d,%d,%d\n", a, b, c, d);
   fun(&a,&b,&c,&d); 
   printf("最大值:%d,最小值:%d\n", a, d);
   NONO();
   getchar();
}

void NONO()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, a, b, c, d ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<5; i++ )//有5组测试数据
  {
     fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);//从文件指针fp指向的文件in.dat获取一组测试数据
     fun(&a,&b,&c,&d); //测试你的代码
     fprintf(wf, "a=%d,d=%d\n", a, d);//结果输出到文件指针指向的文件out.dat存放
  }
  fclose(fp) ;//关闭
  fclose(wf) ;
}


解题思路:
比大小,思路很多,我想的是用三目运算法,要注意先用两个中继变量得四个变量中的最大值和最小值,再去赋给a,和d,以免出错

答案:

1.自己做的:

#include   <stdio.h>
void NONO();
void  fun(int  *a, int  *b, int  *c, int  *d)
{
int x=*a>*b?(*a>*c?(*a>*d?*a:*d):(*c>*d?*c:*d)):(*b>*c?(*b>*d?*b:*d):(*c>*d?*c:*d));//我个人认为我这括号大大的提高了可读性(‾◡◝)
int y=*d>*a?(*a>*c?(*c>*b?*b:*c):(*a>*b?*b:*a)):(*d>*c?(*c>*b?*b:*c):(*d>*b?*b:*d));
*a=x;
*d=y;
}
main()
{  int  a, b, c, d;
   printf("请输入4个整数:    ");  scanf("%d%d%d%d", &a,&b,&c,&d);
   printf("输入数据:    %d,%d,%d,%d\n", a, b, c, d);
   fun(&a,&b,&c,&d); 
   printf("最大值:%d,最小值:%d\n", a, d);
   NONO();
   getchar();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, a, b, c, d ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<5; i++ )
  {
     fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
     fun(&a,&b,&c,&d); 
     fprintf(wf, "a=%d,d=%d\n", a, d);
  }
  fclose(fp) ;
  fclose(wf) ;
}


2.题库答案:

#include   <stdio.h>
void NONO();
void  fun(int  *a, int  *b, int  *c, int  *d)
{
	int max,min;
	max=*a;
	min=*d;
	if(*b>max){max=*b;}
	if(*c>max){max=*c;}
	if(*d>max){max=*d;}
	if(*a<min){min=*a;}
	if(*b<min){min=*b;}
	if(*c<min){min=*c;}
	*a=max;
	*d=min;
}
main()
{  int  a, b, c, d;
   printf("请输入4个整数:    ");  scanf("%d%d%d%d", &a,&b,&c,&d);
   printf("输入数据:    %d,%d,%d,%d\n", a, b, c, d);
   fun(&a,&b,&c,&d); 
   printf("最大值:%d,最小值:%d\n", a, d);
   NONO();
   getchar();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, a, b, c, d ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<5; i++ )
  {
     fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
     fun(&a,&b,&c,&d); 
     fprintf(wf, "a=%d,d=%d\n", a, d);
  }
  fclose(fp) ;
  fclose(wf) ;
}


我觉得我的更好看点(〃 ̄︶ ̄)人( ̄︶ ̄〃)

测试:
在这里插入图片描述

8.统计各年龄段的人数

请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,其余依此类推,把100岁(含100)以上年龄的人数都放在d[10]中。结果在主函数中输出。

注意:部分源程序存在文件prog1.c中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

prog1.c:

#include <stdio.h>
#define   N   50
#define   M   11
void  fun( int  *a,  int  *b)
{



}
double  rnd()//这是一个伪随机数生成函数
{  static  t=29,c=217,m=1024,r=0;//静态变量,保留上一次生成的伪随机数和常量值
   r=(r*t+c)%m;  return((double)r/m);//使用线性同余法生成伪随机数,返回生成的伪随机数除以m得到的结果,即介于0到1之间的浮点数
}
main()
{  int  age[N], i, d[M];void NONO (int d[M]);
   for(i=0; i<N;i++)age[i]=(int)(115*rnd());
   printf("The original data :\n");
   for(i=0;i<N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]);//这里用了个三目运算法使其每10个数一行,
   printf("\n\n");
   fun( age, d);
   for(i=0;i<10;i++)printf("%4d---%4d  :  %4d\n",i*10,i*10+9,d[i]);//i*10和i*10+9是为了描述每个年龄段,在输出时会输出0--9,10--19.……
   printf("  Over  100  :  %4d\n",d[10]);
   NONO(d);
  getchar();
}
void NONO(int d[M])//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *wf ; int i ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) fprintf(wf, "%4d---%4d  :  %4d\n", i*10, i*10+9, d[i]) ;//这次将main函数里得出的结果写入到文件out.dat中,这题没有in.dat
  fprintf(wf, "  Over  100  :  %4d\n", d[10]) ;
  fclose(wf) ;
}


解题思路:
说下题目给的代码中比较新颖的点,

printf((i+1)%10==0?"%4d\n":"%4d",age[i])
//因为下标是从0开始的,所以是i+1,注意双引号内的才是会输出的,当i+1为10的倍数时,(i+1)%10==0成立,则输出的是"%4d\n",否则是"%4d",

我见的代码还不多,对于这种在printf里用三目运算法还是很稀奇的o((>ω< ))o

说下线性同余法:
线性同余法是一种简单的伪随机数生成方法,
线性同余法的递推公式如下:

Xn+1 = (a * Xn + c) % m

其中,Xn是当前的伪随机数,Xn+1是下一个伪随机数,a,c,m是预定义的常量。
具体步骤:
1.初始化X0,即初始种子
2.使用递推公式计算X1,X2,X3……,直到得到所需数量的伪随机数

在应用中,常常将递推公式中的常量a,c,m设置为合适的值,以获得满足要求的伪随机数序列,常用的选择是:
a是一个较大的质数
c为一个较小的非负整数
m为一个较大的整数
最后将Xn+1除以m是为了将生成的随机数映射到一个介于0到1之间的范围,线性同余法生成的伪随机数序列Xn通常是一个整数。通过将Xn除以m,可以得到一个小于1的浮点数。m通常是一个大于Xn的正整数,所以结果会小于1
题目代码中随机数范围是0到115,从age[i]=(int)(115*rnd())可看出,因为rnd()返回值是0到1的,

回到题目:
根据题意可以看出,年龄除以10得出的就是数组d中的下标,那就只需要做个循环,遍历数组age,d[a[i]/10]++就好了
不过要注意,数组d在main函数是没有初始化的,我们需要在fun函数里初始化为0一下,还有年龄是有可能为110的,这时候a[i]/10得出的是11了,不过我们应该存入d[10]才对,所以这里应该,对a[i]>=110的情况用if做个特殊处理

答案:

1.自己想的

#include <stdio.h>
#define   N   50
#define   M   11
void  fun( int  *a,  int  *b)
{
for(int i=0;i<M;i++)//初始化数组b
b[i]=0;
for(int i=0;i<N;i++)
{
if(a[i]>=110)//处理特殊情况
b[10]++;
else
b[a[i]/10]++;
}
}
double  rnd()
{  static  t=29,c=217,m=1024,r=0;
   r=(r*t+c)%m;  return((double)r/m);
}
main()
{  int  age[N], i, d[M];void NONO (int d[M]);
   for(i=0; i<N;i++)age[i]=(int)(115*rnd());
   printf("The original data :\n");
   for(i=0;i<N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]);
   printf("\n\n");
   fun( age, d);
   for(i=0;i<10;i++)printf("%4d---%4d  :  %4d\n",i*10,i*10+9,d[i]);
   printf("  Over  100  :  %4d\n",d[10]);
   NONO(d);
  getchar();
}
void NONO(int d[M])
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *wf ; int i ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) fprintf(wf, "%4d---%4d  :  %4d\n", i*10, i*10+9, d[i]) ;
  fprintf(wf, "  Over  100  :  %4d\n", d[10]) ;
  fclose(wf) ;
}


2.题库答案:

#include <stdio.h>
#define   N   50
#define   M   11
void  fun( int  *a,  int  *b)
{int i;
 for(i=0;i<M;i++)  
   b[i]=0;
 for(i=0;i<N;i++)  
   b[*(a+i)/10>10?10:*(a+i)/10]++;//他这里用三目运算法处理特殊情况,确实更好看些(*^▽^*)
}
double  rnd()
{  static  t=29,c=217,m=1024,r=0;
   r=(r*t+c)%m;  return((double)r/m);
}
main()
{  int  age[N], i, d[M];void NONO (int d[M]);
   for(i=0; i<N;i++)age[i]=(int)(115*rnd());
   printf("The original data :\n");
   for(i=0;i<N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]);
   printf("\n\n");
   fun( age, d);
   for(i=0;i<10;i++)printf("%4d---%4d  :  %4d\n",i*10,i*10+9,d[i]);
   printf("  Over  100  :  %4d\n",d[10]);
   NONO(d);
  getchar();
}
void NONO(int d[M])
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *wf ; int i ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) fprintf(wf, "%4d---%4d  :  %4d\n", i*10, i*10+9, d[i]) ;
  fprintf(wf, "  Over  100  :  %4d\n", d[10]) ;
  fclose(wf) ;
}


测试:
这个在线编译是我用过的最好用的了,用这个的话你可以把in.dat移到项目中,NONO函数也可以执行了

main函数的输出:
在这里插入图片描述

out.dat里的样子:
在这里插入图片描述

9.判断t所指字符串中的字母是否由连续递增字母序列组成

请编写函数fun,其功能是:判断t所指字符串中的字母是否由连续递增字母序列组成

(字符串长度大于等于2)。

例如:字符串: uvwxyz满足要求;

而字符串: uvxwyz不满足要求。

注意:部分源程序存在PROG1. C中,请勿改动主函数main和其他函数中的任何内容,

仅在函数fun指定的部位填入所编写的若干语句。

PROG1. C:

#include   <stdio.h>
#include  <string.h>
void NONO();
int  fun( char  *t )
{



}

main()
{  char  s[26];
   printf("请输入一个字母组成的字符串 :  "); gets(s);
   if( fun(s) )  printf("%s 是由连续字母组成的字符串.\n", s );
   else   printf("%s 不是由连续字母组成的字符串!\n", s );
   NONO();
   getchar();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i;
  char s[26], *p;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {//有10组测试数据
    fgets(s, 26, fp);//从文件指针指向的文件in.dat获取数组s
	p=strchr(s,'\n');//strchr函数是对字符串中的单个字符进行查找,返回该字符的地址
	if(p) *p=0;//指针p如果不为0,那么就在上一句中获取到了地址,那么此时指针p指向'\n',这里是将字符串中的换行符替换为字符串结束符'\0',
    if (fun(s)) fprintf(wf, "%s\n", s+2);//这里看得出检测方式是如果是连续字母组成的字符串,则从s[2]开始输出
	else  fprintf(wf, "%s\n", strrev(s));//strrev()是将字符串倒序,如果不是连续字母组成的,则输出倒序字符串
  }
  fclose(fp) ;//关闭
  fclose(wf) ;
}


解题思路:

先说下题目一些稀奇的点:

  1. 首先最让人难绷的是strrev()函数,strrev()函数用于字符串逆序操作,但这个函数不是标准C库提供的函数,要用的话得自己实现它或使用第三方库中提供,可是在网上搜的话,大部分教程都会说该函数头文件是#include<string.h>,都没提strrev()不是标准C库函数,害得我反复试了几遍,我有些好奇这题在考试中能不能运行成功,现在计算机二级的环境都是vs2010,也许vs2010中函数库有strrev()函数,不然总不可能运行失败吧,

函数原型: char *strrev(char *str);

功 能: 将字符串中的字符全部颠倒顺序,重新排序

参 数: char *str 为要进行倒序的字符串

返回值: 返回指向颠倒顺序后的字符串指针

因为我在测试的时候strrev()函数是无法识别的,我干脆自己定义了一个,在测试的时候加上,当然大伙可不要在答案加上自己定义的函数,我在这里列出来:

char* strrev(char* str) {
    int len = strlen(str);
    int i, j;
    char temp;
    
    for (i = 0, j = len - 1; i < j; i++, j--) {
        temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
    return str;
}
  1. strchr()函数:用于查找字符串中的一个字符,并返回该字符在字符串中第一次出现的位置,头文件是#include<string.h>

函数原型:char *strchr(const char *str, char c)

功能: 查找字符串中第一个出现的指定字符的位置

参数: char *str 为要查找的目标字符串,char c为要查找的字符;

返回值: 成功 返回字符第一次出现的位置;失败 返回NULL;

好了,回到题目,这题还是很简单的,我们只需写一个循环遍历字符串,循环条件为s[i+1]!='\0',循环内设一个if判断t[i+1]-t[i]!=1,如果成立,不是连续字母组成的,返回0,反之,返回1

答案:

1.自己做的:

#include   <stdio.h>
#include  <string.h>
void NONO();
int  fun( char  *t )
{
for(int i=0;t[i+1];i++)
{
  if(t[i+1]-t[i]!=1)
   return 0;
}
return 1;

}

main()
{  char  s[26];
   printf("请输入一个字母组成的字符串 :  "); gets(s);
   if( fun(s) )  printf("%s 是由连续字母组成的字符串.\n", s );
   else   printf("%s 不是由连续字母组成的字符串!\n", s );
   NONO();
   getchar();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i;
  char s[26], *p;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fgets(s, 26, fp);
	p=strchr(s,'\n');
	if(p) *p=0;
    if (fun(s)) fprintf(wf, "%s\n", s+2);
	else  fprintf(wf, "%s\n", strrev(s));
  }
  fclose(fp) ;
  fclose(wf) ;
}


2.题库答案:

#include   <stdio.h>
#include  <string.h>
void NONO();
int  fun( char  *t )
{
	int k=0,i=0;
	while(t[i+1]){
	if(t[i+1]==t[i]+1)
	{
		k++;
		i++;
	}else{
		k=0;
		break;
	}
	}
	return k;
}

main()
{  char  s[26];
   printf("请输入一个字母组成的字符串 :  "); gets(s);
   if( fun(s) )  printf("%s 是由连续字母组成的字符串.\n", s );
   else   printf("%s 不是由连续字母组成的字符串!\n", s );
   NONO();
   getchar();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i;
  char s[26], *p;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fgets(s, 26, fp);
	p=strchr(s,'\n');
	if(p) *p=0;
    if (fun(s)) fprintf(wf, "%s\n", s+2);
	else  fprintf(wf, "%s\n", strrev(s));
  }
  fclose(fp) ;
  fclose(wf) ;
}


看起来还是我的更好些,简洁明了

测试:

main函数的输出:
在这里插入图片描述

in.dat(10组测试数据):
在这里插入图片描述
难绷,又发现了个编译器上差别的问题,在从二进制文件识别换行符时,出了些问题,
我下了个断点:
在这里插入图片描述
可以看到这个换行符从\n被识别成了\r\n,然后在后面指针p指向了s[15]的\n,
在这里插入图片描述
把s[15]替换成了空,保留了\r,这个\r导致后面被识别为不是连续字母组成的字符串

在这里插入图片描述
导致了fun(s)返回0,变成错的了

解决办法
寻找\n改为寻找\r的地址

p=strchr(s,'\r');
	if(p) *p=0;

这个换行符的字符好像与电脑系统也有关,在 Windows 系统中,默认的换行符是回车符(\r)后跟换行符(\n),即 \r\n。在类似于 Unix/Linux 的环境中,通常使用换行符(\n)作为换行的标识符,
在这里插入图片描述
题外话:
wk,这题问题真多,难受,写这么多,都想单开一篇文讲了╰(‵□′)╯,以前都不知道为什么用gets不安全,现在终于明白了

10.将s所指字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中

函数fun的功能是:将s所指字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为"ABCDEFG12345",其中字符A的ASCII码值为奇数、…、字符1的ASCII码值也为奇数、…都应当删除,其它依次类推。最后t所指的数组中的内容应是:“BDF24”。

注意:部分源程序存在文件prog1.c中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

prog1.c:

#include <stdio.h>
#include <string.h>

void  fun(char  *s, char  t[])
{



}

main()
{
  char   s[100], t[100];void NONO ();
  printf("\nPlease enter string S:"); scanf("%s", s);
  fun(s, t);
  printf("\nThe result is: %s\n", t);
  NONO();
  getchar();
}

void NONO ()//系统用于评测的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  char s[100], t[100] ;
  FILE *rf, *wf ;
  int i ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {//有10组测试数据
    fscanf(rf, "%s", s) ;//从文件指针rf指向的文件获取数组s
    fun(s, t) ;
    fprintf(wf, "%s\n", t) ;//结果输出到文件指针指向的文件out.dat
  }
  fclose(rf) ;//关闭
  fclose(wf) ;
}


解题思路:
这次没有什么花里胡哨的东西了

这题说要删除ASCII值为奇数的,那我们直接筛出ASCII值为偶数的字符存入数组t就好了,

答案:

#include <stdio.h>
#include <string.h>

void  fun(char  *s, char  t[])
{
int count=0;
for(int i=0;s[i];i++)
{
 if((s[i]-'0')%2==0)//好像不减这个字符0直接取余也可以
 t[count++]=s[i];
}
t[count]='\0';//要注意一定要记得字符串结尾加个'\0'

}

main()
{
  char   s[100], t[100];void NONO ();
  printf("\nPlease enter string S:"); scanf("%s", s);
  fun(s, t);
  printf("\nThe result is: %s\n", t);
  NONO();
  getchar();
}

void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  char s[100], t[100] ;
  FILE *rf, *wf ;
  int i ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%s", s) ;
    fun(s, t) ;
    fprintf(wf, "%s\n", t) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}


2.题库答案:

#include <stdio.h>
#include <string.h>

void  fun(char  *s, char  t[])
{
  int i,slenth,n=0;
    slenth=strlen(s);  
   for(i=0;i<slenth;i++)
       if(s[i]%2==0)//直接除的
        t[n++]=s[i];
    t[n]='\0';
}

main()
{
  char   s[100], t[100];void NONO ();
  printf("\nPlease enter string S:"); scanf("%s", s);
  fun(s, t);
  printf("\nThe result is: %s\n", t);
  NONO();
  getchar();
}

void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  char s[100], t[100] ;
  FILE *rf, *wf ;
  int i ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%s", s) ;
    fun(s, t) ;
    fprintf(wf, "%s\n", t) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}


差不多。只不过题库用了strlen()函数得出了字符串长度

测试:
main函数:
在这里插入图片描述

in.dat:
在这里插入图片描述

out.dat:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值