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

目录

41.计算下列级数和,和值由函数值返回

写函数fun,它的功能是计算下列级数和,和值由函数值返回。
请添加图片描述

例如,当n=10,x=0.3时,函数值为1.349859。

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

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

prog1.c:

#include <stdio.h>
#include <math.h>
double fun(double x , int  n)
{



}

main()
{  void NONO ();
   printf("%f\n", fun(0.3,10));
   NONO();
  getchar();
}

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

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


解题思路:
这题可以看到代码给了头文件#include<math.h>,题目也没说不可以用函数,所以对于公式中x的n次方,可以用pow()函数来处理

double pow(double x, double y)  //返回x的y次方

如果不想用函数的话,也可以,在下面的答案也会展示出来

答案:

1.自己做的:
先展示不使用函数的吧:

#include <stdio.h>
#include <math.h>
double fun(double x , int  n)
{
 double sum=1+x,a=1,s=x;//sum初始化为前两项的和,a是分母,s是分子
 for(int i=2;i<=n;i++)
 {
  a*=i;
  s*=x;
  sum+=s/a;
 }
return sum;
}

main()
{  void NONO ();
   printf("%f\n", fun(0.3,10));
   NONO();
  getchar();
}

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

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%lf,%d", &x, &n) ;
    s = fun(x, n) ;
    fprintf(wf, "%f\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}


用函数:

#include <stdio.h>
#include <math.h>
double fun(double x , int  n)
{
 double sum=1,a=1;
 for(int i=1;i<=n;i++)
 {
   a*=i;
   sum+=pow(x,i)/a;//用函数还是要方便好多的,
 }
return sum;
}

main()
{  void NONO ();
   printf("%f\n", fun(0.3,10));
   NONO();
  getchar();
}

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

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%lf,%d", &x, &n) ;
    s = fun(x, n) ;
    fprintf(wf, "%f\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}


2.题库答案:

#include <stdio.h>
#include <math.h>
double fun(double x , int  n)
{ int i;
  double f=1.0,h=x;
  double s=1;
  s=s+h/f;        //他这里显然采用的是没有借助函数方式,h是分子,f是分母
  for (i=2;i<=n;i++)
  { f=f*i;      
    h=h*x;       
    s=s+h/f;
  }
 return (s);
}

main()
{  void NONO ();
   printf("%f\n", fun(0.3,10));
   NONO();
  getchar();
}

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

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%lf,%d", &x, &n) ;
    s = fun(x, n) ;
    fprintf(wf, "%f\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}


测试:

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

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

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

42.统计出x所指数组中能被e整除的所有元素,这些元素的和通过函数值返回主函数,元素个数通过形参num返回主函数

请编写函数fun,其功能是:统计出x所指数组中能被e整除的所有元素,这些元素的和通

过函数值返回主函数,元素个数通过形参num返回主函数。

x所指数组的元素个数通过形参n传入。

例如:当数组x内容为1,9,8,6, 12,整数e内容为3时,输出结果应该是: sum=27, num=3

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

PROG1. C:

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

int fun(int x[], int n, int e, int *num)
{



}

int main()
{  
  void NONO();
  int x[] = {1, 9, 8, 6, 12}, num=0, sum;
  sum = fun(x, 5, 3, &num);
  printf("sum=%d,num=%d\n", sum, num);
  NONO();
  return 0;
}

void NONO( )//系统用于评分测试的函数
{
	int x[100] = {1, 9, 8, 6, 12}, num, sum, i, j, count, e;
	FILE *rf, *wf;
	rf = fopen("in.dat","r");//r是打开一个只读取的文件,这个必须存在
	wf = fopen("out.dat","w");//w是创建一个用写入的空文件,如果已存在,则会重新创建一个覆盖掉
	for(i=0;i<10;i++) {//有10组测试数据
		num = 0;//num是被e整除的元素个数
		sum = 0;//sum是能被e整除的元素和
		fscanf(rf, "%d,", &count);//从文件指针rf指向的文件in.dat中
		for(j=0;j<count;j++)
			fscanf(rf,"%d,",&x[j]);//从文件指针rf指向的文件in.dat获取数组x
		fscanf(rf, "%d,", &e);//从文件指针rf指向的文件in.dat获取e
		sum = fun(x, count, e, &num);
		fprintf(wf, "sum=%d,num=%d\n", sum, num);//结果输出到文件指针wf指向的文件out.dat中
     }
     fclose(rf);//关闭
     fclose(wf);
}

解题思路:
遍历数组,x[i]%e==0筛出能被e整除的数,sum+=x[i]累加元素和,(*num)++;元素个数

答案:

1.自己做的:

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

int fun(int x[], int n, int e, int *num)
{
 int sum=0;
 for(int i=0;i<n;i++)//嗯,就这样
 if(x[i]%e==0)
 {
  sum+=x[i];
  (*num)++;
 }
return sum;
}

int main()
{  
  void NONO();
  int x[] = {1, 9, 8, 6, 12}, num=0, sum;
  sum = fun(x, 5, 3, &num);
  printf("sum=%d,num=%d\n", sum, num);
  NONO();
  return 0;
}

void NONO( )
{
	int x[100] = {1, 9, 8, 6, 12}, num, sum, i, j, count, e;
	FILE *rf, *wf;
	rf = fopen("in.dat","r");
	wf = fopen("out.dat","w");
	for(i=0;i<10;i++) {
		num = 0;
		sum = 0;
		fscanf(rf, "%d,", &count);
		for(j=0;j<count;j++)
			fscanf(rf,"%d,",&x[j]);
		fscanf(rf, "%d,", &e);
		sum = fun(x, count, e, &num);
		fprintf(wf, "sum=%d,num=%d\n", sum, num);
     }
     fclose(rf);
     fclose(wf);
}

2.题库答案:

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

int fun(int x[],int n,int e,int *num)
{
    int i,s=0;
    *num=0;//斯,忘了这个,不过main函数里已经初始化为0了
    for(i=0;i<n;i++)//大差不差
        if(x[i]%e==0)
            {s+=x[i];(*num)++;}
    return s;
}


int main()
{  
  void NONO();
  int x[] = {1, 9, 8, 6, 12}, num=0, sum;
  sum = fun(x, 5, 3, &num);
  printf("sum=%d,num=%d\n", sum, num);
  NONO();
  return 0;
}

void NONO( )
{
	int x[100] = {1, 9, 8, 6, 12}, num, sum, i, j, count, e;
	FILE *rf, *wf;
	rf = fopen("in.dat","r");
	wf = fopen("out.dat","w");
	for(i=0;i<10;i++) {
		num = 0;
		sum = 0;
		fscanf(rf, "%d,", &count);
		for(j=0;j<count;j++)
			fscanf(rf,"%d,",&x[j]);
		fscanf(rf, "%d,", &e);
		sum = fun(x, count, e, &num);
		fprintf(wf, "sum=%d,num=%d\n", sum, num);
     }
     fclose(rf);
     fclose(wf);
}

测试:

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

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

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

43.使数组右上三角元素中的值乘以m

程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun,函数的功能

是:使数组右上三角元素中的值乘以m。例如:若m的值为2,a数组中的值为请添加图片描述
则返回主程序后a数组中的值应为请添加图片描述

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

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

prog1.c:

#include <stdio.h>
#include <stdlib.h>
#define  N  5
void fun ( int a[][N], int m )
{



}

main ( )
{  int  a[N][N], m, i, j;void NONO ();
   printf("***** The array *****\n");
   for ( i =0;  i<N; i++ )
   {  for ( j =0; j<N; j++ )
     {  a[i][j] = rand()%20; printf( "%4d", a[i][j] ); }//数组元素由随机数获得,范围为[0,19]
        printf("\n");
   }
   do m = rand()%10 ; while ( m>=3 );//m也由随机数获得,范围为[0,9],但这个do-while循环限制在了[0,3]
   printf("m = %4d\n",m);
   fun ( a ,m );
   printf ("THE  RESULT\n");
   for ( i =0;  i<N; i++ )
   {  for ( j =0; j<N; j++ ) printf( "%4d", a[i][j] );
      printf("\n");
   }
   NONO ( );
   getchar();
}

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

  rf = fopen("in.dat","r") ;//r是打开一个用于读取的文件
  wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件,如果已存在,则覆盖掉
  for(i = 0 ; i < 5 ; i++)//呃,就一组测试数据
  for(j = 0 ; j < 5 ; j++)
    fscanf(rf, "%d ", &a[i][j]) ;//从文件指针rf指向的文件in.dat获取数组a
  fscanf(rf, "%d", &n) ;//从文件指针rf指向的文件in.dat获取n
  fun(a, n) ;
  for ( i = 0;  i < 5; i++ ) {
    for ( j = 0; j < 5; j++ ) fprintf(wf, "%4d", a[i][j] );//结果输出到文件指针wf指向的文件out.dat中
    fprintf(wf, "\n");//加个换行符于下一组测试结果隔开
  }
  fclose(rf) ;//关闭
  fclose(wf) ;
}


解题思路:
就是遍历二维数组中的右上部分,右上部分的元素乘以m,难点就在于遍历右上部分了,拆开来看,这右上部分的行i仍然是0到N-1,列j变了,循环条件为j=N-1,j>=i;j--,可以慢慢体会

答案:

1.自己做的:

#include <stdio.h>
#include <stdlib.h>
#define  N  5
void fun ( int a[][N], int m )
{
 for(int i=0;i<N;i++)
 for(int j=N-1;j>=i;j--)
 a[i][j]*=m;
}

main ( )
{  int  a[N][N], m, i, j;void NONO ();
   printf("***** The array *****\n");
   for ( i =0;  i<N; i++ )
   {  for ( j =0; j<N; j++ )
     {  a[i][j] = rand()%20; printf( "%4d", a[i][j] ); }
        printf("\n");
   }
   do m = rand()%10 ; while ( m>=3 );
   printf("m = %4d\n",m);
   fun ( a ,m );
   printf ("THE  RESULT\n");
   for ( i =0;  i<N; i++ )
   {  for ( j =0; j<N; j++ ) printf( "%4d", a[i][j] );
      printf("\n");
   }
   NONO ( );
   getchar();
}

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

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


2.题库答案:

#include <stdio.h>
#include <stdlib.h>
#define  N  5
void fun ( int a[][N], int m )
{
int i,j; 
  for(i=0; i<N; i++) //一样的
    for(j=N-1; j>=i; j--) 
      a[i][j]*=m; 
}

main ( )
{  int  a[N][N], m, i, j;void NONO ();
   printf("***** The array *****\n");
   for ( i =0;  i<N; i++ )
   {  for ( j =0; j<N; j++ )
     {  a[i][j] = rand()%20; printf( "%4d", a[i][j] ); }
        printf("\n");
   }
   do m = rand()%10 ; while ( m>=3 );
   printf("m = %4d\n",m);
   fun ( a ,m );
   printf ("THE  RESULT\n");
   for ( i =0;  i<N; i++ )
   {  for ( j =0; j<N; j++ ) printf( "%4d", a[i][j] );
      printf("\n");
   }
   NONO ( );
   getchar();
}

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

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


测试:

斯,因为是随机数的原因,我这个m老是随机到0,我觉得题目main函数里do-while的循环条件应该是m<=3,才好一些

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

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

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

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

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

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

注意:部分源程序存在文件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 ();//变量c未初始化
   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) ;
}


解题思路:
这题,直接看代码吧,

答案:

1.自己做的:

#include <stdio.h>
void fun(int a, int b, long *c)
{
 *c=b/10;//直接按题目说从高位到低位构建这个数
 *c=(*c)*10+a/10;
 *c=(*c)*10+b%10;
 *c=(*c)*10+a%10;
}
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") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d,%d", &a, &b) ;
    fun(a, b, &c) ;
    fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}


2.题库答案:

#include <stdio.h>
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=b_up*1000+a_up*100+b_low*10+a_low;  
}
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") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d,%d", &a, &b) ;
    fun(a, b, &c) ;
    fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}


测试:

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

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

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

45.找出用1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数,然后把这些三位数按从小到大的顺序依次存入相应的数组xxx中,符合条件的个数由函数值返回

请编写函数fun,其功能是:找出用1、2、3、4四个数字,能组成多少个互不相同且无重

复数字的三位数,然后把这些三位数按从小到大的顺序依次存入相应的数组xxx中,符合条件的个数由函数值返回。

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

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

PROG1. C:

#include <stdio.h>
#define max 100

int fun(int xxx[])
{



}
int main()
{
	int xx[max],cnt;
	void NONO(int xx[], int cnt);
	
	cnt = fun(xx);
	printf("符合条件的个数=%d\n", cnt);
	NONO(xx, cnt);//得到的结果传入了NONO函数
	return 0;
}

void NONO(int xx[], int cnt)//系统用于评分测试的函数
{
	int i;
	FILE *fp;

	fp = fopen("out.dat", "w");//w是创建一个用于写入的空文件
	fprintf(fp, "%d\n", cnt);//符合条件的个数cnt存入文件指针fp指向的文件out.dat中
	for(i=0;i<cnt;i++)
		fprintf(fp, "%d\n", xx[i]);//数组也存入
	fclose(fp);
}

解题思路:
要求用1,2,3,4四个数组成一个三位数,这个三位数的每一位都要是互不相同的数,要从小到大的顺序存入数组,三位数也就是套三个循环,i(百位)为最外层循环,j(十位)为第二层循环,k(个位)为第三层循环,初始值从1开始就自然是从下到大的顺序了,存入数组作个if条件if(i!=j&&i!=k&&j!=k)这样就能保证每一位都互不相同了,

答案:

1.自己做的:

#include <stdio.h>
#define max 100

int fun(int xxx[])
{
int count=0;
for(int i=1;i<=4;i++)//百位
for(int j=1;j<=4;j++)//十位
for(int k=1;k<=4;k++)//个位
if(i!=j&&i!=k&&j!=k)//保证每一位互不相同
xxx[count++]=i*100+j*10+k;
return count;
}
int main()
{
	int xx[max],cnt;
	void NONO(int xx[], int cnt);
	
	cnt = fun(xx);
	printf("符合条件的个数=%d\n", cnt);
	NONO(xx, cnt);
	return 0;
}

void NONO(int xx[], int cnt)
{
	int i;
	FILE *fp;

	fp = fopen("out.dat", "w");
	fprintf(fp, "%d\n", cnt);
	for(i=0;i<cnt;i++)
		fprintf(fp, "%d\n", xx[i]);
	fclose(fp);
}

2.题库答案:

#include <stdio.h>
#define max 100

int fun(int xxx[])
{
int i,j,l,k=0;
  for(i=1;i<5;i++)//百位
	  for(j=1;j<5;j++)//十位
		if (j!=i) //他j!=i,是我的优化版,进一步缩小了要花费的时间
		  for(l=1;l<5;l++)
			  if (l!=j && l!=i)
				  xxx[k++]=i*100+j*10+l;

   return k;


}
int main()
{
	int xx[max],cnt;
	void NONO(int xx[], int cnt);
	
	cnt = fun(xx);
	printf("符合条件的个数=%d\n", cnt);
	NONO(xx, cnt);
	return 0;
}

void NONO(int xx[], int cnt)
{
	int i;
	FILE *fp;

	fp = fopen("out.dat", "w");
	fprintf(fp, "%d\n", cnt);
	for(i=0;i<cnt;i++)
		fprintf(fp, "%d\n", xx[i]);
	fclose(fp);
}

测试:

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

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

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

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

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

注意:部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。

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

PROG1.C:

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



}
main()
{  int a,b; long c;//注意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") ;
  wf = fopen("out.dat","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) ;
}


解题思路:
有没有觉得这题很熟悉,就是第44道的改动,改成了把数a的十位放在了数c的个位,数a的个位放在了数c的百位,其他的就一样

答案:

1.自己做的:

#include <stdio.h>
void fun(int a, int b, long *c)
{
*c=b/10;
*c=(*c)*10+a%10;
*c=(*c)*10+b%10;
*c=(*c)*10+a/10;
}
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") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d,%d", &a, &b) ;
    fun(a, b, &c) ;
    fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}


2.题库答案:

#include <stdio.h>
void fun(int a, int b, long *c)
{
*c=b/10*1000+a%10*100+b%10*10+a/10;//也对,可以一句话解决的

}
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") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d,%d", &a, &b) ;
    fun(a, b, &c) ;
    fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}


测试:

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

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

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

47.给定一个整数n(n<10000),如果n加上100后是一个完全平方数(所谓“完全平方数”,就是开方后的结果是整数的数),并且n加上268也是一个完全平方数,则函数值返回1,否则返回0

请编写函数fun,其功能是:给定一个整数n(n<10000),如果n加上100后是一个完全平方数(所谓“完全平方数”,就是开方后的结果是整数的数),并且n加上268也是一个完全平方数,则函数值返回1,否则返回0。

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

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

PROG1. C:

#include <stdio.h>
#include <math.h>

int fun(long n)
{


}
int main()
{
    long i;
    FILE *fp = fopen("out.dat", "w");//豁,这回不弄NONO函数了,w是创建一个用于写入的文件,若已存在,则覆盖

    for(i=1;i<10000;i++)
    {
        if (fun(i))
        {
            printf("%ld\n", i);
            fprintf(fp, "%ld\n", i);//结果输出到文件指针fp指向的文件out.dat中
        }
    }
    return 0;
}

解题思路:
嘛,这道题就取决于你知不知道sqrt()这个平方根函数了,sqrt()函数的返回值类型是double,要判断平方根是不是整数,就比较sqrt(n+100)(long)(n+100)是否相等就好了,就是化为整型会去掉小数部分

答案:
1.自己做的:

#include <stdio.h>
#include <math.h>

int fun(long n)
{
double a=sqrt(n+100);//题目怎么说,你就怎么来呗
long a1=a;
if(a==a1)
{
 a=sqrt(n+268);
 a1=a;
 if(a==a1)
 return 1;
}
return 0;
}
int main()
{
    long i;
    FILE *fp = fopen("out.dat", "w");

    for(i=1;i<10000;i++)
    {
        if (fun(i))
        {
            printf("%ld\n", i);
            fprintf(fp, "%ld\n", i);
        }
    }
    return 0;
}

2.题库答案:

#include <stdio.h>
#include <math.h>

int fun(long n)
{
	float y1,y2 = 0;//用于计算
	y1 = sqrt(n + 100);//获取n+100后开方的值
	y2 = sqrt(n + 268);//获取n+268后开方的值
	if ((int)y1 == y1 && (int)y2 == y2)//判断y1,y2是否为整数
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
    long i;
    FILE *fp = fopen("out.dat", "w");

    for(i=1;i<10000;i++)
    {
        if (fun(i))
        {
            printf("%ld\n", i);
            fprintf(fp, "%ld\n", i);
        }
    }
    return 0;


}

测试:

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

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

48.将形参s所指的字符串放入形参a所指的字符数组中,使a中存放同样的字符串

请编写函数fun,其功能是将形参s所指的字符串放入形参a所指的字符数组中,使a中存放同样的字符串。说明:不得使用系统提供的字符串函数。

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

PROG1.C:

#include  <stdio.h>
#define    N    20
void NONO();
void  fun( char  *a , char  *s)
{


}

main()
{  char  s1[N],  *s2="abcdefghijk";
   fun( s1,s2);
   printf("%s\n", s1);
   printf("%s\n", s2);
   NONO();
  getchar();
}

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

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


解题思路:
这题感觉就是在实现strcpy()函数的定义,直接看代码吧(^-^

答案:

1.自己做的:

#include  <stdio.h>
#define    N    20
void NONO();
void  fun( char  *a , char  *s)
{
while(*s)//遍历字符串
{
 *a=*s;//复制
 a++;
 s++;
}
*a='\0';//别忘了字符串结尾
}

main()
{  char  s1[N],  *s2="abcdefghijk";
   fun( s1,s2);
   printf("%s\n", s1);
   printf("%s\n", s2);
   NONO();
  getchar();
}

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

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fgets(s2, 255, fp);
    fun(s1,s2);
    fprintf(wf, "%s", s1);
  }
  fclose(fp) ;
  fclose(wf) ;
}


2.题库答案:

#include  <stdio.h>
#define    N    20
void NONO();
void  fun( char  *a , char  *s)
{
	int i=0;
	while(*s!='\0')
	{
		a[i] = *s;//他这里对于字符串a采用了数组的表示形式
		s++;
		i++;
	}
	a[i]='\0';
}

main()
{  char  s1[N],  *s2="abcdefghijk";
   fun( s1,s2);
   printf("%s\n", s1);
   printf("%s\n", s2);
   NONO();
  getchar();
}

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

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fgets(s2, 255, fp);
    fun(s1,s2);
    fprintf(wf, "%s", s1);
  }
  fclose(fp) ;
  fclose(wf) ;
}


测试:

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

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

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

49.找出dp所指数组中的最小或最大值,并与其第1个元素交换。形参n为元素的个数,形参upordown为查找标志:值为0时找最小值;值为1时找最大值

请编写函数void fun(int *dp, int n, int upordown), 其功能是,找出dp所指数组中的

最小或最大值,并与其第1个元素交换。形参n为元素的个数,

形参upordown为查找标志:值为0时找最小值;值为1时找最大值。

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

PROG1. C:

#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);

void fun (int *dp,int n,int upordown)
{


}

void display(int pd[],int n)//输出数组
{
	int i;
	for(i=0;i<n;i++)
		printf("%4d",pd[i]);
	printf("\n");
}
void main()
{
	int data[N],i,n=N;
	FILE *out ;

    out = fopen("out.dat","w") ;//w是创建一个用于写入的空文件,若已存在,则覆盖
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;//数组元素由随机数生成,随机数范围为[9,99]
	for(i=0;i<N-1;i++)//这个循环类似于排序的作用了,从大到下,没感觉出来的可以细细感觉下
		fun(data+i,n-i,0);//一开始在n个元素中找最大值,与第一个元素交换,下一次循环传入fun函数的数组从第二个元素开始,在n-1个元素里找最大值,此时数组第一个元素就是原来第二个元素了,然后交换,如此反复
	display(data,n);
	NONO(out, data, n);//结果传入了NONO函数
	for(i=0;i<N;i++)//这就是第二组测试数据了
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,1);
	display(data,n);
	NONO(out, data, n);
	fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
	int i;
	for(i=0;i<n;i++)
		fprintf(fp, "%4d", pd[i]);//结果存入文件指针fp指向的文件out.dat中
	fprintf(fp, "\n");

}


解题思路:
这题本身难度不高,只是这个main函数里搞这么一堆,看起来复杂而已,但main里的内容并没有影响我们要构建的fun函数,我们只需要实现在传来的数组里,找出最大值或最小值,然后与第一个元素交换即可

答案:

1.自己做的:

#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);

void fun (int *dp,int n,int upordown)
{
 int max=dp[0],min=dp[0],index_max=0,index_min=0,t=dp[0];//我这里索性是把最小值和最大值都找出来
 for(int i=1;i<n;i++)
 {
  if(max<dp[i])
 {
  max=dp[i];
  index_max=i;
 }
 if(min>dp[i])
 {
  min=dp[i];
  index_min=i;
 }
 }
 if(upordown)//upordown为1,最大值与第一位元素交换
 {
  dp[0]=max;
  dp[index_max]=t;
 }
 else//upordown为0,最小值与第一位元素交换
 {
  dp[0]=min;
  dp[index_min]=t;
 }
}

void display(int pd[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%4d",pd[i]);
	printf("\n");
}
void main()
{
	int data[N],i,n=N;
	FILE *out ;

    out = fopen("out.dat","w") ;
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,0);
	display(data,n);
	NONO(out, data, n);
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,1);
	display(data,n);
	NONO(out, data, n);
	fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
	int i;
	for(i=0;i<n;i++)
		fprintf(fp, "%4d", pd[i]);
	fprintf(fp, "\n");

}


2.题库答案:

#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);

void fun (int *dp,int n,int upordown)
{
int i,dorx;
 dorx=0;
 if(upordown==0)
	{for(i=1;i<n;i++)
		if (dp[dorx]>dp[i]) dorx=i;}//斯,对,我设两个变量存看来是多此一举了
 else
    { for(i=1;i<n;i++)
		if (dp[dorx]<dp[i]) dorx=i;}

 i=dp[0];
 dp[0]=dp[dorx];
 dp[dorx]=i;


}

void display(int pd[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%4d",pd[i]);
	printf("\n");
}
void main()
{
	int data[N],i,n=N;
	FILE *out ;

    out = fopen("out.dat","w") ;
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,0);
	display(data,n);
	NONO(out, data, n);
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,1);
	display(data,n);
	NONO(out, data, n);
	fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
	int i;
	for(i=0;i<n;i++)
		fprintf(fp, "%4d", pd[i]);
	fprintf(fp, "\n");

}


最近状态感觉很大问题呀,本该想到的点,却没想到

测试:

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

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

50.验证参数n是否可以分解成2个素数相乘,是则返回1,否则返回0,并通过指针变更x、y返回分解后的2个素数值,要求*x < *y

请编写函数fun,其功能是:验证参数n是否可以分解成2个素数相乘,是则返回1,否则

返回0,并通过指针变更x、y返回分解后的2个素数值,要求*x < *y。

主程序中将打印出分解结果。

例如:111=3*37, 当函数fun的参数n为111时,

可以分解为2个素数(3和37) 的乘积函数返回值为1。

另外,prime函 数验证参数m是否为素数,是则返回1,否则返回0。

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

仅在函数fun的花括号中填入所编写的若干语句。

PROG1. C:

#include<stdio.h>
#include<math.h>
int prime(int m)//判断是否是素数
{
	int k,flag=1;
	for(k=2;k<(int)sqrt((double)m);k++)
		if(m%k==0)
			flag=0;
	return flag;
}
int fun(int n,int *x,int *y)
{
	int k,flag=0;




    return flag;
}
main()
{
	int a,b;FILE *out ;
	out = fopen("out.dat","w") ;//w是创建一个用于写入的空文件
	if(fun(111,&a,&b)) {//三组测试数据
		printf("111=%d*%d\n",a,b);
		fprintf(out, "111=%d*%d\n",a,b);
	}
	if(fun(11111,&a,&b)) {
		printf("11111=%d*%d\n",a,b);
		fprintf(out, "11111=%d*%d\n",a,b);
	}
	if(fun(1111111,&a,&b)) {
		printf("1111111=%d*%d\n",a,b);
		fprintf(out,"1111111=%d*%d\n",a,b);
	}
   fclose(out);//关闭
   getchar();

}


解题思路:
注意1不是素数,所以遍历小于n的数时,要从2开始,我们可以把范围压缩在2到sqrt(n),正号也方便了*x<*y,可以*x=i,*y=n/i,素数的判断用题目给的prime函数就好了

答案:

1.自己做的:

#include<stdio.h>
#include<math.h>
int prime(int m)
{
	int k,flag=1;
	for(k=2;k<(int)sqrt((double)m);k++)
		if(m%k==0)
			flag=0;
	return flag;
}
int fun(int n,int *x,int *y)
{
	int k,flag=0;
      for(k=2;k<=sqrt(n);k++)//就这样
      {
        if(prime(k)&&n%k==0)
        {
          *x=k;
          *y=n/k;
          if(prime(*y))
          {
           flag=1;
           break;
          }
        }
      }



    return flag;
}
main()
{
	int a,b;FILE *out ;
	out = fopen("out.dat","w") ;
	if(fun(111,&a,&b)) {
		printf("111=%d*%d\n",a,b);
		fprintf(out, "111=%d*%d\n",a,b);
	}
	if(fun(11111,&a,&b)) {
		printf("11111=%d*%d\n",a,b);
		fprintf(out, "11111=%d*%d\n",a,b);
	}
	if(fun(1111111,&a,&b)) {
		printf("1111111=%d*%d\n",a,b);
		fprintf(out,"1111111=%d*%d\n",a,b);
	}
   fclose(out);
   getchar();

}


2.题库答案:

#include<stdio.h>
#include<math.h>
int prime(int m)
{
	int k,flag=1;
	for(k=2;k<(int)sqrt((double)m);k++)
		if(m%k==0)
			flag=0;
	return flag;
}
int fun(int n,int *x,int *y)
{
	int k,flag=0;
	int k2;
    k=2;
	do {//可以可以,帅,感觉比我的更快,
	  k2=n/k;
	  if (k*k2==n)
		  if (prime(k) && prime(k2) && k<k2) 
			  {flag=1; *x=k; *y=k2; break;}
	  k+=1;
	}
	while (k<k2);




    return flag;
}
main()
{
	int a,b;FILE *out ;
	out = fopen("out.dat","w") ;
	if(fun(111,&a,&b)) {
		printf("111=%d*%d\n",a,b);
		fprintf(out, "111=%d*%d\n",a,b);
	}
	if(fun(11111,&a,&b)) {
		printf("11111=%d*%d\n",a,b);
		fprintf(out, "11111=%d*%d\n",a,b);
	}
	if(fun(1111111,&a,&b)) {
		printf("1111111=%d*%d\n",a,b);
		fprintf(out,"1111111=%d*%d\n",a,b);
	}
   fclose(out);
   getchar();

}


测试:

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值