《实验指导书》实验二
【例3】#include <stdio.h>
void main()
{
int input_value,minutes,seconds;
scanf("%d",&input_value);
printf("Input the number of seconds:%d\n",input_value);
minutes=input_value/60;
seconds=input_value%60;
printf("%d seconds is equivalent to %d minutes and %d seconds.\n",input_value,minutes,seconds);
}
编程作业
【1】#define PIE 3.1415926
#include <stdio.h>
void main()
{
float r,h,L_circle,S_circle,S_ball,V_ball,V_cylinder;
scanf("%f%f",&r,&h);
L_circle=2*PIE*r;
S_circle=PIE*r*r;
S_ball=4*PIE*r*r;
V_ball=4*PIE*r*r*r/3;
V_cylinder=S_circle*h;
printf("L_circle=%f\nS_circle=%f\nS_ball=%f\nV_ball=%f\nV_cylinder=%f\n",L_circle,S_circle,S_ball,V_ball,V_cylinder);
}
选做题
【1】#include <stdio.h>
#include <math.h>
void main()
{
float x,square,root;
printf("Please input a number:\n");
scanf("%f",&x);
square=x*x;
root=sqrt(x);
printf("square=%.2f\nroot=%.2f\n",square,root);
}
第二次 上机作业
2.1 求两个数的和与差
程序填空,不要改变与输入输出有关的语句。
输入整数 a 和b,计算并输出a、b 的和与差。
例:
输入
2 -8
输出
The sum is -6
The difference is 10
【1】#include <stdio.h>
int main()
{
int a,b,sum,diff;
scanf("%d%d",&a,&b);
sum=a+b;
diff=a-b;
printf("The sum is %d\n",sum);
printf("The difference is %d\n",diff);
}
2.2 求平方根
程序填空,不要改变与输入输出有关的语句。
输入 1 个实数x,计算并输出其平方根(保留1 位小数)。
例:
输入
17
输出
The square root of 17.0 is 4.1
【2】#include <stdio.h>
#include <math.h>
int main()
{
double x,root;
scanf("%lf",&x);
root=sqrt(x);
printf("The square root of %0.1f is %0.1f\n",x,root);
}
2.3 华氏温度转换为摄氏温度
程序填空,不要改变与输入输出有关的语句。
输入华氏温度f,计算并输出相应的摄氏温度c(保留2 位小数)。c = 5/9(f-32).
例:括号内是说明
输入
17.2 (华氏温度)
输出
The temprature is -8.22
【3】#include <stdio.h>
int main()
{
double f,c;
scanf("%lf",&f);
c=5.0/9.0*(f-32.0);
printf("The temprature is %0.2f\n",c);
}
2.4 计算旅途时间
程序填空,不要改变与输入输出有关的语句。
输入 2 个整数time1 和time2,表示火车的出发时间和到达时间,计算并输出旅途时间。
有效的时间范围是 0000 到2359,不需要考虑出发时间晚于到达时间的情况。
例:括号内是说明
输入
712 1411(出发时间是7:12,到达时间是14:11)
输出
The train journey time is 6 hrs 59 mins.
【4】#include <stdio.h>
int main()
{
int time1,time2,hours,mins;
scanf("%d%d",&time1,&time2);
time1=time1/100*60+time1%100;
time2= time2/100*60+time2%100;
hours=(time2-time1)/60;
mins=(time2-time1)%60;
printf("The train journey time is %d hrs %d mins.\n",hours,mins);
}
2.5 数字加密
程序填空,不要改变与输入输出有关的语句。
输入 1 个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10 取余,
做为该位上的新数字,最后将第1 位和第3 位上的数字互换,第2 位和第4 位上的数字互
换,组成加密后的新数。
例:括号内是说明
输入
1257
输出
The encrypted number is 4621(每一位上的数字加9 除以10 取余后,得0146,交换后得到
4601)
【5】#include <stdio.h>
int main()
{
int number,digit1,digit2,digit3,digit4,newnum;
scanf("%d",&number);
digit1=number/1000;
digit2=number%1000/100;
digit3=number%100/10;
digit4=number%10;
digit1=(digit1+9)%10;
digit2=(digit2+9)%10;
digit3=(digit3+9)%10;
digit4=(digit4+9)%10;
newnum=(digit3*1000+digit4*100+digit1*10+digit2);
printf("The encrypted number is %d\n",newnum);
}
2.6 大写字母转换成小写字母
程序填空,不要改变与输入输出有关的语句。
输入一个大写英文字母,输出相应的小写字母。
例:
输入
G
输出
g
【6】#include <stdio.h>
int main()
{
char ch;
scanf("%c",&ch);
ch=ch-'A'+'a';
printf("%c\n",ch);
}
《实验指导书》实验三
【例1】#include <stdio.h>
void main()
{
int x,y,t;
printf("input x,y:\n");
scanf("%d%d",&x,&y);
if (x<y)
{
t=y;
y=x;
x=t;
}
printf("result:max=%d min=%d\n",x,y);
}
编程作业
【1】#include <stdio.h>
void main()
{
int a=0,b=0,x;
x=0&&(a=b=777);
printf("%d %d %d\n",a,b,x);
x=777||(a=++b);
printf("%d %d %d\n",a,b,x);
}
【2】#include <stdio.h>
void main()
{
int min,max,nFeets;
printf("Please input the number of feets:\n");
scanf("%d",&nFeets);
max=nFeets/2; /*若脚全是鸡的,则动物数最多*/
if(nFeets%4)
min=(nFeets+2)/4; /*因为脚的总数不能被4整除,则可将其中一只鸡看成兔子*/
else
min=nFeets/4; /*若脚全是兔子的,则动物数最少*/
printf("The minimum number of animals is %d.\nThe maxmun number of animals is %d.\n",min,max);
}
【3】#include <stdio.h>
void main()
{
float x,y;
printf("Please input a number:\n");
scanf("%f",&x);
if(x<1)
y=x;
else
if(x>=1&&x<10)
y=2*x-1;
else
y=3*x-11;
选做题
【1】#include<stdio.h>
void main()
{
int num,x,newnum;
printf("Please input a number\n");
scanf("%d",&num);
newnum=num*num;
if(num>=10000)
x=100000;
else if(num>=1000)
x=10000;
else if(num>=100)
x=1000;
else if(num>=10)
x=100;
else
x=10;
/*综合考虑到该数不是两位数时的情况,比如6也为自守数*/
if(newnum%x==num)
printf("%d yes %d*%d=%d\n",num,num,num,newnum);
else
printf("您输入的数不是自守数\n");
}
【100以内的同构数】#include<stdio.h>
void main()
{
int num,x,newnum;
newnum=num*num;
num=1;
while (num<=100)
{
if(num>=10)
x=10*10;
else
x=10;
newnum=num*num;
if(newnum%x==num)
printf("%d yes %d*%d=%d\n",num,num,num,newnum);
num++;
}
}
【2】#include <stdio.h>
void main()
{
int age;
printf("Please input the age:\n");
scanf("%d",&age);
switch(age)
{
case 2:
case 3:printf("%d,enter Lower class\n",age);break;
case 4:printf("%d,enter Middle class\n",age);break;
case 5:
case 6:printf("%d,enter Higher class\n",age);break;
default:printf("Sorry,you can't go to our kindergarten.\n");
}
}
第3次上机作业 选择结构
3.1 显示两级成绩
程序填空,不要改变与输入输出有关的语句。
输入一个学生的数学成绩,如果它低于60,输出“Fail”,否则,输出“Pass”。
输入
60
输出
Pass
【1】#include <stdio.h>
void main()
{
int mark;
scanf("%d",&mark);
if(mark<60)
printf("Fail\n");
else
printf("Pass\n");
}
3.2 找最小值
程序填空,不要改变与输入输出有关的语句。
输入四个整数,输出其中的最小值。
输入
12 6 1 90
输出
min is 1
【2】#include <stdio.h>
void main()
{
int a,b,c,d,min;
scanf("%d%d%d%d",&a,&b,&c,&d);
min=a;
if(b<min) min=b;
else if(c<min) min=c;
else if(d<min) min=d;
printf("min is %d\n",min);
}
3.3 求三角形的面积和周长
程序填空,不要改变与输入输出有关的语句。
输入三角形的三条边a, b, c,如果能构成一个三角形,输出面积area 和周长perimeter(保
留2 位小数);否则,输出“These sides do not correspond to a valid triangle”。
在一个三角形中,任意两边之和大于第三边。
三角形的面积计算公式:
aere*area = s(s-a)(s-b)(s-c)
其中:s = (a+b+c)/2
输入
5 5 3
输出
area=7.15; perimeter=13.00
【3】#include <stdio.h>
#include <math.h>
void main()
{
float a,b,c,area,perimeter,s;
scanf("%f%f%f",&a,&b,&c);
s=(a+b+c)/2.0;
if((a+b>c)&&(b+c>a)&&(c+a>b))
{
area=sqrt(s*(s-a)*(s-b)*(s-c));
perimeter=a+b+c;
printf("area=%.2f;perimeter=%.2f\n",area,perimeter);
}
else
printf("These sides do not correspond to a valid triangle.\n");
}
3.4 判断数的符号
程序填空,不要改变与输入输出有关的语句。
输入整数x,若x 大于0,y=1;若x 等于0,y=0;否则,y=-1,最后输出y。
输入
2
输出
1
【4】#include <stdio.h>
void main()
{
int x,y;
scanf("%d",&x);
if(x>0) y=1;
else if(x=0【应为x==0】) y=0;
else y=-1;
printf("%d\n",y);
}
3.5 计算个人所得税
输入一个职工的月薪salary,输出应交的个人所得税tax(保留2 位小数)。
tax = rate * (salary-850)
当 salary <= 850 时,rate = 0;
当 850 < salary <= 1350 时,rate = 5;
当 1350 < salary <= 2850 时,rate = 10;
当 2850 < salary <= 5850 时,rate = 15;
当 5850 < salary 时,rate = 20;
输入
1010.87
输出
tax=8.04
【5】#include <stdio.h>
void main()
{
float rate,salary,tax;
scanf("%f",&salary);
if(salary<=850) rate=0;
else if(salary<=1350) rate=5;
else if(salary<=2850) rate=10;
else if(salary<=5850) rate=15;
else rate=20;
rate=rate/100;
tax=rate*(salary-850);
printf("tax=%0.2f\n",tax);
}
3.6 显示水果的价格
程序填空,不要改变与输入输出有关的语句。
以下4 种水果的单价分别是3.00 元/公斤,2.50 元/公斤,4.10 元/公斤,10.20 元/公斤。
[1] apples
[2] pears
[3] oranges
[4] grapes
输入水果的编号,输出该水果的单价(保留2 位小数)。如果输入不正确的编号,显示单价为
0。
输入
3
输出
price=4.10
【6】#include <stdio.h>
void main()
{
int choice;
float price;
printf("[1] apples\n");
printf("[2] pears\n");
printf("[3] oranges\n");
printf("[4] grapes\n");
scanf("%d",&choice);
switch(choice)
{
case 1:price=3.00;break;
case 2:price=2.50;break;
case 3:price=4.10;break;
case 4:price=10.20;break;
default:price=0;break;
}
printf("price=%0.2f\n",price);
}
3.7 字母转换
程序填空,不要改变与输入输出有关的语句。
输入一个字符,如果它是大写字母,输出相应的小写字母;如果它是小写字母,输出相应的
大写字母;否则,原样输出。
输入
3
输出
3
【7】#include <stdio.h>
void main()
{
char ch;
ch=getchar();
if(ch>=65&&ch<=90)
ch=ch+32;
else if(ch>=90&&ch<=122)
ch=ch-32;
else;
putchar(ch);
putchar('\n');
}
3.8 判定三角形
编写程序。实现根据用户输入的三角形的三条边长判定是何种三角形。
不要改变程序中的其他部分,完成程序。
请完成下面的程序。
【8】#include <stdio.h>
void main()
{
float a,b,c;
printf("输入三角形的三条边a,b,c:");
scanf("%f%f%f",&a,&b,&c);
if ((a+b>c)&&(b+c>a)&&(c+a>b))
{
if(a==b&&a==c)
printf("等边三角形\n");
else if(a==b||b==c||c==a)
printf("等腰三角形\n");
else if((a*a+b*b==c*c)||(b*b+c*c==a*a)||(c*c+a*a==b*b))
printf("直角三角形\n");
else
printf("一般三角形\n");
}
else
printf("不能组成三角形\n");
}
【8】(下面为简单改进后的程序,综合考虑到“等腰直角三角形”情况。但由于若出现“等腰直角三角形”,斜边长必为直角边的根号二倍,边长中必有无理数的存在,而输入的数是浮点数,并不可能为一个无理数,所以该程序无太大可行性,只是全面考虑下的一种设计。)
#include <stdio.h>
void main()
{
float a,b,c;
printf("输入三角形的三条边a,b,c:");
scanf("%f%f%f",&a,&b,&c);
if ((a+b>c)&&(b+c>a)&&(c+a>b))
{
if(a==b&&a==c)
printf("等边三角形\n");
else
{
if(a==b||b==c||c==a)
{
if((a*a+b*b==c*c)||(b*b+c*c==a*a)||(c*c+a*a==b*b))
printf("等腰直角三角形\n");
else printf("等腰三角形\n");
}
else if((a*a+b*b==c*c)||(b*b+c*c==a*a)||(c*c+a*a==b*b))
printf("直角三角形\n");
else printf("一般三角形\n");
}
}
else
printf("不能组成三角形\n");
}
3.9 显示当前月份的最后一天
编写一个程序输入年月,输出该月的最后一天。
不要改变程序中的其他部分,完成程序。
【9】#include <stdio.h>
void main()
{
int year,month,lastday;
printf("Please enter year and month:");
scanf("%d%d",&year,&month);
switch(month)
{
case 2:
if(year%4==0)【这一部分的判断可以更简化一些。可以参见教材P108的内容,用一个逻辑表达式包含所有的条件。】
{
if(year%100==0)
{
if(year%400==0) lastday=29;
else lastday=28;
}
else lastday=29;
}
else
lastday=28;break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
lastday=31;break;
case 4:
case 6:
case 9:
case 11:
lastday=30;break;
}
printf("%d %d %d\n",year,month,lastday);
}
3.10身高预测
每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素有遗传、饮食习惯与坚持体育锻炼等。小孩成人后的身高与其父母的身高和自身的性别密切相关。
设faHeight为其父身高,moHeight为其母身高,身高预测公式为:
男性成人时身高 = (faHeight + moHeight) * 0.54(cm)
女性成人时身高 = (faHeight * 0.923 + moHeight) / 2(cm)
此外,如果喜爱体育锻炼,那么可增加身高2%,如果有良好的卫生饮食习惯,那么可增加身高1.5%。
编程从键盘输入你的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示喜爱,输入字符N表示不喜爱),利用给定公式和身高预测方法对你的身高进行预测。
不要改变程序中的其他部分,将下面的程序补充完整。
【10】#include <stdio.h>
void main()
{
char sex;
char sports;
char diet;
float myHeight;
float faHeight;
float moHeight;
printf("Are you a boy(M) or a girl(F)?");
scanf("%1s",&sex);
printf("Please input your father's height(cm):");
scanf("%f",&faHeight);
printf("Please input your mother's height(cm):");
scanf("%f",&moHeight);
printf("Do you like sports(Y/N)?");
scanf("%1s",&sports);
printf("Do you have a good habit of diet(Y/N)?");
scanf("%1s",&diet);
if (sex=='M')
{
myHeight=(faHeight+moHeight)*0.54;
if(sports=='Y') myHeight=myHeight*(1+0.02);
if(diet=='Y') myHeight=myHeight*(1+0.015);
}
else
{
myHeight=(faHeight*0.923+moHeight)/2;
if(sports=='Y') myHeight=myHeight*(1+0.02);
if(diet=='Y') myHeight=myHeight*(1+0.015);
}
printf("Your future height will be %f(cm)\n", myHeight);
}
实验指导书
《实验四》
【例2】#include<stdio.h>
void main()
{
int s,n,t;
s=1;
t=1;
printf("Please input n:");
scanf("%d",&n);
while(t<=n)
{
s*=t;
t+=1;
}
printf("%d\n",s);
}
【例3】#include<stdio.h>
void main()
{
int i,n,s=0,t=1;
printf("Please input n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
t*=i;
s+=t;
}
printf("%d\n",s);
}
【例4】#include<stdio.h>
void main()
{
int s=0,t,i,j,n;
printf("Please input n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
t=1;
for(j=1;j<=2*i-1;j++)
t*=j;
s+=t;
}
printf("%d\n",s);
}
【例5】#include<stdio.h>
void main()
{
int a,n,s=0,i,j;
printf("Please input a and n:");
scanf("%d%d",&a,&n);
j=a;
for(i=1;i<=n;i++)
{
s+=j;
j=10*j+a;
}
printf("%d\n",s);
}
编程作业
【1】#include<stdio.h>
void main()
{
int s,r,n,m,t;
printf("请输入两个整数:");
scanf("%d%d",&n,&m);
if(m==0||n==0)
printf("error!\n");
else
{
if(m<0)
m=(-1)*m;
if(n<0)
n=(-1)*n;
if(m<n)
if(n<m)
{
t=n;
n=m;
m=t;
}
s=m*n;
while(r!=0)
{
r=n%m;
n=m;
m=r;
}
printf("最大公约数是:%d\n",n);
printf("最小公倍数是:%d\n",s/n);
}
}
【2】#include<stdio.h>
void main()
{
int k,m,n,i,s=0;
printf("Please input k,m,n:");
scanf("%d%d%d",&k,&m,&n);
for(i=m;i<=n;i++)
i%k==0?s+=i:s;
printf("sum=%d\n",s);
}
【3】#include<stdio.h>
void main()
{
int i,n,s,sum=0;
float aver;
printf("请输入学生总数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("请输入第%d个学生的年龄:",i);
scanf("%d",&s);
sum+=s;
}
aver=sum/n;
printf("average age=%.2f\n",aver);
}
第四次上机作业 循环
4.1 求1+1/2+1/3+……+1/n
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入1 个正整数 n(n<=50),计算并输出1+1/2+1/3+……+1/n (保留3 位小数)。
例:括号内是说明
输入
2 (repeat=2)
2
10
输出
1.500
2.929
【1】#include<stdio.h>
void main()
{
int ri,repeat;
int i,n;
float sum;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
sum=0;
for(i=1;i<=n;i++)
sum=sum+1.0/i;
printf("%.3f\n",sum);
}
}
4.2 求n!
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入1 个正整数 n (n<=50),计算并输出 n! 。
例:括号内是说明
输入
3 (repeat=3)
1
10
5
输出
1
3628800
120
【2】#include<stdio.h>
void main()
{
int ri,repeat;
int i,n;
double fact;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
fact=1;
for(i=1;i<=n;i++)
fact*=i;
printf("%.0f\n",fact);
}
}
4.3 求x 的n 次幂
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入1 个正实数x 和1 个正整数 n(n<=50),计算并输出x 的n 次幂(保留2 位小数)。
例:括号内是说明
输入
2 (repeat=2)
1.5 2
2.0 10
输出
2.25
1024.00
【3】#include<stdio.h>
void main()
{
int ri,repeat;
int i,n;
double x,mypow;
scanf("%d", &repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%lf%d",&x,&n);
mypow=1;
for(i=1;i<=n;i++)
mypow=mypow*x;
printf("%.2f\n",mypow);
}
}
4.4 求1-1/2+1/3-1/4+……
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入1 个正整数 n(n<=100),计算并输出1-1/2+1/3-1/4+??的前n 项和(保留3 位小
数)。
例:括号内是说明
输入
2 (repeat=2)
10
3
输出
0.646
0.833
【4】#include <stdio.h>
void main()
{
int ri,repeat;
int i,n,flag;
float sum;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
sum=0;
flag=1;
for(i=1;i<=n;i++)
{
sum+=flag*1.0/i;
flag=-flag;
}
printf("%.3f\n",sum);
}
}
4.5 求1+1/3+1/5+1/7+……
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入1 个正整数 n(n<=100),计算并输出1+1/3+1/5+1/7+……的前n 项和(保留3 位小
数)。
例:括号内是说明
输入
2 (repeat=2)
10
3
输出
2.133
1.533
【5】#include<stdio.h>
void main()
{
int ri,repeat;
int i,n,temp;
float sum;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
sum=0;
for(i=1;i<=2*n;i+=2)
sum+=1.0/i;
printf("%.3f\n",sum);
}
}
4.6 求1-1/3+1/5-1/7+??
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入1 个正实数eps,计算并输出1-1/3+1/5-1/7+??,直到最后一项的绝对值小于
eps(保留6 位小数)。
例:括号内是说明
输入
2 (repeat=2)
1E-4
0.1
输出
0.785348
0.834921
【6】#include<stdio.h>
#include<math.h>
int main()
{
int ri,repeat;
int temp,flag;
double eps,item,sum;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%le",&eps);
flag=1;
temp=1.0;
sum=0;
item=1;
while(fabs(item)>=eps)
{
sum=sum+item;
temp=temp+2;
flag=-flag;
item=flag*1.0/temp;
}
printf("%.6f\n",sum);
}
}
4.7 摄氏温度和华氏温度转换表
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入2 个整数begin 和end,分别代表摄氏温度的起止值,输出该范围内摄氏温度C 和华
氏温度F 的转换表。
F = 32 + C * 9 / 5
输出语句:printf("%d%10d\n", c, f);
例:括号内是说明
输入
1 (repeat=1)
5 7
输出
Celsius Fahrenheit
5 41
6 42
7 44
【7】#include<stdio.h>
void main()
{
int ri,repeat;
int begin,c,end,f;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d%d",&begin,&end);
printf("Celsius Fahrenheit\n");
for(ri=begin;ri<=end;ri++)
{
c=ri;
f=32+c*9/5;
printf("%d%10d\n",c,f);
}
}
}
4.8 求奇数和
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入一批正整数(以零或负数为结束标志),求其中的奇数和。
例:括号内是说明
输入
2 (repeat=2)
1 3 90 7 0
8 7 4 3 70 5 6 101 -1
输出
11
116
【8】#include<stdio.h>
void main()
{
int ri,repeat;
int x,sum;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&x);
sum=0;
while(x>0)
{
if(x%2!=0)
sum=sum+x;
scanf("%d",&x);
}
printf("%d\n",sum);
}
}
4.9 求最大值
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n, 再输入n 个整数,输出最大值。
例:括号内是说明
输入
3 (repeat=3)
4 2 123 -100 0
4 9 1 -1 8
3 1 3 5
输出
123
9
5
【9】#include <stdio.h>
void main( )
{
int ri, repeat;
int i , max, n, x;
scanf("%d", &repeat);
for(ri=1; ri<=repeat; ri++)
{
scanf("%d", &n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(i==1) max=x;
else if(x>max) max=x;
}
printf("%d\n", max);
}
}
4.10 求整数的位数以及各位数之和
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个整数,输出它的位数以及各位数之和。
例:括号内是说明
输入
4 (repeat=4)
123456 -100 -1 99
输出
number=6, sum=21 (123456 的位数是6, 各位数之和是21)
number=3, sum=1 (-100 的位数是3, 各位数之和是1)
number=1, sum=1 (-1 的位数是1, 各位数之和是1)
number=2, sum=18 (99 的位数是2, 各位数之和是18)
【10】#include <stdio.h>
void main()
{
int ri,repeat;
int number,sum;
long in;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%ld",&in);
number=0;
sum=0;
if(in<0) in=-in;
do{
number++;
sum+=(in%10);
}while((in/=10)!=0);
printf("number=%d,sum=%d\n",number,sum);
}
}
4.11 求2/1+3/2+5/3+8/5+...
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n,输出 2/1+3/2+5/3+8/5 +...的前n 项之和,保留2 位小数。(该序列从第
2 项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子)
例:括号内是说明
输入
3 (repeat=3)
1 5 20
输出
2.00 (第1 项是2.00)
8.39 (前5 项的和是8.39)
32.66 (前20 项的和是32.66)
【11】#include <stdio.h>
void main()
{
int ri,repeat;
int i,n;
float a,b,s,t;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d", &n);
a=2;
b=1;
s=0;
for(i=0;i<n;i++)
{
s+=a/b;
t=b;
b=a;
a+=t;
}
printf("%.2f\n",s);
}
}
4.12 求a+aa+aaa+aa?a
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入2 个正整数a 和n, 求a+aa+aaa+aa?a(n 个a)之和。
例:括号内是说明
输入
2 (repeat=2)
2 3 (a=2, n=3)
8 5 (a=8, n=5)
输出
246 (2+22+222)
98760 (8+88+888+8888+88888)
【12】#include<stdio.h>
void main()
{
int ri,repeat;
int i,n;
long int a,sn,tn;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%ld%d",&a,&n);
tn=a;
sn=0;
for(i=1;i<=n;i++)
{
sn+=tn;
tn=10*tn+a;
}
printf("%ld\n",sn);
}
}
4.13 判断素数
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数m,如果它是素数,输出"YES",否则,输出"NO"(素数就是只能被1 和
自身整除的正整数,1 不是素数,2 是素数)。
例:括号内是说明
输入
4 (repeat=4)
1 2 9 17
输出
NO (1 不是素数)
YES (2 是素数)
NO (9 不是素数)
YES (17 是素数)
【13】#include<stdio.h>
#include<math.h>
void main()
{
int ri,repeat;
int flag,i,m,n;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&m);
if(m==1) flag=0;
else if(m==2) flag=1;
else
{
for(i=2;i<m;i++)
if(m%i==0)
{
flag=0;
break;
}
else flag=1;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
}
4.14 统计字符
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。
例:括号内是说明
输入
2 (repeat=2)
Reold building room 123.
Programming is fun
输出
letter=17, blank=3, digit=3, other=1
letter=16, blank=2, digit=0, other=0
【14】#include<stdio.h>
void main()
{
int ri,repeat;
int blank,digit,letter,other;
char c;
scanf("%d",&repeat);
/*getchar();此处getchar应删去,否则会影响第一个字符的录入*/【不需要删除。此处的getchar()就是为了接收输入完repeat之后的回车。而后面的c=getchar();是进入循环的初值。你的while循环条件要改为c!='\n',循环体中再加一条c=getchar();即可!】
for(ri=1;ri<=repeat;ri++)
{
c=getchar();
blank=0;
digit=0;
letter=0;
other=0;
while((c=getchar())!='\n')
{
if(c>='A'&&c<='Z'||c>='a'&&c<='z') letter++;
else if(c==' ') blank++;
else if(c>='0'&&c<='9') digit++;
else other++;
}
printf("letter=%d,blank=%d,digit=%d,other=%d\n",letter,blank,digit,other);
}
}
第五次上机作业 数组
5.1 求平均值
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n (1<n<=10),再输入n 个整数,输出平均值(保留2 位小数)。
例:括号内是说明
输入
2 (repeat=2)
3 1 2 -6
5 12 2 5 4 0
输出
aver=-1.00
aver=4.60
【5.1】#include <stdio.h>
void main()
{
int ri,repeat;
int i,n,sum;
float aver;
int a[10];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sum=0;
for(i=0;i<n;i++)
sum+=a[i];
aver=sum*1.0/n;
printf("aver=%.2f\n",aver);
}
}
5.2 求最大值及其下标
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n (1<n<=10),再输入n 个整数,输出最大值极其下标(设最大值惟一,下
标从0 开始)。
例:括号内是说明
输入
3 (repeat=3)
3 1 6 4
3 10 8 1
5 1 2 5 4 0
输出
max=6,index=1 (最大值6 的下标是1)
max=10,index=0 (最大值10 的下标是0)
max=5,index=2 (最大值5 的下标是2)
【5.2】#include <stdio.h>
void main()
{
int ri,repeat;
int i,index,n;
int a[10];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
index=0;
for(i=1;i<n;i++)
if(a[index]<a[i]) index=i;
printf("max=%d,index=%d\n",a[index],index);
}
}
5.3 逆序输出
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n (1<n<=10),再输入n 个整数,按逆序输出这些数。
例:括号内是说明
输入
2 (repeat=2)
4 10 8 1 2
5 1 2 5 4 0
输出
2 1 8 10
0 4 5 2 1
【5.3】#include <stdio.h>
void main()
{
int ri,repeat;
int i,n,temp;
int a[10];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n/2;i++)
{
temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
}
5.4 交换最小值和最大值
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n (1<n<=10),再输入n 个整数,将最小值与第一个数交换,最大值与最后
一个数交换,然后输出交换后的n 个数。
例:括号内是说明
输入
3 (repeat=3)
5 4 3 5 1 2
4 1 5 6 7
5 5 4 3 2 1
输出
1 3 2 4 5
1 5 6 7
1 4 3 2 5
【5.4】#include <stdio.h>
int main()
{
int ri,repeat;
int i,index,n,t;
int a[10];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
index=0;
for(i=1;i<n;i++)
if(a[i]<a[index]) index=i;
t=a[0];
a[0]=a[index];
a[index]=t;
index=n-1;
for(i=0;i<n-1;i++)
if(a[i]>a[index]) index=i;
t=a[n-1];
a[n-1]=a[index];
a[index]=t;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
}
5.5 排序
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n (1<n<=10),再输入n 个整数,将它们从大到小排序后输出。。
例:括号内是说明
输入
3 (repeat=3)
4 5 1 7 6
3 1 2 3
5 5 4 3 2 1
输出
7 6 5 1
3 2 1
5 4 3 2 1
【5.5】#include <stdio.h>
void main()
{
int ri,repeat;
int i,index,k,n,temp;
int a[10];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
for(k=0;k<9-i;k++)
if(a[k]<a[k+1])
{
temp=a[k];
a[k]=a[k+1];
a[k+1]=temp;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
}
5.6 矩阵运算
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入 1 个正整数 n(1≤n≤6), 再读入 n 阶方阵 a , 计算该矩阵除副对角线、最后一列和
最后一行以外的所有元素之和.(副对角线为从矩阵的右上角至左下角的连线)
例:括号内是说明
输入:
1 (repeat=1)
4 (n=4)
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
sum=35 (2+3+4+5+6+7+8=35)
【5.6】#include <stdio.h>
void main()
{
int ri,repeat;
int a[6][6],i,j,n,sum;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for (i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
sum=0;
for (i=0;i<n;i++)
for(j=0;j<n;j++)
sum+=a[i][j];
for(i=1;i<n;i++)
sum-=a[i][n-1];
for(j=1;j<n;j++)
sum-=a[n-1][j];
for(i=0;i<n;i++)
sum-=a[i][n-i-1];
sum+=a[n-1][n-1];
printf("sum=%d\n",sum);
}
}
【5.6】#include <stdio.h>
void main()
{
int ri,repeat;
int a[6][6],i,j,n,sum;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for (i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
sum=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i+j!=n-1&&j!=n-1&&i!=n-1)
sum+=a[i][j];
}
printf("sum=%d\n",sum);
}
}
5.7 加法口诀表
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入 1 个正整数 n(1≤n≤10), 输出一张 20 以内的加法口诀表. 加数与被加数都不大于
n, 分列第一行和第一列.(将加数、被加数、和放入一个二维数组中, 再输出该数组)
例:括号内是说明
输入:
1 (repeat=1)
3 (n=3)
输出:
+ 1 2 3
1 2
2 3 4
3 4 5 6
【5.7】#include <stdio.h>
void main()
{
int ri,repeat;
int i,j,n,a[10][10];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for(i=1;i<n+1;i++)
a[0][i]=i;
for(j=1;j<n+1;j++)
a[j][0]=j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=a[0][i]+a[j][0];
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
if(i==0&&j==0) printf("%-4c",'+');
else if(i==0||j<=i) printf("%-4d",a[i][j]);
printf("\n");
}
}
}
5.8 判断上三角矩阵
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入1 个正整数 n (1≤n≤6)和n 阶方阵a 中的元素,如果a 是上三角矩阵, 输出"YES", 否
则, 输出"NO"。(上三角矩阵,即主对角线以下的元素都为0, 主对角线为从矩阵的左上角至右下角的连线)
例:括号内是说明
输入:
2 (repeat=2)
3 1 2 3 0 4 5 0 0 6 (n=3)
2 1 0 -8 2 (n=2)
输出:
YES
NO
【5.8】#include <stdio.h>
#include <math.h>
int main()
{
int ri,repeat;
int a[6][6],flag,i,j,n;
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for (i=0;i<n;i++)
for (j=0;j<n;j++)
scanf("%d",&a[i][j]);
flag=1;
for (i=0;i<n;i++)
for (j=0;j<i;j++)
if(a[i][j]!=0) flag=0;
if(flag) printf("YES\n");
else printf("NO\n");
}
}
5.9 求矩阵每行元素之和
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入2 个正整数 m 和 n (1≤m, n≤6),然后输入该m 行 n 列矩阵a 中的元素,分别求
出各行元素之和, 并存入一维数组row 中, 再输出row.
例:括号内是说明
输入:
1 (repeat=1)
3 2 (m=3, n=2)
6 3
1 -8
3 12
输出:
sum of row 0 is 9
sum of row 1 is -7
sum of row 2 is 15
【5.9】#include <stdio.h>
#include <math.h>
void main()
{
int ri,repeat;
int flag,i,j,m,n,sum;
int a[6][6], row[6];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
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++)
{
row[i]=0;
for(j=0;j<n;j++)
row[i]+=a[i][j];
}
for(i=0;i<m;i++)
printf("sum of row %d is %d\n",i,row[i]);
}
}
5.10 找鞍点
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入 1 个正整数 n(1≤n≤6)和n 阶方阵a 中的元素,如果找到a 的鞍点(鞍点的元素值
在该行上最大, 在该列上最小), 就输出它的下标, 否则,输出"NO"(设a 最多有1 个鞍点)。
例:括号内是说明
输入:
2 (repeat=2)
4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 (n=4)
2 1 7 4 1 (n=2)
输出:
a[2][1]=6
NO
【5.10】#include <stdio.h>
void main()
{
int ri,repeat;
int flag,i,j,k,row,col,n,a[6][6];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
{
flag=1;
col=0;
for(j=0;j<n;j++)
if(a[i][col]<a[i][j]) col=j;
for(k=0;k<n;k++)
if(a[i][col]>a[k][col])
{
flag=0;
break;
}
if(flag)
{
row=i;
break;
}
}
if(flag)
printf("a[%d][%d]=%d\n",row,col,a[row][col]);
else
printf("NO\n");
}
}
第六次上机作业 函数
6.1 求1 + 1/2! +....+ 1/n!
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入1 个正整数n,计算 s 的前n 项的和(保留 4 位小数)。
s = 1 + 1/2! +....+ 1/n!
要求定义并调用函数fact(n)计算n 的阶乘。
例:括号内是说明
输入:
2 (repeat=2)
2 (n=2)
10 (n=10)
输出:
1.5000
1.7183
【6.1】#include "stdio.h"
void main()
{
int ri,repeat;
int i,n;
double s;
double fact(int n);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
s=0;
for(i=1;i<=n;i++)
s+=fact(i);
printf("%0.4f\n",s);
}
}
double fact(int n)
{
int j,t=1;
double x;
for(j=1;j<=n;j++)
{
t*=j;
x=1.0/t;
}
return (x);
}
6.2 求a+aa+aaa+aa?a
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入2 个正整数a 和n, 求a+aa+aaa+aa?a(n 个a)之和。
要求定义并调用函数fn(a,n),它的功能是返回aa?a(n 个a)。例如,fn(3,2)的返回值是33。
例:括号内是说明
输入
2 (repeat=2)
2 3 (a=2, n=3)
8 5 (a=8, n=5)
输出
246 (2+22+222)
98760 (8+88+888+8888+88888)
【6.2】(定义函数不符合题意要求返回值,有待修改)
#include <stdio.h>
void main()
{
int ri,repeat;
int i,n;
long a,sn;
long fn(long a,int n);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%ld%d",&a,&n);
sn=fn(a,n);
printf("%ld\n",sn);
}
}
long fn(long a,int n)
{
int j,tn;
long sum;
tn=a;
sum=0;
for(j=1;j<=n;j++)
{
sum+=tn;
tn=10*tn+a;
}
return (sum);
}
【修正后的程序】
#include <stdio.h>
void main()
{
int ri,repeat;
int i,n;
long a,sn;
long fn(long a,int n);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%ld%d",&a,&n);
sn=0;
for(i=1;i<=n;i++)
sn+=fn(a,i);
printf("%ld\n",sn);
}
}
long fn(long a,int i)
{
int j,tn=a,sum=0;
for(j=0;j<i;j++)
sum=10*sum+tn;
return (sum);
}
6.3 统计一个整数中数字的个数
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
读入1 个整数,统计并输出该数中2 的个数。
要求定义并调用函数countdigit(number,digit),它的功能是统计整数number 中数字digit
的个数。例如,countdigit(10090,0)的返回值是3。
例:括号内是说明
输入:
3 (repeat=3)
-21902
2
345543
输出:
count=2 (-21902 中有2 个2)
count=1 (有1 个2)
count=0 (345543 中没有2)
【6.3】#include "stdio.h"
void main()
{
int ri,repeat;
int count;
long in;
int countdigit(long number,int digit);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%ld",&in);
count=countdigit(in,2);
printf("count=%d\n",count);
}
}
int countdigit(long number, int digit)
{
int i,sum;
if(number<0)
number=-number;
sum=0;
while(number!=0)
{
i=number%10;
if(i==2) sum++;
number=number/10;
}
return (sum);
}
6.4 判断素数
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n,如果它是素数,输出"YES",否则,输出"NO"(素数就是只能被1 和自
身整除的正整数,1 不是素数,2 是素数)。
要求定义并调用函数prime(m)判断m 是否为素数。
例:括号内是说明
输入
4 (repeat=4)
1 2 9 17
输出
NO (1 不是素数)
YES (2 是素数)
NO (9 不是素数)
YES (17 是素数)
【6.4】#include <stdio.h>
#include <math.h>
void main()
{
int ri,repeat;
int flag,n;
int prime(int m);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
flag=prime(n);
if(flag) printf("YES\n");
else printf("NO\n");
}
}
int prime(int m)
{
int flag,i;
if(m==1) flag=0;
else if(m==2) flag=1;
else
{
for(i=2;i<m;i++)
if(m%i==0)
{
flag=0;
break;
}
else flag=1;
}
return (flag);
}
6.5 统计素数并求和
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入2 个正整数m 和n(1<=m,n<=500),统计并输出m 和n 之间的素数的个数以及这些素
数的和(素数就是只能被1 和自身整除的正整数,1 不是素数,2 是素数)。
要求定义并调用函数prime(m)判断m 是否为素数。
例:括号内是说明
输入:
3 (repeat=3)
1 10 (m=1, n=10)
20 35 (m=20, n=35)
14 16 (m=14, n=16)
输出:
count=4, sum=17 (1 到10 之间有4 个素数:2,3,5,7)
count=3, sum=83 (20 到35 之间有3 个素数:23, 29, 31)
count=0, sum=0 (14 到16 之间没有素数)
【6.5】#include "stdio.h"
#include "math.h"
void main()
{
int ri,repeat;
int count,i,m,n,sum;
int prime(int m);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d%d",&m,&n);
count=0;
sum=0;
for(i=m;i<=n;i++)
if(prime(i))
{
count++;;
sum+=i;
}
printf("count=%d,sum=%d\n",count,sum);
}
}
int prime(int i)
{
int flag,j;
if(i==1) flag=0;
else if(i==2) flag=1;
else
{
for(j=2;j<i;j++)
if(i%j==0)
{
flag=0;
break;
}
else flag=1;
}
return(flag);
}
6.6 输出 Fibonacci 序列
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入2 个正整数m 和n(1<=m,n<=10000),输出m 和n 之间所有的Fibonacci 数。
Fibonacci 序列(第1 项起):1 1 2 3 5 8 13 21 ......
要求定义并调用函数fib(n),它的功能是返回第n 项Fibonacci 数。例如,fib(7)的返回值是
13。
输出语句:printf("%d ", f);
例:括号内是说明
输入:
3 (repeat=3)
1 10 (m=1, n=10)
20 100 (m=20, n=100)
1000 6000 (m=1000, n=6000)
输出:
1 1 2 3 5 8 (1 到10 之间的Fibonacci 数)
21 34 55 89 (20 到100 之间的Fibonacci 数)
1597 2584 4181 (1000 到6000 之间的Fibonacci 数)
【6.6】#include "stdio.h"
#include "math.h"
void main()
{
int ri,repeat;
int i,m,n;
long f;
long fib(int n);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d%d",&m,&n);
i=1;
while(fib(i)<=n)
{
f=fib(i);
if(f>=m) printf("%ld ",f);
i++;
}
printf("\n");
}
}
long fib(int n)
{
int i,x1,x2,x;
if(n==1||n==2) x=1;
else
{
x1=x2=1;
for(i=1;i<=n-2;i++)
{
x=x1+x2;
x1=x2;
x2=x;
}
}
return x;
}
6.7 求完数
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入2 个正整数m 和n(1<=m,n<=1000),输出m 到n 之间的所有完数(完数就是因子和
与它本身相等的数)。
要求定义并调用函数factorsum(number),它的功能是返回number 的因子和。例如,
digitsum(12)的返回值是16(1+2+3+4+6)。
输出语句:printf("%d ", i);
例:括号内是说明
输入:
2 (repeat=2)
20 500 (m=100, n=400)
1 100 (m=1, n=100)
输出:
28 496
1 6 28
【6.7】#include "stdio.h"
void main()
{
int ri,repeat;
int i,m,n;
int factorsum(int number);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d%d",&m,&n);
for(i=m;i<=n;i++)
if(factorsum(i)==i||i==1) printf("%d ",i);
printf("\n");
}
}
int factorsum(int number)
{
int j,sum=0;
for(j=1;j<number;j++)
if(number%j==0) sum+=j;
return (sum);
}
6.8 求各位数字的立方和等于它本身的数
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入2 个正整数m 和n(1<=m,n<=1000),输出m 到n 之间的所有满足各位数字的立方和
等于它本身的数。
要求定义并调用函数is(number)判断number 的各位数字之立方和是否等于它本身。
输出语句:printf("%d ", i);
例:括号内是说明
输入:
2 (repeat=2)
100 400 (m=100, n=400)
1 100 (m=1, n=100)
输出:
153 370 371 (1*1*1+5*5*5+3*3*3=153; 3*3*3+7*7*7=370; 3*3*3+7*7*7+1*1*1=371)
1
【6.8】#include "stdio.h"
void main()
{
int ri,repeat;
int i,m,n;
int is(int number);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d%d",&m,&n);
for(i=m;i<=n;i++)
{
if(is(i));
else printf("%d ",i);
}
printf("\n");
}
}
int is(int number)
{
int temp,digit,sum,flag;
temp=number;
sum=0;
while(number!=0)
{
digit=number%10;
sum=sum+digit*digit*digit;
number=number/10;
}
if(sum==temp)
flag=0;
else
flag=1;
return (flag);
}
6.9 将一个整数逆序输出
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个整数,将它逆序输出。
要求定义并调用函数reverse(number),它的功能是返回number 的逆序数。例如
reverse(12345)的返回值是54321。
例:括号内是说明
输入
4 (repeat=4)
123456 -100 -2 99
输出
654321
-1
-2
99
【6.9】#include <stdio.h>
void main()
{
int ri,repeat;
long in,res;
long reverse(long number);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%ld",&in);
res=reverse(in);
printf("%ld\n",res);
}
}
long reverse(long number)
{
long x=0;
while(number!=0)
{
x=10*x+number%10;
number/=10;
}
return (x);
}
6.10 十进制转换二进制
程序填空,不要改变与输入输出有关的语句。
输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入1 个正整数n,将其转换为二进制后输出。
要求定义并调用函数 dectobin(n),它的功能是输出 n 的二进制。例如,调用dectobin(10),
输出1010。
输出语句:printf("%d");
例:括号内是说明
输入:
3 (repeat=3)
15
100
0
输出:
1111
1100100
0
【6.10】#include "stdio.h"
void main()
{
int ri,repeat;
int i,n;
void dectobin(int n);
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++)
{
scanf("%d",&n);
dectobin(n);
printf("\n");
}
}
void dectobin( int n )
{
if(n>1)
dectobin(n/2);
printf("%d",n%2);
}
比较两数组对应数字大小的函数
#include <stdio.h>
int large(int,int);
void input_array(int a[]);
int compare(int a[],int b[]);
void output(int flag);
void main()
{
int a[10],b[10];
int flag;
printf("enter array a:\n");
input_array(a);
printf("enter array b:\n");
input_array(b);
flag=compare(a,b);
output(flag);
}
int large(int x,int y)
{
int flag;
if(x>y)
flag=1;
else if(x<y)
flag=-1;
else
flag=0;
return flag;
}
void input_array (int a[10])
{
int i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
}
int compare(int a[10],int b[10])
{
int i,n=0,m=0,k=0;
for(i=0;i<10;i++)
{
if(1==large(a[i],b[i]))
n++;
else
if(0==large(a[i],b[i]))
m++;
else
k++;
}
printf("array a > array b %d times\narray a = array b %d times\narray < array b %d times\n",n,m,k);
if(n>k)
return 1;
else
if(n<k) return -1;
else
return 0;
}
void output(int flag)
{
if(1==flag)
printf("array a is larger than array b\n");
else
if(-1==flag) printf("array a is smaller than array b\n");
else
printf("array a is equal to array b\n");
}
【适当改进后的程序】
#include <stdio.h>
int large(int,int);
void input_array(int a[]);
int compare(int a[],int b[]);
void output(int flag);
void paixu(int a[]);
void main()
{
int a[10],b[10];
int flag,i;
printf("enter array a:\n");
input_array(a);
printf("enter array b:\n");
input_array(b);
flag=compare(a,b);
output(flag);
paixu(a);
printf("数组 a 进行从小到大排序后为:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
paixu(b);
printf("数组 b 进行从小到大排序后为:\n");
for(i=0;i<10;i++)
printf("%d ",b[i]);
printf("\n");
flag=compare(a,b);
output(flag);
}
int large(int x,int y)
{
int flag;
if(x>y)
flag=1;
else if(x<y)
flag=-1;
else
flag=0;
return flag;
}
void input_array (int a[10])
{
int i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
}
int compare(int a[10],int b[10])
{
int i,n=0,m=0,k=0;
for(i=0;i<10;i++)
{
if(1==large(a[i],b[i]))
n++;
else
if(0==large(a[i],b[i]))
m++;
else
k++;
}
printf("array a > array b %d times\narray a = array b %d times\narray < array b %d times\n",n,m,k);
if(n>k)
return 1;
else
if(n<k) return -1;
else
return 0;
}
void output(int flag)
{
if(1==flag)
printf("array a is larger than array b\n");
else
if(-1==flag) printf("array a is smaller than array b\n");
else
printf("array a is equal to array b\n");
puts("\n");
}
void paixu(int a[10])
{
int i,j,t;
for (j=0;j<9;j++)
for(i=0;i<10-j-1;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}