小编是一个进阶中的程序菜狗,第一篇在CSDN发布的文章希望可以作为一个start。程序里的很多算法不一定是最佳的,但小编希望给刚开始学习的小伙伴们提供一下可参考的答案,如果小伙伴们发现了bug还希望及时告诉小编,蟹蟹啦~(我记得好像有一两道题目有bug但忘记是否订正过来了)
//第二章
/*1.已知整型变量a、b 和c 的值(a=250, b=85, c=25),编写程序,用来计算并显示x =a/(b-c)的值(保留2位小数),其中*/
#include<stdio.h>
int main()
{
int a,b,c;
float x;
a=250;
b=85;
c=25;
x=a*1.0/(b-c);
printf("x=%.2f\n",x);
}
/*2.下面程序要求计算由键盘输入的任意两个整数的平均值,输出结果保留两位小数。
找出并改正以下源程序中错误,得出正确的运行结果。
源程序如下:
#include <stdio.h>
void main()
{
int x,y,a;
scanf("%f%f",x,y);
a=(x+y)/2;
Printf("平均数是"a);
}*/
#include <stdio.h>
int main()
{
float x,y,a;
scanf("%f%f",&x,&y);
a=(x+y)/2;
printf("平均数是%.2f",a);
}
//第三章 选择结构
/*1.从键盘上输入直角坐标系上一个点的坐标(x,y),编程实现判断该点属于第几象限。
请注意在x坐标轴上、y坐标轴上和原点上的数据。*/
#include<stdio.h>
int main()
{
float x,y;
scanf("%f%f",&x,&y);
if(x>0)
{
if(y>0)
printf("(%.2f,%.2f)在第一象限",x,y);
else if(y==0)
printf("(%.2f,%.2f)在x坐标轴上",x,y);
else
printf("(%.2f,%.2f)在第四象限",x,y);
}
else if(x==0)
{
if(y>0||y<0)
printf("(%.2f,%.2f)在y坐标轴上",x,y);
else
printf("(%.2f,%.2f)在原点上",x,y);
}
else
{
if(y>0)
printf("(%.2f,%.2f)在第二象限",x,y);
else if(y==0)
printf("(%.2f,%.2f)在x坐标轴上",x,y);
else
printf("(%.2f,%.2f)在第三象限",x,y);
}
return 0;
}
/*2.输入三角形的三边(整数),计算三角形的面积(保留2位小数),如果不能构成三角形,则输出“不是三角形”。*/
#include<math.h>
#include<stdio.h>
int main()
{
int a,b,c;
float s,p;
scanf("%d%d%d",&a,&b,&c);
if(a+b>c && b+c>a && a+c>b )
{
p=(a+b+c)*1.0/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("%.2f",s);
}
else
printf("不是三角形");
return 0;
}
/*3&4.编写程序。从键盘输入一个整数x,如果x是偶数,输出“x是个偶数”的提示;否则,输出“x是个奇数”的提示信息。
提示:偶数的判断方法x%2 == 0*/
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
if(x%2==0)
printf("%d是个偶数",x);
else
printf("%d是个奇数",x);
return 0;
}
/*5.企业发放的奖金(实数)根据利润(整数)提成。
(1)利润≤10万元时,奖金可提成10% ;
(2)10万元<利润≤20万元时,其中10万元以下部分仍按10%提成,高于10万元(含10万元)的部分,可提成7.5% ;
(3)20万元<利润≤40万元时,其中20万元以下部分仍按上述办法提成,高于20万元的部分按5%提成;
(4)40万元<利润≤60万元时,其中40万元以下部分仍按上述办法提成,高于40万元的部分按3%提成;
(5)60万元<利润≤100万元时,其中60万元以下部分仍按上述办法提成,高于60万的部分按1.5%提成;
(6)100万元<利润时,其中100万元以下部分仍按上述办法提成,超过100万元的部分按1%提成。
从键盘输入当月利润(整数),求应发放奖金(实数)总数。
要求:用switch语句编程序。
调试数据为 第1组 输入 156890 输出 奖金是14266.75
第2组 输入 150000 输出 奖金是13750.00 */
#include<stdio.h>
int main()
{
int p,s,t;
float a=0;
scanf("%d",&p);
t=p/10000;
if(t<=10)
s=1;
else if(t<=20)
s=2;
else if(t<=40)
s=3;
else if(t<=60)
s=4;
else if(t<=100)
s=5;
else
s=6;
switch (s)
{
case 1: a=s*0.1;break;
case 2: a=100000*0.1+(p-10*10000)*0.075;break;
case 3: a=100000*(0.1+0.075)+(p-20*10000)*0.05;break;
case 4: a=100000*(0.1+0.075+2*0.05)+(p-40*10000)*0.03;break;
case 5: a=100000*(0.1+0.075+2*0.05+2*0.03)+(p-60*10000)*0.015;break;
case 6: a=100000*(0.1+0.075+2*0.05+2*0.03+4*0.015)+(p-100*10000)*0.01;break;
}
printf("奖金是%.2f",a);
}
/*6.有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1。
这4个塔的高度都是10米。塔以外无建筑物(即塔外的高度为零)。
输入任一点的坐标,求该点的建筑高度。
(提示:在塔内的点高度为10米,不在任何塔内的点高度都为0米)
调试数据 第1组:输入 1.5,1.5 输出 该点高度为10米
第2组:输入 -1,-1 输出 该点高度为0米*/
//注意浮点型的比较大小!!!
#include<stdio.h>
int main()
{
float x,y;
scanf("%f,%f",&x,&y);
if((x-2)*(x-2)+(y-2)*(y-2)-1<=1e-6||(x+2)*(x+2)+(y-2)*(y-2)-1<=1e-6||(x+2)*(x+2)+(y+2)*(y+2)-1<=1e-6||(x-2)*(x-2)+(y+2)*(y+2)-1<=1e-6)
printf("该点高度为10米");
else
printf("该点高度为0米");
return 0;
}
/*7.输入4个整数,要求按由小到大的顺序输出。
解:此题使用if语句采用依次比较的方法排出其大小顺序。
在学习了循环和数组以后,可以有更多的排序方法。
调试数据:
第1组 输入 2,5,9,3 输出 排序结果如下: 2, 3, 5, 9
第2组 输入 10,-4,-10,9 输出 排序结果如下: -10, -4, 9, 10
注意:输入数据的格式,4个整数用逗号分隔;
输出中的分号为英文分号,四个排序后的整数用英文逗号分隔*/
#include<stdio.h>
int main()
{
int a,b,c,d,t;
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
if(a>b)
{
t=a;
a=b;
b=t;
}
if(a>c)
{
t=a;
a=c;
c=t;
}
if(a>d)
{
t=a;
a=d;
d=t;
}
if(b>c)
{
t=b;
b=c;
c=t;
}
if(b>d)
{
t=b;
b=d;
d=t;
}
if(c>d)
{
t=c;
c=d;
d=t;
}
printf("排序结果如下:%d,%d,%d,%d",a,b,c,d);
return 0;
}
/*8给定一个不多于5位的正整数,要求:
① 求它是几位数;
② 分别打印出每一位数字;
③ 按逆序打印出各位数字。例如原数为213,应输出312。
调试数据:
第1组 输入 213
输出
位数:3
每位数字为:2,1,3
逆序数字为:312
第2组 输入 98423
输出
位数:5
每位数字为:9,8,4,2,3
逆序数字为:32489*/
#include<stdio.h>
int main()
{
int x,n=0,a[10],i;
scanf("%d",&x);
while(x)
{
a[n++]=x%10;
x=x/10;
}
printf("位数:%d\n",n);
printf("每位数字为:%d",a[n-1]);
for(i=n-2;i>=0;i--)
{
printf(",%d",a[i]);
}
printf("\n逆序数字为:");
for(i=0;i<n;i++)
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
/*9.给一个百分制成绩,要求输出等级'A'、'B'、'C'、'D'、'E'。
100>=成绩>=90为'A',90>成绩>=80为'B',80>成绩>=70为'C',70>成绩>=60为'D',60>成绩>=0为'E'。
成绩不在0~100分之间,要给出输入有误的提示。
测试数据:
第1组:输入 85 输出 成绩是 85.0,相应的等级是B
第2组 输入 190 输出 成绩是 输入成绩有误
注意:输入的成绩为实数,输出的成绩保留一位小数,注意输出的格式。
注意错误提示信息要同样例一致*/
#include<stdio.h>
int main()
{
float a;
scanf("%f",&a);
if(a>=0&&a<=100)
{
switch((int)a/10)
{
case 10:
case 9: printf("成绩是%.1f,相应的等级是A",a);break;
case 8: printf("成绩是%.1f,相应的等级是B",a);break;
case 7: printf("成绩是%.1f,相应的等级是C",a);break;
case 6: printf("成绩是%.1f,相应的等级是D",a);break;
default: printf("成绩是%.1f,相应的等级是E",a);break;
}
}
else
printf("输入成绩有误");
return 0;
}
/*10.编写一个程序,输入a、b、c三个值,输出其中最大值。
调试数据:
输入 1,5,3 输出 最大数是 5
解题要求
编写一个程序,输入a、b、c三个值,输出其中最大值。
注意:输入3个整数,用逗号分隔。输出数据的格式如样例所示。*/
#include<stdio.h>
int main()
{
int a,b,c,max;
scanf("%d,%d,%d",&a,&b,&c);
max=0;
if(a>max)
max=a;
if(b>max)
max=b;
if(c>max)
max=c;
printf("最大数是%d",max);
}
//第四章 循环结构
/*1.编写程序利用公式:ex=1+x+x2/2!+x3/3!+......+xn/n!求的近似值。
找出并改正以下源程序中错误,得出正确的运行结果。
源程序如下:
#include <stdio.h>
#include <math.h>
void main()
{
int i;
float a,e,x;
printf("请输入x的值:");
scanf("%d",&x);
e=0;
i=0;
a=1;
while(a>1e-6);
{
a=a*x/i;
e=e+a;
i++;
}
printf("exp(x)=%f\n",exp(x));
printf("循环次数为:%d次\ne的x次方为:%f\n",i,e);
}
程序正确的运行结果为:
1.0
exp(x)=2.718282
循环次数为:11次
e的x次方为:2.718282
Press any key to continue*/
#include <stdio.h>
#include <math.h>
int main()
{
int i;
float a,e,x;
printf("请输入x的值:");
scanf("%f",&x);
e=1;
i=1;
a=1;
while((exp(x)-e)>1e-6)
{
a=a*x/i;
e=e+a;
i++;
}
printf("exp(x)=%f\n",exp(x));
printf("循环次数为:%d次\ne的x次方为:%f\n",i+1,e);
}
/*2.编程输出n行*组成的图形。n值由用户输入。
第一行n个*,第二行n-1个*,依此类推,第n行1个*。*/
#include<stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
while(n>0)
{
for(i=0;i<n;i++)
printf("*");
n--;
printf("\n");
}
return 0;
}
/*3.输出所有大于100小于等于200的3位偶数,且该偶数的各位数字两两不相同。要求每行输出10个数,每个数字占6位宽度*/
#include<stdio.h>
int main()
{
int a,x,y,z,i;
for(i=0,a=101;a<=200;a++)
{
x=a/100;
y=a/10%10;
z=a%10;
if(a%2==0&&x!=y&&x!=z&&y!=z)
{
printf("%-6d",a);
i++;
if(i%10==0)
{
printf("\n");
}
}
}
return 0;
}
/*4.输出m--n间的全部素数。要求每个数输出字宽为5个字符,每输出5个素数换一行。*/
#include<stdio.h>
int main()
{
int m,n,x,i,j=0;
scanf("%d%d",&m,&n);
for(x=m+1;x<n;x++)
{
for(i=2;i<x;i++)
{
if(x%i==0)
break;
}
if(i==x)
{
printf("%-5d",x);
j++;
}
if(j%5==0)
{
printf("\n");
}
}
return 0;
}
/*5.求1!+2!+…+n!,其中n(1<=n<=10)值由用户输入*/
#include<stdio.h>
int main()
{
int n,sum=0,i,t;
scanf("%d",&n);
for(i=1,t=1;i<=n;i++)
{
t=t*i;
sum=sum+t;
}
printf("%d",sum);
return 0;
}
/*6.编程输出n行*组成的图形。n值由用户输入。第一行1个*,第二行2个*,依此类推。*/
#include<stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
/*7.统计输入的一串字符中每个元音字母(a,e,i,o,u)出现的次数,输入#以作为结束。*/
#include<stdio.h>
int main()
{
int time1=0,time2=0,time3=0,time4=0,time5=0;
char ch;
while((ch=getchar())!='#')
{
if(ch=='a')
{
time1++;
}
if(ch=='e')
{
time2++;
}
if(ch=='i')
{
time3++;
}
if(ch=='o')
{
time4++;
}
if(ch=='u')
{
time5++;
}
}
printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",time1,time2,time3,time4,time5);
return 0;
}
/*8.从键盘输入一个大于1的正整数x,打印所有小于x的斐波那契数列(数列的第一项、第二项为1,数列从第三项开始,每一项都等于前两项的和)。
打印所有小于x的斐波那契数列(数列的第一项、第二项为1,数列从第三项开始,每一项都等于前两项的和)。*/
#include<stdio.h>
int main()
{
int x,f1=1,f2=1;
scanf("%d",&x);
printf("%d ",f1);
while(f1<x)
{
printf("%d ",f1);
f1=f1+f2;
f2=f1-f2;
}
return 0;
}
/*9.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?要求这些三位数由小到大输出。*/
#include<stdio.h>
int main()
{
int a,b,c;
for(a=1;a<5;a++)
{
for(b=1;b<5;b++)
{
if(a==b)
continue;
for(c=1;c<5;c++)
{
if(c==a||c==b)
continue;
printf("%d%d%d\n",a,b,c);
}
}
}
return 0;
}
/*10.有4名专家对4款赛车进行评论。
A说:2号赛车是最好的。
B说:4号赛车是最好的。
C说:3号赛车不是最好的。
D说:B说错了。
事实上只有一款赛车是最好的,且只有一名专家说对了,其他3人都说错了,编程输出最好的赛车编号。*/
#include<stdio.h>
int main()
{
int car,a[4];
for(car=1;car<5;car++)
{
a[0]=(car==2);
a[1]=(car==4);
a[2]=(car!=3);
a[3]=(car!=4);
if(a[0]+a[1]+a[2]+a[3]==1)
{
printf("最好的赛车编号为%d\n",car);
}
}
return 0;
}
//或者下面的程序
#include<stdio.h>
int main( )
{
int bestcar;
for(bestcar=1;bestcar<=4;bestcar++)
if((bestcar==2)+(bestcar==4)+(bestcar!=3)+(bestcar!=4)==1)
printf("最好的赛车编号为%d",bestcar);
return 0;
}
/*11.编写程序,找出1~99之间的全部同构数。同构数是这样一组数,它出现在平方数的右边。例如:5是25的右边的数,25是625右边的数,5和25都是同构数。
要求:这些同构数由小到大输出。*/
#include<stdio.h>
int main()
{
int x;
for(x=1;x<=99;x++)
{
if(x<10)
{
if(x==(x*x%10))
{
printf("%d\n",x);
}
}
else
{
if(x==(x*x%100))
{
printf("%d\n",x);
}
}
}
return 0;
}
/*12.一个小于10000的正整数,它加上100后是一个完全平方数,它加上268又是一个完全平方数,请问该数是多少?输出所有这样的数字。要求用for循环完成。
注:若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数,例如4=2*2,9=3*3,25=5*5*/
#include<stdio.h>
#include<math.h>
int main()
{
int x;
double a,b;
for(x=1;x<10000;x++)
{
a=(int)sqrt(x+100);//此题重点在如何验证上面!!
b=(int)sqrt(x+268);
if((a*b)==sqrt(x+100)*sqrt(x+268))
printf("%d\n",x);
}
return 0;
}
/*13.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。
以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。*/
#include<stdio.h>
int main()
{
int left=1,i;
for(i=10;i>1;i--)
{
left=2*(left+1);
}
printf("猴子第一天摘了%d个桃子",left);
return 0;
}
/*14.一球从n米高度*下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米(包括第10次反弹的高度)?第10次反弹多高?要求 n (n>=100)由键盘输入*/
#include<stdio.h>
int main()
{
int i;
float n,h,sum;
scanf("%f",&n);
h=n;
sum=n;
for(i=2;i<=11;i++)
{
h=h/2.0;
sum=sum+h*2;
}
printf("第10次落地时共经过%f米\n",sum-h);
printf("第10次反弹%f米\n",h);
return 0;
}
/*15.一个正整数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。
编程输出1000以内的所有完数。*/
#include <stdio.h>
int main()
{ int n,temp,sum;
for(n=1;n<1000;n++)
{
sum= 0;
for(temp=1;temp<n;temp++)
{
if(n%temp==0)
{
sum=sum+temp;
}
}
if(sum==n)
{
printf("%d\n",n);
}
}
return 0;
}
/*16.打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=13+53+33。*/
#include<stdio.h>
int main()
{
int x,a,b,c;
for(x=100;x<1000;x++)
{
a=x/100;
b=x/10%10;
c=x%10;
if(x==a*a*a+b*b*b+c*c*c)
printf("%d ",x);
}
return 0;
}
/*17.求Sn(a)=a+aa+aaa+…+aa…aaa(有n个a,n<=7)之值,其中a是某一个数字。例如:2+22+222+2222+22222(n=5),a和n由键盘输入。
要求输入语句为:scanf("%d%d",&a,&n); */
#include<stdio.h>
int main()
{
int a,n,S,i,t;
scanf("%d%d",&a,&n);
S=a;
t=a;
for(i=1;i<n;i++)
{
t=t*10+a;
S=S+t;
}
printf("S%d(%d)=%d",n,a,S);
return 0;
}
/*18.输入两个正整数m和n,求其最大公约数和最小公倍数。*/
#include<stdio.h>
int main()
{
int m,n,a,b,r;
scanf("%d,%d",&m,&n);
a=m*n;
if(m<n)
{
r=m;
m=n;
n=r;
}
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
b=a/n;
printf("最大公约数是%d\n",n);
printf("最小公倍数是%d\n",b);//最小公倍数=m*n/最大公约数
return 0;
}
/*19.输入一行字符(以换行符结束),分别统计出其中英文字母、空格、数字和其他字符的个数。 */
#include<stdio.h>
int main()
{
char ch,a=0,b=0,c=0,d=0;
while((ch=getchar())!=0)
{
if(ch>='A'||ch<='z')
{
a++;
}
else if(ch==' ')
{
b++;
}
else if(ch>='0'||ch<='9')
{
c++;
}
else
{
d++;
}
}
printf("字母数:%d\n空格数:%d\n数字数:%d\n其它字符数:%d",a,b,c,d);
return 0;
}
/*20.找出输入的10个数的数组中出现频次最高的数*/
#include<stdio.h>
int main()
{
int i,j,a[10],count[10]={0},max;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)
{
for(j=i;j<10;j++)
{
if(a[j]==a[i])
{
count[i]++;
}
}
}
max=count[0];
for(i=0;i<10;i++)
{
if(count[i]>max)
{
max=count[i];
}
}
for(i=0;i<10;i++)
{
if(count[i]==max)
printf("%d ",a[i]);
}
return 0;
}
/*21.键盘上输入直角坐标系上一个点的坐标(x,y),编程实现判断该点属于第几象限。
测试数据为 (1,0);(0,1);(1,1);(1,-1) (-1,1) (-1,-1)*/
//以下写法并非最优!!
#include<stdio.h>
int main( )
{
float x,y;
scanf("%f%f",&x,&y);
if(x>0&&y>0)
printf("(%.2f,%.2f)在第一象限!\n",x,y);
else if(x<0&&y>0)
printf("(%.2f,%.2f)在第二象限!\n",x,y);
else if(x<0&&y<0)
printf("(%.2f,%.2f)在第三象限!\n",x,y);
else if(x>0&&y<0)
printf("(%.2f,%.2f)在第四象限!\n",x,y);
else if(x==0&&y!=0)
printf("(%.2f,%.2f)在y坐标轴上!\n",x,y);
else if(x!=0&&y==0)
printf("(%.2f,%.2f)在x坐标轴上!\n",x,y);
else
printf("(%.2f,%.2f)在坐标原点上!\n",x,y);
}
/*22.企业发放的奖金(实数)根据利润(整数)提成。
(1)利润≤10万元时,奖金可提成10% ;
(2)10万元<利润≤20万元时,其中10万元以下部分仍按10%提成,高于10万元(含10万元)的部分,可提成7.5% ;
(3)20万元<利润≤40万元时,其中20万元以下部分仍按上述办法提成,高于20万元的部分按5%提成;
(4)40万元<利润≤60万元时,其中40万元以下部分仍按上述办法提成,高于40万元的部分按3%提成;
(5)60万元<利润≤100万元时,其中60万元以下部分仍按上述办法提成,高于60万的部分按1.5%提成;
(6)100万元<利润时,其中100万元以下部分仍按上述办法提成,超过100万元的部分按1%提成。
从键盘输入当月利润(整数),求应发放奖金(实数)总数。
要求:用switch语句编程序。
调试数据为 第1组 输入 156890 输出 奖金是14266.75
第2组 输入 150000 输出 奖金是13750.00 */
#include<stdio.h>
int main( )
{
int award;
float salary;
scanf("%d",&award);
switch (award/100000){
case 0:salary=(float)award*0.1;break;
case 1:salary=10000+(award-100000)*0.075;break;
case 2:case 3:salary=17500+(award-200000)*0.05;break;
case 4:case 5:salary=27500+(award-400000)*0.03;break;
case 6:case 7:case 8:case 9:salary=33500+(award-600000)*0.015;break;
default :salary=39500+(award-1000000)*0.01;break;
}
printf("奖金是%.2f\n",salary);
}
/*23.如何不用数组输入n组数,计算两点间的距离 */
#include<stdio.h>
#include<math.h>
int main()
{
int x1,y1,x2,y2,i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//弊端就是不可以像数组那样连续输入
printf("%.2f/n",sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
}
return 0;
}
/*24.输入一个数并对其进行分解(6=2*3),并以2*3的形式输出*/
#include<stdio.h>
int main()
{
int x,i;
scanf("%d",&x);
printf("%d=",x);
for(i=2;i!=x;i++)
{
if(x%i==0)
{
printf("%d*",i);
x=x/i;
}
}
printf("%d\n",i);
return 0;
}
/*25.用数组输出斐波那契数列的第n项 */
#include<stdio.h>
int main()
{
int a[21]={0,1,1},i,n;//为了方便计数我们常常把数组大小设大一个!!
scanf("%d",&n);
for(i=3;i<=n;i++)
{
a[i]=a[i-2]+a[i-1];
}
printf("%d",a[n]);
return 0;
}
/*26.进阶版输出金字塔型星号*/
#include<stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=n-i;j>0;j--)
{
printf(" ");
}
for(j=1;j<=i;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
/*27.倒序后输出 eg:输入123 输出321*/
#include<stdio.h>
int mian()
{
int x,y=0;
scanf("%d",&x);
while(x!=0)
{
y=y*10+x%10;
x=x/10;
}
printf("%d\n",y);
return 0;
}
/*28.将n中的偶数倒叙后输出*/
#include<stdio.h>
int main()
{
int x,y=0;
scanf("%d",&x);
while(x!=0)
{
if(x%2==0)
{
y=y*10+x%10;
x/=10;
}
else
x=x/10;
}
printf("%d",y);
return 0;
}
//第五章 数据类型和表达式
/*1、请编写程序: 有36 块砖,36 人搬。男人搬4块,女人搬3块,两个小孩抬一砖。要求一次全搬完。问需男人、女人、小孩各若干?(穷举法)。*/
#include<stdio.h>
int main()
{
int male,female,child;
for(male=0;male<=9;male++)
{
for(female=0;female<=12;female++)
{
for(child=0;child<=72;child++)
{
if(child*1.0/2+male*4+female*3==36&&(male+female+child)==36)
{
printf("需要%d个男人,%d个女人,%d个小孩\n",male,female,child);
}
}
}
}
return 0;
}
/*2.输入圆半径和圆柱高,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积,结果都保留两位小数。
要求:将pi定义为符号常量,取值3.1416
注意:输入数据的格式(圆半径在前,圆柱高在后,用逗号分隔),输出的格式和文字(冒号和等号为英文字符)。*/
#include<stdio.h>
#include<math.h>
#define pi 3.1416
int main()
{
float r,h,c,s,sq,v,vz;
scanf("%f,%f",&r,&h);
c=2*pi*r;
s=pi*r*r;
sq=4*pi*r*r;
v=4.0/3*pi*r*r*r;
vz=s*h;
printf("圆周长为:c=%.2f\n圆面积为:s=%.2f\n圆球表面积为:sq=%.2f\n圆球体积为:v=%.2f\n圆柱体积为:vz=%.2f\n",c,s,sq,v,vz);
return 0;
}
/*3.要将"China"译成密码,密码规律是:用原来字母后面的第n个字母代替原来的字母(n的取值从1到10)。例如,n=4,则字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,输入n的值,输出经过变换后的密码字符。 */
#include<stdio.h>
int main()
{
int n;
char c1='C',c2='h',c3='i',c4='n',c5='a';
scanf("%d",&n);
printf("%c%c%c%c%c\n",c1+n,c2+n,c3+n,c4+n,c5+n);
return 0;
}
/*4.假如我国国民生产总值的年增长率为9%,计算n年后我国国民生产总值与现在相比增长多少百分比。
计算公式为
p=(1+r)n
r为年增长率,n为年数,p为与现在相比的倍数
要求:n的值需要输入,输出的倍数以百分比的形式输出,保留两位小数(以上公式求的是倍数,需要转换成百分比的格式,例如p的值是2.5678,需要输出256.78%)。*/
#include<stdio.h>
int main()
{
int n,i;
float r=0.09,p;
scanf("%d",&n);
for(i=0,p=1+r;i<n-1;i++)
{
p*=(1+r);
}
printf("%.2f%%\n",p*100);
return 0;
}
//第六章 数组
/*1.任意读入10个整数存放到数组a中,统计数组中出现频率最高的数,输出该数及其出现次数。
如果数组中没有重复出现的数,则输出"没有重复出现的数";
如果有多个频率最好的数字,按照输入的先后顺序全部输出,参考下面的程序运行示例。*/
#include<stdio.h>
int main()
{
int a[10],i,time[10]={0},j,max;
printf("a数组元素为:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
printf("%d ",a[i]);
}
printf("\n");
for(i=0;i<10;i++)
{
for(j=i;j<10;j++)
{
if(a[i]==a[j])
{
time[i]++;
}
}
}
max=time[0];
for(i=0;i<10;i++)
{
if(time[i]>=max)
{
max=time[i];
}
}
if (max == 1)
printf("没有重复出现的数");
for(i=0;i<10;i++)
{
if(time[i]==max&&max!=1)
{
printf("数组a中出现频率最高的数是%d,出现次数为%d\n",a[i],max);
}
}
return 0;
}
/*2.任意读入10个整数存放到数组a中,在main()中完成如下功能:
找出其中最大的数,给出其在数组中的位置,如果不止有一个最大数,则需要给出所有的最大数在数组中的位置(位置编号由小到大输出)*/
#include<stdio.h>
int main()
{
int a[10],i,max;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
max=a[0];
for(i=0;i<10;i++)
{
if(a[i]>=max)
{
max=a[i];
}
}
printf("最大值是%d,其在数组中位置是",max);
for(i=0;i<10;i++)
{
if(a[i]==max)
printf("%d ",i);
}
return 0;
}
/*3.输入一个长度为8的整型数组,输出该数组的平均值(保留1位小数),输出数组中大于等于平均值的数组元素。
注意:输出按照输入的顺序,如果有相同的元素都输出,请参考下面的运行结果。*/
#include<stdio.h>
int main()
{
int a[8],i;
float ave,sum=0;
for(i=0;i<8;i++)
{
scanf("%d",&a[i]);
sum=sum+a[i];
}
ave=sum/8;
printf("平均值是%.1f\n大于等于平均值的元素是",ave);
for(i=0;i<8;i++)
{
if(a[i]>=ave)
printf("%d ",a[i]);
}
return 0;
}
/*4.分别输入两个长度为5的从小到大排好序的整数数组,将这两个数组合并到第三个数组中,保持从小到大的排序,并输出。*/
#include <stdio.h>
int main()
{
int a[5],b[5],c[5];
int i,j,k,min,index;
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
c[i]=a[i];
}
for(i=0;i<5;i++)
{
scanf("%d",&b[i]);
c[i+5]=b[i];
}
for(i=0;i<9;i++)
{
min=c[i];
index=i;
for(j=i;j<10;j++)
{
if(c[j]<min)
{
min=c[j];
index=j;
}
}
c[index]=c[i];
c[i]=min;
}
for(i=0;i<10;i++)
{
printf("%d ",c[i]);
}
}
/*5.输入一个4行4列的单精度数组,计算主对角线元素之和,保留1位小数输出。*/
#include<stdio.h>
int main()
{
float a[4][4],sum=0;
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%f",&a[i][j]);
}
}
for(i=0;i<4;i++)
{
sum+=a[i][i];
}
printf("%.1f",sum);
return 0;
}
/*6.输入一个2行3列的整数数组,将其进行转置(行和列元素交换)并输出。*/
#include<stdio.h>
int main()
{
int a[2][3],b[3][2],i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
b[j][i]=a[i][j];
}
}
for(j=0;j<3;j++)
{
for(i=0;i<2;i++)
{
printf("%d ",b[j][i]);
}
printf("\n");
}
return 0;
}
/*7.输入一个3行2列的数组,找出最大的元素值以及最大元素的行下标和列下标,并输出。*/
#include<stdio.h>
int main()
{
int a[3][2],i,j,max;
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
scanf("%d",&a[i][j]);
}
}
max=a[0][0];
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
if(max<a[i][j])
{
max=a[i][j];
}
}
}
printf("max=");
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
if(max==a[i][j])
{
printf("a[%d][%d]=",i,j);
}
}
}
printf("%d",max);
return 0;
}
/*8.输入一个2×3的矩阵,求每列的和*/
#include<stdio.h>
int main()
{
int a[2][3],i,j,sum;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
for(j=0;j<3;j++)
{
sum=0;
for(i=0;i<2;i++)
{
sum+=a[i][j];
}
printf("%d",sum);
}
return 0;
}
/*9.编写程序,从输入的一行字符串中抽取一部分(从第n个字符开始,抽取m个字符)构成一个新的字符串,并输出。n>0且n<=字符串的长度,否则打印起始位置-n-越界
要求:n和m都由用户输入。
如果抽取的字符串长度不够,则按照实际长度抽取,例如,字符串为“abcde”,若n=2,m=3,则抽取结果为“bcd”;若n=3,m=5,则抽取结果为“cde”;若n=0,m=4 则输出:起始位置0越界 ;若n=6,m=2 则输出:起始位置6越界 */
#include<stdio.h>
#include<string.h>
int main()
{
int n,m,l,i;
char s[100],cpy[100];
gets(s);
scanf_s("%d%d",&n,&m);
l=strlen(s);
if(n>0&&n<=l)
{
if(m+n>l)
{
for(i=n-1;i<l;i++)
{
cpy[i-n+1]=s[i];
}
s[l-n]='\0';
}
if(m+n<l)
{
for(i=n-1;i<m+n;i++)
{
cpy[i-n+1]=s[i];
}
s[m]='\0';
}
puts(cpy);
}
else
printf("起始位置%d越界",n);
return 0;
}
//10.输入一个字符串和一个特定字符,在字符串中删除从该特定字符开始的所有字符。例如输入字符串为"abcdefg",特定字符为'd',删除后的字符串为"abc";输入字符串为"abcdefg",特定字符为'x',则输出“特定字符不存在”
#include<stdio.h>
#include<string.h>
int main()
{
char s[100],ch;
int i,l1,l2;
gets(s);
l1=strlen(s);
scanf_s("%c",&ch);
printf("特定字符是%c\n",ch);
for(i=0;s[i];i++)
{
if(s[i]==ch)
s[i]='\0';
}
l2=strlen(s);
if(l1==l2)
{
printf("特定字符不存在\n");
}
else
{
printf("删除特定字符%c后的字符串是",ch);
puts(s);
}
return 0;
}
//11.任意输入一行字符串保存在一维字符数组中,判断里面数字字符的个数。
#include<string.h>
#include<stdio.h>
int main()
{
char s[100];
int i,cnt=0;
gets(s);
for(i=0;s[i];i++)
{
if(s[i]>='0'&&s[i]<='9')
{
cnt++;
}
}
printf("%d",cnt);
return 0;
}
//12.任意输入两行字符串,把第二行字符串连接到第一行字符串末尾(不用strcat函数)。
#include<stdio.h>
#include<string.h>
int main()
{
char s1[1000],s2[1000];
int i,l;
gets(s1);
gets(s2);
l=strlen(s1);
for(i=0;s2[i];i++)
{
s1[i+l]=s2[i];
}
s1[i + l] = '\0';
puts(s1);
return 0;
}
//13.任意输一行字符串(包括空格),求其长度(不用strlen函数)。
#include<stdio.h>
int main()
{
char s[100];
int i;
gets(s);
for(i=0;s[i];i++)
;
printf("%d\n",i);
return 0;
}
//14.输入m,n 和一个m*n矩阵 (最大为10 x 10),求他们的各行元素之和。
#include<stdio.h>
int main()
{
int a[10][10],m,n,i,j,sum;
scanf_s("%d%d",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf_s("%d",&a[i][j]);
}
}
for(i=0;i<m;i++)
{
sum=0;
for(j=0;j<n;j++)
{
sum+=a[i][j];
}
printf("第%d行元素之和是%d\n",i,sum);
}
}
/*15.青年歌手参加歌曲大奖赛,有10个评委对她(他)进行打分,试编程求这位选手的平均得分并输出(去掉一个最高分和一个最低分,保留2位小数)。*/
#include<stdio.h>
int main()
{
float a[10],ave,max,min,sum;
int i;
for(i=0;i<10;i++)
{
scanf_s("%f",&a[i]);
}
for(i=0,max=a[0],min=a[0],sum=0;i<10;i++)
{
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
sum+=a[i];
}
ave=(sum-max-min)/8;
printf("最高分%.2f\n最低分%.2f\n最后得分%.2f",max,min,ave);
return 0;
}
/*16.输入n个(1<n<=10)正整数并保存到数组中,求出最大值、最小值、平均值(保留2位小数),以及最大值、最小值在数组中的下标分别是多少。
输入
输入2行
第1行输入整数的个数n
第2行输入n个整数,用空格分隔
输出
需要输出5行
第1行输出最大值
第2行输出最大值的下标
第3行输出最小值
第4行输出最小值的下标
第5行输出平均值*/
#include<stdio.h>
int main()
{
int n,max,min,a[10],i;
float sum,ave;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
max=0;
min=0;
for(i=0,sum=0;i<n;i++)
{
if(a[i]>a[max])
max=i;
if(a[i]<a[min])
min=i;
sum+=a[i];
}
ave=sum/n;
printf("最大值%d\n最大值下标%d\n最小值%d\n最小值下标%d\n",a[max],max,a[min],min);
printf("平均值%.2f\n",ave);
return 0;
}
/*17.将n个数输入到一维数组,将值最大的数组元素与值最小的数组元素的位置对调后输出。*/
#include<stdio.h>
int main()
{
int a[100],i,max,min,n,temp1,temp2;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
max=a[0];//这里在赋初值的的时候最好不要max=min=0!!可能导致逻辑有问题!
min=a[0];
for(i=0;i<n;i++)
{
if(a[i]>max)
{
max=a[i];
temp1=i;
}
if(a[i]<min)
{
min=a[i];
temp2=i;
}
}
a[temp1]=min;
a[temp2]=max;
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
/*18.从键盘输入10个整数并保存到数组,要求找出最小的数,把它和数组中最前面的元素对换位置后输出。*/
#include<stdio.h>
int main()
{
int a[10],i,min;
for(i=0;i<10;i++)
{
scanf_s("%d",&a[i]);
}
for(i=0,min=0;i<10;i++)
{
if(a[i]<a[min])
min=i;
}
for(i=0;i<10;i++)
{
if(i==0)
printf("%d ",a[min]);
else if(i==min)
printf("%d ",a[0]);
else
printf("%d ",a[i]);
}
return 0;
}
/*19.给定一系列正整数,对每个正整数的每一位数字统计0~9各个数字的出现次数,求出现次数最多的数字。
输入:是整数n(1<=n<=100),表示有n个整数;第二行是n个整数值*/
#include <stdio.h>
int main()
{
char str[100];
int a,b,n,max=0;
int q[10]={0};
scanf("%d",&n);
for(a=0;a<n;a++)
{
scanf("%s",str);
for(b=0;str[b]!='\0';b++)
{
if(str[b]>='0'&&str[b]<='9')
{
q[str[b]-'0']++;
}
}
}
for(a=0;a<10;a++)
{
if(q[a]>max)
max=q[a];
}
printf("出现次数最多%d次的数字是",max);
for(a=0;a<10;a++)
{
if(q[a]==max)
printf("%d " ,a);
}
}
/*20.从键盘上读入一个数,从一个已知的数组中删除这个数。
要求使用数组初始化语句为: int a[15]={1,4,6,9,9,6,19,4,4,8,12,1,9,18,19};
n为数组元素的个数,初始值n=15。 程序的输出语句为必要代码:
for(i=0;i<n;i++)
printf("%d ",a[i]);*/
#include<stdio.h>
int main()
{
int a[15]={1,4,6,9,9,6,19,4,4,8,12,1,9,18,19},n=15,i,j,x;
scanf("%d",&x);
for(i=0,j=0;i<n;i++)
{
if(a[i]!=x)
a[j++]=a[i];
}
n=j;
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
/*21.用空格或换行分开的字符串称为单词。输入多行字符串,直到遇到了单词 "stop" 时才停止。最后输出单词的数量。用于分割单词的空格或换行可能多于1个。单词数量不包括"stop" 。*/
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int n=0;
scanf("%s",str);
while(strcmp(str,"stop")!=0)
{
n++;
scanf("%s",str);
}
printf("%d",n);
}
/*22.任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。*/
#include<stdio.h>
int main()
{
int n,i,j,z,a[20],max=0,index;
scanf("%d",&n);
for(i=0;n!=0;i++)
{
a[i]=n%10;
n=n/10;
}
for(j=0;j<i-1;j++)
{
index=j;
for(z=j;z<i;z++)
{
if(a[z]>max)
{
max=a[z];
index=z;
}
}
a[index]=a[j];
a[j]=max;
max=0;
}
for(j=0;j<i;j++)
{
printf("%d",a[j]);
}
return 0;
}
/*23.题目:输入一个小于8位数的正整数,判断它是不是回文数。即12321是回文数。*/
#include <stdio.h>
int main()
{
int a,b,n,i,x=0;
int q[8];
scanf("%d",&n);
for(a=0;n!=0;a++)
{
q[a]=n%10;
n/=10;
}
b=(a+1)/2;
for(i=0;i<b;i++)
{
if(q[i]==q[a-1-i])
{
x++;
}
}
if(x==b&&b!=1||b==1&&x==1)
printf("这是个回文数");
else
printf("这不是回文数");
}
//23题的另法
#include<stdio.h>
int main()
{
int a[8],x,n,i=0,j;
scanf("%d",&x);
while(x)
{
a[i++]=x%10;
x/=10;
}
n=i;
for(i=0,j=n-1;i<j;i++,j--)
{
if(a[i]==a[j])
continue;
else
{
printf("这不是回文数\n");
break;
}
}
if(i==j||i-1==j)
printf("这是个回文数\n");
return 0;
}
/*24.有一篇文章,共有多行文字(不超过10行), 最后一行为end。要求分别统计出其中英文大写字母、小写字母、空格以及其它字符的个数。统计结果不包括最后一行的end。*/
//与21为同类型题
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i,b=0,s=0,num=0,space=0,others=0;
gets(str);
while(strcmp(str,"end")!=0)
{
for(i=0;str[i];i++)
{
if(str[i]>='a'&&str[i]<='z')
s++;
else if(str[i]>='A'&&str[i]<='Z')
b++;
else if(str[i]>='0'&&str[i]<='9')
num++;
else if(str[i]==' ')
space++;
else
others++;
}
gets(str);
}
printf("大写字母有%d个\n小写字母有%d个\n数字有%d个\n空格有%d个\n其他字符有%d个\n",b,s,num,space,others);
}
/*25.用选择法对10个整数从小到大排序,这10个整数需要输入。
要求选择法排序由以下语句实现,其中黄色的为必要代码
for (i=0;i<9;i++)
{ for (min=i,j=i+1;j<10;j++)
。。。
}*/
#include<stdio.h>
int main()
{
int a[10],i,j,t,min;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<9;i++)
{
for (min=i,j=i+1;j<10;j++)
{
if(a[j]<a[min])
{
min=j;
}
}
t=a[min];
a[min]=a[i];
a[i]=t;
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
/*26.已有一个已从小到大排好序的数组,要求输入一个数要求按原来排序的规律将它插入数组中。
要求使用数组初始化语句为: int a[11]={1,4,6,9,13,16,19,28,40,100}*/
#include <stdio.h>
int main()
{
int a[11]={1,4,6,9,13,16,19,28,40,100};
int i,j,k,n;
scanf("%d",&n);
for(i=0;i<10;i++)
{
if(a[i]>n)
{
for(j=11;j>i;j--)
{
a[j]=a[j-1];
}
a[i]=n;
break;
}
}
if(n>a[10])
{
a[10]=n;
}
for(i=0;i<11;i++)
{
printf("%d ",a[i]);
}
}
//26题的另法
#include<stdio.h>
int main()
{
int a[11]={1,4,6,9,13,16,19,28,40,100},i,x;
scanf("%d",&x);
if(x>1&&x<100)
{
for(i=0;i<10;i++)
{
if(a[i]<x||a[i]>x)
printf("%d ",a[i]);
if(a[i]<x&&a[i+1]>x&&i<10)
printf("%d ",x);
}
}
else if(x<1)
{
printf("%d ",x);
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
else
{
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("%d ",x);
}
return 0;
}
/*27.打印出n行杨辉三角形(要求输入n的值,n<=10)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
∶ ∶ ∶ ∶ ∶ ∶*/
#include<stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
int a[100][100];
for(i=0;i<n;i++)
{
a[i][0]=1;
}
a[1][1]=1;
for(i=2;i<n;i++)
{
for(j=1;j<=i;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
/*28.将不多于10个的正整数输入到数组a[ ]中,以-1作为结束符, 要求数组的值按逆序重新存放并输出(不包含-1)。
输出语句必须是:
for(i=0;i<n;i++) printf("%d ",a[i]);
例如,输入: 8 6 5 4 1 -1
输出 1 4 5 6 8。*/
#include<stdio.h>
int main()
{
int a[10],i,j,t,n;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
if(a[i]==-1)
break;
}
n=i;
for(i=0,j=n-1;i<j;i++,j--)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
//第七章 函数
/*1.编写函数,完成下面的程序,将一个字符串中的字母排序后输出。输出要求:字母从小到大排序(包括大小写)后的字符串。例如:
输入:Hello World!
输出:!HWdellloor
程序中的必要代码为:
main()
{
char s[80];
gets(s);
sortchar(s);
puts(s);
}*/
#include <stdio.h>
#include <string.h>
int sortchar(char s[]);
int main()
{
char s[80];
gets(s);
sortchar(s);
puts(s);
}
int sortchar(char s[])
{
int a,b,k;
int i=strlen(s);
char t;
for(a=0;a<i-1;a++)
{
for(b=a;b<i;b++)
{
if(s[a]>s[b])
{
t=s[a];
s[a]=s[b];
s[b]=t;
}
}
}
s[b]='\0';
}
/*2.请编一个函数fun,其中n所指存储单元中存放了数组中元素的个数。函数的功能是:删除所有值为y的元素。已在主函数中给数组元素赋值,y的值由主函数通过键盘读入。
程序的必要代码为:
int main()
{ int aa[M]={1,2,3,3,2,1,1,2,3,4,5,4,3,2,1}, n=15, y, k;
scanf("%d",&y);
n = fun(aa, n, y);
for(k=0; k<n; k++ )
printf("%d ",aa[k]);
printf("\n");
return(0);
}*/
#include<stdio.h>
#define M 15
int fun(int aa[],int n,int y);
int main()
{
int aa[M]={1,2,3,3,2,1,1,2,3,4,5,4,3,2,1},n=15,y,k;
scanf("%d",&y);
n = fun(aa, n, y);
for(k=0; k<n; k++ )
printf("%d ",aa[k]);
printf("\n");
return(0);
}
int fun(int aa[],int n,int y)
{
int i,j;
for(i=0,j=0;i<n;i++)
{
if(aa[i]!=y)
aa[j++]=aa[i];
}
return j;
}
/*3.编写函数 int substring(char s[], char sub[]),查找sub串在字符串s中第一次出现的位置,若找到,函数返回对应位置,否则返回-1。注意主串第1个字符的位置为1。例如s串为“abcdefg”,sub串为“def”,则返回值为4。在main函数中输入主串和子串,调用该函数并输出结果。
输入要求:需要2行。第1行输入主串s,第2行输入子串sub。
示例如下:
abcdefgdefg
def
输出要求:根据实际情况输出子串的位置或提示“***子串没有找到!”(其中***要用实际的子串替代)
示例如下:
子串def在主串abcdefgdefg中第一次出现的位置是4
程序的必要代码为:
void main(void)
{
char s[99],sub[99];
gets(s);
gets(sub);
if(substring(s,sub)==-1)
printf("%s子串没有找到!",sub);
else
printf("子串%s在主串%s中第一次出现的位置是%d",sub,s,substring(s,sub));
}*/
#include<stdio.h>
#include<string.h>
int substring(char s[],char sub[]);
int main()
{
char s[99],sub[99];
gets(s);
gets(sub);
if(substring(s,sub)==-1)
printf("%s子串没有找到!\n",sub);
else
printf("子串%s在主串%s中第一次出现的位置是%d\n",sub,s,substring(s,sub));
}
int substring(char s[], char sub[])
{
int i,j,pos,l;
l=strlen(sub);
char s2[l];
for(j=0;j<strlen(s);j++)
{
if(sub[0]==s[j])
{
pos=j;
break;
}
}
for(i=0;i<l;i++)
{
s2[i]=s[pos+i];
}
s2[i]='\0';
if(strcmp(sub,s2)==0)
{
return pos+1;
}
else
return -1;
}
/*4. 编写函数,统计给定字符串中各个字母出现的次数,不区分大小写。在main函数中输入一个字符串,调用该函数进行计算,然后输出统计结果。
输入要求:任意一个字符串。
程序的必要代码为:
main()
{ char str[255];
int count[26]={0};
int i;
gets(str);
counta_z(str,count);
for(i=0;i<26;i++)
if(count[i])
printf("%c出现的次数为:%d\n",i+'a',count[i]);
}*/
#include<stdio.h>
#include<string.h>
void counta_z(char str[],int count[26]);
int main()
{
char str[255];
int count[26]={0};
int i;
gets(str);
counta_z(str,count);
for(i=0;i<26;i++)
if(count[i])
printf("%c出现的次数为:%d\n",i+'a',count[i]);
}
void counta_z(char str[],int count[26])
{
int i,j;
for(i=0;i<strlen(str);i++)
{
for(j=0;j<26;j++)
{
if(str[i]==j+'a'||str[i]==j+'A')
{
count[j]++;
}
}
}
}
/*5.程序题章节:第七章 函数知识点:无所属语言:C试题难度:中等
编写函数void find_max( int a[][4], int n, int b[2]) 求出二维整型数组中元素的最大值及其下标号。在main函数中输入一个二维数组,调用函数find_max()求出最大值及其下标号,在主函数中输出。其中:二维数组行数由用户确定(不超过10),列数固定为4列。
输入要求:第1行输入二维数组的行数,然后分m行输入二维数组,元素之间用空格分隔。示例如下:
3
18 2 3 4
8 7 6 18
9 10 11 12
输出要求:第一个最大值及下标。示例如下:
最大值array[0][0]=18
提示:这里至少需要返回二维数组元素的行,列两个值,而函数只能返回1个值(无法返回2个值),所以只能通过数组作为参数的方法将值带回来。在main函数中输入一个二维整型数组,调用该函数得到最大值所在的下标,并输出最大值及其下标号。
程序的必要代码为:
main()
{
int array[10][4],m[2],n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<4;j++)
scanf("%d",&array[i][j]);
find_max(array,n,m);
printf("最大值array[%d][%d]=%d",m[0],m[1],array[m[0]][m[1]]);
}*/
#include<stdio.h>
void find_max(int array[][4],int n,int m[2]);
int main()
{
int array[10][4],m[2],n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<4;j++)
scanf("%d",&array[i][j]);
find_max(array,n,m);
printf("最大值array[%d][%d]=%d",m[0],m[1],array[m[0]][m[1]]);
}
void find_max(int array[][4],int n,int m[2])
{
int i,j;
for(i=0,m[0]=0,m[1]=0;i<n;i++)
{
for(j=0;j<4;j++)
{
if(array[m[0]][m[1]]<array[i][j])
{
m[0]=i;
m[1]=j;
}
}
}
}
/*6.编写一个函数void sort(int a[],int n),实现整型数组元素的升序排列。在main函数中输入数组元素个数和各个元素(不超过10个整数),之后调用sort函数进行排序,在主函数中输出排序后的结果。
输入要求:需要输入2行。第1行输入数组元素的个数n;第2行输入n个数组元素。
输入示例:
5
1 9 4 5 7
输出要求:输出2行。第1行为未排序的数组,每个数值之后都用1个空格分隔;第2行为升序排序后的数组,每个数值之后都用1个空格分隔。
输出示例:
排序之前的数组:1 9 4 5 7
排序之后的数组:1 4 5 7 9
程序的必要代码为:
main()
{
int a[10],i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("排序之前的数组:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
sort(a,n);
printf("\n排序之后的数组:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
}*/
#include<stdio.h>
void sort(int a[],int n);
int main()
{
int a[10],i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("排序之前的数组:");
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
sort(a,n);
printf("\n排序之后的数组:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
void sort(int a[],int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
/*7.编写函数long compose(long number)完成如下功能:将长整型数中数字为偶数的数依次取出,构成一个新数返回,例如,假设长整型数为:87653142时,则返回的数为:8642。
然后在main函数中输入一个长整型数,调用该函数得到新的数,并输出结果。
程序的必要代码为:
int main()
{
long int n ;
scanf("%ld",&n);
printf("%ld\n",compose(n));
return 0;
}*/
#include<stdio.h>
long compose(long number);
int main()
{
long int n ;
scanf("%ld",&n);
printf("%ld\n",compose(n));
return 0;
}
long compose(long number)
{
int a[100],i,n,s;
for(i=0;number!=0;i++)
{
a[i]=number%10;
number=number/10;
}
n=i;
for(i=n-1,s=0;i>=0;i--)
{
if(a[i]%2==0)
{
s=s*10+a[i];
}
}
return s;
}
/*8.编写函数int reverse(int number),它的功能是将number逆序,在main函数中输入一个整数,调用该函数得到逆序的数并输出。例如reverse(11233)的返回值为33211。
程序的必要代码为:
void main()
{
int number;
scanf("%d",&number);
printf("%d", reverse(number) );
}*/
#include<stdio.h>
int reverse(int number);
int main()
{
int number;
scanf("%d",&number);
printf("%d", reverse(number) );
}
int reverse(int number)
{
int i,a[100],n,s;
for(i=0;number;i++)
{
a[i]=number%10;
number=number/10;
}
n=i;
for(i=0,s=0;i<n;i++)
{
s=s*10+a[i];
}
return s;
}
/*9.编写一个函数char my_toupper(char ch),其功能是判断输入字符是否为小写字母,若是,返回其对应的大写字母,否则返回原字符。然后在main函数中输入一个字符,调用该函数得到其大写字母或原字符并输出。
程序的必要代码为:
void main()
{ char ch;
ch=getchar();
putchar(my_toupper(ch));
}*/
#include<stdio.h>
char my_toupper(char ch);
int main()
{ char ch;
ch=getchar();
putchar(my_toupper(ch));
}
char my_toupper(char ch)
{
if(ch-'A'<26)
return ch;
else
return (ch-32);
}
/*10.输入1 个正整数 n (1≤n≤6)和n 阶方阵a中的元素,如果a的每一行的最大元素值都相等, 输出"YES", 否则, 输出"NO"。
例:输入:
3
1 2 3
3 3 3
3 0 0
输出:
YES*/
#include<stdio.h>
int max(int a[][6],int n);
int main()
{
int n,i,j,a[6][6];
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
if(max(a,n)==-1)
printf("NO");
else
printf("YES");
}
int max(int a[][6],int n)
{
int i,j,m,max;
for(m=a[0][0],i=0;i<n;i++)
{
if(m<a[0][i])
m=a[0][i];
}
max=m;
for(i=1;i<n;i++)
{
m=a[i][0];
for(j=0;j<n;j++)
{
if(m<a[i][j])
m=a[i][j];
}
if(max!=m)
return -1;
}
return 1;
}
/*11.已知两个整数20和10,编写程序,自定义函数add( )计算这两个数的和,自定义函数sub( )计算这两个数的差,20和10作为参数传递给这两个函数。
程序的必要代码为:
main()
{ int a,b;
scanf("%d%d",&a,&b);
printf("%d+%d = %d\n", a, b, add(a, b));
printf("%d-%d = %d\n", a, b, sub(a, b));
}*/
#include<stdio.h>
int add(int a,int b);
int sub(int a,int b);
int main()
{ int a,b;
scanf("%d%d",&a,&b);
printf("%d+%d = %d\n", a, b, add(a, b));
printf("%d-%d = %d\n", a, b, sub(a, b));
}
int add(int a,int b)
{
return (a+b);
}
int sub(int a,int b)
{
return (a-b);
}
/*12.对每个字符串做如下处理:删除字符串所有连续相同的字符,然后输出该字符串。
要求:使用函数void del_samechar(char str[])实现对字符串str中所有连续相同的字符的删除。
例:输入:room 输出:rm
输入:aabaaama 输出:bma
程序的必要代码为:
main()
{ char str[100];
gets(str);
del_samechar(str);
puts(str);
}*/
#include<stdio.h>
void del_samechar(char str[]);
int main()
{ char str[100];
gets(str);
del_samechar(str);
puts(str);
}
void del_samechar(char str[])
{
int i,j;
for(i=0,j=0;str[i]!=0;i++)
{
if(i==0&&str[i]!=str[i+1])
{
str[j++]=str[i];
}
if(i>0&&str[i]!=str[i-1]&&str[i]!=str[i+1])
{
str[j++]=str[i];
}
}
str[j]='\0';
}
/*13.编写1个函数判断一个整数是否左右对称数。 要求函数为: fun(long n)
要求在主程序中输入一个整数,如果该数对称,输出"YES";否则,输出"NO"。
例如 输入:1235321 输出:YES
输入: 1210 输出:NO
程序的必要代码为:
main( )
{ long in;
scanf("%ld",&in);
if(fun(in))
printf("YES\n");
else
printf("NO\n");
}*/
#include<stdio.h>
int fun(long n);
int main( )
{ long in;
scanf("%ld",&in);
if(fun(in))
printf("YES\n");
else
printf("NO\n");
}
int fun(long n)
{
int i,j,a[100],all;
for(i=0;n!=0;i++)
{
a[i]=n%10;
n=n/10;
}
all=i;
for(i=0,j=all-1;i<j;i++,j--)
{
if(a[i]!=a[j])
return 0;
}
return 1;
}
/*14.输入一个大于等于6的偶数,将它表示为两个素数之和(输出所有的组合)。
要求:用自定义函数int prime(int n)来判断n是否为素数。
例如:输入10
输出:10=3+7
10=5+5*/
#include<stdio.h>
int prime(int n);
int main()
{
int n,i;
scanf("%d",&n);
for(i=2;i<=n/2;i++)
{
if(prime(i)&&prime(n-i))
printf("%d=%d+%d\n",n,i,n-i);
}
}
int prime(int n)
{
int i;
for(i=2;i<n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
/*15.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
程序的必要代码为:
main( )
{ int u,v,h,x;
scanf("%d%d",&u,&v);
h=hcf(u,v);
printf("H.C.F=%d\n",h);
x=lcd(u,v,h);
printf("L.C.D=%d\n",x);
}*/
#include<stdio.h>
int hcf(int u,int v);
int lcd(int u,int v,int h);
int main( )
{ int u,v,h,x;
scanf("%d%d",&u,&v);
h=hcf(u,v);
printf("H.C.F=%d\n",h);
x=lcd(u,v,h);
printf("L.C.D=%d\n",x);
}
int hcf(int u,int v)
{
int r;
if(u<v)
{
r=u;
u=v;
v=r;
}
r=u%v;
while(r!=0)
{
u=v;
v=r;
r=u%v;
}
return v;
}
int lcd(int u,int v,int h)
{
return (u*v/h);
}
//第八章 指针
/*1.输入多行字符串(有可能有空格),最后一行为#号作为结束,按照由小到大的顺序将字符串分行输出(不输出"#")。
例如输入:
I study very hard.
C language is very interesting
He is a professfor.
#
输出:
C language is very interesting
He is a professfor.
I study very hard.*/
#include<stdio.h>
#include<string.h>
int main()
{
char s[10][100],t[100];
int i=0,n,j;
while(1)
{
gets(s[i]);
if(strcmp(s[i],"#")==0)
break;
i++;
}
n=i;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(s[i],s[j])>0)
{
strcpy(t,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],t);
}
}
}
for(i=0;i<n;i++)
{
puts(s[i]);
}
}
/*2.指针实现:输入10个整数,将其中最小的数与第1个数对换,把最大的数与最后一个数对换。*/
#include<stdio.h>
int main()
{
int a[10],*max,*min,i,t;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
max=a;
min=a;
for(i=0;i<10;i++)
{
if(a[i]>*max)
max=a+i;
if(a[i]<*min)
min=a+i;
}
if(a[0]!=*max&&a[9]!=*min)
{
t=a[9];
a[9]=*max;
*max=t;
t=a[0];
a[0]=*min;
*min=t;
}
if(a[0]==*max&&a[9]==*min)
{
t=a[0];
a[0]=a[9];
a[9]=t;
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
//以下是更简便地写法(5个数的)
#include<stdio.h>
int main()
{
int a[5],t,*p,*max,*min;
for(p=a;p<a+5;p++)
{
scanf("%d",p);
}
max=min=a;
for(p=a;p<a+5;p++)
{
if(*p>*max)
max=p;
if(*p<*min)
min=p;
}
if(max=a)
{
max=min;
}
t=a[0];
a[0]=*min;
*min=t;
t=a[4];
a[4]=*max;
*max=t;
for(p=a;p<a+5;p++)
{
printf("%d ",*p);
}
}
/*3.请用指针实现程序:n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来的第几号的那位。*/
#include<stdio.h>
int main()
{
int a[100],i,n,*p,left,cnt;
scanf("%d",&n);
for(i=0;i<n;i++)
{
a[i]=i+1;
}
p=a+n-1;
left=n;
while(1)
{
if(p==a+n-1)
p=a;
else
p++;
if(*p==0)
continue;
cnt++;
if(cnt==3)
{
left--;
if(left==0)
{
printf("%d",*p);
break;
}
cnt=0;
*p=0;
}
}
}
//学校的网只可以编译通过下面的程序
#include <stdio.h>
int main()
{
int n,a[100]={0},i,j,m,t=0,*p=a+1;
scanf("%d",&n);
for(i=1;;i++)
{
m=0;
if(i>n)
i=1;
if(a[i]==0)
{
t++;
if(t%3==0)
a[i]=1;
}
for(j=1;j<=n;j++)
m=m+a[j];
if(m==n-1)
break;
}
for(;p<=n+a;p++)
if(*p==0)
printf("最后留下来的是第%d号\n",p-a);
}
/*4.用指针实现:输入3个整数,按由小到大的顺序输出。*/
#include<stdio.h>
int main()
{
int *x,*y,*z,*t,a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
x=&a;
y=&b;
z=&c;
if(*x>*y)
{
t=x;
x=y;
y=t;
}
if(*x>*z)
{
t=x;
x=z;
z=t;
}
if(*y>*z)
{
t=y;
y=z;
z=t;
}
printf("%d,%d,%d",*x,*y,*z);
return 0;
}
//第九章 结构体
/*1.一次投票后,统计了n位候选人的得票数(n<10)。
定义一个结构体类型,包括姓名和票数两个成员;并声明一个足够大的结构体数组,用来存放各个候选人的姓名和得票数。
结构体类型的定义和数组声明请使用:
struct person
{ char name[20];
int count;
} leader[10];
要求:输入n的值,再依次输出每位候选人及其票数,按照每位候选人的得票数进行由大到小的排序,然后将候选人的姓名和得票数按照由大到小的顺序输出。
有关数据的输入和输出请参照解题要求的示例。*/
#include<stdio.h>
struct person
{ char name[20];
int count;
} leader[10];
int main()
{
int i,j,n;
struct person t;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s%d",leader[i].name,&leader[i].count);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(leader[i].count<leader[j].count)
{
t=leader[i];
leader[i]=leader[j];
leader[j]=t;
}
}
}
for(i=0;i<n;i++)
{
printf("%s:%d\n",leader[i].name,leader[i].count);
}
}
/*2.定义一个结构体datetime,包含7个成员:year, month, day, hour, minute, second,week。其中week是字符串,其他6个成员均为整数。
编写程序,输入一个时间(时间格式为:yyyy-mm-dd hh:mm:ss,例如 2019-01-04 11:04:06),由程序给该时间的week属性赋值(已知1919年1月1日是星期三),并输出该日期是星期几。请注意闰年。
注意星期日不要写成星期天。*/
#include<stdio.h>
struct datetime
{
int year;
int month;
int day;
int hour;
int minute;
int second;
char week[20];
};
struct datetime dt={1919,1,1,0,0,0,"星期三"};
int main()
{
struct datetime date;
int week=0,year=dt.year,month=1;
scanf("%d-%d-%d %d:%d:%d",&date.year,&date.month,&date.day,&date.hour,&date.minute,&date.second);
while(year!=date.year)
{
year++;
if((year%4==0&&year%100!=0)||year%400==0)
{
week+=2;
}
else
{
week++;
}
}
while(month<date.month)
{
if(month==2&&(date.year%4==0&&date.year%100!=0)||date.year%400==0)
{
week+=29;
}
else if(month%2==1)
{
week+=31;
}
else if(month%2==0&&month!=2)
{
week+=30;
}
else
{
week+=28;
}
}
week=(week+date.day-1)%7;
if(week==0)
printf("星期三\n");
if(week==1)
printf("星期四\n");
if(week==2)
printf("星期五\n");
if(week==3)
printf("星期六\n");
if(week==4)
printf("星期日\n");
if(week==5)
printf("星期一\n");
if(week==6)
printf("星期二\n");
}