目录
- 51.将a所指数组主对角线上的元素分别乘以2;次对角线上的元素分别乘以3,依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据
- 52.将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位上,b中的十位和个位数依次放在变量c的个位和百位上
- 53.将字符串尾部的`*`号全部删除,前面和中间的`*`号不删除
- 54.请编写一个函数,用来删除字符串中的所有空格
- 55.将s0所指字符串分解成三个字符串,分别存入s1、s2、 s3所指内存中。分解的方法是,s1、 s2、s3从s0中依次顺序每隔3个字符取1个
- 56.求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组) 的偶数,并依次存入数组a中并在屏幕上打印出来,打印时每个数单独一行,符合条件的个数通过函数值返回
- 57.判断字符串是否为回文?若是,函数返回1,主函数中输出:YES;否则返回0,主函数中输出NO
- 58.统计s所指字符串中的数字字符个数,并作为函数值返回
- 59.只删除字符串前导和尾部的`*`号,串中字母之间的`*`号都不删除
- 60.将M行N列的二维数组中的数据按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中
51.将a所指数组主对角线上的元素分别乘以2;次对角线上的元素分别乘以3,依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据
程序中定义了NXN的二维数组,并已在主函数中赋初值。
请编写函数fun,其功能是:将a所指数组主对角线上的元素分别乘以2;次对角线上的元素
分别乘以3,依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据。
注意:部分源程序在文件PROG1. C中。
PROG1. C:
#include <stdio.h>
#define N 3
#pragma warning(disable:4996)
void NONO( );
void fun( int a[N][N],int *p)
{
}
main()
{ int a[N][N]={ 1,5,7,2,6,8,3,4,9};
int b[2*N],i;
fun(a,b);
for(i=0;i<2*N;i++)
printf("%d,",b[i]);
NONO();
}
void NONO( )//系统用于评分测试的函数
{ int a[N][N];
int b[2*N],i,j,k;
FILE *rf, *wf;
rf = fopen("in.dat","r") ;//r是打开一个用于读取的文件
wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若已存在,则覆盖
for(k=0; k<9;k++) {//有9组测试数据
for(i=0;i<N;i++)
for(j=0;j<N;j++)
fscanf(rf,"%d,",&a[i][j]);//从文件指针rf指向的文件in.dat获取数组a
fun(a,b);
for(i=0;i<2*N;i++)
fprintf(wf, "%d,",b[i]);//结果写入文件指针wf指向的文件out.dat中
fprintf(wf, "\n");
}
fclose(rf);//关闭
fclose(wf);
}
解题思路:
注意啊,是依次存入指针p指向的数组,先存入主对角线的全部元素,再存次对角线,设行为i,主对角线元素规律为a[i][i],次对角线元素规律为a[i][N-i-1]
答案:
1.自己做的:
#include <stdio.h>
#define N 3
#pragma warning(disable:4996)
void NONO( );
void fun( int a[N][N],int *p)
{
int i=0;
for(i=0;i<N;i++)//主对角线
{
*p=a[i][i]*2;
p++;
}
for(i=0;i<N;i++)//次对角线
{
*p=a[i][N-i-1]*3;
p++;
}
}
main()
{ int a[N][N]={ 1,5,7,2,6,8,3,4,9};
int b[2*N],i;
fun(a,b);
for(i=0;i<2*N;i++)
printf("%d,",b[i]);
NONO();
}
void NONO( )
{ int a[N][N];
int b[2*N],i,j,k;
FILE *rf, *wf;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(k=0; k<9;k++) {
for(i=0;i<N;i++)
for(j=0;j<N;j++)
fscanf(rf,"%d,",&a[i][j]);
fun(a,b);
for(i=0;i<2*N;i++)
fprintf(wf, "%d,",b[i]);
fprintf(wf, "\n");
}
fclose(rf);
fclose(wf);
}
2.题库答案:
#include <stdio.h>
#define N 3
#pragma warning(disable:4996)
void NONO( );
void fun( int a[N][N],int *p)
{
int i;
for(i=0;i<N;i++){
p[i]=a[i][i]*2;
p[N+i]=a[i][N-1-i]*3;//他用数组的形式,斯,这样好像要简洁些
}
}
main()
{ int a[N][N]={ 1,5,7,2,6,8,3,4,9};
int b[2*N],i;
fun(a,b);
for(i=0;i<2*N;i++)
printf("%d,",b[i]);
NONO();
}
void NONO( )
{ int a[N][N];
int b[2*N],i,j,k;
FILE *rf, *wf;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(k=0; k<9;k++) {
for(i=0;i<N;i++)
for(j=0;j<N;j++)
fscanf(rf,"%d,",&a[i][j]);
fun(a,b);
for(i=0;i<2*N;i++)
fprintf(wf, "%d,",b[i]);
fprintf(wf, "\n");
}
fclose(rf);
fclose(wf);
}
测试:
main函数:
in.dat:
out.dat:
52.将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位上,b中的十位和个位数依次放在变量c的个位和百位上
函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位上,b中的十位和个位数依次放在变量c的个位和百位上。
例如,当a=45, b=12。调用该函数后,c=5241。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
void fun(int a, int b, long *c)
{
}
main()
{ int a,b; long c;void NONO ();
printf("Input a b:");
scanf("%d%d", &a, &b);
fun(a, b, &c);
printf("The result is: %ld\n", c);
NONO();
getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *rf, *wf ;
int i, a,b ; long c ;
rf = fopen("in.dat","r") ;//r是打开一个用于读取文件
wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件
for(i = 0 ; i < 10 ; i++) {//有10组测试数据
fscanf(rf, "%d,%d", &a, &b) ;//从文件指针rf指向的文件in.dat获取a,b
fun(a, b, &c) ;
fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;//结果存入文件指针wf指向的文件out.dat中
}
fclose(rf) ;//关闭
fclose(wf) ;
}
解题思路:
这题嘛,直接看答案吧,很简单的,前面有至少有两道几乎一样的了
答案:
要不以后答案就只展示fun函数的内容算了,不然一大串观感也不好o( ̄▽ ̄)ブ
1.自己做的:
void fun(int a, int b, long *c)
{
*c=(a%10)*1000+(b%10)*100+(a/10)*10+(b/10);//直接按为构造
}
2.题库答案:
void fun(int a, int b, long *c)
{
int a_up,a_low,b_up,b_low;//他分了四个变量来存这四位
a_up=a/10;
a_low=a%10;
b_up=b/10;
b_low=b%10;
*c=a_low*1000+b_low*100+a_up*10+b_up;
}
测试:
main函数:
in.dat:
out.dat:
53.将字符串尾部的*
号全部删除,前面和中间的*
号不删除
假定输入的字符串中只包含字母和*
号。请编写函数fun,它的功能是:将字符串尾部的*
号全部删除,前面和中间的*
号不删除。
例如,字符串中的内容为:****A*BC*DEF*G*******
,删除后,字符串中的内容应当是:****A*BC*DEF*G
。在编写函数时,不得使用C语言提供的字符串函数。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
void fun( char *a )
{
}
main()
{ char s[81];void NONO ();
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
NONO();
getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81] ;
in = fopen("in.dat","r") ;//r是打开一个用于读取的文件
out = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若已存在,则覆盖
for(i = 0 ; i < 10 ; i++) {//有10组测试数据
fscanf(in, "%s", s) ;//从文件指针in指向的文件in.dat获取字符串s
fun(s) ;
fprintf(out, "%s\n", s) ; //结果存入文件指针out指向的文件out.dat里
}
fclose(in) ;//关闭
fclose(out) ;
}
解题思路:
他说不能用字符串函数,要注意,题目要求将尾部的*
号去掉,可以先遍历整个字符串,使指针a指向字符串的末尾,然后while(*a=='*') a--;
,将尾部的第一个*
号赋为空字符,也就删去了尾部的*
号
答案:
1.自己做的:
void fun( char *a )
{
while(*a)//遍历整个字符串,使指针a指向字符串末尾
a++;
a--;//while循环结束后,此时指针a是指向字符串末尾空字符的,所以要前移一位
while(*a=='*')//使指针a指向字符串中最后一个字母
a--;
*(a+1)='\0';//此时指针a后移一位就是尾部第一个*号了
}
2.题库答案:
void fun( char *a )
{
int i;
for(i=strlen(a)-1;i>=0;i--)//?,不是不能用字符串函数吗,算了,这个就当用字符串函数的做法
if(a[i]!='*') break;
a[i+1]=0;
}
测试:
main函数:
in.dat:
out.dat:
54.请编写一个函数,用来删除字符串中的所有空格
请编写一个函数,用来删除字符串中的所有空格。
例如,输入"asd af aa z67",则输出为"asdafaaz67"。注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
#include <string.h>
void fun(char *str)
{
}
main()
{
char str[81];void NONO ();
printf("Input a string:") ;
gets(str);
puts(str);
fun(str);
printf("*** str: %s\n",str);
NONO();
getchar();
}
void NONO ()//系统用于评分测试的函数
{
/* 请在此函数内打开文件,输入调试数据,调用 fun 函数,
输出数据,关闭文件。 */
char str[81];
int n = 0;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;//r是用于打开一个用于读取的文件
wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件
while(n < 10) {//有10组测试
fgets(str, 80, rf);//从文件指针rf指向的文件in.dat中一行字符串,字符数最多为80个
fun(str);
fprintf(wf, "%s", str) ;//结果存入文件指针wf指向的文件out.dat中
n++ ;
}
fclose(rf) ;//关闭
fclose(wf) ;
}
解题思路:
虽然似乎用处不大,但还是介绍一下,
int isspace(int c)
检查所传的字符是否是空白字符。可以判断是否是空格符
' ' (0x20) space (SPC) 空格符
'\t' (0x09) horizontal tab (TAB) 水平制表符
'\n' (0x0a) newline (LF) 换行符
'\v' (0x0b) vertical tab (VT) 垂直制表符
'\f' (0x0c) feed (FF) 换页符
'\r' (0x0d) carriage return (CR) 回车符
返回值:
如果 c 是一个空白字符,则该函数返回非零值(true),否则返回 0(false)。
在这道题如果用这个函数也没有方便多少,所以我就没有采用了,用字符前移覆盖掉空格的方式,删除空格,前面已经做过很多采用这种方式删除一些字符了,应该很好理解
答案:
1.自己做的:
void fun(char *str)
{
int k=0,len=strlen(str);
for(int i=0;i<len;i++)
{
if(str[i]==' ')
{
k=i;
while(k<len-1)//字符前移
{
str[k]=str[k+1];
k++;
}
i--;//i自减是处理连续空格的情况
len--;//空格被删后,字符串自然也缩短了
}
}
str[len]='\0';//字符串结束符
}
2.题库答案:
void fun(char *str)
{
int i,j;
for(i=0;*(str+i);i++)//*(str+i)就是str[i]
if(*(str+i)==32) //32是空格的ASCII码
{ for(j=i+1;*(str+j);j++)//字符前移
*(str+j-1)=*(str+j);//指针看起来复杂了点,其实就是str[j-1]=str[j]
*(str+j-1)=0; //str[j-1]='\0',字符串结束符
i=0;//呃,也算是处理连续空格的方式了吧
}
}
测试:
main函数:
in.dat:
out.dat:
55.将s0所指字符串分解成三个字符串,分别存入s1、s2、 s3所指内存中。分解的方法是,s1、 s2、s3从s0中依次顺序每隔3个字符取1个
请编写函数fun,其功能是:编写函数char *fun(char * s0, char *s1, char s2,chars3),
要求实现:
将s0所指字符串分解成三个字符串,分别存入s1、s2、 s3所指内存中。分解的方法是,s1、 s2、s3从s0中依次顺序每隔3个字符取1个。
例如:s0为"abcdefghij"时,分解完成后,s1、s2、s3分别为: "adgj”、 "beh”、 "cfi”。
注意:部分源程序在文件PROG1. C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
PROG1. C:
#include <stdio.h>
#include <string.h>
void fun(char * s0,char *s1,char *s2, char *s3)
{
}
void main()
{
void NONO();
char s0[100],s1[40],s2[40],s3[40];
printf("请输入一行字符串\n");
gets(s0);
fun(s0,s1,s2,s3);
puts(s1);
puts(s2);
puts(s3);
NONO();
}
void NONO()//系统用于评分测试的函数
{
FILE *fp = fopen("out.dat", "w");//w是创建一个用于写入的文件,若已存在,则覆盖
char s0[10][100]={"1234567890qazwsx","abcdefghij","0987654321plmokn","fsdjfsdlrj564342dsf",
"gfdklgjdsfl4754398","zxcvbnmasdfg","asdfghjkl123","qwertyuiop456","qweasdzxc789",
"poiuytrewqwsxqaz"};//没用文件读取的方式,用了一个数组,有10组测试数据
char s1[40],s2[40],s3[40];
int i;
for(i=0;i<10;i++)
{
fun(s0[i],s1,s2,s3);
fprintf(fp,"s1=%s,s2=%s,s3=%s\n", s1,s2,s3);//结果存入文件指针fp指向的文件out.dat中
}
fclose(fp);//关闭
}
解题思路:
这题理清思路,还是很简单的,用for循环,更新表达式为i+=3,每次循环操作三个变量,存入各个字符串,别忘了判断字符是否为空,还有字符串结束符
答案:
1.自己做的:
void fun(char * s0,char *s1,char *s2, char *s3)
{
for(int i=0;s0[i];i+=3)
{
*s1=s0[i];//每次循环操作三个字符,第一个字符存入字符串s1
s1++;
if(s0[i+1]!='\0')//判断第二个字符是否为空
{
*s2=s0[i+1];//存入第二个字符
s2++;
}
if(s0[i+2]!='\0')
{
*s3=s0[i+2];//存入第三个字符
s3++;
}
}
*s1='\0';//字符串结束符,这东西很容易忘,在涉及到文件的读取和存入时,对于这个是很严格
*s2='\0';
*s3='\0';
}
2.题库答案:
void fun(char * s0,char *s1,char *s2, char *s3)
{
int i,j,k,t;
j=k=t=0;
for(i=0;i<strlen(s0);i+=3)//一样的思路,但他采取了数组的形式,感觉没我的简洁(。・ω・。)
{
s1[j++]=s0[i];
if(i+1<strlen(s0))
s2[k++]=s0[i+1];
if(i+2<strlen(s0))
s3[t++]=s0[i+2];
}
s1[j]='\0';
s2[k]='\0';
s3[t]='\0';
}
测试:
main函数:
out.dat:
56.求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组) 的偶数,并依次存入数组a中并在屏幕上打印出来,打印时每个数单独一行,符合条件的个数通过函数值返回
根据哥德巴赫猜想,任意一个大偶数都可以分解为两个素数之和。但许多偶数分解为两个素数之和并不是唯一的。
请编写函数fun,其功能是:求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5+109和109+5被认为是同一组) 的偶数,并依次存入数组a中并在屏幕上打印出来,打印时每个数单独一行,符合条件的个数通过函数值返回。
例如:114=5+109=7+107=11+103=13+101=17+97=31+83=41+73=43+71=47+67=53+61
114恰好可以分解为10组素数之和,因此114是我们要找的偶数。
而116=3+113=7+109=13+103=19+97=37+79=43+73
120=7+113=11+109=13+107=17+103=19+101=23+97=31+89=37+83=41+79=47+73=53+67=59+61
116可以分解为6组素数之和,120可以分解为12组素数之和,因此116和120都不是我们要找的偶数。函数prime用来判断一个数n是否为素数,是则返回1,否则返回0。
注意:部分源程序在文件PROG1. C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
PROG1. C:
#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996)
int prime(int n)//判断素数
{ int k,flag=1;
for (k=2; k<=(int)sqrt((double)n); k++)
if (n%k == 0)
flag=0;
return flag;
}
int fun(int m, int a[])
{
int k, s, count, i=0;
for(k=6; k<=m; k+=2)//每次循环加2,保证变量是偶数
{ count = 0;//count是这数有几组素数和
/* 请在此处填写代码 */
if (count == 10) {
printf("%d\n", k);
a[i++] = k;
}
}
return i;
}
main( )
{ int count, a[100];
void NONO(int count, int a[]);
count = fun(999, a);
NONO(count, a);
}
void NONO(int count, int a[])
{
FILE *fp;
int i;
fp = fopen("out.dat","w") ;//w是创建一个用于写入的文件
for(i=0; i<count; i++)
fprintf(fp, "%d\n", a[i]);//结果存入文件指针fp指向的文件out.dat中
fclose(fp);//关闭
}
解题思路:
首先肯定是写一个循环遍历小于k的数j,j起始值从2,毕竟0和1都不是素数,循环条件为j<=k/2;
,另一边不用遍历,这应该好理解,题目举了个例子,5+109和109+5被认为是同一组
答案:
1.自己做的:
int fun(int m, int a[])
{
int k, s, count, i=0;
for(k=6; k<=m; k+=2)
{ count = 0;
/* 请在此处填写代码 */
for(int j=2;j<=k/2;j++)//遍历小于k的数
{
if(prime(j))//判断是否为素数
{
s=k-j;
if(prime(s))//判断另一个因子是否为素数,若是则为一组素数和
count++;
}
}
if (count == 10) {//该数只有10组素数和符合题意
printf("%d\n", k);
a[i++] = k;//该数存入数组
}
}
return i;
}
2.题库答案:
int fun(int m, int a[])
{
int k, s, count, i=0;
for(k=6; k<=m; k+=2)
{ count = 0;
/* 请在此处填写代码 */
for(s=2;s<=k/2;s++)
if(prime(s) && prime(k-s)) count++;//好好好,一样的,不过他很赶时间O(∩_∩)O
if (count == 10) {
printf("%d\n", k);
a[i++] = k;
}
}
return i;
}
测试:
main函数:
out.dat:
57.判断字符串是否为回文?若是,函数返回1,主函数中输出:YES;否则返回0,主函数中输出NO
请编写函数fun,函数的功能是:判断字符串是否为回文?若是,函数返回1,主函数中输出:YES;否则返回0,主函数中输出NO。回文是指顺读和倒读都一样的字符串。
例如,字符串LEVEL是回文,而字符串123312就不是回文。
注意:部分源程序在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char *str)
{
}
main()
{ char s[N] ;void NONO ();
printf("Enter a string: ") ; gets(s) ;
printf("\n\n") ; puts(s) ;
if(fun(s)) printf(" YES\n") ;
else printf(" NO\n") ;
NONO() ;
getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ;
int i ; char s[N] ;
rf = fopen("in.dat","r") ;//r是打开一个用于读取的文件
wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若已存在,则覆盖
for(i = 0 ; i < 10 ; i++) {//有10组测试数据
fscanf(rf, "%s", s) ;//从文件指针rf指向的文件in.dat中获取字符串s
if(fun(s)) fprintf(wf, "%s YES\n", s) ;//结果存入文件指针wf指向的文件out.dat中
else fprintf(wf, "%s NO\n", s) ;
}
fclose(rf) ; fclose(wf) ;//关闭
}
解题思路:
判断回文字符串,老题目了,最常用的方法是双指针法,也是最好用的,一个指针p指向字符串头部,另一个指针q指向字符串尾部,用一个while循环,条件为q>p,然后判断*p!=*q
,若出现不等于情况则返回0,若循环结束也未出现不等的情况则返回1
答案:
1.自己做的:
int fun(char *str)
{
char *p=str;
while(*p)
p++;
p--;
while(str<p)
{
if(*str!=*p)
return 0;
str++;
p--;
}
return 1;
}
2.题库答案:
int fun(char *str)
{
int count=strlen(str),i;
for(i=0;i<=count/2;i++)
if(str[i]!=str[count-i-1])//直接用数组的形式
{return 0; break;}
return 1;
}
测试:
main函数:
in.dat:
out.dat:
58.统计s所指字符串中的数字字符个数,并作为函数值返回
请编写函数fun,其功能是:统计s所指字符串中的数字字符个数,并作为函数值返回。 例如,s所指字符串中的内容是:2def35adh25 3kjsdf 7/kj8655x,函数fun返回值为:11 注意:部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
PROG1.C:
#include <stdio.h>
void NONO();
int fun(char *s)
{
}
main()
{ char *s="2def35adh25 3kjsdf 7/kj8655x";
printf("%s\n",s);
printf("%d\n",fun(s));
NONO();
getchar();
}
void NONO()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i;
char s[256];
fp = fopen("in.dat","r") ;//r是打开一个用于读取的文件
wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件
for(i = 0 ; i < 10 ; i++) {//有10组测试数据
fgets(s, 255, fp);//从文件指针fp指向的文件in.dat获取一行字符串为s,字符数最多为255
fprintf(wf, "%d\n", fun(s));//结果存入文件指针wf指向的文件out.dat中
}
fclose(fp) ;//关闭
fclose(wf) ;
}
解题思路:
这题就是遍历字符串s,检索数字字符,用一个累加器累加,很简单
检索数字字符是有一个函数,但这题并未给出#include<string.h>
的头文件,所以不能用,但还是有必要了解一下
int isdigit(int c); //判断c是否是数字
答案:
1.自己做的:
int fun(char *s)
{
int count=0;
while(*s)
{
if(*s>=48&&*s<=57)//字符0的ASCII码是48,字符9的ASCII码是57
count++;
s++;
}
return count;
}
2.题库答案:
int fun(char *s)
{int n=0;
while(*s!='\0'){
if(*s>='0'&&*s<='9'){//本以为你会用ASCII码的
n++;
}
s++;
}
return n;
}
还是多用ASCII码方便记忆
测试:
main函数:
in.dat:
out.dat:
59.只删除字符串前导和尾部的*
号,串中字母之间的*
号都不删除
假定输入的字符串中只包含字母和*
号。请编写函数fun,它的功能是:只删除字符串前导和尾部的*
号,串中字母之间的*
号都不删除。形参n给出了字符串的长度,形参h给出了字符串中前导*
号的个数,形参e给出了字符串中最后*
号的个数。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G******
,删除后,字符串中的内容应当是:A*BC*DEF*G
。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
void fun( char *a, int n,int h,int e )
{
}
main()
{ char s[81],*t,*f; int m=0, tn=0, fn=0;void NONO ();
printf("Enter a string:\n");gets(s);
t=f=s;
while(*t){t++;m++;}//字符串长度
t--;
while(*t=='*'){t--;tn++;}//字符串尾部*号长度
while(*f=='*'){f++;fn++;}//字符串前导*长度
fun( s , m,fn,tn );
printf("The string after deleted:\n");puts(s);
NONO();
getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81], *t, *f ;
int m=0, tn=0, fn=0;
in = fopen("in.dat","r") ;//r是打开一个用于读取的文件
out = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若存在,则覆盖
for(i = 0 ; i < 10 ; i++) {//有10组测试数据
fscanf(in, "%s", s) ;//从文件指针in指向的文件in.dat中获取字符串s
t=f=s;
m=0; tn=0; fn=0;
while(*t){t++;m++;}//字符串长度
t--;
while(*t=='*'){t--;tn++;}//字符串尾部*号长度
while(*f=='*'){f++;fn++;}//字符串前导*号长度
fun(s, m, fn, tn);
fprintf(out, "%s\n", s) ; //结果存入文件指针out指向的文件out.dat中
}
fclose(in) ;//关闭
fclose(out) ;
}
解题思路:
这题有点小难了,要对指针掌握的比较好,设一个指针p,p=str+h
,使指针p指向前导*
结束后的第一个字母,再设一个指针q,q=a+n-e
,使指针q指向尾部*
号的第一个*
号,指针p到指针q这一段的字符就是结果要的字符串了,将这段字符前移h个的单元,再在尾部加个空字符,就好了
答案:
1.自己做的:
void fun( char *a, int n,int h,int e )
{
char *p=a+h,*q=a+n-e;//指针p指向前导*号结束后的第一个字母,指针q指向尾部*号的第一个*号
*q='\0';//字符串结束符,在后面的while循环,这个空字符也前移了h个单元,作为了新字符串的结束符
while(p<=q)//遍历指针p到指针q的字符,将这些字符前移h个单元
{
*(p-h)=*p;
p++;
}
}
2.题库答案:
void fun( char *a, int n,int h,int e )
{ char b[81],*c,*d;
int i=0,j=0;
c=a;d=a;
c=c+h;d=d+n-e-1;//c指向前导*号结束后的第一个字母,注意啊,他指针d减一了,那d指向后尾部*号前的第一个字母
while (c<=d)//他也是一样的,用两个指针圈出要的那段字符串,但不过他用了数组b存这段字符串
{b[i]=*c;i++;c++;}
b[i]='\0'; i=0;//字符串结束符
while (b[i])//把字符串b复制给了字符串a
{a[j]=b[i];j++;i++;}
a[j]='\0';//字符串a结束
}
测试:
main函数:
in.dat:
out.dat:
60.将M行N列的二维数组中的数据按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中
请编写函数fun,函数的功能是:将M行N列的二维数组中的数据按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。
例如,二维数组中的数据为:
33 33 33 33
44 44 44 44
55 55 55 55
则一维数组中的内容应是:
33 33 33 33 44 44 44 44 55 55 55 55。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
prog1.c:
#include <stdio.h>
void fun(int (*s)[10], int *b, int *n, int mm, int nn)//mm是二维数组的行,nn是二维数组的列
{
}
main()
{ int w[10][10] = {{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ;
int a[100] = {0}, n = 0 ;void NONO ();
printf("The matrix:\n") ;
for(i = 0 ; i < 3 ; i++)
{ for(j = 0 ; j < 4 ; j++) printf("%3d",w[i][j]) ;
printf("\n") ;
}
fun(w, a, &n, 3, 4) ;
printf("The A array:\n") ;
for(i = 0 ; i < n ; i++) printf("%3d",a[i]);printf("\n\n") ;
NONO() ;
getchar();
}
void NONO ()//系统用于评分测试的函数
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。*/
FILE *rf, *wf ; int i, j, k ;
int w[10][10], a[100], n = 0, mm, nn ;
rf = fopen("in.dat","r") ;//r是打开一个用于读取的文件
wf = fopen("out.dat","w") ;//w是创建一个用于写入的文件,若已存在,则覆盖
for(k = 0 ; k < 5 ; k++) {//有5组测试数据
fscanf(rf, "%d %d", &mm, &nn) ;//从文件指针rf指向的文件in.dat中获取二维数组行mm,列nn
for(i = 0 ; i < mm ; i++)
for(j = 0 ; j < nn ; j++) fscanf(rf, "%d", &w[i][j]) ;//获取数组元素
fun(w, a, &n, mm, nn) ;
for(i = 0 ; i < n ; i++) fprintf(wf, "%3d", a[i]) ; fprintf(wf, "\n") ;//结果存入文件指针wf指向的文件out.dat中
}
fclose(rf) ; fclose(wf) ;//关闭
}
解题思路:
前面做过一道差不多的题,但是他是按列的顺序存入,比这道题还要绕些,按行的话就是正常的二维数组的遍历顺序,存入数组b,还有要注意,最后检测时是多组输入,然而n是以指针形式,传递的,那么就要保证在运行fun函数时,*n
的都要赋一次0
答案:
1.自己做的:
void fun(int (*s)[10], int *b, int *n, int mm, int nn)
{
*n=0;
for(int i=0;i<mm;i++)//正常的二维数组遍历,就是按行的顺序
for(int j=0;j<nn;j++)
{
*b=s[i][j];//元素存入数组b
b++;
(*n)++;//元素个数
}
}
2.题库答案:
void fun(int (*s)[10], int *b, int *n, int mm, int nn)
{int x,y;
for(x=0;x<nn;x++)
for(y=0;y<mm;y++)
{b[y*nn+x]=*(s[y]+x); //这段指针用得挺复杂,在下面注释
/*s[y]表示二维数组s的第y行,是一个指向该行第一个元素的指针,
*(s[y]+x)表示取出s[y]指向的地址加上x偏移后的元素的值,即取出二维数组s的第y行第x列的元素的值
b[y*nn+x]表示一维数组b中的第y*nn+x个元素,可以仔细体会下,y*nn就是行
整个操作就是将二维数组s的第y行第x列的元素的值赋给一维数组b的第y*nn+x个元素*/
(*n)++;
}
}
嘿嘿,这题库答案好像没意识到指针n的问题
测试:
main函数:
in.dat:
out.dat:
程序设计这个系列也更完了,等出新的题,有空会继续更,本想全都在今年开考之前更完,结果选择题的系列还没开篇,祝大家都能考个好成绩