本文主要是介绍计算机二级C语言的注意事项及相应真题-2-程序修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 11.找出n的所有因子,统计因子的个数,并判断n 是否是”完数”
- 12.计算s所指字符串中含有t所指字符串的数目
- 13.将一个由八进制数字组成的字符串转换为与其面值相等的十进制整数
- 14.根据整型形参m的值,计算如下公式的值
- 15.从低位开始依次取长整型变量s中奇数位上的数,构成一个新数放在t中
- 16.将形参dt0指向的具有*n0个数据的数组中,所有不等于形参x的数据,重新存留在原数组中,并通过形参n0返回这些数据的个数
- 17.将s所指字符串中的字母转换为按字母序列的后续字母
- 18.在有n名学生,2门课成绩的结构体数组std中,计算出第1门课程的平均分
- 19.将字符串s1和s2交叉合并形成新字符串s3
- 20.当奇数次调用时要求把字符串中的小写字母转换成大写字母,偶数次调用时按输入字符串的逆序输出字符串
11.找出n的所有因子,统计因子的个数,并判断n 是否是”完数”
给定程序MODI1. C中,函数fun的功能是:找出n的所有因子,统计因子的个数,并判断n
是否是”完数”。当一个数的因子之和恰好等于这个数本身时,就称这个数为”完数”。
例如: 6的因子包括1、2、3,而6=1+2+3,所以6是完数。
如果是完数,函数返回值为1,否则函数返回值为0。
数组a中存放的是找到的因子,变量k中存放的是因子的个数。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
MODI1. C:
#include <stdio.h>
int fun(int n, int a[], int *k)
{ int m=0, i, t;t = n;
/**********found**********/for( i=0; i<n; i++ )//这个for循环是找因子,找因子,因子怎么可以是0,应该从1开始if(n%i==0)//筛出因子存入数组a{ a[m]=i; m++; t=t - i; }
/**********found**********/k=m;//k是指针,这样赋,等于是赋给地址了,得要加上解引符*
/**********found**********/if ( t=0 ) return 1;//单等=是赋值,双等是等于else return 0;
}
main()
{ int n , a[10], flag, i, k;printf("请输入一个整数: "); scanf("%d",&n);flag = fun( n, a, &k );if(flag){ printf(" %d 是完数,其因子是: ", n);for(i=0;i<k;i++) printf(" %d ", a[i]);printf("\n");}else printf(" %d 不是完数.\n ", n );getchar();
}
解题思路:
不是很难,注释就已经解释的差不多了
答案:
#include <stdio.h>
int fun(int n, int a[], int *k)
{ int m=0, i, t;t = n;
/**********found**********/for( i=1; i<n; i++ )if(n%i==0){ a[m]=i; m++; t=t - i; }
/**********found**********/*k=m;
/**********found**********/if ( t==0 ) return 1;else return 0;
}
main()
{ int n , a[10], flag, i, k;printf("请输入一个整数: "); scanf("%d",&n);flag = fun( n, a, &k );if(flag){ printf(" %d 是完数,其因子是: ", n);for(i=0;i<k;i++) printf(" %d ", a[i]);printf("\n");}else printf(" %d 不是完数.\n ", n );getchar();
}
测试:
请输入一个整数: 66 是完数,其因子是: 1 2 3
12.计算s所指字符串中含有t所指字符串的数目
给定程序modi1.c中函数fun的功能是:计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
modi1.c:
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char *s, char *t)
{ int n;char *p , *r;n=0;while ( *s )//遍历s所指字符串{ p=s;//指针p指向s所指字符串
/*********found**********/r=p;//指针r应该指向t所指字符串,这里应该是r=t;while(*r)//遍历t指向字符串进行比对,是否含有t指向字符串if(*r==*p) { r++; p++; }else break;
/*********found**********/if(*r= 0)//运行到这里如果此时r指向空,则含有t所指字符串数目递增n++;s++;//指针s后移}return n;//返回含有t所指字符串数目
}
main()
{ char a[N],b[N]; int m;printf("\nPlease enter string a : "); gets(a);printf("\nPlease enter substring b : "); gets( b );m=fun(a, b);printf("\nThe result is : m = %d\n",m);getchar();
}
解题思路:
这些题的代码都挺经典的,不要只顾着答对,也要理解代码的思路
答案:
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char *s, char *t)
{ int n;char *p , *r;n=0;while ( *s ){ p=s;
/*********found**********/r=t;while(*r)if(*r==*p) { r++; p++; }else break;
/*********found**********/if(*r== '\0')n++;s++;}return n;
}
main()
{ char a[N],b[N]; int m;printf("\nPlease enter string a : "); gets(a);printf("\nPlease enter substring b : "); gets( b );m=fun(a, b);printf("\nThe result is : m = %d\n",m);getchar();
}
测试:
Please enter string a : abcdabcdresdPlease enter substring b : abcdThe result is : m = 2
13.将一个由八进制数字组成的字符串转换为与其面值相等的十进制整数
给定程序modi1.c中,函数fun的功能是:将一个由八进制数字组成的字符串转换为与其面值相等的十进制整数。规定输入的字符串最多只能包含5位8进制数字。
例如,若输入77777,则输出将是32767。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
modi1.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning (disable:4996)
int fun( char *p )
{ int n;
/**********found**********/n= *P-'o';//这个错误像误写一样,数字字符变为整型,应该减去字符0,但这个是o,还有p误写成了大写,c语言中变量都是区分大小写的p++;//第一个字符的值为n的初始值,所以p需要后移while( *p!=0 ) {//遍历字符串,八进制转十进制
/**********found**********/n=n*8+*P-'o';//这个也是一样,0写成了o,这里p也写成了大写p++;//指针p后移}return n;
}
main()
{ char s[6]; int i; int n;printf("Enter a string (Ocatal digits): "); gets(s);if(strlen(s)>5){ printf("Error: String too longer !\n\n");exit(0); }//题目说规定输入的字符串最多只能包含5位8进制数字,strlen()函数是返回字符串长度for(i=0; s[i]; i++)//单一个s[i]就等同于s[i]!='\0'if(s[i]<'0'||s[i]>'7')//如果不是八进制就会进入该if分支{ printf("Error: %c not is ocatal digits!\n\n",s[i]);exit(0); }//exit(0)可以理解为等同于return 0printf("The original string: "); puts(s);n=fun(s);printf("\n%s is convered to integer number: %d\n\n",s,n);getchar();
}
解题思路:
不是很难,这个错误有点像是0写成了o一样,还有p误写成了大写一样,这个错误让我想起了一张图,虽然里面并没有这条:
给大伙欣赏下
答案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning (disable:4996)
int fun( char *p )
{ int n;
/**********found**********/n= *p-'0';p++;while( *p!=0 ) {
/**********found**********/n=n*8+*p-'0';p++;}return n;
}
main()
{ char s[6]; int i; int n;printf("Enter a string (Ocatal digits): "); gets(s);if(strlen(s)>5){ printf("Error: String too longer !\n\n");exit(0); }for(i=0; s[i]; i++)if(s[i]<'0'||s[i]>'7'){ printf("Error: %c not is ocatal digits!\n\n",s[i]);exit(0); }printf("The original string: "); puts(s);n=fun(s);printf("\n%s is convered to integer number: %d\n\n",s,n);getchar();
}
测试:
Enter a string (Ocatal digits): 77777
The original string: 7777777777 is convered to integer number: 32767
14.根据整型形参m的值,计算如下公式的值
给定程序modi1.c中,函数fun的功能是:根据整型形参m的值,计算如下公式的值。
例如:若m中的值为:5,则应输出:0.536389。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
modi1.c:
#include <stdio.h>double fun ( int m )
{ double y = 1.0 ;int i ;
/**************found**************/for(i = 2 ; i < m ; i++)//可以看到题目中的公式分母是有m的,这里循环中的i就是题目中的分母
/**************found**************/y -= 1 /(i * i) ;//在程序语言中,分式必须分子是浮点类型,结果才会有小数,1改成浮点类型就是1.0return( y ) ;
}main( )
{ int n = 5 ;printf( "\nThe result is %lf\n", fun ( n ) ) ;getchar();
}
解题思路:
主要考数据类型的运算,这里我想到了我碰到的选择题中的一个选项,1和1.0所占的字节不同,这句话是正确的,1是整型,而1.0是浮点型
答案:
#include <stdio.h>double fun ( int m )
{ double y = 1.0 ;int i ;
/**************found**************/for(i = 2 ; i <= m ; i++)
/**************found**************/y -= 1.0 /(i * i) ;return( y ) ;
}main( )
{ int n = 5 ;printf( "\nThe result is %lf\n", fun ( n ) ) ;getchar();
}
测试:
The result is 0.536389
15.从低位开始依次取长整型变量s中奇数位上的数,构成一个新数放在t中
给定程序MODI1. C中函数fun的功能是:从低位开始依次取长整型变量s中奇数位上的数,构成一个新数放在t中(注意:位置从0开始计算)。
例如:输入: 12345678, 则输出: 1357
输入: 123456789, 则输出: 2468
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
MODI1. C:
#include <stdio.h>
#pragma warning (disable:4996)
void fun (long s, long *t)
{ long sl = 10;s /= 10;//位置是从0开始的,0是偶数,去掉
/**********found**********/*t = s / 10;//位置0已经被去掉,现在是到了位置1,但要取一位,应该用取余while(s > 0) {s = s / 100;//s/100去掉两位,就到了下一个奇数位
/**********found**********/t = s % 10 * sl + t;//t是指针,单独一个t代表的仅仅是地址,*t代表的才是值,由于是从低位开始,所以是后面增加的值乘以权
/**********found**********/sl /= 10;//s1是权,应该是乘以10}
}main()
{ long s, t;printf("\nPlease enter long number:");scanf("%ld", &s); fun(s, &t);printf("The result is: %ld\n", t);
}
解题思路:
注意,题目说了位置是从0开始的,如果不仔细看题目就去看代码,会很懵的
答案:
#include <stdio.h>
#pragma warning (disable:4996)
void fun (long s, long *t)
{ long sl = 10;s /= 10;
/**********found**********/*t = s % 10;while(s > 0) {s = s / 100;
/**********found**********/*t = s % 10 * sl + *t;
/**********found**********/sl *= 10;}
}main()
{ long s, t;printf("\nPlease enter long number:");scanf("%ld", &s); fun(s, &t);printf("The result is: %ld\n", t);
}
测试:
Please enter long number:12345678
The result is: 1357
16.将形参dt0指向的具有*n0个数据的数组中,所有不等于形参x的数据,重新存留在原数组中,并通过形参n0返回这些数据的个数
给定程序MODI1. C中,函数fun的功能是:将形参dt0指向的具有*n0个数据的数组中,所
有不等于形参x的数据,重新存留在原数组中,并通过形参n0返回这些数据的个数。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
MODI1. C:
#include <stdio.h>
#pragma warning (disable:4996)
void fun(int *dt0,int *n0,int x)
{int i,j;
/**********************found***********************/i=1;j=1;//可以看到下面i和j都是作为数组的下标来用的,数组的下标应该从0开始do{
/**********************found***********************/if(dt0[i]=x)//依据题意这里应该是筛出不等于形参x的数据{dt0[j]=dt0[i];//把筛出的数据赋在数组前面j++;//j是不等于形参x的数据数}i++;}while(i<*n0);
/**********************found***********************/
return j;//这个函数是void类型的,是无返回值的,这里显然是要返回筛出的不等于形参x的数据的个数,题目已经给了提示,通过形参n0返回这些数据的个数
}
main()
{ int d[10]={2,5,6,7,2,4,5,2,2,6},n=10,i;fun(d,&n,2);for(i=0;i<n;i++)printf("%d ",d[i]);printf("\n");
}
解题思路:
题目要求的结果就是输出不等于形参x的数据,思路是把不等于形参x的数据放在数组的前面
答案:
#include <stdio.h>
#pragma warning (disable:4996)
void fun(int *dt0,int *n0,int x)
{int i,j;
/**********************found***********************/i=0;j=0;do{
/**********************found***********************/if(dt0[i]!=x){dt0[j]=dt0[i];j++;}i++;}while(i<*n0);
/**********************found***********************/
*n0=j;
}
main()
{ int d[10]={2,5,6,7,2,4,5,2,2,6},n=10,i;fun(d,&n,2);for(i=0;i<n;i++)printf("%d ",d[i]);printf("\n");
}
测试:
5 6 7 4 5 6
17.将s所指字符串中的字母转换为按字母序列的后续字母
给定程序modi1.c中函数fun的功能是:将s所指字符串中的字母转换为按字母序列的后续字母(但Z转换为A,z转换为a),其它字符不变。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
modi1.c:
#include <stdio.h>
#include <ctype.h>
void fun (char *s)
{
/**********found***********/while(*s!='@')//遍历字符串,应该是遍历到空时停止{ if(*s>='A' && *s<='Z' || *s>='a' && *s<='z'){ if(*s=='Z') *s='A';else if(*s=='z') *s='a';else *s += 1;}
/**********found***********/(*s)++;//这里遍历字符串,显然应该是指针后移,地址自增才对,加了解引符*就变成值了,变成值自增了}
}
main()
{ char s[80];printf("\n Enter a string with length < 80. :\n\n "); gets(s);printf("\n The string : \n\n "); puts(s);fun ( s );printf ("\n\n The Cords :\n\n "); puts(s);getchar();
}
解题思路:
主要考你对指针概念的理解
答案:
#include <stdio.h>
#include <ctype.h>
void fun (char *s)
{
/**********found***********/while(*s!='\0'){ if(*s>='A' && *s<='Z' || *s>='a' && *s<='z'){ if(*s=='Z') *s='A';else if(*s=='z') *s='a';else *s += 1;}
/**********found***********/s++;}
}
main()
{ char s[80];printf("\n Enter a string with length < 80. :\n\n "); gets(s);printf("\n The string : \n\n "); puts(s);fun ( s );printf ("\n\n The Cords :\n\n "); puts(s);getchar();
}
测试:
Enter a string with length < 80. :ZzAa1The string : ZzAa1The Cords :AaBb1
18.在有n名学生,2门课成绩的结构体数组std中,计算出第1门课程的平均分
给定程序MODI1. C中,函数fun的功能是:在有n名学生,2门课成绩的结构体数组std中,计算出第1门课程的平均分,作为函数值返回。
例如:主函数中给出了4名学生的数据,
则程序运行的结果为:第1门课程的平均分是: 76. 125000
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
MODI1. C:
#include <stdio.h>
typedef struct
{ char num[8];double score[2];
}STU ;
double fun(STU std[], int n)
{ int i;
/**********found**********/double sum ;//可以看到在后面的循环中sum是累加的,而不是赋值的,那就必须要赋个初值
/**********found**********/for(i=0; i<2 ; i++)//这个循环应该要累加上所有的学生,在main函数里可以看到有4名学生,传给了变量n
/**********found**********/sum += std[i].score[1]; //数组的下标都是从0开始的,0才是第一项return sum/n;//返回平均值
}
main()
{ STU std[ ]={ "N1001", 76.5,82.0 ,"N1002", 66.5,73.0, "N1005", 80.5,66.0,"N1006", 81.0,56.0 };printf("第1门课程的平均分是:%lf\n", fun(std,4) );getchar();
}
解题思路:
难度不高,也没什么迷惑性的地方φ(゜▽゜*)♪
答案:
#include <stdio.h>
typedef struct
{ char num[8];double score[2];
}STU ;
double fun(STU std[], int n)
{ int i;
/**********found**********/double sum =0.0;
/**********found**********/for(i=0; i<n ; i++)
/**********found**********/sum += std[i].score[0]; return sum/n;
}
main()
{ STU std[ ]={ "N1001", 76.5,82.0 ,"N1002", 66.5,73.0, "N1005", 80.5,66.0,"N1006", 81.0,56.0 };printf("第1门课程的平均分是:%lf\n", fun(std,4) );getchar();
}
测试:
第1门课程的平均分是:76.125000
19.将字符串s1和s2交叉合并形成新字符串s3
给定程序MODI1. C中,函数fun将字符串s1和s2交叉合并形成新字符串s3,合并方法为:先取s1的第1个字符存入s3,再取s2的第1个字符存入s3,以后依次类推;若s1和s2的长度不等时,较长字符串多出的字符顺序放在新生成的s3后。
例如:当s1为: “123456789”,s2为: " abcdefghijk”时,
输出结果应该是: 1a2b3c4d5e6f7g8h9ijk
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
MODI1. C:
#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
void fun( char *s1, char *s2, char *s3)
{ int i,j;
/**********************found***********************/for(i = 0, j = 0; (s1[i] != '\0') && (s2[i] != '\0'); i++, j = j + 1) { s3[j] = s1[i]; s3[j+1] = s2[i]; } if (s2[i] != '\0') { for(; s2[i] != '\0'; i++, j++)
/**********************found***********************/s3[i] = s2[j]; } else if (s1[i] != '\0') { for(; s1[i] != '\0'; i++, j++) s3[j] = s1[i];}
/**********************found***********************/s3[j-1] = '\0';
}
void main()
{ char s1[128], s2[128], s3[255]; printf("Please input string1:"); gets(s1); printf("Please input string2:"); gets(s2); fun(s1,s2,s3);printf("string:%s\n", s3);
}
解题思路:
有三个错误:
(1)
for(i = 0, j = 0; (s1[i] != '\0') && (s2[i] != '\0'); i++, j = j + 1)
//&&且,两个只要有一个不成立,就会停止,没有问题,j的自增出现了问题,两个字符串的合并方式是你存
//入一个字符,我在其后也存入一个字符,也就是说每次循环都会存入两个字符,倘若依题目这种循环方式,会
//出现如下情况:
/*
第一遍循环:
s3[0]=s1[0];
s3[1]=s2[0];
第二遍循环:
s3[1]=s1[1];
s3[2]=s2[1];
问题出现了,数组s2存入的字符在后续循环中被数组s1覆盖了,那要怎么做才会不被覆盖,因为每次都会存入两个字符,j每次递增加2不就好了,这样第二遍循环就会是:
s3[2]=s1[1];
s3[4]=s2[1];
*/
(2)
s3[i] = s2[j]; //i和j都是在函数fun里的全局变量,在上面循环结束后,i是数组s1和s2循环结束时遍历到的下标,j是数组s3最后的下标
(3)
s3[j-1] = '\0';//j-1显然不对,应该是j
答案:
#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
void fun( char *s1, char *s2, char *s3)
{ int i,j;
/**********************found***********************/for(i = 0, j = 0; (s1[i] != '\0') && (s2[i] != '\0'); i++, j = j + 2) { s3[j] = s1[i]; s3[j+1] = s2[i]; } if (s2[i] != '\0') { for(; s2[i] != '\0'; i++, j++)
/**********************found***********************/s3[j] = s2[i]; } else if (s1[i] != '\0') { for(; s1[i] != '\0'; i++, j++) s3[j] = s1[i];}
/**********************found***********************/s3[j] = '\0';
}
void main()
{ char s1[128], s2[128], s3[255]; printf("Please input string1:"); gets(s1); printf("Please input string2:"); gets(s2); fun(s1,s2,s3);printf("string:%s\n", s3);
}
测试:
Please input string1:123456789
Please input string2:abcdefghijk
string:1a2b3c4d5e6f7g8h9ijk
20.当奇数次调用时要求把字符串中的小写字母转换成大写字母,偶数次调用时按输入字符串的逆序输出字符串
给定程序MODI1. C中,调用fun函数输出字符串,
当奇数次调用时要求把字符串中的小写字母转换成大写字母,
偶数次调用时按输入字符串的逆序输出字符串。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
MODI1. C:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#pragma warning (disable:4996)
void fun( char *s )
{ int i;
/**********************found***********************/Static int n = 1; //static关键字不能大写,否则就失去了原来的意义if ( n++ %2 )
/**********************found***********************/for(i=0;i<=strlen(s);i++) //最大数组下标应该是strlen(s)-1,这个循环多了一项printf("%c", islower(s[i]) ? toupper(s[i]) : s[i]);//islower()是判断小写字母,toupper()是转化为大写字母else
/**********************found***********************/for (i = strlen(s)-1; i>0; i--) //这个循环又少了一项,数组最小下标应该是0printf("%c", s[i]);
}
main( )
{ int i;char s[] = "Hello, C Programmer";for (i=0; i<5; i++) { fun(s); printf("\n"); }
}
解题思路:
static修饰符:
被static修饰的变量,生命周期会被延长,值被改变的话,会被保留
int islower(char c) :检查所传字符是否是小写字母
char toupper(char c):把小写字母转换为大写字母
如果 c 有相对应的大写字母,则该函数返回 c 的大写字母,否则 c 保持不变。返回值是一个可被隐式转换为 char 类型的 int 值。
答案:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#pragma warning (disable:4996)
void fun( char *s )
{ int i;
/**********************found***********************/static int n = 1; if ( n++ %2 )
/**********************found***********************/for(i=0;i<strlen(s);i++) printf("%c", islower(s[i]) ? toupper(s[i]) : s[i]);else
/**********************found***********************/for (i = strlen(s)-1; i>=0; i--) printf("%c", s[i]);
}
main( )
{ int i;char s[] = "Hello, C Programmer";for (i=0; i<5; i++) { fun(s); printf("\n"); }
}
测试:
HELLO, C PROGRAMMER
remmargorP C ,olleH
HELLO, C PROGRAMMER
remmargorP C ,olleH
HELLO, C PROGRAMMER
这篇关于计算机二级C语言的注意事项及相应真题-2-程序修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!