目录
- 41.计算下列级数和,和值由函数值返回
- 42.统计出x所指数组中能被e整除的所有元素,这些元素的和通过函数值返回主函数,元素个数通过形参num返回主函数
- 43.使数组右上三角元素中的值乘以m
- 44.将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的千位和十位上
- 45.找出用1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数,然后把这些三位数按从小到大的顺序依次存入相应的数组xxx中,符合条件的个数由函数值返回
- 46.将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的千位和十位上
- 47.给定一个整数n(n<10000),如果n加上100后是一个完全平方数(所谓“完全平方数”,就是开方后的结果是整数的数),并且n加上268也是一个完全平方数,则函数值返回1,否则返回0
- 48.将形参s所指的字符串放入形参a所指的字符数组中,使a中存放同样的字符串
- 49.找出dp所指数组中的最小或最大值,并与其第1个元素交换。形参n为元素的个数,形参upordown为查找标志:值为0时找最小值;值为1时找最大值
- 50.验证参数n是否可以分解成2个素数相乘,是则返回1,否则返回0,并通过指针变更x、y返回分解后的2个素数值,要求*x < *y
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: