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

news2024/11/19 13:38:46

目录

    • 前言:
    • 1.将ss所指字符串中所有下标为奇数位置上的字母转换成大写
    • 2.若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后
    • 3.计算并输出给定整数n的所有因子(不包括1与n自身)之和
    • 4.使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)
    • 5.计算并输出下列多项式的值
    • 6.统计出x所指数组中能被e整除的元素个数,通过函数值返回主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中
    • 7.在形参指针所指的4个整数中找出最大值和最小值,最大的放在a中,最小的放在d中
    • 8.统计各年龄段的人数
    • 9.判断t所指字符串中的字母是否由连续递增字母序列组成
    • 10.将s所指字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中

前言:

  • 程序设计需要运行一遍,用.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:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1475701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习29-进程间通信

1.进程间的通信: 1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字 1.管道: 1.无名管道 无名管道只能用于具有亲缘关系的进程间通信 pipe int pipe(int pipefd[2]); 功能: …

uniapp基于android的旅游服务微信 python+nodejs微信小程序_9wv9e

本Android的旅游服务APP采用Java语言来进行开发&#xff0c;从角色上分为用户和管理员两部分&#xff0c;用户功能主要是在前台&#xff0c;前台部分主要实现了用户注册登录&#xff0c;首页&#xff0c;广场&#xff0c;旅游景点&#xff0c;酒店信息&#xff0c;酒店预订&…

哪个牌子的电视盒子好用?2024超强电视盒子排名

最近很多朋友问我电视盒子的相关问题&#xff0c;就目前来说&#xff0c;电视盒子的地位依然是不可取代的。我近来要发布的测评内容是哪个牌子的电视盒子好用&#xff0c;耗时两周进行对比后整理了电视盒子排名&#xff0c;看看哪些电视盒子是最值得入手的吧。 NO.1——泰捷新品…

Java 1.8 docker 镜像制作

文章目录 一、下载文件二、精简JRE三、Dockerfile四、构建镜像五、容器测试 一、下载文件 glibc 下载地址 glibc-2.33-r0.apk glibc-bin-2.33-r0.apk glibc-i18n-2.33-r0.apk rsa sgerrand.rsa.pub jre 1.8 jre-8u201-linux-x64.tar.gz 二、精简JRE 解压 tar -zxvf jre-8…

亚信安慧AntDB数据库:实时流数据处理的不二选择

亚信安慧AntDB数据库是一种解决实时流数据处理中数据容灾和一致性问题的创新性解决方案。它不仅能够在处理流数据时确保数据的完整性和准确性&#xff0c;还能精确判断数据故障点&#xff0c;从而避免可能的数据损失和错误。AntDB数据库采用先进的技术和算法&#xff0c;能够实…

06 Qt自绘组件:Switch动画开关组件

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

ISP代理是什么?跨境账号养号为什么要选择它?

在跨境出海业务中&#xff0c;代理IP对于您的在线任务至关重要&#xff0c;尤其是对于那些运行多个帐户的人来说。为您的帐户选择正确类型的代理对于确保帐户安全非常重要&#xff0c;劣质的IP容易使账号遭受封号风险。IPFoxy的多种代理IP类型应用范围各有侧重&#xff0c;其中…

如何在aws服务器上部署mysql

在AWS服务器上部署 MySQL 数据库可以通过以下步骤完成&#xff1a; 启动 EC2 实例&#xff1a; 在 AWS 控制台中启动一个 EC2 实例&#xff0c;选择适合你需求的实例类型和配置。 安全组配置&#xff1a; 确保你的 EC2 实例的安全组配置允许来自你的 IP 地址的 MySQL 连接。默…

12. WorkQueue(工作队列)

WorkQueue WorkQueue 称为工作队列&#xff0c;Kubernetes 的 WorkQueue 队列与普通 FIFO&#xff08;先进先出&#xff0c;First-In&#xff0c;First-Out&#xff09;队列相比&#xff0c;实现略显复杂&#xff0c;它的主要功能在于标记和去重&#xff0c;并支持如下特性。 …

linux系统Jenkins的安装

Jenkins安装 安装上传安装包解压包首次登录要去服务器查看密码&#xff0c;更改密码选择需要安装的插件设置Admin用户和密码安装完成 安装 上传安装包 上传 jdk17 tomcat jenkins.war的安装包 . 上传 tomcat安装包解压包 解压jdk tar xf jdk-11.0.18_linux-x64_bin.tar.gz解…

雾锁王国Enshrouded服务器CPU内存配置怎么选择?

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

【HarmonyOS】鸿蒙开发之Video组件——第3.7章

Video组件内VideoOptions属性简介 src&#xff1a;设置视频地址。currentProgressRate&#xff1a;设置视频播放倍速&#xff0c;参数说明如下&#xff1a; number|string&#xff1a;只支持 0.75 &#xff0c; 1.0 &#xff0c; 1.25 &#xff0c; 1.75 &#xff0c; 2.0 。P…

首超星巴克,瑞幸咖啡开始“守擂”?

农历新年开年短短半个月&#xff0c;瑞幸咖啡凭一己之力&#xff0c;似乎拉开了国内现磨咖啡行业竞争的新序幕。 先是新年开工首日&#xff0c;瑞幸咖啡每周“9.9元喝一杯”的可选性品类减少&#xff0c;登上微博热搜&#xff0c;引发市场对于现磨咖啡行业生态的可持续性担忧。…

[计算机网络]--MAC/ARP/DNS协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、认识以…

ARM系列 -- 虚拟化(五)

在ARM体系结构中&#xff0c;处理器内部有通用计时器&#xff0c;通用计时器包含一组比较器&#xff0c;用来与系统计数器进行比较&#xff0c;一旦通用计时器的值小于等于系统计数器时便会产生时钟中断。 大家看到这里是不是想起了前面讲GIC时提到的PPI&#xff08;private p…

招聘系统架构的设计与实现

在当今竞争激烈的人才市场中&#xff0c;有效的招聘系统对企业吸引、筛选和管理人才至关重要。本文将探讨招聘系统的架构设计与实现&#xff0c;帮助企业构建一个高效、可靠的人才招聘平台。 ## 1. 系统架构设计 ### 1.1 微服务架构 招聘系统通常采用微服务架构&#xff0c;将…

移动Web系统中无监督KPI异常检测的监督式微调

简介 本文介绍由清华大学、南开大学、中国移动研究院与必示科技共同合作的论文&#xff1a;移动Web系统中无监督KPI异常检测的监督式微调。该论文已被The Web Conference 2024&#xff08;International World Wide Web Conference&#xff09;会议录用&#xff0c;论文标题为&…

【Hudi】核心概念

https://www.bilibili.com/video/BV1ue4y1i7na?p17&vd_sourcefa36a95b3c3fa4f32dd400f8cabddeaf 大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; 1 基础概念 1.1 时间轴(TimeLine) 1.2 文件布局(File Layout) 1.3 索引(In…

Leetcode—82. 删除排序链表中的重复元素 II【中等】

2024每日刷题&#xff08;117&#xff09; Leetcode—82. 删除排序链表中的重复元素 II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val…