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

news2024/9/23 21:32:35

目录

    • 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:
在这里插入图片描述

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

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

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

相关文章

【OJ比赛日历】快周末了,不来一场比赛吗? #03.23-03.29 #16场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2024-03-23&#xff08;周六&#xff09; #7场比赛2024-03-24…

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

算法详解——Dijkstra算法

Dijkstra算法的目的是寻找单起点最短路径&#xff0c;其策略是贪心加非负加权队列 一、单起点最短路径问题 单起点最短路径问题&#xff1a;给定一个加权连通图中的特定起点&#xff0c;目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是&#xff0c;这里关心…

Python和Java哪一个更适合初学者?

Python和Java哪一个更适合初学者&#xff1f; 对于初学者来说&#xff0c;Python通常是更友好的入门选择。它的语法简洁明了&#xff0c;接近自然语言&#xff0c;易于理解&#xff0c;使得初学者能够更快地掌握编程基础和逻辑思维。Python拥有丰富的库支持&#xff0c;特别是在…

【Arxml专题】-29-使用Cantools将CAN Matrix Arxml自动生成C语言代码

目录 1 安装Python和Cantools 1.1 查看Python已安装的Package包 1.2 在Python中安装Cantools插件包 1.3 获取更多Cantools工具的更新动态 2 CAN Matrix Arxml自动生成C语言代码 2.1 批处理文件CAN_Matrix_Arxml_To_C.bat内容说明 2.2 CAN Matrix Arxml文件要求 2.3 如何…

关于Ansible的模块 ①

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 什么是Ansible模块 在Linux中&#xff0c;bash无论是在命令行上执行&#xff0c;还是在bash脚本中&#xff0c;都需要调用cd、l…

Zookeeper的ZAB协议原理详解

Zookeeper的ZAB协议原理详解 如何保证数据一致性。 Paxos&#xff0c; 吸收了主从。 zk 数据模型Watch机制 zab zookeeper原子广播协议。 ZAB概念 ZooKeeper是通过Zab协议来保证分布式事务的最终一致性。 Zab(ZooKeeper Atomic Broadcast,.ZooKeeper原子广播协议)支持…

C语言例:设 int a,b; 则表达式(a=2,b=5,a++,b++,a+b) 的值

代码如下&#xff1a; #include<stdio.h> int main(void) {int a,b,m; m(a2,b5,a,b,ab);printf("(a2,b5,a,b,ab) %d\n",m);//a2,b5,a3,b6,ab9return 0; } 结果如下&#xff1a;

第十二届蓝桥杯省赛CC++ 研究生组-路径

记录到每个结点的最短距离&#xff0c;以此为基础计算后续结点最优值 #include<iostream> #include<algorithm> using namespace std; typedef long long ll;ll gcd(int a, int b){if(!b) return a;return gcd(b, a % b); }int main(){ll dp[2022] {0};//dp[i]记…

【一起学Rust | 基础篇】rust线程与并发

文章目录 前言一、创建线程二、mpsc多生产者单消费者模型1.创建一个简单的模型2.分批发送数据3. 使用clone来产生多个生产者 三、共享状态&#xff1a;互斥锁1. 创建一个简单的锁2. 使用互斥锁解决引用问题 前言 并发编程&#xff08;Concurrent programming&#xff09;&#…

【Java Web基础】一些网页设计基础(三)

文章目录 1. 导航栏样式进一步调整2. 入驻企业信息展示栏2.1 Title设置2.2 具体信息添加 3. 轮播图4. 注册登录按钮及其他信息5. 一些五颜六色的、丰富视觉效果的中间件…… 1. 导航栏样式进一步调整 这种导航栏&#xff0c;选中的时候字体变蓝色&#xff0c;可能还是不够美观&…

C++进阶--哈希

哈希概念 哈希&#xff08;Hash&#xff09;是一种常见的密码学技术和数据结构&#xff0c;它将任意长度的输入通过散列算法转换成固定长度的输出&#xff0c;这个输出被称为散列值或哈希值。哈希函数是一种单向函数&#xff0c;即从哈希值无法反推出原始输入值。 哈希函数具有…

Android14 - AMS之Activity启动过程(1)

Android14 - AMS之Activity启动过程&#xff08;2&#xff09;-CSDN博客 ​​​​​​​ Android14 - AMS之Activity启动过程&#xff08;3&#xff09;-CSDN博客 我们以Context的startActivity场景&#xff08;option null&#xff0c; FLAG_ACTIVITY_NEW_TASK&#xff09;来…

C++类型转换及IO流(深度剖析)

文章目录 1. 前言2. C语言的类型转换3. C的强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast 4. RTTI&#xff08;了解&#xff09;5. C语言的输入输出及缓存区理解6. CIO流6.1 C标准IO流6.2 C文件IO流 7. stringstream的简单介绍 1. 前言 C语言…

机器学习-可解释性机器学习:支持向量机与fastshap的可视化模型解析

一、引言 支持向量机(Support Vector Machine, SVM)作为一种经典的监督学习方法&#xff0c;在分类和回归问题中表现出色。其优点之一是生成的模型具有较好的泛化能力和可解释性&#xff0c;能够清晰地展示特征对于分类的重要性。 fastshap是一种用于快速计算SHAP值&#xff08…

华曦传媒陆锋:数字媒体时代,社区电梯广告价值正在被重估

在数字化时代的浪潮中&#xff0c;电梯广告、停车场道闸广告、门禁灯箱广告等线下社区广告似乎面临着生存的挑战。 然而&#xff0c;这一传统广告形式展现出了惊人的韧性和价值。 比如&#xff0c;2023年上半年&#xff0c;作为行业龙头分众传媒&#xff0c;2023年上半年实现…

【Linux】多线程编程基础

&#x1f4bb;文章目录 &#x1f4c4;前言&#x1f33a;linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 &#x1f33b;linux线程冲突概念互斥锁函数介绍加锁的缺点 &#x1f4d3;总结 &#x1f4c4;前言 无论你是否为程序员&#xff0c;相信多线程这个词汇应…

小白也能在3分钟完成短剧解说的剪辑,这是真的!

3分钟的解说视频&#xff0c;真的需要1小时的手工剪辑吗&#xff1f; 生成解说视频需要经过素材准备、解说词创作、声音录制、视频剪辑和视频合成等多个步骤&#xff0c;每个步骤都需要投入一定的时间和精力&#xff0c;因此整个过程较为耗时耗力。 1. 素材准备&#xff1a; 需…

【LINUX笔记】驱动开发框架

应用程序调动驱动程序 驱动模块运行模式 模块加载-卸载 加载卸载注册函数 加载 驱动编译完成以后扩展名为.ko&#xff0c;有两种命令可以加载驱动模块&#xff1a; insmod和modprobe 驱动卸载 驱动注册注销 //查看当前已经被使用掉的设备号 cat /proc/devices 实现设备的具…

AI系统性学习06—开源中文语言大模型

1、ChatGLM ChatGLM-6B的github地址&#xff1a;https://github.com/THUDM/ChatGLM-6B ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级…