一 字符串
写一个程序输入有四个字符的字符串,如果串中每个字符都是数字(0-9),则将该字符串转换为对应的整数,然后加1并输出结果。如果有任何一个字符不是数字,则显示一个错误消息。
**提示信息:"请输入四个数字字符:"
**输出格式要求:"有非数字字符!" "你输入的数值+1后为%d\n"
#include <stdio.h>
#include <stdlib.h>
char arr[5];
int main()
{
printf("请输入四个数字字符:");
gets(arr);
if((arr[0]<='9'&&arr[0]>='0')&&(arr[1]<='9'&&arr[1]>='0')&&(arr[2]<='9'&&arr[2]>='0')&&(arr[3]<='9'&&arr[3]>='0'))
{
int a,b,c,d,sum;
a=(int)arr[0]-48;
b=(int)arr[1]-48;
c=(int)arr[2]-48;
d=(int)arr[3]-48;
sum=a*1000+b*100+c*10+d+1;
printf("你输入的数值+1后为%d\n",sum);
}
else{
printf("有非数字字符!");
}
return 0;
}
二 字符串改错题
下面程序的功能是删除字符串中第一次出现的a字符。找出其中错误,并改正之。
#include <stdio.h>
#include <string.h>
void fun(char *x,int n,*t);
{ int i,k=0;
x[n]='a';x[n+1]='\0';
while(x[k]!=’a’) k++;
if(k==n){*t=0;break;}
else
{ for(i=k;i<n;i++)
x[i]=x[i+1];
x[i]='\0';
}
}
int main()
{
char x[20];
int len,t;
gets(x);
puts(x);
len=strlen(x);
fun(x,len,t);
if(t==0) printf("Not exist!\n");
else puts(x);
return 0;
}
答案
下面程序的功能是删除字符串中第一次出现的a字符。找出其中错误,并改正之。
#include <stdio.h>
#include <string.h>
void fun(char *x,int n,*t);
{ int i,k=0;
x[n]='a';x[n+1]='\0';
while(x[k]!=’a’) k++;
if(k==n){*t=0;break;}
else
{ for(i=k;i<n;i++)
x[i]=x[i+1];
x[i]='\0';
}
}
int main()
{
char x[20];
int len,t;
gets(x);
puts(x);
len=strlen(x);
fun(x,len,t);
if(t==0) printf("Not exist!\n");
else puts(x);
return 0;
}
3 改错题
在下面使用指针数组的程序中存在一个错误,试分析这个程序,并上机运行,观察运行结果,找到这个错误,并分析出错的原因。
#include <stdio.h>
void Print(char *arr[], int len);
int main(void)
{
char *pArray[] = {"Fred","Barrey","Wilma","Betty"};
int num = sizeof(pArray) / sizeof(char);
printf("Total string numbers = %d\n", num);
Print(pArray, num);
return 0;
}
void Print(char *arr[], int len)
{
int i;
for (i=0; i<len; i++)
{
printf("%s,", arr[i]);
}
printf("\n");
}
答案
#include <stdio.h>
void Print(char *arr[], int len);
int main(void)
{
char *pArray[] = {"Fred","Barrey","Wilma","Betty"};
int num = sizeof(pArray) / sizeof(char *);//里面的元素是指针
printf("Total string numbers = %d\n", num);
Print(pArray, num);
return 0;
}
void Print(char *arr[], int len)
{
int i;
for (i=0; i<len; i++)
{
printf("%s,", arr[i]);
}
printf("\n");
}
第四题
输出 2~n之间所有素数,并求和,n由键盘输入。素数是只能被1和自身整除的整数。要求编写函数判断自然数x是否为素数,函数原型为:
int IsPrime(unsigned int x); //x是素数返回1,不是素数返回0。
输入提示信息:"Please input n(n>1):"
输入格式:"%d"
每个素数的输出格式:"%d\n"
求和输出格式:"sum of prime numbers:%d"
答案
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
int IsPrime(unsigned int x);
int main(){
int n;
int sum=0;
printf("Please input n(n>1):");
scanf("%d",&n);
for(int i=2;i<=n;i++){
if(IsPrime(i))
{
printf("%d\n",i);
sum+=i;
}
}
printf("sum of prime numbers:%d",sum);
}
int IsPrime(unsigned int x){
int i;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0){
return 0;
}
}
return 1;
}
第五题 第八章
要求:从键盘输入10个整数存入一个数组中,用函数编程将其中的最大数与最小数位置互换,然后输出互换后的数组。函数原型:void MaxMinExchang(int a[], int n);
输入提示信息:"Input 10 numbers:"
输入格式:"%d"
输出提示信息:"Exchang results:"
输出格式:"%4d"
程序运行结果示例:
Input 10 numbers:0 2 7 4 9 11 5 47 6 97↙
Exchang results: 97 2 7 4 9 11 5 47 6 0
答案
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
int arr[10];
void MaxMinExchang(int a[], int n);
int main(){
printf("Input 10 numbers:");
for (int i=0;i<10;i++){
scanf("%d",&arr[i]);
}
MaxMinExchang(arr,10);
printf("Exchang results:");
for (int i=0;i<10;i++){
printf("%4d",arr[i]);
}
}
void MaxMinExchang(int a[], int n){
int max=a[0];
int min=a[0];
int x=0;//最大值下标
int y=0;//最小值下标
for (int i=0;i<10;i++){
if(max<a[i]){
max=a[i];
x=i;
}
if(min>a[i]){
min=a[i];
y=i;
}
}
int temp;
temp=a[x];
a[x]=a[y];
a[y]=temp;
}
第六题 第九章
从键盘输入某班学生某门课的成绩(每班人数最多不超过30人,具体人数由键盘输入),按如下函数原型,用指针做函数参数编写函数FindMax()计算最高分及相应学生的学号返回给主函数,然后在主函数中输出最高分及相应学生的学号。
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum);
**输入提示信息:
输入学生人数的提示信息为"How many students?"
输入学号和成绩的提示信息为"Input student’s ID and score:\n"
**输入数据格式:输入学生人数用"%d", 输入学号和成绩用"%ld%d"
**输出提示信息和数据格式:"maxScore = %d, maxNum = %ld\n"
按如下框架编写程序:
#include <stdio.h>
#define N 30
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum);
main()
{
}
/* 函数功能:计算最高分及其相应学生的学号 */
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum)
{
}
第六题 第九章 1
按如下函数原型,采用梯形法编程实现,在积分区间[a,b]内划分n个小区间,这里取n=100,计算函数y1=∫10(1+x2)dx和y2=∫30x1+x2dx的定积分。其中,指向函数的指针变量f用于接收被积函数的入口地址。
Integral(float (*f)(float), float a, float b);
**输出格式要求:"y1=%f\ny2=%f\n"
答案
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
float f1(float a,float b){
float sum=0;
float step=(b-a)/100;
float x=a;
for(int i=0;i<100;i++)
{
sum=(((1+x*x)+(1+(x+step)*(x+step)))*step)/2+sum;
x=x+step;
}
return sum;
}
float f2(float a,float b){
float sum=0;
float step=(b-a)/100;
float x=a;
for(int i=0;i<100;i++){
sum=(((x/(1+x*x))+((x+step)/(1+(x+step)*(x+step))))*step)/2+sum;
x=x+step;
}
return sum;
}
float Integral(float (*f)(float,float), float a, float b){
return (*f)(a,b);
}
int main(){
float y1,y2;
y1=Integral(f1,0,1);
y2=Integral(f2,0,3);
printf("y1=%f\ny2=%f\n",y1,y2);
}
第七题 第十章(重点)
单词接龙
阿泰和女友小菲用英语短信玩单词接龙游戏。一人先写一个英文单词,然后另一个人回复一个英文单词,要求回复单词的开头有若干个字母和上一个人所写单词的结尾若干个字母相同,重合部分的长度不限。(如阿泰输入happy,小菲可以回复python,重合部分为py。)现在,小菲刚刚回复了阿泰一个单词,阿泰想知道这个单词与自己发过去的单词的重合部分是什么。他们两人都是喜欢写长单词的英语大神,阿泰觉得用肉眼找重合部分实在是太难了,所以请你编写程序来帮他找出重合部分。
程序运行结果示例1:
happy↙
pythen↙
py
程序运行结果示例2:
sun↙
unknown↙
un
输入格式: "%s%s"
输出格式: "%s\n"
参考答案
#include <stdio.h>
#include <string.h>
char a[81], b[81];
int main()
{
int maxlen, testlen, la;
scanf("%s%s", a, b);
la = strlen(a);
maxlen = strlen(b);
for (testlen = maxlen; testlen > 0; testlen--)
if (!strncmp(b, a + la - testlen, testlen))
{
printf("%s\n", a + la - testlen);
break;
}
return 0;
}
答案一
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define N 20
int main()
{
char str1[N], str2[N], str3[N];
int i, r=0, lenth1, lenth2;
scanf(" %s %s", str1, str2);
lenth1 = strlen(str1);
lenth2 = strlen(str2);
for(i=0;i<lenth1;i++)
{
if(str1[i] == str2[0])
{
for(r=0;r<lenth2;r++)
{
if(str1[i+r] == str2[r])
{
str3[r] = str2[r];
}
else if(str1[i+r] != '\0')
{
break;
}
else
{
str3[r] = '\0';
}
}
}
}
printf("%s\n", str3);
return 0;
}
答案二
#include <stdio.h>
#include<math.h>
#include<string.h>
#define N 20
int main()
{
char a[N], b[N], c[N];
long lena, lenb;
long i, j=0;
scanf("%s%s", a, b);
lena = strlen(a);
lenb = strlen(b);
for(i=0;i<lena;i++)
{
if(a[i]==b[j])
{
c[j]=b[j];
for(j=1;j<lenb;j++)
{
if(a[i+j]==b[j])
c[j]=b[j];
else
break;
}
}
}
c[j+1]='\0';
printf("%s\n", c);
return 0;
}
第八题 二维数组
用指向一维数组的指针变量即二维数组的行指针作为函数参数,实现矩阵转置。按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。
void Transpose(int (*a)[N], int (*at)[M], int m, int n);
void InputMatrix(int (*a)[N], int m, int n);
void PrintMatrix(int (*at)[M], int n, int m);
输入提示信息:"Input m, n:"
输入格式:"%d,%d"
输入提示信息:"Input %d*%d matrix:\n"
输出提示信息和格式:"The transposed matrix is:\n"
输出格式:"%d\t"
答案
#include<stdio.h>
#define M 10
#define N 10
void Transpose(int (*a)[N], int (*at)[M], int m, int n);
void InputMatrix(int (*a)[N], int m, int n);
void PrintMatrix(int (*at)[M], int n, int m);
int main()
{
int s[M][N],st[N][M],m,n;// 1 2 3 4 5 6 7 8 9
printf("Input m, n:");
scanf("%d,%d",&m,&n);
InputMatrix(s,m,n);
Transpose(s,st,m,n);
printf("The transposed matrix is:\n");
PrintMatrix(st,n,m);
return 0;
}
void Transpose(int (*a)[N], int (*at)[M], int m, int n)
{
int i,j;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
*(*(at+j)+i)=*(*(a+i)+j);
}
void InputMatrix(int (*a)[N], int m, int n)
{
int i,j;
printf("Input %d*%d matrix:\n",m,n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d",*(a+i)+j);
}
void PrintMatrix(int (*at)[M], int n, int m)
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
printf("%d\t",*(*(at+i)+j));
printf("\n");
}
}
答案
#include<stdio.h>
#define M 10
#define N 10
void Transpose(int (*a)[N], int (*at)[M], int m, int n);
void InputMatrix(int (*a)[N], int m, int n);
void PrintMatrix(int (*at)[M], int n, int m);
int main()
{
int s[M][N],st[N][M],m,n;// 1 2 3 4 5 6 7 8 9
printf("Input m, n:");
scanf("%d,%d",&m,&n);
InputMatrix(s,m,n);
Transpose(s,st,m,n);
printf("The transposed matrix is:\n");
PrintMatrix(st,n,m);
return 0;
}
void Transpose(int (*a)[N], int (*at)[M], int m, int n)
{
int i,j;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
*(*(at+j)+i)=*(*(a+i)+j);
}
void InputMatrix(int (*a)[N], int m, int n)
{
int i,j;
printf("Input %d*%d matrix:\n",m,n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d",*(a+i)+j);
}
void PrintMatrix(int (*at)[M], int n, int m)
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
printf("%d\t",*(*(at+i)+j));
printf("\n");
}
}
第九题 二维数组(重点,注意如何申请数组)
用动态数组编程输入任意m个班学生(每班n个学生)的某门课的成绩,计算最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。其中,m和n的值由用户从键盘任意输入(不限定m和n的上限值)。
输入提示信息:
"Input array size m,n:"
"Input %d*%d array:\n"
输入格式:"%d,%d"
输出提示信息和格式:"maxScore = %d, class = %d, number = %d\n"
答案
#include<stdio.h>
#include<stdlib.h>
int main(){
int m,n;
printf("Input array size m,n:");
scanf("%d,%d",&m,&n);
int*p=(int*)calloc(m*n,sizeof(int));//申请到的二维数组指针是一个列指针
printf("Input %d*%d array:\n",m,n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",(p+i*n+j));//按照列指针方式来处理
}
}
int max=p[0];
int k,l;
k=l=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(max<p[i*n+j])
{
max=p[i*n+j];
k=i;l=j;
}
}
}
printf("maxScore = %d, class = %d, number = %d\n",max,k+1,l+1);//因为k,l是从0开始,但是班级是从一开始
}
第十题 二维数组
口袋中有若干红、黄、蓝、白、黑5种颜色的球,每次从口袋中取出3个球,定义如下指针数组,编程打印出得到3种不同颜色的球的所有可能取法。按照红黄蓝白黑的顺序依次输出所有可能的解,不要输出重复的取法(组合情况相同但顺序不同视为相同的取法)。
char *bColor[] = {"RED", "YELLOW", "BLUE", "WHITE", "BLACK"};
输入提示信息和数据格式:无
输出提示信息和数据格式:"%d:%s,%s,%s\n"
请按如下框架编程:
#include <stdio.h>
int main()
{
char *bColor[] = {"RED", "YELLOW", "BLUE", "WHITE", "BLACK"};
return 0;
}
答案
#include <stdio.h>
int main()
{
char *bColor[] = {"RED", "YELLOW", "BLUE", "WHITE", "BLACK"};
int i,j,k;
int num=0;
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
for(k=j+1;k<5;k++)
{
if(bColor[i]!=bColor[j]&&bColor[j]!=bColor[k]&&bColor[k]!=bColor[i])
{
num++;
printf("%d:%s,%s,%s\n",num,bColor[i],bColor[j],bColor[k]);
}
}
}
}
return 0;
}
第十题 数值处理
输入一个整数,截取它对应的二进制位中从右到左的第8-11位(最右边为第0位)。
**输入格式要求:"%d" 提示信息:"请输入一个整数:"
**输出格式要求:"它的从右开始的第11-8位为:\n" "%d "
程序运行示例如下:
请输入一个整数:2997↙
它的从右开始的第11-8位为:
1 0 1 1
答案
#include <stdio.h>
#include<stdlib.h>
int arr[20];
void fun(int a)
{
int i=0;
while(a)//除2取余法一定要熟悉
{
arr[i]=a%2;
a=a/2;
i++;
}
}
int main()
{
int num;
printf("请输入一个整数:");
scanf("%d",&num);
fun(num);
printf("它的从右开始的第11-8位为:\n");//注意审题**加粗样式**
for(int i=11;i>=8;i--)
{
printf("%d ",arr[i]);
}
}
第11题 选择控制结构
感觉这题条件不是很完善
程序:显示法定格式的日期合同和其他法律文档中经常使用下列日期格式:
Dated this day of ,19 .
编写程序用来显示这种格式的日期。用户以月/日的格式录入日期,然后计算机显示出“法定”格式的日期:
Enter date (mm/dd/yy) : 7/19/96
Dated this 19th day of July, 1996.
可以使用printf函数实现主要的格式化。然而,还有两个问题:如何为日添加“th”(或者“st”、“nd”、“rd”),以及如何使用单词代替数字显示月份。幸运的是,switch语句可以很好地解决这两种问题:用一个switch语句负责显示日的后缀,再用另一个switch语句显示出月份名。注意,11日、12日、13日对应的英文是th结尾。
**输入格式要求:"%d/%d/%d" 提示信息:"Enter date (mm/dd/yy):" "Dated this %d" "st/nd/rd/th" " day of " "January/February/.../December"
如果输入的日期不在合法范围内,则输出"Input error!\n"。
**输出格式要求:", 19%.2d.\n"
插曲 strcpy的用法
详见此链接
答案
#include <stdio.h>
#include<stdlib.h>
int main(){
int day,year,month;
printf("Enter date (mm/dd/yy):" );
char arr[20];
char arr1[3];
scanf("%d/%d/%d",&month,&day,&year);
if(day>31||month>12||month<1||day<1)
{
printf("Input error!\n");
return 0;
}
switch(month)
{
case 1:
strcpy(arr,"January");
break;
case 2:
strcpy(arr,"February");
break;
case 3:
strcpy(arr,"March");
break;
case 4:
strcpy(arr,"April");
break;
case 5:
strcpy(arr,"May");
break;
case 6:
strcpy(arr,"June");
break;
case 7:
strcpy(arr,"July");
break;
case 8:
strcpy(arr,"August");
break;
case 9:
strcpy(arr,"September");
break;
case 10:
strcpy(arr,"October");
break;
case 11:
strcpy(arr,"November");
break;
case 12:
strcpy(arr,"December");
break;
default:
break;
}
switch(day){
case 1:
strcpy(arr1,"st");
break;
case 2:
strcpy(arr1,"nd");
break;
case 3:
strcpy(arr1,"rd");
break;
case 21:
strcpy(arr1,"st");
break;
case 22:
strcpy(arr1,"nd");
break;
case 23:
strcpy(arr1,"rd");
break;
default:
strcpy(arr1,"th");
break;
}
printf("Dated this %d%s day of %s, 19%02d.",day,arr1,arr,year);
}
12题 循环控制结构
将任一整数转换为二进制形式。
**输入格式要求:"%d" 提示信息:"Input number:"
**输出格式要求:"number of decimal form:%d\n" " it\'s binary form: "
程序运行示例如下:
Input number:876
number of decimal form:876
it's binary form: 00000000000000000000001101101100
答案(要求的格式有问题)
#include <stdio.h>
#include<stdlib.h>
int arr[32];
int fun(int num){
int i=0;
while (num){
arr[i]=num%2;
num=num/2;
i++;
}
return i;
}
int main()
{
int num;
printf("Input number:");
scanf("%d",&num);
int n=fun(num);
printf("number of decimal form:%d\n",num);
printf(" it\'s binary form: ");
for(int i=31;i>=0;i--)
{
printf("%d",arr[i]);
}
}
13题 递归函数
编程将字符串s倒序输出,要求利用函数递归实现。
**输入格式要求:"%s" 提示信息:"input your string:\n"
**输出格式要求:"%c"
程序运行的输入输出样例:
屏幕先输出提示信息:
input your string:
然后用户键盘输入:
abcdefg
最后屏幕输出:
gfedcba
答案
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
void fun(char arr[],int n)
{
int i=n-1;
if (i<0)
{
}
else
{
printf("%c",arr[i]);
fun(arr,n-1);
}
}
int main()
{
char arr[30]={0};
printf("input your string:\n");
scanf("%s",arr);
int n=strlen(arr);
fun(arr,n);
}
第14题 函数指针
编写一个函数,输入大于1的整数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 求1/1+1/3+...+1/n(要求利用函数指针编程)
输入格式:"%d"
偶数输出:"Even=%f"
奇数输出:"Odd=%f"
程序运行示例1如下:
10
Even=1.141667
程序运行示例2如下:
9
Odd=1.787302
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
void Even( float n){
float sum=0;
for (float i=2;i<=n;i=i+2)
{
sum=sum+1/i;
}
printf("Even=%f",sum);
//return sum;
}
void Odd( float n){
float sum=0;
for (float i=1;i<=n;i=i+2)
{
sum=sum+1/i;
}
printf("Odd=%f",sum);
//return sum;
}
void fun(void (*f)(float),float m)
{
f(m);
}
int main()
{
int num;
scanf("%d",&num);
if (num%2==0)
{
fun(Even,num);
}else{
fun(Odd,num);
}
}
第15题 约瑟夫问题(重点)
*约瑟夫问题。这是十七世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个基督教徒和15个异教徒在海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了个办法:30个人围成一个圆圈,从第一个人开始依次报数,每数到第9个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是异教徒。
本题示例为 @ @ @ @ + + + + + @ @ + @ @ @ + @ + + @ @ + + + @ + + @ @ + (第一个人前无空格,每人中间1个空格)
**输出格式要求:"The original circle is (+:papandom, @:christian);\n" "%c "
自己写的答案(错了)
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
char arr[30]={0};
int main()
{
int n=0;
int i=-1;
while(n<15)
{
i=(i+9)%30;
if(arr[i]!='+')
{
arr[i]='+';
}
else
{
i=(i+1)%30;
arr[i]='+';
}
n++;
}
for(int j=0;j<30;j++)
{
if (arr[j]=='\0')
{
arr[j]='@';
}
}
printf("The original circle is (+:papandom, @:christian);\n");
for(int j=0;j<30;j++)
{
printf("%c ",arr[j]);
}
}
正确答案
#include<stdio.h>
int main() {
int i, j, n;
//数组当中某元素为0表示该人在船上,为1表示该人已被扔下去
int person[30] = { 0 };
int count = 0, num = 0; //count用于0-9报数的计数,num用于计数扔下船的人数
while (num != 15) {
for (i = 0; i < 30; i++) {
if (person[i] == 0) { //当这个位置的人在船上,报一次数
count++;
if (count == 9) { //当这个人报数为9,扔下去,计数器归零
count = 0;
person[i] = 1;
num++;
}
}
}
}
printf("The original circle is (+:papandom, @:christian);\n");
for (i = 0; i < 30; i++) {
if (person[i] == 1)
printf("+ ");
else
printf("@ ");
}
}
第 16题 结构体
用结构体实现输入4个学生的学号(无符号整数)、姓名(字符串)和考试成绩(整数),然后按从高分到低分的顺序排列后输出。
程序的运行示例如下:
输入第1个学生的信息:学号、姓名、成绩
2011 zhangsan 89
输入第2个学生的信息:学号、姓名、成绩
2012 lisi 96
输入第3个学生的信息:学号、姓名、成绩
2013 wangwu 67
输入第4个学生的信息:学号、姓名、成绩
2014 liuliu 59
排序后学生的信息为:
2012 lisi 96
2011 zhangsan 89
2013 wangwu 67
2014 liuliu 59
typedef的用法
答案
#include <stdio.h>
typedef struct student
{
unsigned int number;
char name[20];
int score;
}stu;
void change(stu stu1[],int n)
{
int i,j;
stu temp;
for(i=0;i<n-1;i++)
{
for(j=1;j<n-i;j++)
{
if( stu1[j].score>stu1[j-1].score)//冒泡排序
{
temp=stu1[j];//结构体可以直接变换
stu1[j]=stu1[j-1];
stu1[j-1]=temp;
}
}
}
}
int main()
{
stu stu1[4];
for(int i=0;i<4;i++)
{
printf("输入第%d个学生的信息:学号、姓名、成绩\n",i+1);
scanf("%d",&stu1[i].number);
scanf("%s",stu1[i].name);
scanf("%d",&stu1[i].score);
}
change(stu1,4);
printf("排序后学生的信息为:\n");
for(int i=0;i<4;i++)
{
printf("%d ",stu1[i].number);
printf("%s ",stu1[i].name);
printf("%d\n",stu1[i].score);
}
}
第17题 共用体(改错题)
以下程序有若干语法错误,不能正确输出成员a和成员v的值。请找出错误并改正之。
union
{ int a;
Struct
{ int u;
float v;
}b;
}
main()
{ union uu m;
m.a=200;
m.u=500;
m.v=120.5;
printf(“%d\t%f\n”,m.a,m.b.v);
}
答案
#include <stdio.h>
union uu
{ int a;
struct
{ int u;
float v;
}b;
};
int main()
{ union uu m;
m.a=200;
printf("%d\t",m.a);
m.b.u=500;
m.b.v=120.5;
printf("%f\n",m.b.v);
}
第18题 动态数据结构(链表是重点)
在一个有序(按非递减顺序)的链表中插入一个元素为x的结点,使插入后的链表仍然有序(链表数据域为整型数,初始时输入6个元素)。
程序运行示例如下:
输入数组6个元素的值。
12 23 34 45 56 67
此链表各个结点的数据域为:12 23 34 45 56 67
输入要插入的数据x:36
插入后链表各个结点的数据域为:12 23 34 36 45 56 67
插曲:不是偏链表的动态数组
#include <stdio.h>
typedef struct arr1
{
int* array;
int length;
}arr;
int main(){
arr a;
int i;
int n=9;
a.array=(int *)malloc(sizeof(int)*n);
a.length=n;
for(i=0;i<a.length;i++)
{
scanf("%d" ,&a.array[i]);
}
}
答案
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node* next;
};
int main(){
struct node* L=(struct node*)malloc(sizeof(struct node));
struct node* q=L;
int num=0;
printf("输入数组6个元素的值。\n");
for (int i=0;i<6;i++)
{
struct node*p=(struct node*)malloc(sizeof(struct node));
scanf("%d",&p->data);
q->next=p;
q=q->next;
num++;
}
printf("此链表各个结点的数据域为:");
struct node* k=L;
for( int i=0;i<num;i++)
{
printf("%d ",k->next->data);
k=k->next;
}
int x;
printf("\n");
printf("输入要插入的数据x:");
scanf("%d",&x);
struct node* m=L;
while(m->next->data<x)
{
m=m->next;
}
struct node*n=(struct node*)malloc(sizeof(struct node));
n->data=x;
n->next=m->next;
m->next=n;
struct node* u=L;
printf("插入后链表各个结点的数据域为:");
for( int i=0;i<num+1;i++)
{
printf("%d ",u->next->data);
u=u->next;
}
}
第19 题 动态数据结构(也是约瑟夫问题)
n个人围成一圈,顺序编号。从第一个人开始从1到m报数,凡报到m的人退出圈子,编程求解最后留下的人的初始编号。
样例输入:(第一行输入)
6 3(两个输入数据之间有空格)
样例输出:(换行输出)
1
答案
#include <stdio.h>
#include <stdlib.h>
struct arr{
int *p;
int length;
};
int main()
{
int m;int n;
scanf("%d%d",&n,&m);
struct arr a;
a.p=(int*)malloc(sizeof(int)*n);
a.length=n;
for(int i=0;i<n;i++)
{
a.p[i]=i+1;
}
int number=n;
int count=0;
while(number!=1)
{
for(int i=0;i<n;i++)
{
if(a.p[i]!=-1)
{
count++;
if(count==m)
{
a.p[i]=-1;
number--;
count=0;
}
}
}
}
for(int i=0;i<n;i++)
{
if(a.p[i]!=-1)
{
printf("%d",a.p[i]);
break;
}
}
}
第20题 一维数据结构(这个题还要再看一下)
小明买书
小明假期同爸爸一起去书店,他选中了六本书,每本书的单价分别:3.1,1.7,2,5.3,0.9和7.2元。不巧的是,爸爸兜里只带了十几块钱,为了让小明过一个愉快的假期,爸爸仍然同意买书,但提出了一个要求,要小明从六本书中选出若干本,使得单价相加所得的和同10最接近。你能够帮助小明解决这个问题吗?如果有多种方案,请按照运行示例中的顺序输出。
**输入格式要求:"%f"
**输出格式要求:"10(+ -)%.2f=" "%.2f+" "%.2f\n"
程序运行示例如下:
3.1 1.7 2 5.3 0.9 7.2
10(+ -)0.10=2.00+0.90+7.20
10(+ -)0.10=1.70+2.00+5.30+0.90
10(+ -)0.10=3.10+1.70+5.30
官方答案
#include <math.h>
#include <stdio.h>
main()
{
int d[6],m,i,j;
long b[63],flag;
float c[6]={3.1,1.7,2,5.3,0.9,7.2},min,x;
/*printf("Please enter the prices of 6 books:");
for(i=0;i<6;i++)
scanf("%f",&c[i]);*/
for(i=0,min=-1,d[0]=0;d[0]<2;d[0]++)
for(d[1]=0;d[1]<2;d[1]++)
for(d[2]=0;d[2]<2;d[2]++)
for(d[3]=0;d[3]<2;d[3]++)
for(d[4]=0;d[4]<2;d[4]++)
for(d[5]=0;d[5]<2;d[5]++)
{
for(flag=0,x=0.,j=5;j>=0;j--)
{
x+=c[j]*d[j];flag=flag*10+d[j];
}
x=((x-10>0)?x-10:10-x);
if(min<0)
{
min=x;
b[i++]=flag;
}
else if(min-x>1.e-6)
{
min=x;b[0]=flag;i=1;
}
else if(fabs((double)x-min)<1.e-6)
b[i++]=flag;
}
for(m=0;m<i;m++)
{
printf("10(+ -)%.2f=",min);
for(flag=b[m],j=0;flag>0;j++,flag/=10)
if(flag%10)
if(flag>1) printf("%.2f+",c[j]);
else printf("%.2f\n",c[j]);
}
}
第21题 一维数据结构(需要再看一下)
计算分数的精确值
使用数组精确计算M/N(0<M<N<=100)的值。如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数位的序号)。
**输入格式要求:"%d/%d" 提示信息:"please input a fraction (m/n)) (0< m< n<=100):"
**输出格式要求:"%d/%d it's accuracy value is:0." "\n\tand it is a infinite cyclic fraction from %d\n" "\tdigit to %d digit after decimal point.\n"
程序运行示例如下:
please input a fraction (m/n)) (0< m< n<=100):1/6
1/6 it's accuracy value is:0.16
and it is a infinite cyclic fraction from 2
digit to 2 digit after decimal point.
思路来源
答案
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
int arr[20];
int m,n;
printf("please input a fraction (m/n)) (0< m< n<=100):");
scanf("%d/%d",&m,&n);
printf("%d/%d it's accuracy value is:0.",m,n);
int flag=0;
int a,b;//用来存无限循环小数下标
int length=0;
for(int i=0;i<20;i++)
{
m=m*10;
arr[i]=m/n;
length++;
m=m%n;
if(i>=1)//i>0时才有可能有重复值
{
for(int k=0;k<i;k++)
{
if(arr[k]==arr[i])
{
flag=1;//此时有重复的,代表遇到了无限循环小数
a=k+1;//数组下标和位序的关系
b=i;//b-1+1
}
}
if(flag==1)
{
break;
}
}
}
for (int i=0;i<length-1;i++)//length-1是为了去掉重复节段第一个数字
{
printf("%d",arr[i]);
}
if(flag==1)
{
printf("\n\tand it is a infinite cyclic fraction from %d\n" "\tdigit to %d digit after decimal point.\n",a,b);
}
}
第22题 求1898(一开始没做出来)
求1898
现將不超过2000的所有素数从小到大排成第一行,第二行上的每个数都等于它“右肩”上的素数与“左肩”上的素数之差。这样可以得到两行数,如下:
2 3 5 7 11 13 17 19 ......1997 1999
1 2 2 4 2 4 2 ......... 2
请编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假如存在的话,又有几种这样的情况?
**输入格式要求:提示信息:"There are follwing primes in first row :\n"
**输出格式要求:"(%d).%3d,......,%d\n"
程序运行示例如下:
There are follwing primes in first row :
(1).101,......,1999
(2). 89,......,1987
(3). 53,......,1951
(4). 3,......,1901
自己的答案(最终和答案输出反了)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int arr1[2000];
int arr2[2000];
int k=0;
void Isprime(int n)
{
int flag=1;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
flag=0;
break;
}
}
if(flag==1)
{
arr1[k]=n;
k++;
}
}
int main(){
int num=1;//用于记录输出序列
for(int i=2;i<2000;i++)
{
Isprime(i);
}
for(int i=0;i<k-1;i++)
{
arr2[i]=arr1[i+1]-arr1[i];
}
int sum=0;
printf("There are follwing primes in first row :\n");
for(int i=0;i<k-1;i++)
{
sum=0;
sum=sum+arr2[i];
for(int j=i+1;j<k-1;j++)
{
sum=sum+arr2[j];
if(sum==1898)
{
printf("(%d).%3d,......,%d\n",num,arr1[i],arr1[j+1]);
num++;
}
if(sum>1898)
{
break;
}
}
}
}
改了下输出顺序后
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int arr1[2000];
int arr2[2000];
int k=0;
void Isprime(int n)
{
int flag=1;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
flag=0;
break;
}
}
if(flag==1)
{
arr1[k]=n;
k++;
}
}
int main(){
int num=1;//用于记录输出序列
for(int i=2;i<2000;i++)
{
Isprime(i);
}
for(int i=0;i<k-1;i++)
{
arr2[i]=arr1[i+1]-arr1[i];
}
int sum=0;
printf("There are follwing primes in first row :\n");
for(int i=k-2;i>=0;i--)
{
sum=0;
sum=sum+arr2[i];
for(int j=i-1;j>=0;j--)
{
sum=sum+arr2[j];
if(sum==1898)
{
printf("(%d).%3d,......,%d\n",num,arr1[j],arr1[i+1]);//这里发生了改动
num++;
}
if(sum>1898)
{
break;
}
}
}
}
第23题 改错题(一开始错了)
关于字符串比较函数strcmp返回值的问题
注意scanf遇到空格的表现
关于c语言的scanf用来读取字符的一些总结
将字符串“Hello World”读入字符数组中去。请改正程序中的错误,使它能得出正确的结果。
#include <stdio.h>
#include <string.h>
main()
{
char ch[10];
scanf("%s", ch);
if (!strcmp(ch, "Hello World"))
printf("OK!");
else
printf("Error!");
}
答案
#include <stdio.h>
#include <string.h>
int main()
{
char ch[11];
gets(ch);
if(strcmp(ch,"Hello World")==0)
{printf("OK!");}
else
{
printf("Error!");
}
}
24 改错题
程序改错。在一个3x4矩阵中找出最大数及最大数所在元素的下标。
#include <stdio.h>
#define M 3
#define N 4
int FindMax(int (*p)[N],int m,int n, int *pRow, int *pCol)
main()
{
int score[M][N], i, j, maxScore, row, col;
for ( i=0; i<M; i++ )
{
for ( j=0; j<N; j++ )
{
scanf("%d", &score[i][j]);
}
}
maxScore = FindMax(*score, M, N, &row, &col);
printf("%d %d %d\n", maxScore, row+1, col+1);
}
int FindMax( int (*p)[N], int m, int n,
int *pRow, int *pCol )
{
int i, j, max;
max = *(p);
pRow = 0;
pCol = 0;
for (i=0; i<m; i++)
{
for (j = 0; j<n; j++)
{
if ( *(*(p+i)+j) > max )
{
max = *(*(p+i)+j) ;
*pRow = i;
*pCol = j;
}
}
}
}
#include <stdio.h>
#define M 3
#define N 4
int FindMax(int (*p)[N],int m,int n, int *pRow, int *pCol) ;
int main()
{
int score[M][N], i, j, maxScore, row, col;
for ( i=0; i<M; i++ )
{
for ( j=0; j<N; j++ )
{
scanf("%d", &score[i][j]);
}
}
maxScore = FindMax(*score, M, N, &row, &col);
printf("%d %d %d\n", maxScore, row+1, col+1);
}
int FindMax( int (*p)[N], int m, int n,
int *pRow, int *pCol )
{
int i, j, max;
max = **(p);
*pRow = 0;
*pCol = 0;
for (i=0; i<m; i++)
{
for (j = 0; j<n; j++)
{
if ( *(*(p+i)+j) > max )
{
max = *(*(p+i)+j) ;
*pRow = i;
*pCol = j;
}
}
}
return max;
}
25 改错题(仔细再仔细)
函数fun()功能是:将所有大于1小于整数m的素数存入xx所指向的数组中,素数的个数通过k传回。
例如输入25,则应输出 :
There are 9 prime numbers less than 25:
2 3 5 7 11 13 17 19 23
注意:
请将修改正确后的完整源程序拷贝粘贴到答题区内。
不得增行或删行,也不得更改程序的结构。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。
经教师手工核对后,如果未用指针做函数参数编程,那么即使做对也不给分。
#include <stdio.h>
void fun(int m, int *k, int xx[])
{
int i,j,t;
int n;
for(i=2;i<m;i++)
{
t=1;
for(j=2;j<i;j++)
{
if(i/j==0)
{
t=0;
;
}
}
if(t=1);
xx[n++]=j;
}
k=n;
}
main()
{
int m,n,zz[100];
printf("Please enter an integer number between 10 and 100:\n");
scanf("%d",&n);
fun(n,m,zz);
printf("There are %d prime numbers less than %d:\n",m,n);
for(n=0;n<m;n++)
{
printf("%4d",zz[i]);
}
}
答案
#include <stdio.h>
void fun(int m, int *k, int xx[])
{
int i,j,t;
int n=0;
for(i=2;i<m;i++)
{
t=1;
for(j=2;j<i;j++)
{
if(i%j==0)
{
t=0;
}
}
if(t==1)
{xx[n++]=j; }
}
*k=n;
}
int main()
{
int m,n,zz[100];
printf("Please enter an integer number between 10 and 100:\n");
scanf("%d",&n);
fun(n,&m,zz);
printf("There are %d prime numbers less than %d:\n",m,n);
for(int i=0;i<m;i++)
{
printf("%4d",zz[i]);
}
}
26 改错题(第一遍没改全,注意不要和函数参数重复定义)
在长度为10的数组中查找数组元素最大值及其在数组中的下标位置。下面的程序有错误,请找出并改正之。
#include <stdio.h>
#define n = 10;
int FindMax(int num[], int n, int *pMaxPos);
main()
{
int num[n], maxValue, maxPos, i;
printf("Input %d numbers:\n",n);
for (i=0; i<n; i++)
{
scanf("%d", num[i]);
}
maxValue = FindMax(num, n, maxPos);
printf("Max=%d, Position=%d\n", maxValue, maxPos);
}
int FindMax(int num[], int n, int *pMaxPos)
{
int i, max = num[0];
for (i=1; i<n; i++)
{
if (num[i] > max)
{
max = num[i];
pMaxPos = i;
}
}
return max;
}
注意:
(1)请将修改正确后的完整源程序拷贝粘贴到答题区内。
(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
(3)当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。
(4)改错时不能改变程序原有的意图,也不要改变代码的输入输出格式。
第一遍答案(没改全)
#include <stdio.h>
const int n =10;
int FindMax(int num[], int n, int *pMaxPos);
int main()
{
int num[n], maxValue, maxPos, i;//后面要用到pMaxPos,所以要赋初值才对
printf("Input %d numbers:\n",n);
for (i=0; i<n; i++)
{
scanf("%d", &num[i]);
}
maxValue = FindMax(num, n, &maxPos);
printf("Max=%d, Position=%d\n", maxValue, maxPos);
}
int FindMax(int num[], int n, int *pMaxPos)
{
int max = num[0];
int i=0;
for (i=1; i<n; i++)
{
if (num[i] > max)
{
max = num[i];
*pMaxPos = i;
}
}
return max;
}
正确答案
#include <stdio.h>
const int n=10;
int FindMax(int num[],int n,int *pMaxPos);
int main()
{
int num[n], maxValue, maxPos=0, i;
printf("Input %d numbers:\n",n);
for (i=0; i<n; i++)
{
scanf("%d", &num[i]);
}
maxValue = FindMax(num, n, &maxPos);
printf("Max=%d, Position=%d\n", maxValue, maxPos);
return 0;
}
int FindMax(int num[], int n, int *pMaxPos)
{
int i, max = num[0];
for (i=1; i<n; i++)
{
if (num[i] > max)
{
max = num[i];
*pMaxPos = i;
}
}
return max;
}
27 改错题*求100~200间的全部素数(要细心)
求100~200间的全部素数(即质数),要求每行输出10个素数。
下面程序中存在比较隐蔽的错误,
请通过分析和调试程序,发现并改正程序中的错误。
注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,才得满分。
#include <stdio.h>
main()
{
int m,k,i,n;
for(m=101;m<=200;m+=2)
{
if(n%10==0)
printf("\n");
k=sqrt(m);
for(i= 1;i<=k;i++)
if(m%i==0)
continue;
if(i==m%10)
{
printf("%d ",m);
n++;
}
}
}
答案
#include <stdio.h>
#include <math.h>
int main()
{
int m,k,i,n;
n=0;
printf("\n");
for(m=101;m<=200;m+=1)
{
k=sqrt(m);
for(i= 2;i<=k;i++)
if(m%i==0)
break;
if(i==k+1)
{
printf("%d ",m);
n++;
if(n%10==0)
{printf("\n"); }
}
}
}
28 改错题( 任意输入英文的星期几,通过查找星期表,输出其对应的数字)
任意输入英文的星期几,通过查找星期表,输出其对应的数字,
若查到表尾,仍未找到,则输出错误提示信息。
下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。
改错时不能改变程序原有的意图,不能改变函数原型
#include <stdio.h>
#define WEEKDAYS 7
#define MAX_STR_LEN 10
main()
{
int i, pos;
int findFlag;
char x[MAX_STR_LEN];
char weekDay[][MAX_STR_LEN] = {"Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"
};
printf("Please enter a string:\n");
scanf("%s", &x[i]);
for (i = 0; i < WEEKDAYS || !findFlag; i++)
{
if (x[i] == weekDay[i])
{
pos = i;
findFlag = 1;
}
}
if (findFlag)
{
printf("%s is %d\n", x, pos);
}
else
{
printf("Not found!\n");
}
}
自己的答案(9.6分)
#include <stdio.h>
#include <string.h>
#define WEEKDAYS 7
#define MAX_STR_LEN 10
int main()
{
int i, pos;
int findFlag=0;
char x[MAX_STR_LEN];
char weekDay[][MAX_STR_LEN] = {"Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday","Sunday",
};
printf("Please enter a string:\n");
scanf("%s", x);
for (i = 0; i < WEEKDAYS && !findFlag; i++)
{
if (!strcmp(x,weekDay[i]))
{
pos = i+1;
findFlag = 1;
}
}
if (findFlag)
{
printf("%s is %d\n", x, pos);
}
else
{
printf("Not found!\n");
}
}
正确答案
#include <stdio.h>
#define WEEKDAYS 7
#define MAX_STR_LEN 10
main()
{
int i, pos;
int findFlag=0;
char x[MAX_STR_LEN];
char weekDay[][MAX_STR_LEN] = {"Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"
};
printf("Please enter a string:\n");
scanf("%s", x);
for (i = 0; i < WEEKDAYS && !findFlag; i++)
{
if (strcmp(x,weekDay[i])==0)
{
pos = i;
findFlag = 1;
}
}
if (findFlag)
{
printf("%s is %d\n", x, pos);
}
else
{
printf("Not found!\n");
}
}
29 二维数组
在屏幕上显示如下的杨辉三角形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
…… …… …… …… ……
请按照如下给定的函数原型编程计算并输出n(n<=15)行杨辉三角形。
其中,n值由用户在主函数中通过键盘输入。
void YHTriangle(int a[][15], int n);/*用于计算杨辉三角形*/
void PrintYHTriangle(int a[][15], int n);/*用于打印杨辉三角形*/
**输入提示信息要求:"Input n(n<=15):\n"
**输入格式:"%d"
**输出格式:"%5d" "\n"
每输出一行后就换行
注:
严格按C标准编程。各函数中的变量声明写在所有可执行语句之前。
不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程。
#include <stdio.h>
void YHTriangle(int a[][15], int n);/*用于计算杨辉三角形*/
void PrintYHTriangle(int a[][15], int n);/*用于打印杨辉三角形*/
int a[15][15]={0};
void YHTriangle(int a[][15], int n)
{
if(n>=2)
{
for(int i=0;i<n;i++)
{
a[i][0]=1;
a[i][i]=1;
}
for(int i=2;i<n;i++)
{
for(int j=1;j<i;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
if(n==1)
{
a[0][0]=1;
}
}
void PrintYHTriangle(int a[][15], int n)
{
for(int i =0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
}
int main()
{
int n;
printf("Input n(n<=15):\n");
scanf("%d",&n);
YHTriangle(a,n);
PrintYHTriangle(a,n);
}
30 字符数组 改错题
输入一行字符,统计其中的英文字符、数字字符、空格字符,以及其他字符的个数。请找出以下程序的错误,并改正之。
#include <stdio.h>
#include <string.h>
#define ARR_SIZE = 80;
main()
{
char str[ARR_SIZE];
int len, i;
int letter=0,digit=0,space=0,other=0;
printf("请输入一个字符串:");
gets(str);
len = strlen(str);
for (i=0; i<len; i++)
{
if (a=<str[i]<=z || A=<str[i]<=Z)
{
letter ++;
}
else if (0=<str[i]<=9)
{
digit ++;
}
else if (str[i]=' ' )
{
space ++;
}
else
other ++;
}
printf("英文字符数:%d\n", letter);
printf("数字字符数:%d\n", digit);
printf("空格数:%d\n", space);
printf("其他字符数:%d\n", other);
}
答案
#include <stdio.h>
#include <string.h>
#define ARR_SIZE 80
int main()
{
char str[ARR_SIZE];
int len, i;
int letter = 0, digit = 0, space = 0, other = 0;
printf("请输入一个字符串:");
gets(str);
len = strlen(str);
for (i = 0; i < len; i++)
{
if (('a' <= str[i] && str[i] <= 'z' )|| ('A' <= str[i] && str[i] <= 'Z'))
{
letter++;
}
else if ('0' <= str[i] && str[i] <= '9')
{
digit++;
}
else if (str[i] == ' ' )
{
space++;
}
else
other++;
}
printf("英文字符数:%d\n", letter);
printf("数字字符数:%d\n", digit);
printf("空格数:%d\n", space);
printf("其他字符数:%d\n", other);
}
31题(也 是链表 重点)
建立一个链表,使链表中从头到尾的结点数据域依次是一个数组的各个元素的值。程序先建立链表然后再遍历输出(假定链表和数组均有6个整型元素)。
程序运行示例如下:
输入数组6个元素的值。
1 3 5 7 9 11
此链表各个结点的数据域为:1 3 5 7 9 11
错误答案
#include <stdio.h>//这是错误答案
#include <string.h>
#include <stdlib.h>
struct node{
int data;
struct node* next;
};
int arr[6];
void Insert(struct node* q,int n)
{
struct node*p=(struct node*)malloc(sizeof(struct node));
p->data=n;
q->next=p;
q=q->next;//这里的q在函数执行完之后就会被释放了,所以导致只会给链表中第一个元素赋值
}
int main()
{
printf("输入数组6个元素的值。");
for(int i=0;i<6;i++)
{
scanf("%d",&arr[i]);
}
struct node* L=(struct node*)malloc(sizeof(struct node));
struct node* q=L;
for(int i=0;i<6;i++){
Insert(q,arr[i]);
}
printf("此链表各个结点的数据域为:");
struct node* p=L;
for(int i=0;i<6;i++){
printf("%d ",p->next->data);
p=p->next;
}
}
正确答案
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node{
int data;
struct node* next;
};
int arr[6];
void Insert(struct node *q)
{
for(int i=0;i<6;i++)
{
struct node*p=(struct node*)malloc(sizeof(struct node));
p->data=arr[i];
q->next=p;
q=q->next;
}
}
int main()
{
printf("输入数组6个元素的值。\n");
for(int i=0;i<6;i++)
{
scanf("%d",&arr[i]);
}
struct node L;
L.data=0;
L.next=NULL;
struct node* q=&L;
Insert(q);
printf("此链表各个结点的数据域为:");
struct node* p=&L;
for(int i=0;i<6;i++){
printf("%d ",p->next->data);
p=p->next;
}
}
32题 动态数组
产生动态数组,编写程序,输入数组大小后,通过动态分配内存函数malloc产生数组。 给数组元素赋值,数组元素的值是其下标的10倍。
**输入格式要求:"%d" 提示信息:"Enter array size:"
**输出格式要求:"array[%d]=%d\n"
程序运行示例如下:
Enter array size:8
array[0]=0
array[1]=10
array[2]=20
array[3]=30
array[4]=40
array[5]=50
array[6]=60
array[7]=70
答案
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
printf("Enter array size:");
int n;
scanf("%d",&n);
int*p=(int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
{
p[i]=i*10;
}
for(int i=0;i<n;i++)
{
printf("array[%d]=%d\n",i,p[i]);
}
}
33题 字符串(按下面规律译成密码。)重点找规律
有一电文,已按下面规律译成密码。
A->Z a->z
B->Y b->y
C->X c->x
… …
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程将密码译回原文,并打印出密码和原文。
输入信息和格式:
"请输入字符:"
用gets输入字符串
输出信息和格式:
"\n密码是:%s"
"\n原文是:"
putchar或"%c"
程序的运行示例如下:
请输入字符:hello,world!
密码是:hello,world!
原文是:svool,dliow!
答案
//显然两元素相加是一个定值
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char arr[30];
int main()
{
printf("请输入字符:");
gets(arr);
int length;
length =strlen(arr);
printf("\n密码是:%s",arr);
for(int i=0;i<length;i++)
{
if(arr[i]<='z'&&arr[i]>='a')
{
arr[i]=2*(int)'n'-arr[i]-1;
}
if(arr[i]<='Z'&&arr[i]>='A')
{
arr[i]=2*(int)'N'-arr[i]-1;
}
}
printf("\n原文是:%s",arr);
}
34 题 二维字符数组(排序算法一定要会)
用二维字符数组方法编程实现从键盘任意输入10个字符串,将这10个字符串按字典顺序排序后打印输出,字符串最大长度80。
**输入提示信息格式: 无
**输入数据格式要求: 要求读入的字符串可以包含有空格
**输出数据格式要求: 一行输出一个字符串
注:不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程。
用的是交换排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char arr[10][81];
int main()
{
for(int i=0;i<10;i++)
{
gets(arr[i]);
}
char temp[81]={0};
for(int i=0;i<9;i++)
{
for(int j=i+1;j<10;j++)
{
if(strcmp(arr[j],arr[i])<0)
{
strcpy(temp,arr[j]);
strcpy(arr[j],arr[i]);
strcpy(arr[i],temp);
}
}
}
for(int i=0;i<10;i++)
{
printf("%s\n",arr[i]);
}
}
35结构体
完成对输入的字符串中C关键词的查找统计。
程序运行示例如下:
本程序将为您统计C语言的关键字的个数,请输入,输入end结束输入:
if do while while do break goto helloworld end
您的输入中C语言关键字出现的次数统计如下:
break : 1
do : 2
goto : 1
if : 1
while : 2
输入格式:
"本程序将为您统计C语言的关键字的个数,请输入,输入end结束输入:\n"
(既可以以空格分隔单词,也可以以回车分隔单词)
输出格式:
"您的输入中C语言关键字出现的次数统计如下:\n"
"%-10s: %6d\n"
36 改错
下列给定程序中,函数fun()的功能是求出数组中最小数和次最小数,并把最小数和a[0]中的数对调,次最小数和a[1]中的数对调。
注意:
(1)请将修改正确后的完整源程序拷贝粘贴到答题区内。
(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
(3)当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。
#include <stdio.h>
#define N 20
void fun(int *a,int n)
{
int i, m, t, k;
for(i=0; i<n; i++)
{
m=i;
for(k=i; k<n; k++)
if(a[k]<a[m])
k=m;
t=a[k]
a[k]=a[i];
a[i]=t;
}
}
int main()
{
int b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
for(i=0; i<n; i++)
printf("%d ",b[i]);
printf("\n");
fun(b,n);
for(i=0; i<n; i++)
printf("%d ", b[i]);
printf("\n");
return 0;
}
答案
#include <stdio.h>
#define N 20
void fun(int *a, int n)
{
int i, m, t, k;
for (i = 0; i < 2; i++)
{
m = i;
for (k = i; k < n; k++)
if (a[k] < a[m])
m=k;
t = a[m];
a[m] = a[i];
a[i] = t;
}
}
int main()
{
int b[N] = {11, 5, 12, 0, 3, 6, 9, 7, 10, 8}, n = 10, i;
for (i = 0; i < n; i++)
printf("%d ", b[i]);
printf("\n");
fun(b, n);
for (i = 0; i < n; i++)
printf("%d ", b[i]);
printf("\n");
return 0;
}
37 排序题
设数组a的定义如下:int a[20]={2,4,6,8,10,12,14,16};
已存入数组中的数据值已经按由小到大的顺序存放,现从键盘输入一个数据,把它插入到数组中,要求插入新数据以后,数组数据仍然保持有序。请编写一个程序实现上述功能。
**输入格式要求:"%d" 提示信息:"Enter n:"
**输出格式要求:"%d "
程序运行示例如下:
Enter n:11
2 4 6 8 10 11 12 14 16
答案
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int a[20]={2,4,6,8,10,12,14,16};
printf("Enter n:");
int n;
scanf("%d",&n);
int k;
for(int i=0;i<8;i++)
{
if(a[i]>n)
{
k=i;
break;
}
else
{
k=8;
a[k]=n;
}
}
if(k<8)
{
for(int i=7;i>=k;i--)
{
a[i+1]=a[i];
}
a[k]=n;
}
for(int i=0;i<9;i++)
{
printf("%d ",a[i]);
}
}