资源描述
【上机题命题及答题要点】
1、 近年来江苏省高校上机题目难度有所下降。本轮上机命题的难度系数与全国计算机等级考试二级C语言接近。
2、 改错题通常有3~4个错误。错误分为两大类,一类是语法犯错,这类错误比较查错和容易修改,即在编译时报的错误 。另一类是结果犯错,即程序的算法犯错,这类错误需认真审题。
3、 编程题必须掌握C语言的文献,应熟悉文献指针的定义,文献的打开及文献的输入输出。编程题的固定框架。必须记忆。以C01的编程为例。
#include <stdlib.h> /*库函数exit(0)需要*/
#include <stdio.h> /*定义文献指针时需要的头文献*/
函数编程,按【编程规定】
1.编写函数int palindrome(char *str, char *r)。.....
要点:函数首部完整照抄。参数为指针时,若对指针不熟悉,在函数体内可以按数组编程。
…………..
int palindrome(char *str, char *r)
{
}
void main()
{ FILE *fp;
所有数据类型的说明和定义
if((fp=fopen("t:\\myf2.out","w"))==NULL)
{ printf("\nCan't open the file!"); exit (0);}
函数调用(具体问题具体分析)
结果输出
printf("\nMy number is:\n");
fprintf(fp,"\nMy number is:1292340\n");
fclose(fp);
}
4、 必须熟悉常用算法。
5、 江苏省高校计算机二级C语言上机编程题常考问题:
字符串相关问题、素数相关问题、回文数相关问题、矩阵(二维数组)相关问题、特殊数问题(如,合数、真因子或质因子之和、水仙花数、密切数、完数、数制转换、哥德巴赫猜想等)。
6、掌握文献输出操作标准形式。
【2023年3月江苏省等考上机真题解析】
江苏省高等学校非计算机专业学生(C01)
计算机基础知识和应用能力等级考试上机试卷
二级 C语言(试卷代号C01)
(本试卷完毕时间 70分钟)
一、 改错题(16分)
【程序功能】
判断一个N×N方阵(N为奇数)是否为魔方阵。魔方阵的鉴定条件是:方阵中每行、每列、主对角线及副对角线上的数据之和均相等。
例如,以下方阵中,主对角线的数据是8、5、2之和是15,副对角线上的数据6、5、4之和也是15,并且每行、每列数据之和15,因此该项方阵是魔方阵。
8 1 6
3 5 7
4 9 2
【测试数据与运营结果】
屏幕输出: 8 1 6
3 5 7
4 9 2
The Array x is a magic square.
1 2 3
5 6 4
9 8 7
The Array x isn’t a magic square.
【具有错误的源程序】
以下源程序已保存在T盘myf1.c文献内,考生可直接打开该文献测试程序。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 3
void fun(int (*a)[N])
{ int i,j,m1,m2,row,colum;
m1=m2=0;
for(i=0; i<N; i++)
{ m1+=a[i][i];
m2+=a[i][N-i-1];
}
if(m1!=m2) return 0;
for(i=0; i<N; i++)
{ row=colum=i;
for(j=0; j<N; j++)
{ row+=a[i][j];
colum+=a[j][i];
}
if((row!=colum)||(row!=m1))
return 0;
}
return 1;
}
void print(int x[][N])
{ int i,j;
for(i=0; i<N; i++)
{ for(j=0; j<N; j++)
printf("%3d,x[i][j]");
printf("\n");
}
}
int main()
{ int x[N,N]={{8,1,6},{3,5,7},{4,9,2}},y[N,N]={{1,2,3},{5,6,4},{9,8,7}};
print(x);
if(fun(x)) printf("The Array x is a magic square.\n");
else printf("The Array x isn't a magic square.\n");
print(y);
if(fun(y)) printf("The Array y is a magic square.\n");
else printf("The Array y isn't a magic square.\n");
getch();
return 0;
}
【规定】
1. 打开T盘中myfl.c文献或将上述程序录入到myf1.c文献中,根据题目规定及程序中语句之间的逻辑关系对程序中的错误进行修改。
2. 改错时,可以修改语句中的一部分内容,调整语句顺序,增长少量的变量说明或编译预解决命令,但不能增长其它语句,也不能删去整条语句。
3. 改正后的源程序(文献名myfl.c)保存在T盘的根目录中供阅卷使用,否则不予评分。
【解析】
#include <stdio.h>
#include <conio.h> /*该头文献是调用getch()函数需要的*/
#include <stdlib.h>
#define N 3
int fun(int (*a)[N]) //1、函数规定调用有返回值,void fun(int (*a)[N])函数类型设立错误
{ int i,j,m1,m2,row,colum;
m1=m2=0;
for(i=0; i<N; i++)
{ m1+=a[i][i];
m2+=a[i][N-i-1];
}
if(m1!=m2) return 0;
for(i=0; i<N; i++)
{ row=colum=i;
for(j=0; j<N; j++)
{ row+=a[i][j];
colum+=a[j][i];
}
if((row!=colum)&&(row!=m1)) //2、逻辑表达式犯错:(row!=colum)||(row!=m1)
return 0;
}
return 1;
}
void print(int x[][N])
{ int i,j;
for(i=0; i<N; i++)
{ for(j=0; j<N; j++)
printf("%3d",x[i][j]); //3、输出格式犯错:printf("%3d,x[i][j] ");
printf("\n");
}
}
int main()
{ int x[N][N]={{8,1,6},{3,5,7},{4,9,2}},y[N][N]={{1,2,3},{5,6,4},{9,8,7}}; //4、数组下标定义犯错:x[N,N]和y{N,N}
print(x);
if(fun(x)) printf("The Array x is a magic square.\n");
else printf("The Array x isn't a magic square.\n");
print(y);
if(fun(y)) printf("The Array y is a magic square.\n");
else printf("The Array y isn't a magic square.\n");
getch();
return 0;
}
二、编程题(24分)
【程序功能】
检查一个字符串中中所有数字字符所相应整数(例如,字符'1'所相应的整数为1,其他依次类推)之和是否为3的倍数;判断该字符串是否回文字符串(回文字符串:正序和倒序相同的字符串。例如,"ab121ba"是回文字符串)。
【编程规定】
1、编写函数int palindrome(char *str, char *r)。函数功能:①检查str指向的字符串中所有数字字符所相应的整数之和是否为3的倍数,若是则将"yes"存储到r指向的数组中,否则将"no"存储到r指向的数组中.②判断str指向的字符串是否是回文字符串,若是则函数返回1,否则返回0。
2、编写函数main()。函数功能:声明字符型数组a和r,输入一个字符串到a数组,用a、r作实寻调用palindrome函数,若字符串中所有数字字符所相应的整数之和是3的倍数且字符串双是回文字符串,则输出该字符串及"yes"到屏幕及数据文献myf2.out中,否则输出"no"到屏幕及数据文献myf2.out中。最后将考生本人的准考证号字符串输出到文献myf2.out中。
【测试数据与运营结果】
测试数据:33abbba66
屏幕输出: no
测试数据:12abcba21
屏幕输出: yes
【规定】
1. 源程序文献名为myf2.c,输出结果文献名为myf2.out。
2. 数据文献的打开、使用、关闭均用C语言标准库中文献操作函数实现。
3. 源程序文献和运营结果文献均需保存到T盘上,供阅卷使用。
4. 不要复制扩展名为obj和exe的文献到T盘上。
【编程题解题思绪】
编程的关键是
①知道库函数所需要的相应的头文献名。
②除主函数和函数palindrome外,根据C语言模块化设计特点,增长了能判断一串字符串是否是回文字符串的自编函数int Judger(char a[]),其中判断回文字符串的函数必须要熟记之,与此同时也要记住判断回文数(data_palindrome)和回文素数的通用函数:
#include <stdio.h>
int data_palindrome(long s)
{ long k=s,h=0;
while(k)
h=h*10+k%10,k/=10;
if(h==s) return 1;
return 0;
}
int main()
{ long a;
scanf("%ld",&a);
if(data_palindrome(a)) printf("\%ld is palindrome",a);
else printf("\%ld isn't palindrome",a);
}
【编程题解答:myf2.c】
#include <stdio.h>
#include <string.h> //库函数strlen()需要
#include <ctype.h> //库函数isdigit()、strcpy()需要,书P386
int Judger(char a[]) //判断字符串a是否是回文字符串的通用函数
{ int n=0,i,j;
n=strlen(a);
for(i=0,j=n-1;i<j;i++,j--)
if(a[i]!=a[j]) return 0;
return 1;
}
int palindrome(char *str, char *r)
{ int i=strlen(str)-1,j=0,m=0;
while(str[i]!=-1) //计算字符串str中数字字符的数字量值之和
{ if(isdigit(str[i]))
m+=(str[i]-48);
i--;
}
if(m%3==0&&Judger(str)) //满足字符串的数字量之和是3的倍数和回文字符串时返回1,并将"yes"存入数组元素
{ strcpy(r,"yes");j++; return 1;}
else //不满足字符串的数字量之和是3的倍数和回文字符串时返回0,并将"no"存入数组元素
{ strcpy(r,"no"); j++; return 0;}
}
void main()
{ FILE *fp;
int i;
char a[2][10]={"33abbba66","12abcba21"},r[2][10];
if((fp=fopen("t:\\myf2.out","w"))==NULL)
{ printf("\nCan't open the file!"); exit (0);}
for(i=0;i<2;i++)
{ if(palindrome(a[i],r[i]))
printf("\n%s\n%s",a[i],r[i]),fprintf(fp,"\n%s\n%s",a[i],r[i]);
else
printf("\n%s\n%s",a[i],r[i]),fprintf(fp,"\n%s\n%s",a[i],r[i]);
}
printf("\nMy number is:\n");
fprintf(fp,"\nMy number is:1292340\n");
fclose(fp); /*操作结束,关闭文献fp */
}
蓝色的内容需记忆,并且printf函数与 fprintf函数写在一起,用逗号分隔,这样程序不容易
江苏省高等学校非计算机专业学生(C04)
计算机基础知识和应用能力等级考试上机试卷
二级 C语言(试卷代号C04)
(本试卷完毕时间 70分钟)
一、 改错题(16分)
【程序功能】
子串查找并替换。
函数substition的功能是在s指向的字符串(简称s串)中查找t指向的子串(简称t串),并用g指向的字符串(简称g串)替换s串中所有的t串。
【测试数据与运营结果】
测试数据: s: aaacdaaaaaaaefaaaghaa
t: aaa
g: 22
屏幕输出: 22cd2222aef22ghaa
【具有错误的源程序】
以下源程序已保存在T盘myf1.c文献内,考生可直接打开该文献测试程序。
#include <stdio.h>
#include <string.h>
#include <conio.h>
void substitution(char*,char*,char*);
int main()
{ char s[80]=" aaacdaaaaaaaefaaaghaa",t[2]="aaa",g[]="22";
puts(s);
substitution(s,t,g);
puts(s);
getch();
}
void substitution(char *,char *,char *) ;
{ int i,j,k;
char temp[80];
for(i=0;s[i]=='\0';i++)
{
for(j=i,k=0;s[j]==t[k]&&t[k]!='\0';j++,k++);
if(t[k]=='\0')
{ temp=s+j;
strcpy(s+i,g);
strcat(s,temp);
i+=strlen(g)-1;
}
}
}
【规定】
1.打开T盘中myfl.c文献或将上述程序录入到myf1.c文献中,根据题目规定及程序中语句之间的逻辑关系对程序中的错误进行修改。
2. 改错时,可以修改语句中的一部分内容,调整语句顺序,增长少量的变量说明或编译预解决命令,但不能增长其它语句,也不能删去整条语句。
3. 改正后的源程序(文献名myfl.c)保存在T盘的根目录中供阅卷使用,否则不予评分。
二、编程题(24分)
【程序功能】
在一组数值不全全的整数中查找次大数。
【编程规定】
1、编写函数int findsecmax(int data[], int count)。函数功能:在data数组的前count个整数中查找次大数。
2、编写函数main()。函数功能:声明一个整型数组a并用测试数据初始化,用数组a及数组元素个数作实参调用findsecmax 函数找出次大数,然后将原数组及次大数输出到屏幕及数据文献myf2.out中。最后将考生本人的准考证号字符串输出到文献myf2.out中。
【测试数据与运营结果】
测试数据:1,9,2,8,3,7,4,6,10,10
屏幕输出:
1 9 2 8 3
7 4 6 10 10
Sec_max: 9
【规定】
1.源程序文献名为myf2.c,输出结果文献名为myf2.out。
2.数据文献的打开、使用、关闭均用C语言标准库中文献操作函数实现。
3.源程序文献和运营结果文献均需保存到T盘上,供阅卷使用。
4.不要复制扩展名为obj和exe的文献到T盘上。
【改错题解答:myf1.c】
此题比较简朴。按照标准,原程序存在6个错误,所以每个错误,若改正,则得3分。实际命题教师只认4个错误:1、2、5、6,此时每题4分。
#include <stdio.h>
#include <string.h>
#include <conio.h>
void substitution(char*s,char*t,char*g); //1、自定义函数的声明语句犯错void substitution(char*,char*,char*);
int main()
{ char s[80]=" aaacdaaaaaaaefaaaghaa",t[4]="aaa",g[3]="22"; //2、字符串数组下标填写为大于或等于字符数加1
puts(s);
substitution(s,t,g);
puts(s);
getch(); return 0; //3、主函数有类型定义,在TC30编译时必须有返回语句
}
void substitution(char *s,char *t,char *g) //4、自定义函数的函数头犯错void substitution(char*,char*,char*);
{ int i,j,k;
char temp[80];
for(i=0;s[i]!='\0';i++) //5、循环语句终结条件犯错:s[i]=='\0'。否则不执行循环语句
{
for(j=i,k=0;s[j]==t[k]&&t[k]!='\0';j++,k++);
if(t[k]=='\0')
{ strcpy(temp,s+j); //6、字符串赋值用库函数strcpy:temp=s+j;
strcpy(s+i,g);
strcat(s,temp);
i+=strlen(g)-1;
}
}
}
【编程题解答:myf2.c】
解题思绪:。编程的关键是需要知道库函数所需要的相应的头文献名。此题较简朴。
#include <stdio.h>
int findsecmax(int data[], int count)
{ int i, j=0,secmax=0,max=data[0],b[10];
for(i=1;i<count;i++) //查找整数数组的最大值max
if(data[i]>max) max=data[i];
for(i=0;i<count;i++) //排除最大值后的整数数据放入临时数组b
if(data[i]!=max) b[j++]=data[i];
for(i=0;i<j;i++) //在临时数组b中找最大值,即是次大值
if(data[i]>secmax) secmax=data[i];
return secmax;
}
void main()
{ FILE *fp;
int i,a[20]={1,9,2,8,3,7,4,6,10,10},count=10,sec_max;
if((fp=fopen("myf2.out","w"))==NULL)
{ printf("\nCan't open the file!"); exit (0);}
sec_max=findsecmax(a,count);
for(i=0;i<count;i++)
printf((i+1)%5==0?"%4d\n":"%4d",a[i]),fprintf(fp,i%5==0?"%4d\n":"%4d",a[i]);
printf("\nsec_max:%4d",sec_max),fprintf(fp, "\nsec_max:%4d",sec_max);
printf("\nMy number is:\n");
fprintf(fp,"\nMy number is:1292340\n");
fclose(fp); /*操作结束,关闭文献fp */
}
江苏省高等学校非计算机专业学生(C05)
计算机基础知识和应用能力等级考试上机试卷
二级 C语言(试卷代号C05)
(本试卷完毕时间 70分钟)
一、 改错题(16分)
【程序功能】
找出找出所有符合条件的数列:⑴由6个素数组成;⑵数列中每一项的值在7~360之间;⑶数列是一个公差为30的等差数列。简称这样的数列为等差素数数列。例如,7 37 67 97 127 157就是符合上述条件的一个等差素数数列。
函数series将x~y范围内所有符合上述条件的等差素数数列依次保存到a指向的二维数组中(一行保存一个数列)。
【测试数据与运营结果】
屏幕输出: 7 37 67 127 157
107 137 167 197 227 257
【具有错误的源程序】
以下源程序已保存在T盘myf1.c文献内,考生可直接打开该文献测试程序。
#include<stdio.h>
#include<math.h>
#include<conio.h>
int prime(int n;)
{ int i;
for(i=2;i<=(int)sqrt(n);i++)
if(n%i==0)
return 0;
return 1;
}
int series(int a[][6],int x,int y)
{ int d=30,i=0,n=x,j,f;
while(n==2||prime(n))
n++;
while(n<y-5*d)
{ f=1;
for(j=0;j<6; j++)
if(prime(n+j*d)==0)
{ f=0; break; }
if(f)
{ for(j=0;j<6;j++)
a[i][j]=n+j*d;
i++;
}
n+=2;
}
return i;
}
int main()
{ int a[30][6],i,j,count;
count=series(int a[][6],7,360);
for(i=0;i<count;i++)
{ for(j=0;j<6;j++)
printf("%5d",a[i][j]);
printf("\n");
}
getch();
return 0;
}
【规定】
1.打开T盘中myfl.c文献或将上述程序录入到myf1.c文献中,根据题目规定及程序中语句之间的逻辑关系对程序中的错误进行修改。
2.改错时,可以修改语句中的一部分内容,调整语句顺序,增长少量的变量说明或编译预解决命令,但不能增长其它语句,也不能删去整条语句。
3.改正后的源程序(文献名myfl.c)保存在T盘的根目录中供阅卷使用,否则不予评分。
二、编程题(24分)
【程序功能】
将一个字符串中所有数字字符顺序交移,其他字符顺序后移,生成一个新的字符串。
【编程规定】
1、编写函数void move(char *s)。函数功能:将s指向的字符串中所有数字字符顺序前移,其他字符顺序后移,所生成的新字符串仍然存放在s指向的数组中。
2、编写函数main()。函数功能:声明一个字符型数组s并用测试数据初始化,用s作实参调用move 函数,将结果字符串输出到屏幕及数据文献myf2.out中。最后将考生本人的准考证号字符串输出到文献myf2.out中。
【测试数据与运营结果】
测试数据:"asd123fgh5##43df"
屏幕输出:123543asdfgh##df
【规定】
1.源程序文献名为myf2.c,输出结果文献名为myf2.out。
2.数据文献的打开、使用、关闭均用C语言标准库中文献操作函数实现。
3.源程序文献和运营结果文献均需保存到T盘上,供阅卷使用。
4.不要复制扩展名为obj和exe的文献到T盘上。
【改错题解答:myf1.c】
按照标准,原程序存在3个错误,所以每个错误,若改正,则得4、8、4分。第2个错误是本改错题关键所在。其分值较高。该段程序的目的是保证初始值n是素数。读者也可用实参a,4,360去实验,同样可得相同结果。但考生一般会修改为while(a==0&&prime(n)),这样用实参a,4,360去试,则使下面程序为死循环,对此要扣8分的。
#include<stdio.h>
#include<math.h>
#include<conio.h>
int prime(int n) //1、函数的形参犯错 int n;int n
{ int i;
for(i=2;i<=(int)sqrt(n);i++)
if(n%i==0)
return 0;
return 1;
}
int series(int a[][6],int x,int y)
{ int d=30,i=0,n=x,j,f;
while(!prime(n)) //2、逻辑表达式犯错 n==2||prime(n)→!prime(n) ,不改则导致下面程序死循环
n++; //其实这段循环目的是保证n是素数。
while(n<y-5*d)
{ f=1;
for(j=0;j<6; j++)
if(prime(n+j*d)==0)
{ f=0; break; }
if(f)
{ for(j=0;j<6;j++)
a[i][j]=n+j*d;
i++;
}
n+=2;
}
return i;
}
int main()
{ int a[30][6],i,j,count;
count=series(a,7,360); //3、函数调用的实参犯错:int a[][6],7,360→a,7,360
for(i=0;i<count;i++)
{ for(j=0;j<6;j++)
printf("%5d",a[i][j]);
printf("\n");
}
getch();
return 0;
}
【编程题解题思绪】
此题解题思绪是挑字符串s中数字字符存入数组a;其余数字存入数组b,最后将其合并,再由合并后的字符串复制入形参数组s。
另一方面是,需要知道库函数所需要的相应的头文献名,下面一一予以注释。
【编程题解答:myf2.c】
#include <stdio.h>
#include <string.h> //库函数strcat()和strcpy()需要
#include <ctype.h> //库函数isdigit()需要
#include <stdlib.h> //库函数exit(0)需要
#include <conio.h> //库函数getch()需要
void move(char *s)
{ int i=0, j=0,k,m=strlen(s);
char a[20],b[20];
for(k=0;k<m;k++)
if(isdigit(s[k])) a[i++]=s[k]; //数字串s中数字字符顺序存入数组a
else b[j++]=s[k]; //其余字符顺序存入数组b
a[i]='\0'; b[j]='\0'; //加字符串的截止符
strcat(a,b); //变化后字符所有存入数组a
strcpy(s,a);
}
void main()
{ char s[20]="asd123fgh5##43df"; FILE *fp;
if((fp=fopen("myf2.out","w"))==NULL)
{ printf("\nCan't open the file!"); exit (0);}
move(s);
printf("\n%s",s),fprintf(fp, "\n%s",s);
printf("\nMy number is:\n"); fprintf(fp,"\nMy number is:1292340\n");
fclose(fp); /*操作结束,关闭文献fp 书P334 */
getch();
}
江苏省高等学校非计算机专业学生(C06)
计算机基础知识和应用能力等级考试上机试卷
二级 C语言(试卷代号C06)
(本试卷完毕时间 70分钟)
一、 改错题(16分)
【程序功能】
任何一个合数都可以成若干个质因数相乘的形式,例如,120=2×2×2×3×5。
以下程序实现将输入的一个合数分解成质因数相乘的形式,其中,函数fun的功能是分解num的质因数,将得到的所有质因数存放在a指向的数组中,质因数的个数通过指针count带回主函数。
【测试数据与运营结果】
测试数据: n=120
屏幕输出: 120=2×2×2×3×5
【具有错误的源程序】
以下源程序已保存在T盘myf1.c文献内,考生可直接打开该文献测试程序。
#include<stdio.h>
#include <conio.h>
int prime(int n)
{ int i;
for(i=1;i<=n/2;i++)
if (n%i==0)
return 0;
return 1;
}
void fun(int a[], int num, int *count)
{ int b[50]={2},k=1,i=0,j=0,n;
for(n=3;n<50;n+=2) /* 将50以内的质数按值从小到大顺序存放到b数组 */
if(prime(n)=1) b[k++]=n;
while(num!=1&&j<k)
{ while(num%b[j]==0) /*反复判断b[j]是否num的因子,直到b[j]不能整除num */
{ num=num/b[j];
a[i++]=b[j];
}
j++;
}
*count=i;
}
int main()
{ int a[20],n,i,count;
printf("Please input an integer:\n");
scanf("%d",&n);
if(!prime(n)&&n>0)
{ fun(a[20],n,&count);
printf("%d=%d\n",n,a[0]);
for(i=1;i<count;i++)
printf("*%d ",a[i]);
}
else printf("%d error",n);
getch();
return 0;
}
【规定】
1.打开T盘中myfl.c文献或将上述程序录入到myf1.c文献中,根据题目规定及程序中语句之间的逻辑关系对程序中的错误进行
展开阅读全文