目录
- 前言:
- 1.将ss所指字符串中所有下标为奇数位置上的字母转换成大写
- 2.若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后
- 3.计算并输出给定整数n的所有因子(不包括1与n自身)之和
- 4.使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)
- 5.计算并输出下列多项式的值
- 6.统计出x所指数组中能被e整除的元素个数,通过函数值返回主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中
- 7.在形参指针所指的4个整数中找出最大值和最小值,最大的放在a中,最小的放在d中
- 8.统计各年龄段的人数
- 9.判断t所指字符串中的字母是否由连续递增字母序列组成
- 10.将s所指字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中
前言:
- 程序设计需要运行一遍,用.c文件是无法运行的,这时就要用.sln文件了,在考试系统提供的vs2010里调试,按ctrl+F5,也可以找到运行和保存按钮来执行,
- 程序设计那考试系统只检测最终运行结果的对错,如果没有会是0分,当然那个运行结果是由考试系统提供的输入数据产生的,这里说下程序设计提供的文件,会较程序填空和程序修改多两个二进制文件
in.dat:系统提供的测试数据
out.dat:这个是你运行之后才会出现的文件了,这个文件的内容就是系统检测的答案了,
1.将ss所指字符串中所有下标为奇数位置上的字母转换成大写
请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。
例如,若输入"abc4EFG",则应输出"aBc4EFG"。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
#include <string.h>
void fun( char *ss )
{
}
void main( void )
{
char tt[51];void NONO ();
printf( "\nPlease enter an character string within 50 characters:\n" );
gets( tt );
printf( "\n\nAfter changing, the string\n \"%s\"", tt );
fun(tt) ;
printf( "\nbecomes\n \"%s\"", tt );
NONO();//说一下,假如就是你平时想刷程序设计的题,但你又没有下载vs2010的环境,那么你可以把这句NONO()注释掉,NONO函数是系统评分的测试,你是用main函数的输入输出来判断自己是否对错的,但在考试可千万不要这么做
getchar();
}
void NONO ()//这个函数就是考试系统进行测试,这个函数里所做的与main内容相同,只不过测试数据通过读取in.dat文件获取
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
char tt[51], ch;
FILE *rf, *wf ;
int len, i=0 ;
rf = fopen("in.dat","r") ;//r打开一个用于读取的文件,这里也就是让指针rf指向文件in.dat
wf = fopen("out.dat","w") ;//w创建一个用于写入的空文件,如果之前已经创建过,那么会将之前的删除掉,重新创建,这里用意也就是如果你多次运行,最终也只会留下最后一次产生的out.dat文件,
while(i < 10) {//会进行10次循环,也就是进行10次测试
fgets( tt, 50, rf );//数组tt从文件指针rf指向的文件in.dat获取最多50个字符
len = strlen(tt) - 1 ;//得出的len是最大下标
ch = tt[len] ;
if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;//给字符串结尾
fun(tt);//执行fun函数
fprintf( wf, "%s\n", tt );//结果输出到文件指针wf指向的out.dat中
i++ ;
}
fclose(rf) ;//最后关闭两个文件指针
fclose(wf) ;
}
解题思路:
除题干外的其他因素,我想我解释的应该很清楚了,那看题目要求
- 题目说把字符串上下标为奇数的字母转化为大写字母,注意是下标啊,不要搞错了,还有只有字母才要转换,所以我们只要筛出字符串上下标为奇数且小写字母的元素即可,然后再将他们转换,那思路就很清晰了
- 题目给的代码中并没有给出头文件
#include<ctype.h>
,那就不能用islower()
和toupper()
,不然会方便很多
islower()
: 是判断小写字母
toupper()
:把小写字母转化为大写字母
答案:
当然答案有很多种,看大家的思路了,我这一般只列两个:
1.自己做的:
#include <stdio.h>
#include <string.h>
void fun( char *ss )
{
int i=0;
for(i=0;ss[i];i++)//这里循环条件为ss[i]就是ss[i]!='\0'
{
if(i%2&&ss[i]>='a'&&ss[i]<='z')
ss[i]-=32;//小写字母和大写字母的ASCII码的差为32
}
}
void main( void )
{
char tt[51];void NONO ();
printf( "\nPlease enter an character string within 50 characters:\n" );
gets( tt );
printf( "\n\nAfter changing, the string\n \"%s\"", tt );
fun(tt) ;
printf( "\nbecomes\n \"%s\"", tt );
NONO();
getchar();
}
void NONO ()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
char tt[51], ch;
FILE *rf, *wf ;
int len, i=0 ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
while(i < 10) {
fgets( tt, 50, rf );
len = strlen(tt) - 1 ;
ch = tt[len] ;
if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;
fun(tt);
fprintf( wf, "%s\n", tt );
i++ ;
}
fclose(rf) ;
fclose(wf) ;
}
2.题库的答案:
#include <stdio.h>
#include <string.h>
void fun( char *ss )
{
int i,n=0;
char *p;
p=ss;
while(*p++!='\0') //用指针p遍历字符串得字符串长度n,感觉应该也可以用strlen()吧,
n++;
for(i=1;i<n;i+=2)//i从1开始,每次自增加2,这样i一直都是奇数,也就不用在后面if中加判断if的条件了
if(ss[i]>='a' && ss[i]<='z')
ss[i]=ss[i]-'a'+'A';
}
void main( void )
{
char tt[51];void NONO ();
printf( "\nPlease enter an character string within 50 characters:\n" );
gets( tt );
printf( "\n\nAfter changing, the string\n \"%s\"", tt );
fun(tt) ;
printf( "\nbecomes\n \"%s\"", tt );
NONO();
getchar();
}
void NONO ()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
char tt[51], ch;
FILE *rf, *wf ;
int len, i=0 ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
while(i < 10) {
fgets( tt, 50, rf );
len = strlen(tt) - 1 ;
ch = tt[len] ;
if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;
fun(tt);
fprintf( wf, "%s\n", tt );
i++ ;
}
fclose(rf) ;
fclose(wf) ;
}
3.看到题库的答案,那我的还可以优化下,结合双方优点:
#include <stdio.h>
#include <string.h>
void fun( char *ss )//短就是好
{
int i=0;
for(i=1;ss[i];i+=2)
{
if(ss[i]>='a'&&ss[i]<='z')
ss[i]-=32;
}
}
void main( void )
{
char tt[51];void NONO ();
printf( "\nPlease enter an character string within 50 characters:\n" );
gets( tt );
printf( "\n\nAfter changing, the string\n \"%s\"", tt );
fun(tt) ;
printf( "\nbecomes\n \"%s\"", tt );
NONO();
getchar();
}
void NONO ()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
char tt[51], ch;
FILE *rf, *wf ;
int len, i=0 ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
while(i < 10) {
fgets( tt, 50, rf );
len = strlen(tt) - 1 ;
ch = tt[len] ;
if(ch == '\n' || ch == 0x1a) tt[len] = 0 ;
fun(tt);
fprintf( wf, "%s\n", tt );
i++ ;
}
fclose(rf) ;
fclose(wf) ;
}
测试:
2.若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后
请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。
例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
#define N 80
void fun(int *w, int p, int n)
{
}
main()
{ int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i,p,n=15;void NONO ();
printf("The original data:\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
printf("\n\nEnter p: ");scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
printf("\n\n");
NONO();
getchar();
}
void NONO ()//考试时系统进行评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf,*wf ; int a[N], i, j, p, n ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 5 ; i++) {//循环5次,也就是进行5次测试
fscanf(rf, "%d %d", &n, &p) ;//从文件指针rf指向的文件in.dat获取元素个数n和p
for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;//获取数组元素
fun(a, p, n) ;//执行fun函数
for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;//结果输出到文件指针wf指向的文件out.dat中,最后接个换行符与下一次测试的结果隔开
}
fclose(rf) ; fclose(wf) ;//关闭文件指针
}
解题思路:
-
看到这个fscanf(),想起之前见过的stdout,顺带讲一下:
fscanf(stdout,"%d",&n)
是基本与scanf("%d",&n)
是一样的
stdout 是一个标准输出流,它是 C 语言标准库中定义的一个文件指针,用于表示标准输出设备。
在大多数操作系统中,标准输出设备通常是指显示器或终端窗口。通过将数据输出到 stdout,可以将结果显示在屏幕上 -
我的思路是建一个新的数组把下标0到p的元素存起来,把下标为p+1到n-1的每个元素前移p+1个位置覆盖掉下标0到p的元素,再用新数组的元素覆盖原数组后p+1个元素,
-
注意,题目说了要移动的元素是含下标p的
答案:
1.自己想的:
#include <stdio.h>
#define N 80
void fun(int *w, int p, int n)
{
int a[n],i=0;
for(i=0;i<=p;i++)//把下标0到p的元素存起来
a[i]=w[i];
for(i=0;i<n-p-1;i++)//这里的循环条件你要看着难受,i+p+1<n,是不是看着舒服多了
w[i]=w[i+p+1];//把下标为p+1到n-1的每个元素前移p+1个位置覆盖掉下标0到p的元素
for(int j=0;j<=p;j++)//用新数组的元素覆盖原数组后p+1个元素
w[i+j]=a[j];
}
main()
{ int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i,p,n=15;void NONO ();
printf("The original data:\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
printf("\n\nEnter p: ");scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
printf("\n\n");
NONO();
getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf,*wf ; int a[N], i, j, p, n ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 5 ; i++) {
fscanf(rf, "%d %d", &n, &p) ;
for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
fun(a, p, n) ;
for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;
}
fclose(rf) ; fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#define N 80
void fun(int *w, int p, int n)
{int x,j,ch;
for(x=0;x<=p;x++)
{ch=w[0];//在内循环中后面元素全部前移一个位置,也就是说w[0]元素是一直在更新的
for(j=1;j<n;j++)
{
w[j-1]=w[j];
}
w[n-1]=ch; //内循环中后面元素的前移也让一开始赋到数组末尾前移,最后移到n-x-1下标
}
}
main()
{ int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i,p,n=15;void NONO ();
printf("The original data:\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
printf("\n\nEnter p: ");scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
printf("\n\n");
NONO();
getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf,*wf ; int a[N], i, j, p, n ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 5 ; i++) {
fscanf(rf, "%d %d", &n, &p) ;
for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
fun(a, p, n) ;
for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;
}
fclose(rf) ; fclose(wf) ;
}
测试:
3.计算并输出给定整数n的所有因子(不包括1与n自身)之和
请编写一个函数fun,它的功能是:计算并输出给定整数n的所有因子(不包括1与n自身)之和。规定n的值不大于1000。
例如,在主函数中从键盘给n输入的值为856,则输出为: sum=763。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句
PROG1.C:
#include <stdio.h>
#pragma warning (disable:4996)
int fun(int n)
{
}
main()
{ int n,sum;
void NONO( );
printf("Input n: "); scanf("%d",&n); getchar();
sum=fun(n);
printf("sum=%d\n",sum);
NONO();
getchar();
}
void NONO()//系统进行评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int i, n, sum ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {//10次循环,也就是要进行10次测试
fscanf(rf, "%d", &n) ;//从文件指针rf指向的文件in.dat获取到整数n
sum = fun(n) ;
fprintf(wf, "%d=%d\n", n, sum) ;//结果输出到文件指针wf指向的文件out.dat中
}
fclose(rf) ; fclose(wf) ;//关闭文件指针
}
解题思路:
- 这题的头文件有些限制发挥,这题做法就是整一个循环,题目说除开了1和自身,那就是2到n-1,在这个区间筛出n的因子,然后累加,
说一下理想解法,需要加个头文件#include<math.h>
:
思路就是对整数n取平方根,因子都是成对的,小于n的平方根的是因子对中小的因子,大于n的平方根的是因子对中大的因子,取平方根后,我们只需对2到n的平方根的范围筛出因子就可以了,每次都可以直接加上一个因子对
#include <stdio.h>
#include<math.h>//需要加个头文件,这里只是展示下,考试时可不要在fun函数外的地方做改动,以免出什么差错
#pragma warning (disable:4996)
int fun(int n)
{
int sum=0;
for(int i=2;i<=sqrt(n);i++)//加的头文件就是为了sqrt()这个平方根函数,
if(n%i==0)
sum=sum+i+n/i;//每次直接加上一个因子对
return sum;
}
main()
{ int n,sum;
void NONO( );
printf("Input n: "); scanf("%d",&n); getchar();
sum=fun(n);
printf("sum=%d\n",sum);
NONO();
getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int i, n, sum ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d", &n) ;
sum = fun(n) ;
fprintf(wf, "%d=%d\n", n, sum) ;
}
fclose(rf) ; fclose(wf) ;
}
答案:
1.自己想的:
#include <stdio.h>
#pragma warning (disable:4996)
int fun(int n)
{
int sum=0;
for(int i=2;i<n;i++)
if(n%i==0)
sum+=i;
return sum;
}
main()
{ int n,sum;
void NONO( );
printf("Input n: "); scanf("%d",&n); getchar();
sum=fun(n);
printf("sum=%d\n",sum);
NONO();
getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int i, n, sum ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d", &n) ;
sum = fun(n) ;
fprintf(wf, "%d=%d\n", n, sum) ;
}
fclose(rf) ; fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#pragma warning (disable:4996)
int fun(int n)
{
int i,s=0;
if(n<1000)
{for (i=2;i<n;i++)
if (n%i==0) s=s+i;}
return (s);
}
main()
{ int n,sum;
void NONO( );
printf("Input n: "); scanf("%d",&n); getchar();
sum=fun(n);
printf("sum=%d\n",sum);
NONO();
getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int i, n, sum ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d", &n) ;
sum = fun(n) ;
fprintf(wf, "%d=%d\n", n, sum) ;
}
fclose(rf) ; fclose(wf) ;
}
呃,没有加n<1000的限制,不过这个题库还是算我对了
测试:
4.使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)
请编一个函数fun,函数的功能是使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)。
例如: 实型数为1234.567,则函数返回1234.570000;
实型数为1234.564,则函数返回1234.560000。
注意:部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
PROG1.C:
#include <stdio.h>
float fun ( float h )
{
}
main( )
{ float a;void NONO ();
printf ("Enter a: "); scanf ( "%f", &a );
printf ( "The original data is : " );
printf ( "%f \n\n", a );
printf ( "The result : %f\n", fun ( a ) );
NONO( );
getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i ;
float a ;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 20 ; i++) {//循环20次,也就是有20个数据,20次测试
fscanf(rf, "%f", &a) ;//从文件指针rf指向的文件in.dat获取浮点数a
fprintf(wf, "%f\n", fun(a)) ;//最后结果输出到文件指针指向的文件out.dat
}
fclose(rf) ;//关闭文件指针
fclose(wf) ;
}
解题思路:
我的思路是把设一个int x
等于浮点数a1000,再判断x的个位是否大于5,若大于5则x/10+1,反之x/10,也就是四舍五入了,然后x1.0/100再赋回给a,
答案:
1.自己想的:
#include <stdio.h>
float fun ( float h )
{
int x=h*1000;
if(x%10<5)
x=x/10;
else
x=x/10+1;
h=x*1.0/100;//x*1.0是为了保证右边表达式最后结果是浮点数能够保留小数
return h;
}
main( )
{ float a;void NONO ();
printf ("Enter a: "); scanf ( "%f", &a );
printf ( "The original data is : " );
printf ( "%f \n\n", a );
printf ( "The result : %f\n", fun ( a ) );
NONO( );
getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i ;
float a ;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 20 ; i++) {
fscanf(rf, "%f", &a) ;
fprintf(wf, "%f\n", fun(a)) ;
}
fclose(rf) ;
fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
float fun ( float h )
{
return (int)(h*100+0.5)/100.0;//他这思路比我快好多,加0.5就是对第三位进行四舍五入,他int类型只对分子做了处理,抹掉了后面的小数
}
main( )
{ float a;void NONO ();
printf ("Enter a: "); scanf ( "%f", &a );
printf ( "The original data is : " );
printf ( "%f \n\n", a );
printf ( "The result : %f\n", fun ( a ) );
NONO( );
getchar();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i ;
float a ;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 20 ; i++) {
fscanf(rf, "%f", &a) ;
fprintf(wf, "%f\n", fun(a)) ;
}
fclose(rf) ;
fclose(wf) ;
}
测试:
斯,一测试才发现,这出的题的代码有些问题,也有可能是这题太旧了,总之现在这个c11版本的,float会因为精度的问题,你输入1234.567,实际上编译器得到的数会是1234.56702,
用double就正常了
5.计算并输出下列多项式的值
请编写函数fun,其功能是:计算并输出下列多项式的值:
例如,在主函数中从键盘给n输入15,则输出为:s=2.718282。
注意:要求n的值大于1但不大于100。
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
PROG1.C:
#include <stdio.h>
#pragma warning (disable:4996)
double fun(int n)
{
}
main()
{ int n; double s;
void NONO( );
printf("Input n: "); scanf("%d",&n); getchar();
s=fun(n);
printf("s=%f\n",s);
NONO();
getchar();
}
void NONO()//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int n, i ; double s ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {//有10组测试数据
fscanf(rf, "%d", &n) ;//从文件指针rf指向的文件in.dat获取n
s = fun(n) ;
fprintf(wf, "%lf\n", s) ;//结果输出到文件指针wf指向的文件out.dat
}
fclose(rf) ; fclose(wf) ;//关闭
}
解题思路:
直接看答案吧,这种求解多项式的,都挺简单的,就是把给的公式的规律转化为循环结构
答案:
1.自己做的
#include <stdio.h>
#pragma warning (disable:4996)
double fun(int n)
{
double sum=1,x=1;
for(int i=1;i<=n;i++)//题目公式中通过分母可看出后面分式有n项
{
x=x*i;//阶乘
sum+=1.0/x;//累计得多项式的和
}
return sum;
}
main()
{ int n; double s;
void NONO( );
printf("Input n: "); scanf("%d",&n); getchar();
s=fun(n);
printf("s=%f\n",s);
NONO();
getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int n, i ; double s ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%lf\n", s) ;
}
fclose(rf) ; fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#pragma warning (disable:4996)
double fun(int n)
{
double m=1.0,p=1.0;
int i;
for(i=1;i<=n;i++)
{ p=p*i;
m=m+1.0/p;
}
return (m);
}
main()
{ int n; double s;
void NONO( );
printf("Input n: "); scanf("%d",&n); getchar();
s=fun(n);
printf("s=%f\n",s);
NONO();
getchar();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int n, i ; double s ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%lf\n", s) ;
}
fclose(rf) ; fclose(wf) ;
}
基本一样了,
测试:
6.统计出x所指数组中能被e整除的元素个数,通过函数值返回主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中
请编写函数fun,其功能是:统计出x所指数组中能被e整除的元素个数,通过函数值返回
主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中。
例如:当数组x内容为1, 7,8,6, 10, 15, 11, 13, 29,31,整数e内容为3时,
输出结果应该是: n=2, sum=110
注意:部分源程序存在文件PROG1. C中。
请勿更改主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
PROG1. C:
#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{
}
main()
{
void NONO();
int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
n=fun(x, e, &sum);
printf("n=%d,sum=%d\n", n, sum);
NONO();
}
void NONO()//系统用于评测的函数
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i, j, x[10], n, e, sum;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i=0; i<5; i++) {//有5组数据
for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]); fscanf(rf, "%d", &e);//从文件指针rf指向的文件in.dat获取数组元素,和e
n = fun( x, e, &sum );
fprintf(wf, "%d, %d\n", n, sum);//结果输出到文件指针wf指向的文件out.dat
}
fclose(rf) ;
fclose(wf) ;
}
解题思路:
用一个for循环遍历数组筛选,不过注意sum在主函数里没有初始化,那我们要在fun函数里初始化为0,这算是个坑
答案:
1.自己做的:
#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{
int n=0;
*sum=0;
for(int i=0;i<N;i++)
{
if(x[i]%e==0)
n++;
else
*sum+=x[i];
}
return n;
}
main()
{
void NONO();
int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
n=fun(x, e, &sum);
printf("n=%d,sum=%d\n", n, sum);
NONO();
}
void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i, j, x[10], n, e, sum;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i=0; i<5; i++) {
for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]); fscanf(rf, "%d", &e);
n = fun( x, e, &sum );
fprintf(wf, "%d, %d\n", n, sum);
}
fclose(rf) ;
fclose(wf) ;
}
题库答案:
#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{int i,n=0;
*sum=0;
for(i=0;i<N;i++)
if(x[i]%e==0) n++;
else *sum+=x[i];
return n;
}
main()
{
void NONO();
int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
n=fun(x, e, &sum);
printf("n=%d,sum=%d\n", n, sum);
NONO();
}
void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i, j, x[10], n, e, sum;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i=0; i<5; i++) {
for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]); fscanf(rf, "%d", &e);
n = fun( x, e, &sum );
fprintf(wf, "%d, %d\n", n, sum);
}
fclose(rf) ;
fclose(wf) ;
}
基本一样*____*
测试:
7.在形参指针所指的4个整数中找出最大值和最小值,最大的放在a中,最小的放在d中
请编写函数fun:在形参指针所指的4个整数中找出最大值和最小值,
最大的放在a中,最小的放在d中。
注意:部分源程序存在PROG1. C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
PROG1. C:
#include <stdio.h>
void NONO();
void fun(int *a, int *b, int *c, int *d)
{
}
main()
{ int a, b, c, d;
printf("请输入4个整数: "); scanf("%d%d%d%d", &a,&b,&c,&d);
printf("输入数据: %d,%d,%d,%d\n", a, b, c, d);
fun(&a,&b,&c,&d);
printf("最大值:%d,最小值:%d\n", a, d);
NONO();
getchar();
}
void NONO()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, a, b, c, d ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for( i=0; i<5; i++ )//有5组测试数据
{
fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);//从文件指针fp指向的文件in.dat获取一组测试数据
fun(&a,&b,&c,&d); //测试你的代码
fprintf(wf, "a=%d,d=%d\n", a, d);//结果输出到文件指针指向的文件out.dat存放
}
fclose(fp) ;//关闭
fclose(wf) ;
}
解题思路:
比大小,思路很多,我想的是用三目运算法,要注意先用两个中继变量得四个变量中的最大值和最小值,再去赋给a,和d,以免出错
答案:
1.自己做的:
#include <stdio.h>
void NONO();
void fun(int *a, int *b, int *c, int *d)
{
int x=*a>*b?(*a>*c?(*a>*d?*a:*d):(*c>*d?*c:*d)):(*b>*c?(*b>*d?*b:*d):(*c>*d?*c:*d));//我个人认为我这括号大大的提高了可读性(‾◡◝)
int y=*d>*a?(*a>*c?(*c>*b?*b:*c):(*a>*b?*b:*a)):(*d>*c?(*c>*b?*b:*c):(*d>*b?*b:*d));
*a=x;
*d=y;
}
main()
{ int a, b, c, d;
printf("请输入4个整数: "); scanf("%d%d%d%d", &a,&b,&c,&d);
printf("输入数据: %d,%d,%d,%d\n", a, b, c, d);
fun(&a,&b,&c,&d);
printf("最大值:%d,最小值:%d\n", a, d);
NONO();
getchar();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, a, b, c, d ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for( i=0; i<5; i++ )
{
fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
fun(&a,&b,&c,&d);
fprintf(wf, "a=%d,d=%d\n", a, d);
}
fclose(fp) ;
fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
void NONO();
void fun(int *a, int *b, int *c, int *d)
{
int max,min;
max=*a;
min=*d;
if(*b>max){max=*b;}
if(*c>max){max=*c;}
if(*d>max){max=*d;}
if(*a<min){min=*a;}
if(*b<min){min=*b;}
if(*c<min){min=*c;}
*a=max;
*d=min;
}
main()
{ int a, b, c, d;
printf("请输入4个整数: "); scanf("%d%d%d%d", &a,&b,&c,&d);
printf("输入数据: %d,%d,%d,%d\n", a, b, c, d);
fun(&a,&b,&c,&d);
printf("最大值:%d,最小值:%d\n", a, d);
NONO();
getchar();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, a, b, c, d ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for( i=0; i<5; i++ )
{
fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
fun(&a,&b,&c,&d);
fprintf(wf, "a=%d,d=%d\n", a, d);
}
fclose(fp) ;
fclose(wf) ;
}
我觉得我的更好看点(〃 ̄︶ ̄)人( ̄︶ ̄〃)
测试:
8.统计各年龄段的人数
请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,其余依此类推,把100岁(含100)以上年龄的人数都放在d[10]中。结果在主函数中输出。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
#define N 50
#define M 11
void fun( int *a, int *b)
{
}
double rnd()//这是一个伪随机数生成函数
{ static t=29,c=217,m=1024,r=0;//静态变量,保留上一次生成的伪随机数和常量值
r=(r*t+c)%m; return((double)r/m);//使用线性同余法生成伪随机数,返回生成的伪随机数除以m得到的结果,即介于0到1之间的浮点数
}
main()
{ int age[N], i, d[M];void NONO (int d[M]);
for(i=0; i<N;i++)age[i]=(int)(115*rnd());
printf("The original data :\n");
for(i=0;i<N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]);//这里用了个三目运算法使其每10个数一行,
printf("\n\n");
fun( age, d);
for(i=0;i<10;i++)printf("%4d---%4d : %4d\n",i*10,i*10+9,d[i]);//i*10和i*10+9是为了描述每个年龄段,在输出时会输出0--9,10--19.……
printf(" Over 100 : %4d\n",d[10]);
NONO(d);
getchar();
}
void NONO(int d[M])//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *wf ; int i ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) fprintf(wf, "%4d---%4d : %4d\n", i*10, i*10+9, d[i]) ;//这次将main函数里得出的结果写入到文件out.dat中,这题没有in.dat
fprintf(wf, " Over 100 : %4d\n", d[10]) ;
fclose(wf) ;
}
解题思路:
说下题目给的代码中比较新颖的点,
printf((i+1)%10==0?"%4d\n":"%4d",age[i])
//因为下标是从0开始的,所以是i+1,注意双引号内的才是会输出的,当i+1为10的倍数时,(i+1)%10==0成立,则输出的是"%4d\n",否则是"%4d",
我见的代码还不多,对于这种在printf里用三目运算法还是很稀奇的o((>ω< ))o
说下线性同余法:
线性同余法是一种简单的伪随机数生成方法,
线性同余法的递推公式如下:
Xn+1 = (a * Xn + c) % m
其中,Xn是当前的伪随机数,Xn+1是下一个伪随机数,a,c,m是预定义的常量。
具体步骤:
1.初始化X0,即初始种子
2.使用递推公式计算X1,X2,X3……,直到得到所需数量的伪随机数
在应用中,常常将递推公式中的常量a,c,m设置为合适的值,以获得满足要求的伪随机数序列,常用的选择是:
a是一个较大的质数
c为一个较小的非负整数
m为一个较大的整数
最后将Xn+1除以m是为了将生成的随机数映射到一个介于0到1之间的范围,线性同余法生成的伪随机数序列Xn通常是一个整数。通过将Xn除以m,可以得到一个小于1的浮点数。m通常是一个大于Xn的正整数,所以结果会小于1
题目代码中随机数范围是0到115,从age[i]=(int)(115*rnd())
可看出,因为rnd()返回值是0到1的,
回到题目:
根据题意可以看出,年龄除以10得出的就是数组d中的下标,那就只需要做个循环,遍历数组age,d[a[i]/10]++
就好了
不过要注意,数组d在main函数是没有初始化的,我们需要在fun函数里初始化为0一下,还有年龄是有可能为110的,这时候a[i]/10
得出的是11了,不过我们应该存入d[10]才对,所以这里应该,对a[i]>=110
的情况用if
做个特殊处理
答案:
1.自己想的
#include <stdio.h>
#define N 50
#define M 11
void fun( int *a, int *b)
{
for(int i=0;i<M;i++)//初始化数组b
b[i]=0;
for(int i=0;i<N;i++)
{
if(a[i]>=110)//处理特殊情况
b[10]++;
else
b[a[i]/10]++;
}
}
double rnd()
{ static t=29,c=217,m=1024,r=0;
r=(r*t+c)%m; return((double)r/m);
}
main()
{ int age[N], i, d[M];void NONO (int d[M]);
for(i=0; i<N;i++)age[i]=(int)(115*rnd());
printf("The original data :\n");
for(i=0;i<N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]);
printf("\n\n");
fun( age, d);
for(i=0;i<10;i++)printf("%4d---%4d : %4d\n",i*10,i*10+9,d[i]);
printf(" Over 100 : %4d\n",d[10]);
NONO(d);
getchar();
}
void NONO(int d[M])
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *wf ; int i ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) fprintf(wf, "%4d---%4d : %4d\n", i*10, i*10+9, d[i]) ;
fprintf(wf, " Over 100 : %4d\n", d[10]) ;
fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#define N 50
#define M 11
void fun( int *a, int *b)
{int i;
for(i=0;i<M;i++)
b[i]=0;
for(i=0;i<N;i++)
b[*(a+i)/10>10?10:*(a+i)/10]++;//他这里用三目运算法处理特殊情况,确实更好看些(*^▽^*)
}
double rnd()
{ static t=29,c=217,m=1024,r=0;
r=(r*t+c)%m; return((double)r/m);
}
main()
{ int age[N], i, d[M];void NONO (int d[M]);
for(i=0; i<N;i++)age[i]=(int)(115*rnd());
printf("The original data :\n");
for(i=0;i<N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]);
printf("\n\n");
fun( age, d);
for(i=0;i<10;i++)printf("%4d---%4d : %4d\n",i*10,i*10+9,d[i]);
printf(" Over 100 : %4d\n",d[10]);
NONO(d);
getchar();
}
void NONO(int d[M])
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *wf ; int i ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) fprintf(wf, "%4d---%4d : %4d\n", i*10, i*10+9, d[i]) ;
fprintf(wf, " Over 100 : %4d\n", d[10]) ;
fclose(wf) ;
}
测试:
这个在线编译是我用过的最好用的了,用这个的话你可以把in.dat移到项目中,NONO函数也可以执行了
main函数的输出:
out.dat里的样子:
9.判断t所指字符串中的字母是否由连续递增字母序列组成
请编写函数fun,其功能是:判断t所指字符串中的字母是否由连续递增字母序列组成
(字符串长度大于等于2)。
例如:字符串: uvwxyz满足要求;
而字符串: uvxwyz不满足要求。
注意:部分源程序存在PROG1. C中,请勿改动主函数main和其他函数中的任何内容,
仅在函数fun指定的部位填入所编写的若干语句。
PROG1. C:
#include <stdio.h>
#include <string.h>
void NONO();
int fun( char *t )
{
}
main()
{ char s[26];
printf("请输入一个字母组成的字符串 : "); gets(s);
if( fun(s) ) printf("%s 是由连续字母组成的字符串.\n", s );
else printf("%s 不是由连续字母组成的字符串!\n", s );
NONO();
getchar();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i;
char s[26], *p;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {//有10组测试数据
fgets(s, 26, fp);//从文件指针指向的文件in.dat获取数组s
p=strchr(s,'\n');//strchr函数是对字符串中的单个字符进行查找,返回该字符的地址
if(p) *p=0;//指针p如果不为0,那么就在上一句中获取到了地址,那么此时指针p指向'\n',这里是将字符串中的换行符替换为字符串结束符'\0',
if (fun(s)) fprintf(wf, "%s\n", s+2);//这里看得出检测方式是如果是连续字母组成的字符串,则从s[2]开始输出
else fprintf(wf, "%s\n", strrev(s));//strrev()是将字符串倒序,如果不是连续字母组成的,则输出倒序字符串
}
fclose(fp) ;//关闭
fclose(wf) ;
}
解题思路:
先说下题目一些稀奇的点:
- 首先最让人难绷的是strrev()函数,strrev()函数用于字符串逆序操作,但这个函数不是标准C库提供的函数,要用的话得自己实现它或使用第三方库中提供,可是在网上搜的话,大部分教程都会说该函数头文件是
#include<string.h>
,都没提strrev()
不是标准C库函数,害得我反复试了几遍,我有些好奇这题在考试中能不能运行成功,现在计算机二级的环境都是vs2010,也许vs2010中函数库有strrev()函数,不然总不可能运行失败吧,
函数原型: char *strrev(char *str);
功 能: 将字符串中的字符全部颠倒顺序,重新排序
参 数: char *str
为要进行倒序的字符串
返回值: 返回指向颠倒顺序后的字符串指针
因为我在测试的时候strrev()函数是无法识别的,我干脆自己定义了一个,在测试的时候加上,当然大伙可不要在答案加上自己定义的函数,我在这里列出来:
char* strrev(char* str) {
int len = strlen(str);
int i, j;
char temp;
for (i = 0, j = len - 1; i < j; i++, j--) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
return str;
}
- strchr()函数:用于查找字符串中的一个字符,并返回该字符在字符串中第一次出现的位置,头文件是
#include<string.h>
函数原型:char *strchr(const char *str, char c)
功能: 查找字符串中第一个出现的指定字符的位置
参数: char *str
为要查找的目标字符串,char c
为要查找的字符;
返回值: 成功 返回字符第一次出现的位置;失败 返回NULL;
好了,回到题目,这题还是很简单的,我们只需写一个循环遍历字符串,循环条件为s[i+1]!='\0'
,循环内设一个if判断t[i+1]-t[i]!=1
,如果成立,不是连续字母组成的,返回0,反之,返回1
答案:
1.自己做的:
#include <stdio.h>
#include <string.h>
void NONO();
int fun( char *t )
{
for(int i=0;t[i+1];i++)
{
if(t[i+1]-t[i]!=1)
return 0;
}
return 1;
}
main()
{ char s[26];
printf("请输入一个字母组成的字符串 : "); gets(s);
if( fun(s) ) printf("%s 是由连续字母组成的字符串.\n", s );
else printf("%s 不是由连续字母组成的字符串!\n", s );
NONO();
getchar();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i;
char s[26], *p;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fgets(s, 26, fp);
p=strchr(s,'\n');
if(p) *p=0;
if (fun(s)) fprintf(wf, "%s\n", s+2);
else fprintf(wf, "%s\n", strrev(s));
}
fclose(fp) ;
fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#include <string.h>
void NONO();
int fun( char *t )
{
int k=0,i=0;
while(t[i+1]){
if(t[i+1]==t[i]+1)
{
k++;
i++;
}else{
k=0;
break;
}
}
return k;
}
main()
{ char s[26];
printf("请输入一个字母组成的字符串 : "); gets(s);
if( fun(s) ) printf("%s 是由连续字母组成的字符串.\n", s );
else printf("%s 不是由连续字母组成的字符串!\n", s );
NONO();
getchar();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i;
char s[26], *p;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fgets(s, 26, fp);
p=strchr(s,'\n');
if(p) *p=0;
if (fun(s)) fprintf(wf, "%s\n", s+2);
else fprintf(wf, "%s\n", strrev(s));
}
fclose(fp) ;
fclose(wf) ;
}
看起来还是我的更好些,简洁明了
测试:
main函数的输出:
in.dat(10组测试数据):
难绷,又发现了个编译器上差别的问题,在从二进制文件识别换行符时,出了些问题,
我下了个断点:
可以看到这个换行符从\n
被识别成了\r\n
,然后在后面指针p指向了s[15]的\n
,
把s[15]替换成了空,保留了\r
,这个\r
导致后面被识别为不是连续字母组成的字符串
导致了fun(s)返回0,变成错的了
解决办法:
寻找\n
改为寻找\r
的地址
p=strchr(s,'\r');
if(p) *p=0;
这个换行符的字符好像与电脑系统也有关,在 Windows 系统中,默认的换行符是回车符(\r
)后跟换行符(\n
),即 \r\n
。在类似于 Unix/Linux 的环境中,通常使用换行符(\n)作为换行的标识符,
题外话:
wk,这题问题真多,难受,写这么多,都想单开一篇文讲了╰(‵□′)╯,以前都不知道为什么用gets不安全,现在终于明白了
10.将s所指字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中
函数fun的功能是:将s所指字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为"ABCDEFG12345",其中字符A的ASCII码值为奇数、…、字符1的ASCII码值也为奇数、…都应当删除,其它依次类推。最后t所指的数组中的内容应是:“BDF24”。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
#include <string.h>
void fun(char *s, char t[])
{
}
main()
{
char s[100], t[100];void NONO ();
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
getchar();
}
void NONO ()//系统用于评测的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
char s[100], t[100] ;
FILE *rf, *wf ;
int i ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {//有10组测试数据
fscanf(rf, "%s", s) ;//从文件指针rf指向的文件获取数组s
fun(s, t) ;
fprintf(wf, "%s\n", t) ;//结果输出到文件指针指向的文件out.dat
}
fclose(rf) ;//关闭
fclose(wf) ;
}
解题思路:
这次没有什么花里胡哨的东西了
这题说要删除ASCII值为奇数的,那我们直接筛出ASCII值为偶数的字符存入数组t就好了,
答案:
#include <stdio.h>
#include <string.h>
void fun(char *s, char t[])
{
int count=0;
for(int i=0;s[i];i++)
{
if((s[i]-'0')%2==0)//好像不减这个字符0直接取余也可以
t[count++]=s[i];
}
t[count]='\0';//要注意一定要记得字符串结尾加个'\0'
}
main()
{
char s[100], t[100];void NONO ();
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
char s[100], t[100] ;
FILE *rf, *wf ;
int i ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%s", s) ;
fun(s, t) ;
fprintf(wf, "%s\n", t) ;
}
fclose(rf) ;
fclose(wf) ;
}
2.题库答案:
#include <stdio.h>
#include <string.h>
void fun(char *s, char t[])
{
int i,slenth,n=0;
slenth=strlen(s);
for(i=0;i<slenth;i++)
if(s[i]%2==0)//直接除的
t[n++]=s[i];
t[n]='\0';
}
main()
{
char s[100], t[100];void NONO ();
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
char s[100], t[100] ;
FILE *rf, *wf ;
int i ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%s", s) ;
fun(s, t) ;
fprintf(wf, "%s\n", t) ;
}
fclose(rf) ;
fclose(wf) ;
}
差不多。只不过题库用了strlen()函数得出了字符串长度
测试:
main函数:
in.dat:
out.dat: