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

目录

    • 51.将a所指数组主对角线上的元素分别乘以2;次对角线上的元素分别乘以3,依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据
    • 52.将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位上,b中的十位和个位数依次放在变量c的个位和百位上
    • 53.将字符串尾部的`*`号全部删除,前面和中间的`*`号不删除
    • 54.请编写一个函数,用来删除字符串中的所有空格
    • 55.将s0所指字符串分解成三个字符串,分别存入s1、s2、 s3所指内存中。分解的方法是,s1、 s2、s3从s0中依次顺序每隔3个字符取1个
    • 56.求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组) 的偶数,并依次存入数组a中并在屏幕上打印出来,打印时每个数单独一行,符合条件的个数通过函数值返回
    • 57.判断字符串是否为回文?若是,函数返回1,主函数中输出:YES;否则返回0,主函数中输出NO
    • 58.统计s所指字符串中的数字字符个数,并作为函数值返回
    • 59.只删除字符串前导和尾部的`*`号,串中字母之间的`*`号都不删除
    • 60.将M行N列的二维数组中的数据按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中

51.将a所指数组主对角线上的元素分别乘以2;次对角线上的元素分别乘以3,依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据

程序中定义了NXN的二维数组,并已在主函数中赋初值。

请编写函数fun,其功能是:将a所指数组主对角线上的元素分别乘以2;次对角线上的元素

分别乘以3,依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据。

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

PROG1. C:

#include <stdio.h>
#define N  3
#pragma warning(disable:4996)
void NONO( );

void fun( int a[N][N],int *p)
{


}
main()
 {   int a[N][N]={ 1,5,7,2,6,8,3,4,9};
     int b[2*N],i;
     fun(a,b);
     for(i=0;i<2*N;i++)
            printf("%d,",b[i]);
     NONO();
}

void NONO( )//系统用于评分测试的函数
{   int a[N][N];
     int b[2*N],i,j,k;
     FILE *rf, *wf;

     rf = fopen("in.dat","r") ;//r是打开一个用于读取的文件
     wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若已存在,则覆盖
     for(k=0; k<9;k++) {//有9组测试数据
           for(i=0;i<N;i++)
                for(j=0;j<N;j++)
                     fscanf(rf,"%d,",&a[i][j]);//从文件指针rf指向的文件in.dat获取数组a
         fun(a,b);
         for(i=0;i<2*N;i++)
              fprintf(wf, "%d,",b[i]);//结果写入文件指针wf指向的文件out.dat中
         fprintf(wf, "\n");
     }
     fclose(rf);//关闭
     fclose(wf);
}

解题思路:
注意啊,是依次存入指针p指向的数组,先存入主对角线的全部元素,再存次对角线,设行为i,主对角线元素规律为a[i][i],次对角线元素规律为a[i][N-i-1]

答案:

1.自己做的:

#include <stdio.h>
#define N  3
#pragma warning(disable:4996)
void NONO( );

void fun( int a[N][N],int *p)
{
 int i=0;
 for(i=0;i<N;i++)//主对角线
 {
  *p=a[i][i]*2;
   p++;
 }
 for(i=0;i<N;i++)//次对角线
 {
  *p=a[i][N-i-1]*3;
   p++;
 }
}
main()
 {   int a[N][N]={ 1,5,7,2,6,8,3,4,9};
     int b[2*N],i;
     fun(a,b);
     for(i=0;i<2*N;i++)
            printf("%d,",b[i]);
     NONO();
}

void NONO( )
{   int a[N][N];
     int b[2*N],i,j,k;
     FILE *rf, *wf;

     rf = fopen("in.dat","r") ;
     wf = fopen("out.dat","w") ;
     for(k=0; k<9;k++) {
           for(i=0;i<N;i++)
                for(j=0;j<N;j++)
                     fscanf(rf,"%d,",&a[i][j]);
         fun(a,b);
         for(i=0;i<2*N;i++)
              fprintf(wf, "%d,",b[i]);
         fprintf(wf, "\n");
     }
     fclose(rf);
     fclose(wf);
}

2.题库答案:

#include <stdio.h>
#define N  3
#pragma warning(disable:4996)
void NONO( );

void fun( int a[N][N],int *p)
{
    int i;
    for(i=0;i<N;i++){
        p[i]=a[i][i]*2;
        p[N+i]=a[i][N-1-i]*3;//他用数组的形式,斯,这样好像要简洁些
    }
}
main()
 {   int a[N][N]={ 1,5,7,2,6,8,3,4,9};
     int b[2*N],i;
     fun(a,b);
     for(i=0;i<2*N;i++)
            printf("%d,",b[i]);
     NONO();
}

void NONO( )
{   int a[N][N];
     int b[2*N],i,j,k;
     FILE *rf, *wf;

     rf = fopen("in.dat","r") ;
     wf = fopen("out.dat","w") ;
     for(k=0; k<9;k++) {
           for(i=0;i<N;i++)
                for(j=0;j<N;j++)
                     fscanf(rf,"%d,",&a[i][j]);
         fun(a,b);
         for(i=0;i<2*N;i++)
              fprintf(wf, "%d,",b[i]);
         fprintf(wf, "\n");
     }
     fclose(rf);
     fclose(wf);
}

测试:

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

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

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

52.将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位上,b中的十位和个位数依次放在变量c的个位和百位上

函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位上,b中的十位和个位数依次放在变量c的个位和百位上。

例如,当a=45, b=12。调用该函数后,c=5241。

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

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

prog1.c:

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



}
main()
{  int  a,b; long  c;void NONO ();
   printf("Input a b:");
   scanf("%d%d", &a, &b);
   fun(a, b, &c);
   printf("The result is: %ld\n", c);
   NONO();
   getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *rf, *wf ;
  int i, a,b ; long c ;

  rf = fopen("in.dat","r") ;//r是打开一个用于读取文件
  wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件
  for(i = 0 ; i < 10 ; i++) {//有10组测试数据
    fscanf(rf, "%d,%d", &a, &b) ;//从文件指针rf指向的文件in.dat获取a,b
    fun(a, b, &c) ;
    fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;//结果存入文件指针wf指向的文件out.dat中
  }
  fclose(rf) ;//关闭
  fclose(wf) ;
}


解题思路:
这题嘛,直接看答案吧,很简单的,前面有至少有两道几乎一样的了

答案:

要不以后答案就只展示fun函数的内容算了,不然一大串观感也不好o( ̄▽ ̄)ブ

1.自己做的:

void fun(int  a, int  b, long  *c)
{
*c=(a%10)*1000+(b%10)*100+(a/10)*10+(b/10);//直接按为构造
}

2.题库答案:

void fun(int  a, int  b, long  *c)
{
    int a_up,a_low,b_up,b_low;//他分了四个变量来存这四位
    a_up=a/10;
    a_low=a%10;
    b_up=b/10;
    b_low=b%10;
    *c=a_low*1000+b_low*100+a_up*10+b_up;
}

测试:

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

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

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

53.将字符串尾部的*号全部删除,前面和中间的*号不删除

假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串尾部的*号全部删除,前面和中间的*号不删除。

例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内容应当是:****A*BC*DEF*G。在编写函数时,不得使用C语言提供的字符串函数。

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

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

prog1.c:

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


}

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") ;//r是打开一个用于读取的文件
  out = fopen("out.dat","w") ;//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) ;
}


解题思路:
他说不能用字符串函数,要注意,题目要求将尾部的*号去掉,可以先遍历整个字符串,使指针a指向字符串的末尾,然后while(*a=='*') a--;,将尾部的第一个*号赋为空字符,也就删去了尾部的*

答案:

1.自己做的:

void  fun( char *a )
{
 while(*a)//遍历整个字符串,使指针a指向字符串末尾
 a++;
 a--;//while循环结束后,此时指针a是指向字符串末尾空字符的,所以要前移一位
 while(*a=='*')//使指针a指向字符串中最后一个字母
 a--;
 *(a+1)='\0';//此时指针a后移一位就是尾部第一个*号了
}




2.题库答案:

void  fun( char *a )
{
int i;
for(i=strlen(a)-1;i>=0;i--)//?,不是不能用字符串函数吗,算了,这个就当用字符串函数的做法
if(a[i]!='*') break;
a[i+1]=0;
}

测试:

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

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

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

54.请编写一个函数,用来删除字符串中的所有空格

请编写一个函数,用来删除字符串中的所有空格。

例如,输入"asd af aa z67",则输出为"asdafaaz67"。注意:部分源程序存在文件prog1.c中。

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

prog1.c:

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

void fun(char *str)
{




}

main()
{
  char str[81];void NONO ();

  printf("Input a string:") ;
  gets(str);
  puts(str);
  fun(str);
  printf("*** str: %s\n",str);
  NONO();
  getchar();
}

void NONO ()//系统用于评分测试的函数
{
/* 请在此函数内打开文件,输入调试数据,调用 fun 函数,
   输出数据,关闭文件。 */
  char str[81];
  int n = 0;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;//r是用于打开一个用于读取的文件
  wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件
  while(n < 10) {//有10组测试
    fgets(str, 80, rf);//从文件指针rf指向的文件in.dat中一行字符串,字符数最多为80个
    fun(str);
    fprintf(wf, "%s", str) ;//结果存入文件指针wf指向的文件out.dat中
    n++ ;
  }
  fclose(rf) ;//关闭
  fclose(wf) ;
}


解题思路:
虽然似乎用处不大,但还是介绍一下,
int isspace(int c) 检查所传的字符是否是空白字符。可以判断是否是空格符

' '     (0x20)    space (SPC) 空格符
'\t'    (0x09)    horizontal tab (TAB) 水平制表符    
'\n'    (0x0a)    newline (LF) 换行符
'\v'    (0x0b)    vertical tab (VT) 垂直制表符
'\f'    (0x0c)    feed (FF) 换页符
'\r'    (0x0d)    carriage return (CR) 回车符

返回值:
如果 c 是一个空白字符,则该函数返回非零值(true),否则返回 0(false)。

在这道题如果用这个函数也没有方便多少,所以我就没有采用了,用字符前移覆盖掉空格的方式,删除空格,前面已经做过很多采用这种方式删除一些字符了,应该很好理解

答案:

1.自己做的:

void fun(char *str)
{
 int k=0,len=strlen(str);
 for(int i=0;i<len;i++)
 {
  if(str[i]==' ')
  {
   k=i;
   while(k<len-1)//字符前移
   {
    str[k]=str[k+1];
    k++;
   }
   i--;//i自减是处理连续空格的情况
   len--;//空格被删后,字符串自然也缩短了
  }
 }
str[len]='\0';//字符串结束符
}

2.题库答案:

void fun(char *str)
{
int i,j;
 for(i=0;*(str+i);i++)//*(str+i)就是str[i]
   if(*(str+i)==32)  //32是空格的ASCII码
   { for(j=i+1;*(str+j);j++)//字符前移
       *(str+j-1)=*(str+j);//指针看起来复杂了点,其实就是str[j-1]=str[j]
       *(str+j-1)=0; //str[j-1]='\0',字符串结束符
       i=0;//呃,也算是处理连续空格的方式了吧
   }
}

测试:

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

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

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

55.将s0所指字符串分解成三个字符串,分别存入s1、s2、 s3所指内存中。分解的方法是,s1、 s2、s3从s0中依次顺序每隔3个字符取1个

请编写函数fun,其功能是:编写函数char *fun(char * s0, char *s1, char s2,chars3),

要求实现:

将s0所指字符串分解成三个字符串,分别存入s1、s2、 s3所指内存中。分解的方法是,s1、 s2、s3从s0中依次顺序每隔3个字符取1个。

例如:s0为"abcdefghij"时,分解完成后,s1、s2、s3分别为: "adgj”、 "beh”、 "cfi”。

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

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

PROG1. C:

#include <stdio.h>
#include <string.h>
void fun(char * s0,char *s1,char *s2, char *s3)
{


}
void main()
{
    void NONO();
	char  s0[100],s1[40],s2[40],s3[40];
	printf("请输入一行字符串\n");
	gets(s0);
	fun(s0,s1,s2,s3);
	puts(s1);
	puts(s2);
	puts(s3);
	NONO();
}
void NONO()//系统用于评分测试的函数
{
    FILE *fp = fopen("out.dat", "w");//w是创建一个用于写入的文件,若已存在,则覆盖
    char s0[10][100]={"1234567890qazwsx","abcdefghij","0987654321plmokn","fsdjfsdlrj564342dsf",
    "gfdklgjdsfl4754398","zxcvbnmasdfg","asdfghjkl123","qwertyuiop456","qweasdzxc789",
    "poiuytrewqwsxqaz"};//没用文件读取的方式,用了一个数组,有10组测试数据
    char s1[40],s2[40],s3[40];
    int i;
    for(i=0;i<10;i++)
    {
        fun(s0[i],s1,s2,s3);
        fprintf(fp,"s1=%s,s2=%s,s3=%s\n", s1,s2,s3);//结果存入文件指针fp指向的文件out.dat中
    }
    fclose(fp);//关闭
}

解题思路:
这题理清思路,还是很简单的,用for循环,更新表达式为i+=3,每次循环操作三个变量,存入各个字符串,别忘了判断字符是否为空,还有字符串结束符

答案:

1.自己做的:

void fun(char * s0,char *s1,char *s2, char *s3)
{
 for(int i=0;s0[i];i+=3)
 {
  *s1=s0[i];//每次循环操作三个字符,第一个字符存入字符串s1
   s1++;
  if(s0[i+1]!='\0')//判断第二个字符是否为空
  {
   *s2=s0[i+1];//存入第二个字符
    s2++;
  }
  if(s0[i+2]!='\0')
  {
   *s3=s0[i+2];//存入第三个字符
    s3++;
  }
 }
*s1='\0';//字符串结束符,这东西很容易忘,在涉及到文件的读取和存入时,对于这个是很严格
*s2='\0';
*s3='\0';
}

2.题库答案:

void fun(char * s0,char *s1,char *s2, char *s3)
{
 int i,j,k,t;
 j=k=t=0;
 for(i=0;i<strlen(s0);i+=3)//一样的思路,但他采取了数组的形式,感觉没我的简洁(。・ω・。)
 {
  
  s1[j++]=s0[i];
  if(i+1<strlen(s0))
   s2[k++]=s0[i+1];
  if(i+2<strlen(s0))
   s3[t++]=s0[i+2];
 }
 s1[j]='\0';
 s2[k]='\0';
 s3[t]='\0';
}

测试:

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

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

56.求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组) 的偶数,并依次存入数组a中并在屏幕上打印出来,打印时每个数单独一行,符合条件的个数通过函数值返回

根据哥德巴赫猜想,任意一个大偶数都可以分解为两个素数之和。但许多偶数分解为两个素数之和并不是唯一的。

请编写函数fun,其功能是:求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组) 的偶数,并依次存入数组a中并在屏幕上打印出来,打印时每个数单独一行,符合条件的个数通过函数值返回。

例如:114=5+109=7+107=11+103=13+101=17+97=31+83=41+73=43+71=47+67=53+61

114恰好可以分解为10组素数之和,因此114是我们要找的偶数。

而116=3+113=7+109=13+103=19+97=37+79=43+73

120=7+113=11+109=13+107=17+103=19+101=23+97=31+89=37+83=41+79=47+73=53+67=59+61

116可以分解为6组素数之和,120可以分解为12组素数之和,因此116和120都不是我们要找的偶数。函数prime用来判断一个数n是否为素数,是则返回1,否则返回0。

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

PROG1. C:

#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996)

int prime(int n)//判断素数
{	int k,flag=1;
	for (k=2; k<=(int)sqrt((double)n); k++)
		if (n%k == 0)
			flag=0;
	return flag;
}
int fun(int m, int a[])
{ 
  int k, s, count, i=0;
   for(k=6; k<=m; k+=2)//每次循环加2,保证变量是偶数
   {   count = 0;//count是这数有几组素数和
	   /* 请在此处填写代码 */



       if (count == 10) {
		   printf("%d\n", k);
		   a[i++] = k;
	   }
   }
   return i;
}
main( )
{	int count, a[100];
	void NONO(int count, int a[]);
	count = fun(999, a);
	NONO(count, a);
}

void NONO(int count, int a[])
{
	FILE *fp;
	int i;
	fp = fopen("out.dat","w") ;//w是创建一个用于写入的文件
	for(i=0; i<count; i++)
		fprintf(fp, "%d\n", a[i]);//结果存入文件指针fp指向的文件out.dat中
	fclose(fp);//关闭
}

解题思路:
首先肯定是写一个循环遍历小于k的数j,j起始值从2,毕竟0和1都不是素数,循环条件为j<=k/2;,另一边不用遍历,这应该好理解,题目举了个例子,5+109和109+5被认为是同一组

答案:

1.自己做的:

int fun(int m, int a[])
{ 
  int k, s, count, i=0;
   for(k=6; k<=m; k+=2)
   {   count = 0;
	   /* 请在此处填写代码 */
       for(int j=2;j<=k/2;j++)//遍历小于k的数
       {
         if(prime(j))//判断是否为素数
         {
           s=k-j;
           if(prime(s))//判断另一个因子是否为素数,若是则为一组素数和
           count++;
         }
       }

       if (count == 10) {//该数只有10组素数和符合题意
		   printf("%d\n", k);
		   a[i++] = k;//该数存入数组
	   }
   }
   return i;
}

2.题库答案:

int fun(int m, int a[])
{ 
  int k, s, count, i=0;
   for(k=6; k<=m; k+=2)
   {   count = 0;
	/* 请在此处填写代码 */
        for(s=2;s<=k/2;s++)
            if(prime(s) && prime(k-s)) count++;//好好好,一样的,不过他很赶时间O(∩_∩)O
        if (count == 10) {
             printf("%d\n", k);
	     a[i++] = k;
	 }
   }
   return i;
}

测试:

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

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

57.判断字符串是否为回文?若是,函数返回1,主函数中输出:YES;否则返回0,主函数中输出NO

请编写函数fun,函数的功能是:判断字符串是否为回文?若是,函数返回1,主函数中输出:YES;否则返回0,主函数中输出NO。回文是指顺读和倒读都一样的字符串。

例如,字符串LEVEL是回文,而字符串123312就不是回文。

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

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

prog1.c:

#include <stdio.h>
#include <string.h>
#define  N  80
int fun(char *str)
{


}

main()
{ char  s[N] ;void NONO ();
  printf("Enter a string: ") ; gets(s) ;
  printf("\n\n") ; puts(s) ;
  if(fun(s)) printf("  YES\n") ;
  else       printf("  NO\n") ;
  NONO() ;
  getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ;
  int i ; char s[N] ;
  rf = fopen("in.dat","r") ;//r是打开一个用于读取的文件
  wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若已存在,则覆盖
  for(i = 0 ; i < 10 ; i++) {//有10组测试数据
    fscanf(rf, "%s", s) ;//从文件指针rf指向的文件in.dat中获取字符串s
    if(fun(s)) fprintf(wf, "%s  YES\n", s) ;//结果存入文件指针wf指向的文件out.dat中
    else       fprintf(wf, "%s  NO\n", s) ;
  }
  fclose(rf) ; fclose(wf) ;//关闭
}


解题思路:
判断回文字符串,老题目了,最常用的方法是双指针法,也是最好用的,一个指针p指向字符串头部,另一个指针q指向字符串尾部,用一个while循环,条件为q>p,然后判断*p!=*q,若出现不等于情况则返回0,若循环结束也未出现不等的情况则返回1

答案:

1.自己做的:

int fun(char *str)
{
 char *p=str;
 while(*p)
 p++;
 p--;
 while(str<p)
 {
  if(*str!=*p)
  return 0;
  str++;
  p--;
 }
return 1;
}

2.题库答案:

int fun(char *str)
{
    int count=strlen(str),i; 
    for(i=0;i<=count/2;i++)
	if(str[i]!=str[count-i-1])//直接用数组的形式
	    {return 0;	break;}
    return 1;
}

测试:

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

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

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

58.统计s所指字符串中的数字字符个数,并作为函数值返回

请编写函数fun,其功能是:统计s所指字符串中的数字字符个数,并作为函数值返回。 例如,s所指字符串中的内容是:2def35adh25 3kjsdf 7/kj8655x,函数fun返回值为:11 注意:部分源程序在文件PROG1.C文件中。

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

PROG1.C:

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



}

main()
{  char *s="2def35adh25  3kjsdf 7/kj8655x";
   printf("%s\n",s);
   printf("%d\n",fun(s));
   NONO();
  getchar();
}

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

  fp = fopen("in.dat","r") ;//r是打开一个用于读取的文件
  wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件
  for(i = 0 ; i < 10 ; i++) {//有10组测试数据
    fgets(s, 255, fp);//从文件指针fp指向的文件in.dat获取一行字符串为s,字符数最多为255
    fprintf(wf, "%d\n", fun(s));//结果存入文件指针wf指向的文件out.dat中
  }
  fclose(fp) ;//关闭
  fclose(wf) ;
}


解题思路:
这题就是遍历字符串s,检索数字字符,用一个累加器累加,很简单

检索数字字符是有一个函数,但这题并未给出#include<string.h>的头文件,所以不能用,但还是有必要了解一下

int isdigit(int c); //判断c是否是数字

答案:

1.自己做的:

int fun(char  *s)
{
 int count=0;
 while(*s)
{
 if(*s>=48&&*s<=57)//字符0的ASCII码是48,字符9的ASCII码是57
 count++;
 s++;
}
return count;
}

2.题库答案:

int fun(char  *s)
{int n=0;
   while(*s!='\0'){
        if(*s>='0'&&*s<='9'){//本以为你会用ASCII码的
		n++;
	}
	s++;
   }
	return n;
}

还是多用ASCII码方便记忆

测试:

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

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

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

59.只删除字符串前导和尾部的*号,串中字母之间的*号都不删除

假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参n给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中最后*号的个数。在编写函数时,不得使用C语言提供的字符串函数。

例如,字符串中的内容为:****A*BC*DEF*G******,删除后,字符串中的内容应当是:A*BC*DEF*G

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

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

prog1.c:

#include <stdio.h>
void  fun( char *a, int n,int h,int e )
{


}

main()
{  char  s[81],*t,*f;  int m=0, tn=0, fn=0;void NONO ();
   printf("Enter a string:\n");gets(s);
   t=f=s;
   while(*t){t++;m++;}//字符串长度
   t--;
   while(*t=='*'){t--;tn++;}//字符串尾部*号长度
   while(*f=='*'){f++;fn++;}//字符串前导*长度
   fun( s , m,fn,tn );
   printf("The string after deleted:\n");puts(s);
   NONO();
   getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i ; char s[81], *t, *f ;
  int m=0, tn=0, fn=0;
  in = fopen("in.dat","r") ;//r是打开一个用于读取的文件
  out = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若存在,则覆盖
  for(i = 0 ; i < 10 ; i++) {//有10组测试数据
    fscanf(in, "%s", s) ;//从文件指针in指向的文件in.dat中获取字符串s
    t=f=s;
    m=0; tn=0; fn=0;
    while(*t){t++;m++;}//字符串长度
    t--;
    while(*t=='*'){t--;tn++;}//字符串尾部*号长度
    while(*f=='*'){f++;fn++;}//字符串前导*号长度
    fun(s, m, fn, tn);
    fprintf(out, "%s\n", s) ;    //结果存入文件指针out指向的文件out.dat中
  }
  fclose(in) ;//关闭
  fclose(out) ;
}


解题思路:
这题有点小难了,要对指针掌握的比较好,设一个指针p,p=str+h,使指针p指向前导*结束后的第一个字母,再设一个指针q,q=a+n-e,使指针q指向尾部*号的第一个*号,指针p到指针q这一段的字符就是结果要的字符串了,将这段字符前移h个的单元,再在尾部加个空字符,就好了

答案:

1.自己做的:

void  fun( char *a, int n,int h,int e )
{
 char *p=a+h,*q=a+n-e;//指针p指向前导*号结束后的第一个字母,指针q指向尾部*号的第一个*号
 *q='\0';//字符串结束符,在后面的while循环,这个空字符也前移了h个单元,作为了新字符串的结束符
 while(p<=q)//遍历指针p到指针q的字符,将这些字符前移h个单元
 {
  *(p-h)=*p;
  p++;
 }
}

2.题库答案:

void  fun( char *a, int n,int h,int e )
{ char b[81],*c,*d;
  int i=0,j=0;
  c=a;d=a;
  c=c+h;d=d+n-e-1;//c指向前导*号结束后的第一个字母,注意啊,他指针d减一了,那d指向后尾部*号前的第一个字母
  while (c<=d)//他也是一样的,用两个指针圈出要的那段字符串,但不过他用了数组b存这段字符串
  {b[i]=*c;i++;c++;}    
  b[i]='\0'; i=0;//字符串结束符
  while (b[i])//把字符串b复制给了字符串a
  {a[j]=b[i];j++;i++;} 
  a[j]='\0';//字符串a结束
}

测试:

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

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

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

60.将M行N列的二维数组中的数据按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中

请编写函数fun,函数的功能是:将M行N列的二维数组中的数据按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。

例如,二维数组中的数据为:

33 33 33 33

44 44 44 44

55 55 55 55

则一维数组中的内容应是:

33 33 33 33 44 44 44 44 55 55 55 55。

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

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

prog1.c:

#include <stdio.h>
void  fun(int  (*s)[10], int  *b, int  *n, int mm, int nn)//mm是二维数组的行,nn是二维数组的列
{


}
main()
{ int w[10][10] = {{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ;
  int a[100] = {0}, n = 0 ;void NONO ();
  printf("The matrix:\n") ;
  for(i = 0 ; i < 3 ; i++)
  { for(j = 0 ; j < 4 ; j++) printf("%3d",w[i][j]) ;
    printf("\n") ;
  }
  fun(w, a, &n, 3, 4) ;
  printf("The A array:\n") ;
  for(i = 0 ; i < n ; i++) printf("%3d",a[i]);printf("\n\n") ;
  NONO() ;
  getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。*/
  FILE *rf, *wf ; int i, j, k ;
  int w[10][10], a[100], n = 0, mm, nn ;
  rf = fopen("in.dat","r") ;//r是打开一个用于读取的文件
  wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若已存在,则覆盖
  for(k = 0 ; k < 5 ; k++) {//有5组测试数据
    fscanf(rf, "%d %d", &mm, &nn) ;//从文件指针rf指向的文件in.dat中获取二维数组行mm,列nn
    for(i = 0 ; i < mm ; i++)
      for(j = 0 ; j < nn ; j++) fscanf(rf, "%d", &w[i][j]) ;//获取数组元素
    fun(w, a, &n, mm, nn) ;
    for(i = 0 ; i < n ; i++) fprintf(wf, "%3d", a[i]) ; fprintf(wf, "\n") ;//结果存入文件指针wf指向的文件out.dat中
  }
  fclose(rf) ; fclose(wf) ;//关闭
}


解题思路:
前面做过一道差不多的题,但是他是按列的顺序存入,比这道题还要绕些,按行的话就是正常的二维数组的遍历顺序,存入数组b,还有要注意,最后检测时是多组输入,然而n是以指针形式,传递的,那么就要保证在运行fun函数时,*n的都要赋一次0

答案:

1.自己做的:

void  fun(int  (*s)[10], int  *b, int  *n, int mm, int nn)
{
*n=0;
 for(int i=0;i<mm;i++)//正常的二维数组遍历,就是按行的顺序
 for(int j=0;j<nn;j++)
 {
  *b=s[i][j];//元素存入数组b
   b++;
  (*n)++;//元素个数
 }
}

2.题库答案:

void  fun(int  (*s)[10], int  *b, int  *n, int mm, int nn)
{int x,y;
 for(x=0;x<nn;x++)  
  for(y=0;y<mm;y++)
   {b[y*nn+x]=*(s[y]+x); //这段指针用得挺复杂,在下面注释
   /*s[y]表示二维数组s的第y行,是一个指向该行第一个元素的指针,
   *(s[y]+x)表示取出s[y]指向的地址加上x偏移后的元素的值,即取出二维数组s的第y行第x列的元素的值
   b[y*nn+x]表示一维数组b中的第y*nn+x个元素,可以仔细体会下,y*nn就是行
   整个操作就是将二维数组s的第y行第x列的元素的值赋给一维数组b的第y*nn+x个元素*/
    (*n)++;
   }
}

嘿嘿,这题库答案好像没意识到指针n的问题

测试:

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

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

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

程序设计这个系列也更完了,等出新的题,有空会继续更,本想全都在今年开考之前更完,结果选择题的系列还没开篇,祝大家都能考个好成绩
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试算法-62-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…

Java------数据结构之栈与队列(简单讲解)

本篇碎碎念&#xff1a;时隔n个月&#xff0c;继续写博客&#xff0c;假期落下的进度&#xff0c;在开学后努力追赶&#xff0c;假期不努力&#xff0c;开学徒伤悲啊&#xff0c;此时此刻真想对自己说一句&#xff0c;活该啊~~~~ 欠下的链表练习题讲解会在下次更新~~~~ 今日份励…

基于Springboot的在线投稿系统+数据库+免费远程调试

项目介绍: Javaee项目&#xff0c;springboot项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringBoot Mybatis VueMavenLayui来实现。MySQL数据库作为系统数据储存平台&a…

第十二届蓝桥杯省赛CC++ 研究生组-砝码称重

solution1&#xff08;通过10%&#xff09; 写了几种可能的组合方式&#xff0c;骗到一丢丢分数 #include<iostream> #include<algorithm> #include<map> using namespace std; int main(){int n, a[110], count 0, sum[110] {0};map<int, int> mp…

Windows系统部署GoLand结合内网穿透实现SSH远程Linux服务器开发调试

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-HIOuHATnug3qMHzx {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

PTA L2-041 插松枝 代码附注释

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始状态为空。每人面前有用不完的松枝干和一个推送器&#xff0c;每次推送一…

本地项目文件夹创建python文件并配置conda环境的完整流程

1 在Pycharm中创建新项目 位置就是本地的项目文件夹 2 接着打开pycharm的终端 创建conda环境&#xff08;这个过程需要保证conda.exe能够被系统路径识别&#xff09; conda create --name my_environment&#xff08;my_environment取自己想要的环境名字&#xff09; 还可以指…

(附源码)基于Spring Boot + Vue的校园综合信息服务平台设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

1.2 编译型语言和解释型语言的区别

编译型语言和解释型语言的区别 通过高级语言编写的源码&#xff0c;我们能够轻松理解&#xff0c;但对于计算机来说&#xff0c;它只认识二进制指令&#xff0c;源码就是天书&#xff0c;根本无法识别。源码要想执行&#xff0c;必须先转换成二进制指令。 所谓二进制指令&…

2024年上半年PETS5考试提醒/北语考前培训班(线上)招

PEST5考试每年进行两次&#xff0c;上半年和下半年各一次。目前尚未公布2024年的报考计划&#xff0c;但可以参考2023年度信息&#xff0c;上半年报名时间&#xff1a;4月11日-4月13日&#xff1b;考试时间&#xff1a;5月20日-5月21日。知识人网小编提醒拟申报者关注报考日期&…

聚焦两会:数字化再加速,VR全景助力制造业转型

近年来&#xff0c;随着信息技术、人工智能、VR虚拟现实等新兴技术的不断涌现&#xff0c;数字化正日益成为推动当今经济发展的新驱动力。在不久前的两会上&#xff0c;数字化经济和创新技术再度成为热门话题&#xff1a; 国务院总理李强作政府工作报告&#xff1a; 要深入推…

2024.3.21 QT

思维导图 自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。&#xff08;不要使用课堂上的图片和代码&#xff0c;自己发挥&#xff0c;有利于后面项目的完成&#xff09; 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&…

如何设计一个安全的API接口详解

前言 在日常开发中&#xff0c;总会接触到各种接口。前后端数据传输接口&#xff0c;第三方业务平台接口。一个平台的前后端数据传输接口一般都会在内网环境下通信&#xff0c;而且会使用安全框架&#xff0c;所以安全性可以得到很好的保护。这篇文章重点讨论一下提供给第三方…

【ai技术】(3):树莓派4,成功安装ollama软件,内存4G,推荐使用命令行界面安装,使用raspi-config配置wifi,运行速度飞快

1&#xff0c;关于raspberrypi 4 项目 https://www.bilibili.com/video/BV1K2421P71h/ 【ai技术】&#xff08;3&#xff09;&#xff1a;树莓派4&#xff0c;成功安装ollama软件&#xff0c;内存4G&#xff0c;安装命令行版本&#xff0c;使用raspi-config配置wifi&#xff0…

MO尺度(大气边界层)

在大气表面层( atmospheric surface layer)中,MO参数是用来决定流动是中性或者非中性的一个重要参数。其定义是 z / L z/L z/L&#xff0c;其中 L L L为Obukhov长度&#xff0c;其含义是浮力产生的湍动能和剪切产生的湍动能之比(Hj h AIP 2023)(Monin IAS,1954)&#xff0c;具体…

C++初始化列表

本博客将讲述C初始化列表的相关内容 一.什么是初始化列表 图中红方框框的就是初始化列表 格式为&#xff1a; &#xff1a;成员变量1&#xff08;参数1&#xff09;&#xff0c;成员变量2&#xff08;参数2&#xff09; 编译器会将初始化列表一一转换成代码&#xff0c;并将…

G - Find a way

题目分析 1.双重bfs,遍历两个起点求最短路再计算总和即可 2.唯一的坑点在于对于一个KFC&#xff0c;两人中可能有一个到不了&#xff0c;所以还要对到不了的点距离做处理 #include <bits/stdc.h> using namespace std; using ll long long; const int N 220;struct pos…

英伟达GTC大会看点:Blackwell芯片、推理微服务NIM、人形机器人

北京时间3月19日&#xff0c;英伟达创始人兼首席执行官黄仁勋在美国加州圣何塞SAP中心拉开了GTC大会帷幕&#xff0c;这是时隔5年重回线下的会议&#xff0c;现场吸引了11000多名与会者。大会上黄仁勋演讲了长达120分钟的主题分享《见证AI的变革时刻》&#xff0c;并发布了最新…

如何在edge上安装拓展weTab

1.点解管理拓展 2.点击获取拓展 3.搜索框输入"wetab"并搜索 4.点击获取按钮 5.点击之后跳出弹窗,点击"添加拓展" 6.回到拓展页面,找到wetab拓展,点击右侧启动拓展 7.打开新的界面,wetab已经启动 8.自定义界面 1. 右键图标可以进行删除操作 2.左下角有个设…