目录
一、顺序结构程序(二)
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;
}