目录
- 51.从整数10到55之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回
- 52.先将s所指字符串中的字符按逆序存放到t所指字符串中,然后把s所指串中的字符按正序连接到t所指串的后面
- 53.统计s所指维数组中0的个数(存在变量zero中)和1的个数(存在变量one中),并输出结果
- 54.删除b所指数组中小于10的数据。主函数中输出删除后数组中余下的数据
- 55.在任意给定的N个正整数中,从左到右依次逐个取三个数作为一组,按值大小找出该组数的中值,用该中值替换与该组数对应的原三个数中的中间位置的数。处理后原数列中首尾2个数不变。处理后数列在主函数中输出
- 56.根据以下公式求值,并作为函数值返回
- 57.读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行
- 58.将形参str所指字符串中的数字字符按从前往后出现的次序从左往右拼接成一个整数,返回主函数输出
- 59.求S的值
51.从整数10到55之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回
给定程序modi1.c中函数fun的功能是:从整数10到55之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
modi1.c:
#include <stdio.h>
int fun( int *b )
{ int k,a1,a2,i=0;for(k=10; k<=55; k++) {
/************found************/a2=k/1O;//0写成了大写的O,a1=k-a2*10;if((k%3==0 && a2==5)||(k%3==0 && a1==5)){ b[i]=k; i++; }}
/************found************/return k;//最后返回的应该是这些数的个数}
main( )
{ int a[100],k,m;m=fun( a );printf("The result is :\n");for(k=0; k<m; k++) printf("%4d",a[k]); printf("\n");getchar();
}
解题思路:
0写成了O挺像新手会犯的错,毕竟在键盘上也挨得挺近的,在记事本上也很像
答案:
#include <stdio.h>
int fun( int *b )
{ int k,a1,a2,i=0;for(k=10; k<=55; k++) {
/************found************/a2=k/10;a1=k-a2*10;if((k%3==0 && a2==5)||(k%3==0 && a1==5)){ b[i]=k; i++; }}
/************found************/return i;}
main( )
{ int a[100],k,m;m=fun( a );printf("The result is :\n");for(k=0; k<m; k++) printf("%4d",a[k]); printf("\n");getchar();
}
测试:
52.先将s所指字符串中的字符按逆序存放到t所指字符串中,然后把s所指串中的字符按正序连接到t所指串的后面
给定程序modi1.c中函数fun的功能是:先将s所指字符串中的字符按逆序存放到t所指字符串中,然后把s所指串中的字符按正序连接到t所指串的后面。
例如:当s中的字符串为:"ABCDE"时,则t中的字符串应为:“EDCBAABCDE”。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
modi1.c:
#include <stdio.h>
#include <string.h>void fun (char *s, char *t)
{
/************found************/int i;//这里可以明显看到是少定义了一个变量sl,注意是sl,l是字母,不是数字1,在有的字符格式里l和1可谓格外相似,这里建议大家看到题目代码有的直接复制比较好i=0;sl = strlen(s);for (; i<sl; i++)
/************found************/t[i] = s[sl-i];//数组下标是从0开始的,所以对应得倒序元素下标应为sl-i-1for (i=0; i<sl; i++)//接上正序的字符串t[sl+i] = s[i];t[2*sl] = '\0';
}main()
{ char s[100], t[100];printf("\nPlease enter string s:"); scanf("%s", s);fun(s, t);printf("The result is: %s\n", t);getchar();
}
解题思路:
虽然修改书写错误很简单,这种错误更多考的是细心
答案:
#include <stdio.h>
#include <string.h>void fun (char *s, char *t)
{
/************found************/int i,sl;i=0;sl = strlen(s);for (; i<sl; i++)
/************found************/t[i] = s[sl-i-1];for (i=0; i<sl; i++)t[sl+i] = s[i];t[2*sl] = '\0';
}main()
{ char s[100], t[100];printf("\nPlease enter string s:"); scanf("%s", s);fun(s, t);printf("The result is: %s\n", t);getchar();
}
测试:
53.统计s所指维数组中0的个数(存在变量zero中)和1的个数(存在变量one中),并输出结果
给定程序MODI1.C中,函数fun()的功能是统计s所指维数组中0的个数(存在变量zero中)和1的个数(存在变量one中),并输出结果。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
MODI1.C:
#include <stdio.h>
void fun( int *s, int n )
{
/**********found**********/int i, one=0, zero ;//zero在后面都是累加的,所以必须要初始化为0for(i=0; i<n; i++)
/**********found**********/switch( s[i] );//switch()后面是不带分号的{
/**********found**********/case 0 : zero++;//case语句后面不加break的话,后面的语句就都会执行,直到遇到break语句或switch语句结束case 1 : one ++;}printf( "one : %d zero : %d\n", one, zero);
}
main()
{ int a[20]={1,1,1,0,1,0,0,0,1,0,0,1,1,0,0,1,0,1,0,0}, n=20;fun( a, n );getchar();
}
解题思路:
主要考察switch-case的结构
答案:
#include <stdio.h>
void fun( int *s, int n )
{
/**********found**********/int i, one=0, zero=0 ;for(i=0; i<n; i++)
/**********found**********/switch( s[i] ){
/**********found**********/case 0 : zero++;break;case 1 : one ++;}printf( "one : %d zero : %d\n", one, zero);
}
main()
{ int a[20]={1,1,1,0,1,0,0,0,1,0,0,1,1,0,0,1,0,1,0,0}, n=20;fun( a, n );getchar();
}
测试:
54.删除b所指数组中小于10的数据。主函数中输出删除后数组中余下的数据
给定程序MODI1.C中,fun函数的功能是:删除b所指数组中小于10的数据。主函数中输出删除后数组中余下的数据。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
MODI1.C:
#include <stdio.h>
#include <stdlib.h>
#define N 20
int fun( int *b )
{
/**********found**********/int t[N] ,i, num//由题意可知num是删除数组中小于10的数据后还剩下的数据个数,要初始化为0,且定义变量最后没加分号结尾for(i=0; i<N; i++)if(b[i]>=10)
/**********found**********/t[++num]=b[i];//这里num应该是后自增运算符,不然的话存入数组t的数据就是从下标1开始了
/**********found**********/for(i=0; i<nun; i++)//循环条件应该是小于numb[i]=t[i];return( num );
}
main()
{ int a[N],i,num;printf("a数组中的数据 :\n");for(i=0;i<N ;i++) {a[i]=rand()%21; printf("%4d",a[i]);}//数组a内数据取随机数,范围为[0,20]printf("\n");num=fun(a);for(i=0;i<num ;i++) printf("%4d",a[i]);printf("\n");getchar();
}
解题思路:
随机数函数:
rand()%(n-m+1)+m
//随机数范围为[m,n]
答案:
#include <stdio.h>
#include <stdlib.h>
#define N 20
int fun( int *b )
{
/**********found**********/int t[N] ,i, num=0;for(i=0; i<N; i++)if(b[i]>=10)
/**********found**********/t[num++]=b[i];
/**********found**********/for(i=0; i<num; i++)b[i]=t[i];return( num );
}
main()
{ int a[N],i,num;printf("a数组中的数据 :\n");for(i=0;i<N ;i++) {a[i]=rand()%21; printf("%4d",a[i]);}printf("\n");num=fun(a);for(i=0;i<num ;i++) printf("%4d",a[i]);printf("\n");getchar();
}
测试:
55.在任意给定的N个正整数中,从左到右依次逐个取三个数作为一组,按值大小找出该组数的中值,用该中值替换与该组数对应的原三个数中的中间位置的数。处理后原数列中首尾2个数不变。处理后数列在主函数中输出
给定程序MODI1.C中,函数fun的功能是:在任意给定的N个正整数中,从左到右依次逐个取三个数作为一组,按值大小找出该组数的中值,用该中值替换与该组数对应的原三个数中的中间位置的数。处理后原数列中首尾2个数不变。处理后数列在主函数中输出。例如,有10个正整数如下:
初始数列为:6 5 7 23 18 5 8 21 45 38
第1组数为:6 5 7 中值为:6 替换后的数列为:6 6 7 23 18 5 8 21 45 38
第2组数为:5 7 23 中值为:7 替换后的数列为:6 6 7 23 18 5 8 21 45 38
第3组数为:7 23 18中值为:18替换后的数列为: 6 6 7 18 18 5 8 21 45 38
第4组数为:28 18 5中值为:18替换后的数列为:6 6 7 18 18 5 8 21 45 38
第5组数为: 18 5 8中值为:8 替换后的数列为:6 6 7 18 18 8 8 21 45 38
第6组数为: 5 8 21中值为:8 替换后的数列为:6 6 7 18 18 8 8 21 45 88
第7组数为:8 21 45中值为:21替换后的数列为:6 6 7 18 18 8 8 21 45 38
第8组数为:21 45 38中值为:38替换后的数列为: 6 6 7 18 18 8 8 21 38 38
最终结果为:6 6 7 18 18 8 8 21 38 38
请改正程序中指定部位的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
MODI1.C:
#include <stdio.h>
#define N 10
int findmid(int a, int b, int c)
{ int t;t = (a>b)?(b>c?b:(a>c?c:a)):((a>c)?a:((b>c)?c:b));//这个三目运算法看起来挺复杂的,可以自个慢慢推下,就是找出三个数的中值
/**********found**********/return b;//这里应该是返回中值,也就是返回t
}
void fun(int x[])
{ int i,a,b,c,t[N];
/**********found**********/for(i=0;i<N;i++) t[i]=x[i]//语句的结尾应该加分号for(i=0;i<N-2;i++){ a=t[i];b=t[i+1];c=t[i+2];
/**********found**********/t[i+1]=findmid(a,b,c);//如果这里赋给数组t的话,那么就还要把数组t赋给数组x,显然后续没有这么做,所以这里应该直接赋给数组x}
}
main()
{ int i, x[N]={6,5,7,23,18,5,8,21,45,38};for(i=0; i<N; i++) printf("%d ",x[i]);printf("\n");fun(x);for(i=0; i<N; i++) printf("%d ",x[i]);printf("\n");getchar();
}
解题思路:
这题代码复杂的点可能就在那个三目运算符了,这种还是自己去推一遍才有感觉,如果用if估计要挂一大串,用三目运算符还是要简洁很多的
答案:
#include <stdio.h>
#define N 10
int findmid(int a, int b, int c)
{ int t;t = (a>b)?(b>c?b:(a>c?c:a)):((a>c)?a:((b>c)?c:b));
/**********found**********/return t;
}
void fun(int x[])
{ int i,a,b,c,t[N];
/**********found**********/for(i=0;i<N;i++) t[i]=x[i];for(i=0;i<N-2;i++){ a=t[i];b=t[i+1];c=t[i+2];
/**********found**********/x[i+1]=findmid(a,b,c);}
}
main()
{ int i, x[N]={6,5,7,23,18,5,8,21,45,38};for(i=0; i<N; i++) printf("%d ",x[i]);printf("\n");fun(x);for(i=0; i<N; i++) printf("%d ",x[i]);printf("\n");getchar();
}
测试:
56.根据以下公式求值,并作为函数值返回
给定程序MODI1.C中函数fun的功能是:根据以下公式求值,并作为函数值返回。
例如,给指定精度的变量eps输入0.0005时,应当输出Pi=3.140578。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
MODI1.C:
#include <math.h>
#include <stdio.h>
double fun(double eps)
{ double s,t; int n=1;s=0.0;
/************found************/t=0;//通过下面的循环可以看出t就是公式中累加的每一项,可以看到公式中第一项是1,所以t应该初始化为1while( t>eps){ s+=t;t=t * n/(2*n+1);n++;}
/************found************/return(s);//题目中最后公式得到的是Π/2,而我们要求的是Π,所以这里应该还要乘以2
}
main()
{ double x;printf("\nPlease enter a precision: "); scanf("%lf",&x);printf("\neps=%lf, Pi=%lf\n\n",x,fun(x));getchar();
}
解题思路:
题目真是云里雾里的,其实最后函数要得出的是圆周率,感觉题目说得不够清楚,很容易下意识认为最后求的就是公式得出的值
这个求Π/2的公式道是有意思,我好像没见过
答案:
#include <math.h>
#include <stdio.h>
double fun(double eps)
{ double s,t; int n=1;s=0.0;
/************found************/t=1;while( t>eps){ s+=t;t=t * n/(2*n+1);n++;}
/************found************/return(s*2);
}
main()
{ double x;printf("\nPlease enter a precision: "); scanf("%lf",&x);printf("\neps=%lf, Pi=%lf\n\n",x,fun(x));getchar();
}
测试:
57.读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行
给定程序modi1.c的功能是:读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行(这里的"单词"是指由空格隔开的字符串)。
例如,若输入: I am a student to take the examination.,则应输出:工 Am A Student To Take The Examination.。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构!
modi1.c:
#include <ctype.h>
#include <string.h>
/************found************/
include <stdio.h> //调用库的操作都在预处理里,加了#之后就是预处理指令
/************found************/
void upfst ( char p )//这里主函数传来的是一个字符数组,所以这里参数应该为一个字符数组或指针
{ int k=0;for ( ; *p; p++ )if ( k ){ if ( *p == ' ' ) k = 0; }else if ( *p != ' ' ){ k = 1; *p = toupper( *p ); }//toupper()是变大写字母函数
}main( )
{ char chrstr[81];printf( "\nPlease enter an English text line: " ); gets( chrstr );printf( "\n\nBefore changing:\n %s", chrstr );upfst( chrstr );printf( "\nAfter changing:\n %s\n", chrstr );getchar();
}
解题思路:
还是照例讲下题目代码使用的函数:
int toupper(int c); //把小写字母转化为大写字母
参数c可以是一个表示字符的整数值(通常是字符的 ASCII 码),函数将返回将该字符转换为大写字母形式后的整数值,如果是字母的话就会返回一个大写字母
答案:
#include <ctype.h>
#include <string.h>
/************found************/
#include <stdio.h>
/************found************/
void upfst ( char *p )
{ int k=0;for ( ; *p; p++ )if ( k ){ if ( *p == ' ' ) k = 0; }else if ( *p != ' ' ){ k = 1; *p = toupper( *p ); }
}main( )
{ char chrstr[81];printf( "\nPlease enter an English text line: " ); gets( chrstr );printf( "\n\nBefore changing:\n %s", chrstr );upfst( chrstr );printf( "\nAfter changing:\n %s\n", chrstr );getchar();
}
测试:
58.将形参str所指字符串中的数字字符按从前往后出现的次序从左往右拼接成一个整数,返回主函数输出
给定程序MODI1.C中函数fun的功能是:将形参str所指字符串中的数字字符按从前往后出
现的次序从左往右拼接成一个整数,返回主函数输出。若形参str中没有数字,
则函数fun返回0给主函数。
例如:若str的内容为”C3Xyz9D1",则函数返回391,程序输出391。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
MODI1.C:
#include <stdio.h>
#include <string.h>int fun(char* str)
{ int i, k;i = 0;
/**********************found***********************/for (k=0; k<=strlen(str); k++) //循环条件错了,最大下标应该是strlen(str)-1{
/**********************found***********************/if ( (str[k] >= 0) && (str[k] <= 9) ) //由于是在字符串中筛出数字字符,应该大于等于字符'0'且小于等于字符'9'i = i * 10 + str[k] - '0';}
/**********************found***********************/return k;//k是下标,i才是得出的整数
}int main()
{ char str[100];int l;printf("input string:");scanf("%s", str);l = fun(str);printf("num:%d\n", l);return 0;
}
解题思路:
用字符与整数比较时,其实就是把字符转为ASCII码与整数比较,
这里说几个常见字符的ASCII码:
'\0'
是0,'0'
是48,'A'
是65,'a'
是97,
小写字母与对应的大写字母的ASCII码之差为32
答案:
#include <stdio.h>
#include <string.h>int fun(char* str)
{ int i, k;i = 0;
/**********************found***********************/for (k=0; k<strlen(str); k++) {
/**********************found***********************/if ( (str[k] >= '0') && (str[k] <= '9') ) i = i * 10 + str[k] - '0';}
/**********************found***********************/return i;
}int main()
{ char str[100];int l;printf("input string:");scanf("%s", str);l = fun(str);printf("num:%d\n", l);return 0;
}
测试:
59.求S的值
给定程序modi1.c中,函数fun的功能是:求S的值。设
例如,当k为10时,函数值应为: 1.533852。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
modi1.c:
#include <stdio.h>
#include <math.h>/************found************/
void fun( int k )//一眼就可以看到fun函数是有返回值的,返回值类型为double
{ int n; double s, w, p, q;n = 1;s = 1.0;
/************found************/while ( n < k )//n还可以等于k{ w = 2.0 * n;p = w - 1.0;q = w + 1.0;s = s * w *w/p/q;n++;}
/************found************/return s//语句要以分号;结尾
}main ( )
{printf("%f\n", fun (10));getchar();
}
解题思路:
这题代码很短,也没有用什么函数,(´ー∀ー`)
答案:
#include <stdio.h>
#include <math.h>/************found************/
double fun( int k )
{ int n; double s, w, p, q;n = 1;s = 1.0;
/************found************/while ( n <= k ){ w = 2.0 * n;p = w - 1.0;q = w + 1.0;s = s * w *w/p/q;n++;}
/************found************/return s;
}main ( )
{printf("%f\n", fun (10));getchar();
}
测试: