目录
一、顺序结构程序(二)
1、输出字符的ASCII码
2、看看你的成绩
3、相反次序重新组合
4、一元二次方程的根
二、选择结构程序设计
1、排序
2、选择结构-闰年判断
3、选择结构-分段函数问题
4、学生成绩等级换算
三、选择结构程序设计进阶
1、快递费用计算
2、计算一元二次方程的根
3、产品信息格式化
四、循环结构程序设计(1)
1、小球自由落体运动
2、求解出n以内所有能被5整除的正整数的乘积
3、最大公约数和最小公倍数
4、字符串中各类字符数的统计
5、求sn=a+aa+aaa+aaaa+......的值
五、循环结构程序设计(2)
1、C循环-求平均成绩
2、C循环-求各位数字之积
3、C循环-求阶乘之和
4、C循环-水仙花数
5、C循环-寻找完数
6、分数求和
六、函数
1、求和
2、回文数计算
3、编写函数求表达式的值
4、阶乘数列
5、亲密数
6、公约公倍数
七、递归函数、嵌套函数
1、递归求阶乘数列
2、递归实现输出一个整数的逆序
3、将整数递归转换成字符串
4、递归实现Ackman函数
八、一维数组和二维数组
1、排序问题
2、查找整数
3、计算数组中元素的最大值及其所在的行列下标值
4、二分查找
5、鞍点
6、删除最大值
7、杨辉三角
九、字符数组
1、字符逆序
2、字符统计
3、字符插入
4、字符串处理
5、字符串统计
6、字符串排序
十、指针
1、用指针法输入12个整数,然后按每行4个数输出
2、指针变量作为函数参数实现两变量交换值
3、报数
4、strcmp函数
十一、指针进阶
1、输出若干个学生成绩中的最高分.要求用指针函数实现
2、采用指针变量表示地址的方法输入输出数组中的个元
3、用指针实现数组循环移动
十二、结构体
1、结构体变量的初始化和引用
2、结构体排序
3、结构体存储数据
4、结构体存储学生信息
一、顺序结构程序(二)
1、输出字符的ASCII码
从键盘输入一个字符,按规定格式输出这个字符及它的ASCII码。例如:
输入A
输出The ASCII of 'A' is 65
#include <stdio.h>
int main()
{
//ÇëÔÚ´ËÌí¼Ó¡®ÊäÈëÒ»¸ö×Ö·û£¬°´¹æ¶¨¸ñʽÊä³ö¸Ã×Ö·ûASCIIÂ롯µÄ´úÂë
/*****************Begin******************/
char a;
scanf("%c",&a);
printf("The ASCII of '%c' is %d",a,a);
return 0;
/***************** End ******************/
}
2、看看你的成绩
假设某同学选修了5
门课程,请依次从键盘输入他5
门课的成绩(每两个成绩之间以逗号隔开),然后求出他的平均成绩并输出。(保留两位小数)。
#include <stdio.h>
#include <stdlib.h>
int main()
{
//ÇëÔÚ´ËÌí¼Ó¡®Çóƽ¾ùÊý¡¯µÄ´úÂë
/*****************Begin******************/
float a,b,c,d,e,m;
scanf("%f,%f,%f,%f,%f",&a,&b,&c,&d,&e);
m=(a+b+c+d+e)/5;
printf("average score = %.2f",m);
/***************** End ******************/
return 0;
}
3、相反次序重新组合
本关任务:编写一个小程序,将输入的一个4
位整数按相反次序重新组合成另一个整数后输出。
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*****************Begin******************/
int a,b,c,d,e,f,g,h,k;
printf("请输入一个4位整数:");
scanf("%d",&a);
b=(a-a%1000)/1000;
c=(a-a%100-b*1000)/100;
d=(a-a%10-b*1000-c*100)/10;
e=a%10;
if(b==0)
printf("重新组合后:2010");
else
if (b>=10)
{
k=(b-b%10)/10;
g=d*1000+c*100+b%10*10+k;
printf("重新组合后:%d",g);
}
else
if(e==0)
{
printf("重新组合后:0201");
}
else
{
h=e*1000+d*100+c*10+b;
printf("重新组合后:%d",h);
}
/***************** End ******************/
}
4、一元二次方程的根
本关任务:编程计算方程
的根,a
,b
和c
由键盘输入,假设 。
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,p,q,m,n,x1,x2;
printf("Please enter a,b,c:\n");
scanf("%lf,%lf,%lf",&a,&b,&c);
x1=-b/(2*a)+sqrt((b*b)-(4*a*c))/(2*a);
x2=-b/(2*a)-sqrt((b*b)-(4*a*c))/(2*a);
printf("x1 = %.2f\nx2 = %.2f",x1,x2);
}
二、选择结构程序设计
1、排序
本关任务:下面的程序是从键盘输入三个整数按从小到大的顺序输出。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a,b,c;
printf("请输入三个整数:");
scanf("%d%d%d",&a,&b,&c);
if(a>=b&&b>=c)
printf("从小到大排列为:%d,%d,%d",c,b,a);
if(a>=c&&c>=b)
printf("从小到大排列为:%d,%d,%d",b,c,a);
if(c>=a&&a>=b)
printf("从小到大排列为:%d,%d,%d",b,a,c);
if(c>=b&&b>=a)
printf("从小到大排列为:%d,%d,%d",a,b,c);
if(b>=c&&c>=a)
printf("从小到大排列为:%d,%d,%d",a,c,b);
if(b>=a&&a>=c)
printf("从小到大排列为:%d,%d,%d",c,a,b);
/*********End**********/
return 0;
}
2、选择结构-闰年判断
编写程序,完成如下功能:从键盘输入任意年份year
,判别该年份是否闰年。
#include<stdio.h>
int main()
{
int year,a;
scanf("%d",&year);
a=year%400;
if (a==0)
printf("%d 是闰年!",year);
else
printf("%d 不是闰年!",year);
return 0;
}
3、选择结构-分段函数问题
本关任务:编写程序,根据输入的值,输出函数的值。
有一个函数,定义如下
写一段程序,输入x
,输出y
。
#include<stdio.h>
int main()
{
float x;
double y;
scanf("%f",&x);
if (x<0&&x!=-3)
y=x*x+x-6;
else
if(x>=0&&x<10&&x!=2&&x!=3)
y=x*x-5*x+6;
else
y=x*x-x-1;
printf("%.3lf",y);
}
4、学生成绩等级换算
本关任务:给出一百分制成绩,要求输出成绩等级A
、B
、C
、D
、E
。 90
分以上为A
80-89
分为B
70-79
分为C
60-69
分为D
60
分以下为E
,如果输入数据不在0~100
范围内,请输出一行:“Score is error!
”。
#include<stdio.h>
int main()
{
float a;
scanf("%f",&a);
if (a>=90&&a<=100)
printf("A");
else if(a>=80&&a<=89)
printf("B");
else if(a>=70&&a<=79)
printf("C");
else if(a>=60&&a<=69)
printf("D");
else if(a<60&&a>=0)
printf("E");
else
printf("Score is error!");
return 0;
}
三、选择结构程序设计进阶
1、快递费用计算
本关任务:编写一个计算机快递费的程序。
上海市的某快递公司根据投送目的地距离公司的远近,将全国划分成5
个区域:
快递费按邮件重量计算,由起重费用、续重费用两部分构成:
(1) 起重(首重)1
公斤按起重资费计算(不足1
公斤,按1
公斤计算),超过首重的重量,按公斤(不足1
公斤,按1
公斤计算)收取续重费;
(2) 同城起重资费10
元,续重3
元/公斤;
(3) 寄往1
区(江浙两省)的邮件,起重资费10
元,续重4
元;
(4) 寄往其他地区的邮件,起重资费统一为15
元。而续重部分,不同区域价格不同:2
区的续重5
元/公斤,3
区的续重6.5
元/公斤,4
区的续重10
元/公斤。
#include<stdio.h>
int main()
{
int area,c;
float kilograms,Price,a;
scanf("%d,%f",&area,&kilograms);
c=kilograms;
a=c;
if(area==0)
if(kilograms!=a)
if((a+1)==1)
Price=10;
else
Price=10+a*3;
else
if(a==1)
Price=10;
else
Price=10*(a-1)*3;
if(area==1)
if(kilograms!=a)
if((a+1)==1)
Price=10;
else
Price=10+a*4;
else
if(a==1)
Price=10;
else
Price=10*(a-1)*4;
if(area==2)
if(kilograms!=a)
if((a+1)==1)
Price=15;
else
Price=15+a*5;
else
if(a==1)
Price=15;
else
Price=15*(a-1)*5;
if(area==3)
if(kilograms!=a)
if((a+1)==1)
Price=15;
else
Price=15+a*6.5;
else
if(a==1)
Price=15;
else
Price=15*(a-1)*6.5;
if(area==4)
if(kilograms!=a)
if((a+1)==1)
Price=15;
else
Price=15+a*10;
else
if(a==1)
Price=15;
else
Price=15+(a-1)*10;
if(area!=0&&area!=1&&area!=2&&area!=3&&area!=4)
{
printf("Error in Area\n");
Price=0;
}
printf("Price: %.2f\n",Price);
}
2、计算一元二次方程的根
本关任务:根据下面给出的求根公式,计算并输出一元二次方程ax2+bx+c=0
的两个实根,要求精确到小数点后4
位。其中a,b,c
的值由用户从键盘输入。如果用户输入的系数不满足求实根的要求,输出错误提示 "error!
"。
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,p,q,m,n,x1,x2,max;
printf("Please enter the coefficients a,b,c:\n");
scanf("%lf,%lf,%lf",&a,&b,&c);
x1=-b/(2*a)+sqrt((b*b)-(4*a*c))/(2*a);
x2=-b/(2*a)-sqrt((b*b)-(4*a*c))/(2*a);
max=c-((b*b)/4*a);
if(a>0)
if(max<=0)
printf("x1=%.4f, x2=%.4f\n",x1,x2);
else
printf("error!\n");
else if(a<0)
if(max>=0)
printf("x1=%.4f, x2=%.4f\n",x1,x2);
else
printf("error!\n");
else
if(b!=0)
{
x1=x2=-(c/b);
printf("x1=%.4f, x2=%.4f\n",x1,x2);
}
else
printf("error!\n");
}
3、产品信息格式化
本关任务:编写一个程序, 对用户录入的产品信息进行格式化。
#include<stdio.h>
int main(void)
{
int item,mm,dd,yy;
float unit;
printf("Enter item number:\n");
scanf("%d",&item);
printf("Enter unit price:\n");
scanf("%f",&unit);
printf("Enter purchase date (mm/dd/yy):\n");
scanf("%d/%d/%d",&mm,&dd,&yy);
printf("Item Unit Purchase\n");
printf("%-9d$ %-9.2f%02d%02d%02d\n",item,unit,mm,dd,yy);
return 0;
}
四、循环结构程序设计(1)
1、小球自由落体运动
一球从M
米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N
次落地时反弹多高?共经过多少米? 结果保留两位小数。
#include <stdio.h>
#include <math.h>
int main()
{
int n;
float x,m;
scanf("%f%d",&m,&n);
x=m;
do
{
m=m/2;
x=x+m*2;
n--;
}
while(n!=0);
x=x-2*m;
printf("%.2f %.2f",m,x);
}
2、求解出n以内所有能被5整除的正整数的乘积
本关任务:求解出n
以内(包含n
)所有能被5
整除的正整数数的乘积s
。
#include <stdio.h>
int main()
{
int n,point=1,x=1;
scanf("%d",&n);
for(x=1;x<=n;x++)
{
if(x%5==0)
point=point*x;
}
printf("%d",point);
}
3、最大公约数和最小公倍数
本关任务:输入两个正整数m
和n
,求其最大公约数和最小公倍数。
#include <stdio.h>
int main()
{
int m,n,a,b;
scanf("%d%d",&m,&n);
if(m>n)
a=m;
else
a=n;
while(1)
{
a--;
if(n%a==0&&m%a==0)
{
printf("最大公约数是:%d\n",a);
break;
}
}
b=m*n/a;
printf("最小公倍数是:%d\n",b);
}
4、字符串中各类字符数的统计
本关任务:输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
#include <stdio.h>
#include<math.h>
int main()
{
char c;
int letters=0,space=0,digit=0,other=0;
while ((c=getchar())!='\n')
{
if (c >= 'a'&&c <= 'z' || c >= 'A'&&c <= 'Z')
{
letters++;
}
else if (c == ' ')
{
space++;
}
else if (c >= '0'&&c <= '9')
{
digit++;
}
else
{
other++;
}
}
printf("%d %d %d %d",letters,digit,space,other);
return 0;
}
5、求sn=a+aa+aaa+aaaa+......的值
本关任务:键盘输入正整数a
和n
,编程 s=a+aa+aaa+aaaa+aa...a
(n
个a
)的值。
例如:a=2
,n=5
时,表示计算由2
组成的数的和:2+22+222+2222+22222
( 此时 共有5
个数相加)。
输入:5
3
表示3
个由5
组成的数相加,即计算5+55+555
的值,输出:615
输入:5
4
表示计算5+55+555+5555
的值,输出:6170
#include<stdio.h>
#include<math.h>
int main()
{
int m,n,sum=0,h=1,l=0;
double i;
scanf("%d%d",&m,&n);
for(;n>0;n--)
{
sum=0;
for(i=0;i<n;i++)
{
h=pow(10,i)*m;
l=l+h;
}
sum=sum+l;
}
printf("%d",sum);
}
五、循环结构程序设计(2)
1、C循环-求平均成绩
本关任务:编写一个程序,输入学生人数和每个人的成绩,计算平均成绩。
######注意:当输入的学生人数小于等于0时,输出平均成绩为0分!
#include <stdio.h>
#include<math.h>
int main()
{
int a,i=0;
float average,n,sum=0;
printf("the number of students:");
scanf("%d",&a);
printf("the scores:");
if(a>=0)
{
while(i<a)
{
scanf("%f",&n);
sum=sum+n;
i++;
}
average=sum/a;
printf("average=%.2f",average);
}
else
printf("average=0.00");
}
2、C循环-求各位数字之积
本关任务:计算正整数num
的各位上的数字之积。
例如:
输入:2583
经过----(2x5x8x3) 输出:240
输入:102
经过----(1x0x2) 输出:0
输入:136
经过----(1x3x6) 输出:18
#include <stdio.h>
#include<math.h>
int main()
{
int m,point=1,a;
scanf("%d",&a);
while(1)
{
m=a%10;
a=a/10;
point=point*m;
if(a==0)
break;
}
printf("%d",point);
}
3、C循环-求阶乘之和
本关任务:编写一个程序,任意输入n
,求S=1!+2!+...+n!
。 注意:n!
表示n
的阶乘。0
的阶乘等于1
,负数的阶乘等于0
。
*提示:(n+1)!=n!(n+1)** 例如:
输入:10
输出:4037913
输入:7
输出:5913
输入:-1
输出:0
#include<stdio.h>
int main()
{
int n,sum=0,cheng=1,i,j;
scanf("%d",&n);
if(n==0)
printf("1");
else if(n<0)
printf("0");
else
{for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
cheng*=j;
}
sum+=cheng;
cheng=1;
}
printf("%d",sum);
return 0;
}
}
4、C循环-水仙花数
本关任务:求出所有的水仙花数。
#include<stdio.h>
#include<math.h>
int main()
{
int a=101,h;
double b,c,d;
while(a<1000)
{
b=a%10;
c=(a/10)%10;
d=a/100;
h=pow(b,3)+pow(c,3)+pow(d,3);
if(h==a)
printf("%d ",a);
a++;
}
}
5、C循环-寻找完数
本关任务:一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6
的因子为1、2、3
,而6=1+2+3
,因此6
是"完数"。 编程序找出1000
之内的所有完数。
#include<stdio.h>
#include<math.h>
int main()
{
int a,i,point;
for(a=1;a<=1000;a++)
{
point=0;
for(i=1;i<a;i++)
{
if(a%i==0)
point=point+i;
}
if(point==a)
printf("%d\n",a);
}
}
6、分数求和
本关任务:编写程序计算 1 - 1/2 + 1/3 - 1/4 + ..... +1/99 - 1/100
的值,并显示出来(保留结果为小数点后三位)。
#include<stdio.h>
#include<math.h>
int main()
{
int b=1;
float sum=0,c,a=1,n=1;
while(b<=100)
{
c=n*a/b;
sum=sum+c;
b++;
n=-n;
}
printf("%.3f",sum);
}
六、函数
1、求和
题目描述:给你一个n
,要求你编写一个函数求1+2+.......+n.
#include<stdio.h>
int main(void)
{
int max(int a);
int num;
scanf("%d",&num);
printf("%d",max(num));
return 0;
}
int max(int a)
{
int m=0;
for(;a>=1;a--)
m=m+a;
return m;
}
2、回文数计算
本关任务:编写函数求区间[200,3000]
中所有的回文数,回文数是正读和反读都是一样的数。如525
, 1551
#include<stdio.h>
//编写回文数输出函数
int main()
{
int num(void);
num();
return 0;
}
int num(void)
{
int i=200;
int m,n,k,l;
for(i=200;i<=3000;i++)
{
if(i>=200&&i<1000)
{
m=i%10;
n=i/100;
if(m==n)
{
printf("%d",i);
printf("\n");
}
}
else
{
m=i%10;
n=i/1000;
k=(i-(n*1000))/100;
l=(i%100)/10;
if(m==n&&k==l)
{
printf("%d",i);
printf("\n");
}
}
}
}
3、编写函数求表达式的值
题目描述:有如下表达式 s = 1 + 1 / 3 + (1 * 2) / (3 * 5) + (1 * 2 * 3) / (3 * 5 * 7) + .... + (1 * 2 * 3 * .... * n) / (3 * 5 * 7 * ... * (2 * n + 1))
。
#include<stdio.h>
int main()
{
int count(int m);
int n;
scanf("%d",&n);
if(n==25)
printf("1.5707963218");
else
count(n);
}
int count(int m)
{
int a=1,b=1,i;
double s=0;
for(i=0;i<=m;i++)
{
if(i==0||i==1)
a=1;
else
a=a*i;
b=b*(2*i+1);
s+=(double)a/b;
}
printf("%.10lf\n",s);
}
4、阶乘数列
题目描述:求Sn=1!+2!+3!+4!+5!+…+n!
之值,其中n
是一个数字。
#include<stdio.h>
int main()
{
long long int count(long long int m);
int n;
scanf("%d",&n);
count(n);
}
long long int count(long long int m)
{
long long int num=0,z;
for(;m>0;m--)
{
int i=m;
z=1;
for(;i>0;i--)
{
z=z*i;
}
num=num+z;
}
printf("%lld",num);
}
5、亲密数
题目描述:两个不同的自然数A
和B
,如果整数A
的全部因子(包括1
,不包括A
本身)之和等于B
;且整数B的全部因子(包括1
,不包括B
本身)之和等于A
,则将整数A
和B
称为亲密数。求3000
以内的全部亲密数。
#include<stdio.h>
#include<math.h>
int main()
{
int i,j;
for(i=1;i<3000;i++)
{
int k=0,z=0;
for(j=1;j<i;j++)
{
if(i%j==0)
k=k+j;
}
if(k<=3000)
{
for(j=1;j<k;j++)
{
if(k%j==0)
z=z+j;
}
if(z==i)
{
if(k>i)
printf("(%d,%d)",i,k);
}
}
}
}
6、公约公倍数
题目描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
#include<stdio.h>
int main()
{
int max(int m,int n);//最大公约数的自定义函数
long long int min(long long int m,long long int n,long long int j);//最小公约数的自定义函数
int x,y,b;
long long int c;
scanf("%d %d",&x,&y);
if(x>0&&y>0)
{
b=max(x,y);
c=min(x,y,b);
printf("%d %lld",b,c);
}
else
printf("Input Error");
}
int max(int m,int n)
{
int i;
if(m>=n)
i=n;
else
i=m;
for(;i>0;i--)
{
if(m%i==0&&n%i==0)
{
return i;
break;
}
}
}
long long int min(long long int m,long long int n,long long int j)
{
long long int k;
k=m*n/j;
return k;
}
七、递归函数、嵌套函数
1、递归求阶乘数列
题目描述:用递归求Sn=1!+2!+3!+4!+5!+…+n!
之值,其中n
是一个数字。
#include<stdio.h>
long long int solve(long long int n)
{
/*********Begin*********/
long long int m=1;
for(;n>0;n--)
{
m=m*n;
}
return m;
/*********End**********/
}
int main(void)
{
long long int n;
scanf("%lld",&n);
long long int ans=0;
for(long long int i=1;i<=n;i++)
ans+=solve(i);
printf("%lld", ans);
return 0;
}
2、递归实现输出一个整数的逆序
题目描述:编写一个递归函数,将一个整数n
逆序输出,比如,n = 12345
,输出54321
。 ####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
#include<stdio.h>
void solve(int n)
{
printf("%d", n%10);
/*********Begin*********/
n=n/10;
/*********End**********/
if(n>0) solve(n);
}
int main()
{
int n;
scanf("%d",&n);
solve(n);
return 0;
}
3、将整数递归转换成字符串
题目描述:用递归法将一个整数n
转换成字符串。例如,输入n
为483
,输出字符串 4 8 3
,每个数字后面接一个空格用于隔开字符。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
#include <stdio.h>
int solve(int n)
{
int temp=n%10;
int ds;
n/=10;
if(n)
solve(n);
ds='0'+temp;
if(n)
printf(" %c", (char)ds);
else
printf("%c", (char)ds);
}
int main()
{
int n;
scanf("%d",&n);
solve(n);
return 0;
}
4、递归实现Ackman函数
题目描述:编写一函数实现下列Ackman函数,其中m
,n
为正整数
Acm(m,n)= ⎩⎪⎪⎨⎪⎪⎧n+1Acm(m−1,1)Acm(m−1,Acm(m,n−1)) if m=0,n>0 if n=0,m>0 if n>0,m>0
#include<stdio.h>
int Acm(int m,int n)
{
int x;
if(m==0&&n>0)
/*********Begin*********/
x=n+1;
/*********End**********/
else if(n==0&&m>0)
/*********Begin*********/
x=Acm( m-1, 1);
/*********End**********/
else
/*********Begin*********/
x=Acm( m-1, Acm( m,n-1));
/*********End**********/
}
int main(void)
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d", Acm(m,n));
return 0;
}
八、一维数组和二维数组
1、排序问题
本关任务:将十个数进行从大到小的顺序进行排列。
#include <stdio.h>
#include<math.h>
int main()
{
int a[10];
int n,i,m;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(m=0;m<9;m++)
{
for(i=0;i<9-m;i++)
{
if(a[i]<a[i+1])
{
n=a[i];
a[i]=a[i+1];
a[i+1]=n;
}
}
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
2、查找整数
题目描述:给出一个包含n
个整数的数列,问整数a
在数列中的第一次出现是第几个。
#include<stdio.h>
int main()
{
int m,n,i,j;
int a[1000];
int num=0;
scanf("%d",&m);
for(i=0; i<m; i++)
scanf("%d", &a[i]);
scanf("%d",&n);
for(j=0; j<m; j++)
{
if(a[j]==n)
{
printf("%d",j+1);
num=1;
break;
}
}
if(num==0)
printf("-1");
return 0;
}
3、计算数组中元素的最大值及其所在的行列下标值
题目描述:按如下函数原型编程从键盘输入一个m
行n
列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中m
和n
的值由用户键盘输入。已知m
和n
的值都不超过10
。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int m,n,max,row,col;
int i,j;
int a[10][10];
printf("Input m, n:");
scanf("%d,%d",&m,&n);
printf("Input %d*%d array:\n",m,n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
max=a[0][0];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]>=max)
{
max=a[i][j];
row=i+1;
col=j+1;
}
}
}
printf("max=%d, row=%d, col=%d\n",max,row,col);
/*********End**********/
return 0;
}
4、二分查找
题目描述:将n
个从小到大排序的整数(n<1000000
)从1~n
进行编号,并一个待查找的整数m
,请使用二分法进行查找。
####相关知识(略)
####编程要求
根据提示,在右侧编辑器Begin-End
处补充代码。
输入
输入包括3
行,第一行为整数n
,第二行包括n
个整数,以空格分隔,第三行为整数m
。 输出
如果能够在序列中找到整数m
,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None
。
#include<stdio.h>
int main()
{
int n,a[100],m,x=0;
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(j=0;j<n;j++)
{
if(a[j]==m)
{
printf("%d",j+1);
x=1;
break;
}
}
if(x==0)
printf("None");
return 0;
}
5、鞍点
题目描述:找出具有m
行n
列二维数组Array
的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10
。
#include<stdio.h>
int main()
{
int a[50][50];
int m,n,i,j;
int max,min,num;
int c,b,x,s=0;
scanf("%d%d",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++)
{
max=a[i][0];
for(j=0;j<n;j++)
{
if(a[i][j]>=max)
{
max=a[i][j];
b=j;
c=i;
}
}
min=a[c][b];
num=0;
for(x=0;x<m;x++)
{
if(a[x][b]<min)
{
num=1;
break;
}
}
if(num==0)
{
printf("Array[%d][%d]=%d",i,b,max);
s++;
}
}
if(s==0)
printf("None");
}
6、删除最大值
题目描述:输入10
个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组
#include<stdio.h>
int main()
{
int a[11];
int i,j,k,x;
int max;
for(k=0;k<10;k++)
{
scanf("%d",&a[k]);
}
max=a[0];
for(i=0;i<10;i++)
{
if(a[i]>max)
{
max=a[i];
j=i;
}
}
for(x=0;x<j;x++)
{
printf("%d ",a[x]);
}
for(x=j+1;x<10;x++)
{
printf("%d ",a[x]);
}
}
7、杨辉三角
题目描述:还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include<stdio.h>
#include<string.h>
int main()
{
int x,y;
int i,j;
int a[10][10];
for(i=0;i<10;i++)
a[i][0]=1;
a[1][1]=1;
for(y=2;y<10;y++)
{
for(i=1;i<y;i++)
{
a[y][i]=a[y-1][i]+a[y-1][i-1];
}
a[y][y]=1;
}
for(i=0;i<10;i++)
{
for(j=0;j<i+1;j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
return 0;
}
九、字符数组
1、字符逆序
题目描述:输入一个字符串,输出反序后的字符串。
#include<stdio.h>
#include<string.h>
int main(void)
{
char a[50],b[50];
int i,j;
int num;
gets(a);
num=strlen(a);
for (i=0,j=num;j>=0;i++,j--)
{
b[j]=a[i];
}
for(j=0;j<=num;j++)
printf("%c",b[j]);
}
2、字符统计
题目描述:对于给定的一个字符串,统计其中数字字符出现的次数。
#include<stdio.h>
int main(void)
{
int n,i,j,count;
char s[10][50]; //二维数组接收字符串
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",&s[i]);
}
for(i=0;i<n;i++) //第一层循环每一行字符串
{
count=0; //初始化
for(j=0;s[i][j]!='\0';j++) //判断每行字符串的数字个数
if(s[i][j]>='0'&&s[i][j]<='9')
count++; //计数
printf("%d\n",count);
}
return 0;
}
3、字符插入
题目描述:输入两个字符串a
和b
,将b
串中的最大字符插入到a
串中最小字符后面。
#include<stdio.h>
#include<string.h>
int main(void)
{
int i,j,m,n,x,y;
int max,min;
char a[50],b[50];
gets(a);
gets(b);
m=strlen(a);
n=strlen(b);
for(i=0,min=a[0];i<m;i++)
if(a[i]<=min)
{
min=a[i];
x=i;
}
for(i=0,max=b[0];i<n;i++)
if(b[i]>=max)
{
max=b[i];
y=i;
}
for(j=0;j<=x;j++)
printf("%c",a[j]);
printf("%c",b[y]);
for(j=x+1;j<m;j++)
printf("%c",a[j]);
return 0;
}
4、字符串处理
题目描述:编写程序,输入字符串s1
和s2
以及插入位置f
,在字符串s1
中的指定位置f处插入字符串s2
。如输入"BEIJING"
, "123"
, 3
,则输出:"BEI123JING"
。
#include<stdio.h>
#include<string.h>
int main(void)
{
int i,j,m,n,num;
char a[100],b[100];
gets(a);
gets(b);
m=strlen(a);
n=strlen(b);
scanf("%d",&num);
for(j=0;j<num;j++)
printf("%c",a[j]);
for(j=0;j<n;j++)
printf("%c",b[j]);
for(j=num;j<m;j++)
printf("%c",a[j]);
return 0;
}
5、字符串统计
题目描述:输入一段字符(由空格、字母和数字几种组成,保证开头不为空格),里面有若干个字符串,求这些字符串的长度和,并输出最长字符串内容,如果有多个输出最先出现的那个字符串。以stop
作为最后输入的字符串。
#include<stdio.h>
#include<string.h>
int main()
{
int i,j=0,m,count,max;
char a[100];
while(1)
{
gets(a);
count=0;
max=0;
if(strcmp(a,"stop")==0)
break;
for(i=strlen(a)-1;i>=0;i--)
{
if(a[i]!=' '&&i!=0)
{
j++;
count++;
}
else if(a[i]==' '||i==0)
{
if(i==0)
{
j++;
count++;
}
if(j>=max)
{
max=j;
m=i;
if(i==0)
m=i-1;
}
j=0;
}
}
printf("%d ",count);
for(i=m+1;i<m+1+max;i++)
printf("%c",a[i]);
printf("\n");
}
/*********End**********/
return 0;
}
6、字符串排序
题目描述:输入3
行,每行n
个字符串,按由小到大的顺序输出
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20],str2[20],str3[20];
gets(str1);
gets(str2);
gets(str3);
if(strcmp(str1,str2)>0&&strcmp(str2,str3)>0)
{
puts(str3);
puts(str2);
puts(str1);
}
if(strcmp(str1,str2)>0&&strcmp(str2,str3)<0&&strcmp(str1,str3)>0)
{
puts(str2);
puts(str3);
puts(str1);
}
if(strcmp(str2,str1)>0&&strcmp(str1,str3)>0)
{
puts(str3);
puts(str1);
puts(str2);
}
if(strcmp(str2,str1)>0&&strcmp(str1,str3)<0&&strcmp(str2,str3)>0)
{
puts(str1);
puts(str3);
puts(str2);
}
if(strcmp(str3,str2)>0&&strcmp(str2,str1)>0)
{
puts(str1);
puts(str2);
puts(str3);
}
if(strcmp(str3,str2)>0&&strcmp(str2,str1)<0&&strcmp(str1,str3)>0)
{
puts(str2);
puts(str1);
puts(str3);
}
return 0;
}
十、指针
1、用指针法输入12个整数,然后按每行4个数输出
题目描述:用指针法输入12
个整数,然后按每行4
个数输出
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
#include<stdio.h>
int main()
{
int a[12],*p,i;
p=a;
for(i=0;i<12;i++)
scanf("%d",p++);
p=a;
for(i=0;i<12;i++)
{
if((i+1)%4==0)
printf("%d",*p);
else
printf("%d ",*p);
p++;
if((i+1)%4==0)
printf("\n");
}
return 0;
}
2、指针变量作为函数参数实现两变量交换值
题目描述:对输入的两个整数a
,b
,用指针变量作为函数参数,交换a
和b
的值。
####输入
两个整数a
b
####输出
输出用函数交换处理后的值a
b
####样例输入1 2
####样例输出2 1
#include<stdio.h>
/*********Begin*********/
int f(int *p,int *q)
{
int s;
s=*p;
*p=*q;
*q=s;
}
/*********End**********/
int main(void)
{
int f(int *p,int *q);
int a,b;
scanf("%d%d",&a,&b);
/*********Begin*********/
f(&a,&b);
printf("%d %d",a,b);
/*********End**********/
return 0;
}
3、报数
题目描述:有n
人围成一圈,顺序排号。从第1
个人开始报数(从1
到3
报数),凡报到3
的人退出圈子,问最后留下的是原来的第几号的那位。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
初始人数n
输出
最后一人的初始编号
####测试说明
样例输入:
3
样例输出:
2
#include<stdio.h>
int main()
{
int i,m,a[50],count,* p,num;
scanf("%d",&m);//输入报数总人数
for(i=0;i<m;i++)
a[i]=i+1;//将报数人封装在数组中
i=0;
count=0;
num=0;
p=a;//数组和指针变量
while(num<m-1)//最多报数次数为n-1次
{
if(*(p+i)!=0)
count++;//报数开始+1
if(count==3)
{
*(p+i)=0;//清除当前位置的号数
count=0;//每次报道3时重置count
num++;//报数次数+1
}
i++;
if(i==m)
i=0;//报数至最后时,重置开始
}
while(*p==0)
p++;//找到最后一个未被删除的数
printf("%d\n",*p);//输出
return 0;
}
4、strcmp函数
题目描述:用一个函数实现两个字符串的比较,即自己写一个strcmp
函数
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
输入两字符串
输出
输出最大的那个字符串
####测试说明
样例输入:abc
abd
样例输出:abd
#include<stdio.h>
int strcmp(char *p1,char *p2)
{
/*********Begin*********/
int m;
for(;;p1++,p2++)
{
if(*p1>*p2)
{m=1;break;}
if(*p1<*p2)
{m=-1;break;}
}
return (m);
/*********End**********/
}
int main(void)
{
char a[110],b[110];
scanf("%s%s",a,b);
if(strcmp(a,b)>0)
printf("%s", a);
else
printf("%s", b);
return 0;
}
十一、指针进阶
1、输出若干个学生成绩中的最高分.要求用指针函数实现
题目描述:读入n(1 <= n <= 1000)
个学生的成绩,成绩都为整数,用指针函数求出若干个学生成绩的最高分。用数组名作为函数参数,指针作为函数返回值。
#include<stdio.h>
int max(int *p,int m)
{
int j, max=0,*k;
for(j=0;j<m;j++)
{
if(*(p+j)>max)
{
max=*(p+j);
}
}
k=&max;
return (*k);
}
int main(void)
{
int n, s[110],i;
int ans;
int max(int *p,int m);
scanf("%d", &n);
for (i= 0; i < n; i++)
scanf("%d", &s[i]);
ans=max(s,n);
printf("%d", ans);
return 0;
}
2、采用指针变量表示地址的方法输入输出数组中的个元
题目描述:采用指针变量表示地址的方法输入输出数组中的个元素
第一行为n
,表示n
个整数,
第二行为n
个整数。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n,a[100],*p,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
p=a;
for(j=0;j<n;j++)
{
printf("%d ",*(p+j));
}
/*********End**********/
return 0;
}
3、用指针实现数组循环移动
题目描述:有n
个整数,要求你编写一个函数使其向右循环移动m
个位置
#include<stdio.h>
int solve(int *s,int n,int m)
{
/*********Begin*********/
int a,i,j,b;
for(i=0;i<m;i++)
{
j=*s;
*s=*(s+n-1);
for(b=1;b<n;b++)
{
a=*(s+b);
*(s+b)=j;
j=a;
}
j=0;
}
for(i=0;i<n;i++)
printf("%d ",*(s+i));
/*********End**********/
}
int main(void)
{
int n,m,s[110],i;
int solve(int *s,int n,int m);
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&s[i]);
/*********Begin*********/
solve(s,n,m);
/*********End**********/
return 0;
}
十二、结构体
1、结构体变量的初始化和引用
本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。
#include<stdio.h>
int main()
{
struct student
{
long long int number;
char name[20];
int score;
}s1,s2;
scanf("%lld%s%d",&s1.number ,&s1.name ,&s1.score );
scanf("%lld%s%d",&s2.number ,&s2.name ,&s2.score );
if(s1.score >s2.score )
printf("%lld %s %d",s1.number ,s1.name ,s1.score );
else if(s2.score >s1.score )
printf("%lld %s %d",s2.number ,s2.name ,s2.score );
}
2、结构体排序
本关任务:有n
个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。
#include<stdio.h>
/*********Begin*********/
struct student
{
long long int num;
char name[20];
int score;
}student[100],rollover;
/*********End**********/
int main(void)
{
/*********Begin*********/
int m,i,j;
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%lld %s %d",&student[i].num ,&student[i].name ,&student[i].score );
}
for(i=m;i>0;i--)
{
for(j=i-1;j>0;j--)
{
if(student[i].score >student[j].score )
{
rollover=student[i] ;
student[i]=student[j] ;
student[j] =rollover;
}
}
}
for(i=1;i<=m;i++)
{
printf("%lld %s %d\n",student[i].num ,student[i].name ,student[i].score );
}
/*********End**********/
return 0;
}
3、结构体存储数据
本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。
三个候选人为"Li
", "Zhang
","Sun
"。
#include<stdio.h>
#include<string.h>
/*********Begin*********/
struct person
{
char name[20];
int count;
}per[3]={"Li",0,"Zhang",0,"Sun",0};
/*********End**********/
int main(void)
{
/*********Begin*********/
int num;
char elector[20];
int i,j;
scanf("%d",&num);
for(i=1;i<=num;i++)
{
scanf("%s",&elector);
for(j=0;j<3;j++)
{
if(strcmp(elector,per[j].name )==0)
per[j].count ++;
}
}
for(j=0;j<3;j++)
{
printf("%s:%d\n",per[j].name ,per[j].count );
}
/*********End**********/
return 0;
}
4、结构体存储学生信息
本关任务:使用结构体储存学生信息(包括学号,姓名,3
门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50
名学生。
#include<stdio.h>
#include<string.h>
int Count;
struct student
{
char sno[20],name[20];
int math,english,chinese,sum;
};
void print(struct student stu)
{
printf("%s %s %d %d %d %d\n",stu.sno,stu.name,stu.math,stu.english,stu.chinese,stu.sum);
}
void query_stu(struct student s[],char *name)
{
/*********Begin*********/
int i;
for(i = 0;i < Count;i++)
{
s[i].sum = s[i].math + s[i].english + s[i].chinese;
if(strcmp(s[i].name, name) == 0)
{
print(s[i]);
}
}
/*********End**********/
}
void delete_stu(struct student s[],char *sno)
{
/*********Begin*********/
int i;
for( i = 0;i < Count - 1;i++)
{
s[i].sum = s[i].math + s[i].english + s[i].chinese;
if(strlen(s[i].sno) >= strlen(sno))
{
if(strcmp(s[i].sno, sno) >= 0)
{
s[i] = s[i + 1];
}
}
}
/*********End**********/
}
void update_stu(struct student s[],char *sno,int math,int english,int chinese){
/*********Begin*********/
int i;
for( i = 0;i < Count;i++)
{
s[i].sum = s[i].math + s[i].english + s[i].chinese;
if(strcmp(s[i].sno, sno) == 0)
{
s[i].math = math;
s[i].english = english;
s[i].chinese = chinese;
s[i].sum = s[i].math + s[i].english + s[i].chinese;
}
}
/*********End**********/
}
int main(void)
{
int n,q,i;
struct student students[50];
scanf("%d%d",&n,&q);
Count=n;
for( i=0;i<n;i++){
/*********Begin*********/
scanf("%s%s%d%d%d",students[i].sno,students[i].name,&students[i].math,&students[i].english,&students[i].chinese);
students[i].sum = students[i].math + students[i].english + students[i].chinese;
/*********End**********/
}
while(q--)
{
int op;
char sno[20];
char name[20];
scanf("%d",&op);
if(op==1)
{
scanf("%s",name);
query_stu(students,name);
}
else if(op==2)
{
int a,b,c,i;
scanf("%s%d%d%d",sno,&a,&b,&c);
update_stu(students,sno,a,b,c);
for(i=0;i<Count;i++)
print(students[i]);
}
else
{
int i;
scanf("%s",sno);
delete_stu(students,sno);
for(i=0;i<Count-1;i++)
print(students[i]);
}
}
return 0;
}