第一章 认识变量和常量
1.1 hello world!
题目内容:使用printf()屏幕上输出hello world!
#include <stdio.h>
int main()
{
printf(“hello world!\n”);
return 0;
}
1.2 在屏幕上输出多行信息
题目内容:使用printf()函数在屏幕上输出多行信息:
hello world!
hello hit!
Hello everyone!
#include <stdio.h>
int main()
{
printf(“hello world!\n”);
printf(“hello hit!\n”);
printf(“hello everyone!\n”);
return 0;
}
1.3 计算半圆弧长以及半圆的面积
题目内容:编程并输出半径r=5.3的半圆弧长(提示:半圆弧长不应该加直径的长度。)及该半圆弧与直径围成的半圆的面积,π的取值3.14159。要求半径r和π必须利用宏常量表示。
#include<stdio.h>
#define PI 3.14159
int main()
{
double r = 5.3,Area,circumference;
printf(“Area = %.5f\n”,PI*r*r/2);
printf(“circumference = %.5f\n”,PI*(r+r)/2);
}
1.4 计算长方形体积
题目内容:编程并输出长1.2、宽4.3、高6.4的长方形的体积。要求长方形的长、宽、高必须利用const常量表示。程序中用到的数类型均为double类型。
#include<stdio.h>
int main()
{
double const l = 1.2,w = 4.3,h = 6.4;
double v ;
v = l*w*h;
printf(“volume = %.3f\n”,v);
}
第二章 计算
2.1 输出逆序数
题目内容:从键盘任意输入一个3位整数,编程计算并输出它的逆序数(忽略整数前的正负号)。例如,输入-123,则忽略负号,由123分离出其百位1、十位2、个位3,然后计算3100+210+1 = 321,并输出321。
第一种写法
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c,e,sum;
printf("Input e:");
scanf("%d",&e);
a=fabs(e/100);
b=fabs((e/10)%10);
c=fabs(e%10);
sum=c*100+b*10+a;
printf("a=%d,b=%d,c=%d,sum=%d\n",a,b,c,sum);
return 0;
}
第二种写法
#include <stdio.h>
int main()
{
printf("Input x:\n");
int x,a,b,c;
scanf("%d",&x);
while (x < 0)
{
x = x * -1 ;
}
a = x % 10 ;
b=x%100/10;
c=x/100;
printf("y=%d\n",a*100+b*10+c);
return 0;
}
2.2 计算总分和平均数
题目内容:小明本学期共有5门课程,分别是英语、语文、数学、历史和音乐。5科的期中考试成绩分别是86分、74分、92分、77分、82分,期末考试成绩分别是81分、87分、90分、62分、88分。已知期中和期末考试成绩分别占总成绩的30%和70%。定义相应的变量存放各科成绩,并计算出小明5门课程的总分和平均分。要求平均分输出两种形式:带2位小数的浮点数形式和不带小数的整数形式。要求总分输出带2位小数的浮点数形式。程序中浮点数的数据类型均为float类型。
#include<stdio.h>
int main()
{
int a[5]={86,74,92,77,82};
int b[5]={81,87,90,62,88};
float result=0,result1=0,result2=0;
for(int i=0;i<5;i++)
{
result1+=a[i];
result2+=b[i];
}
result=result1*0.3+result2*0.7;
printf("total=%.2f\n",result);
printf("average=%.2f\n",result/5.0);
printf("average=%d\n",(int)result/5);
return 0;
}
2.3 存款利率计算器V1.0
题目内容:设银行定期存款的年利率rate为2.25%,已知存款期为n年,存款本金为capital元,试编程计算并输出n年后的本利之和deposit。程序中所有浮点数的数据类型均为double类型。
#include<stdio.h>
#include <math.h>
int main()
{
double capital,deposit,rate;
int year;
printf( "Please enter rate, year, capital:\n");
scanf("%lf,%d,%lf", &rate, &year, &capital);
deposit=capital*pow(1+rate,year);
printf("deposit=%.3f\n",deposit);
return 0;
}
2.4 数位拆分v1.0
题目内容:现有一个4位数的正整数n=4321(即n是一个已知的数,固定为4321),编写程序将其拆分为两个2位数的正整数43和21,计算并输出拆分后的两个数的加、减、乘、除和求余的结果。例如n=4321,设拆分后的两个整数为a,b,则a=43,b=21。除法运算结果要求精确到小数点后2位,数据类型为float。
#include<stdio.h>
#include <math.h>
int main()
{
int x=4321,a,b;
a=x/100;
b=x%100;
printf("a=%d,b=%d\n",a,b);
printf("a+b=%d\n",a+b);
printf("a-b=%d\n",a-b);
printf("a*b=%d\n",a*b);
printf("a/b=%.2f\n",(float)a/b);
printf("a%%b=%d\n",a%b);
return 0;
}
2.5 求正/负余数
题目内容:在C语言中,如果被除数为负值,则对一个正数求余的时候,求出的余数也是一个负数。在某些场合下,我们需要求出它的正余数,例如:在C语言中有(-11)%5=-1,但是有时我们希望得到的余数不是-1,而是4。请编写程序计算(-11)%5的负余数和正余数。
#include<stdio.h>
int main()
{
printf("negative: %d\n",-11%5);
printf("positive: %d\n",-11%5+5);
return 0;
}
2.6 身高预测
题目内容:已知小明(男孩)爸爸的身高是175厘米,妈妈的身高是162厘米。小红(女孩)爸爸的身高是169厘米,妈妈的身高是153厘米,按照下面公式,预测并输出小明和小红的遗传身高(不考虑后天因素)。
#include<stdio.h>
int main()
{
int mf=175,mm=162,hf=169,hm=153;
printf("Height of xiao ming:%d\n",(int)((mf + mm)*0.54));
printf("Height of xiao hong:%d\n",(int)((hf*0.923 + hm)/2));
return 0;
}
2.7 求一元二次方程的根
#include<stdio.h>
#include<math.h>
int main()
{
int a=2,b=3,c=1;
double x1,x2;
x1=-b/2.0/a;
x2=sqrt(b*b-4*a*c)/2.0/a;
printf("x1=%.4f\n",x1+x2);
printf("x2=%.4f\n",x1-x2);
return 0;
}
第三章 输入输出
3.1 日期显示
题目内容:编写一个程序, 接收用户录入的日期信息并且将其显示出来. 其中, 输入日期的形式为月/日/年(mm/dd/yy), 输出日期的形式为年月日(yy.mm.dd)。以下为程序的运行结果示例:Enter a date (mm/dd/yy):12/03/2015↙You entered the date: 2015.12.03
#include<stdio.h>
int main()
{
int mm,dd,yy;
printf("Enter a date (mm/dd/yy):\n");
scanf("%d/%d/%d",&mm,&dd,&yy);
printf("You entered the date: %04d.%02d.%02d\n",yy,mm,dd);
return 0;
}
3.2 产品信息格式化
题目内容:编写一个程序, 对用户录入的产品信息进行格式化。以下为程序的运行结果示例:
Enter item number:385↙
Enter unit price:12.5↙
Enter purchase date (mm/dd/yy):12/03/2015↙
Item Unit Purchase
385 $ 12.50 12032015
#include<stdio.h>
int main()
{
int number,mm,dd,yy;
float price;
printf("Enter item number:\n");
scanf("%d",&number);
printf("Enter unit price:\n");
scanf("%f",&price);
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",number,price,mm,dd,yy);
return 0;
}
3.3 计算两个数的平方和
题目内容:从键盘读入两个实数,编程计算并输出它们的平方和,要求使用数学函数pow(x,y)计算平方值,输出结果保留2位小数。 程序中所有浮点数的数据类型均为float。
#include<stdio.h>
#include<math.h>
int main()
{
float x,y;
printf("Please input x and y:\n");
scanf("%f,%f",&x,&y);
printf("Result=%.2f\n",pow(x,2.0)+pow(y,2.0));
return 0;
}
3.4 逆序数的拆分计算
题目内容:从键盘输入一个4位数的整数,编程计算并输出它的逆序数(忽略整数前的正负号)。例如,输入-1234,忽略负号,由1234分离出其千位1、百位2、十位3、个位4,然后计算41000+3100+2*10+1 = 4321,并输出4321。再将得到的逆序数4321拆分为两个2位数的正整数43和21,计算并输出拆分后的两个数的平方和的结果。
#include<stdio.h>
#include<math.h>
int main()
{
int x,y,x1,x2,x3,x4,a,b;
printf("Input x:\n");
scanf("%d",&x);
y=abs(x);
x1=y/1000;
x2=y/100%10;
x3=y/10%10;
x4=y%10;
y=x1+10*x2+100*x3+1000*x4;
a=x4*10+x3;
b=x2*10+x1;
printf("y=%d\n",y);
printf("a=%d,b=%d\n",a,b);
printf("result=%d\n",(int)pow(a,2)+(int)pow(b,2));
return 0;
}
3.5 拆分英文名
题目内容:从键盘输入某同学的英文名(小写输入,假设学生的英文名只包含3个字母。如: tom),编写程序在屏幕上输出该同学的英文名,且首字母大写(如: Tom)。同时输出组成该英文名的所有英文字符在26个英文字母中的序号。
#include<stdio.h>
int main()
{
char a,b,c;
printf("Input your English name:\n");
scanf("%c%c%c",&a,&b,&c);
printf("%c%c%c\n",a-32,b,c);
printf("%c:%d\n",a,a-'a'+1);
printf("%c:%d\n",b,b-'a'+1);
printf("%c:%d\n",c,c-'a'+1);
return 0;
}
3.6 计算体指数
题目内容:从键盘输入某人的身高(以厘米为单位,如174cm)和体重(以公斤为单位,如70公斤),将身高(以米为单位,如1.74m)和体重(以斤为单位,如140斤)输出在屏幕上,并按照以下公式计算并输出体指数,要求结果保留到小数点后2位。程序中所有浮点数的数据类型均为float。假设体重为w公斤,身高为h米,则体指数的计算公式为:t=w/h^2
#include<stdio.h>
int main()
{
int weight,height;
float h,t;
printf("Input weight, height:\n");
scanf("%d,%d",&weight,&height);
printf("weight = %d\n",weight*2);
h=height/100.0;
printf("height = %.2f\n",h);
printf("t=%.2f\n",weight/h/h);
return 0;
}
3.7 学分绩计算
题目内容:已知某大学期末考试学分绩的计算公式为:学分绩 =(工科数学 * 5 + 英语 * 1.5 + 线性代数 * 3.5) / 10请编程从键盘按顺序输入某学生的工科数学、英语和线性代数成绩,计算并输出其学分绩。
#include<stdio.h>
int main()
{
int a,b,c;
printf("Input math1, English and math2:");
scanf( "%d,%d,%d",&a,&b,&c);
printf("Final score = %.2f\n",(a*5+b*1.5+c*3.5)/10);
return 0;
}
3.8 一尺之锤,日取其半
题目内容:我国古代著作《庄子》中记载道:“一尺之捶,日取其半,万世不竭”。其含义是:对于一尺的东西,今天取其一半,明天取其一半的一半,后天再取其一半的一半的一半总有一半留下,所以永远也取不尽。请编写一个程序,使其可以计算出一条长为m的绳子,在n天之后剩下的长度。
#include<stdio.h>
int main()
{
int b;
float a;
printf("Input length and days:");
scanf("%f,%d",&a,&b);
for(b>0;b--;)
{
a/=2;
}
printf("length=%.5f\n",a);
return 0;
}
3.9 网购打折商品V1.0
题目内容:某网上购物网站对用户实行优惠,买家购物货款p越多,则折扣越多。今天正值该网站优惠折扣日,买家可以获得8%的折扣。请编程从键盘输入买家购物货款p,计算并输出买家折扣后实际应付出的价钱。注:程序中的数据类型为float。
#include<stdio.h>
int main()
{
float price;
printf("Input payment p:");
scanf("%f",&price);
printf("price = %.1f\n",price*(1-0.08));
return 0;
}
3.10 计算时间差V1.0
题目内容:编程从键盘任意输入两个时间(例如4时55分和1时25分),计算并输出这两个时间之间的间隔。要求不输出时间差的负号。
#include<stdio.h>
#include<math.h>
int main()
{
typedef struct clock
{
int hour;
int minute;
int second;
} CLOCK;
struct clock stu1;
struct clock stu2;
struct clock stu3;
printf("Input time one(hour, minute):");
scanf("%d,%d", &stu1.hour,&stu1.minute);
printf( "Input time two(hour, minute):");
scanf("%d,%d", &stu2.hour, &stu2.minute);
stu3.hour = fabs((stu1.hour * 60 + stu1.minute) - (stu2.hour * 60 + stu2.minute)) / 60;
stu3.minute = fabs(((stu1.hour * 60 + stu1.minute) - (stu2.hour * 60 + stu2.minute)) % 60);
printf("%d hour %d minute\n", stu3.hour, stu3.minute);
}
第四章 选择
4.1 检测用户错误输入
题目内容:根据scanf()的返回值判断scanf()是否成功读入了指定的数据项数,使程序在用户输入123a时,能输出如下运行果:123a↙Input error!
#include<stdio.h>
#include<stdlib.h>
int main()
{
int c;
int a,b;
c = scanf("%d %d",&a,&b);
if(c==2)
printf("a = %d,b = %d\n",a,b);
else
printf("input error!");
return 0;
}
4.2 闰年判断
题目内容:从键盘任意输入一个公元年份(大于等于1),判断它是否是闰年。若是闰年输出“Yes”,否则输出“No”。要求对输入数据进行合法性判断。已知符合下列条件之一者是闰年:(1)能被4整除,但不能被100整除;(2)能被400整除。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
scanf("%d",&a);
if(a>=1)
{
if(a%4==0&&a%100!=0||a%400==0)
printf("Yes\n");
else
printf("No\n");
}
else
printf("Input error!\n");
return 0;
}
4.3 程序改错
题目内容:下面代码的功能是将百分制成绩转换为5分制成绩,具体功能是:如果用户输入的是非法字符或者不在合理区间内的数据(例如输入的是a,或者102,或-45等),则程序输出 Input error!,否则将其转换为5分制输出。目前程序存在错误,请将其修改正确。并按照下面给出的运行示例检查程序。
//错误代码
#include<stdio.h>
int main()
{
int score;
char grade;
printf("Please input score:");
scanf("%d", &score);
if (score < 0 || score > 100)
printf("Input error!\n");
else if (score >= 90)
grade = 'A’;
else if (score >= 80)
grade = 'B';
else if (score >= 70)
grade = 'C';
else if (score >= 60)
grade = 'D';
else
grade = 'E';
printf("grade:%c\n", grade);
return 0;
}
//更改后代码
#include<stdio.h>
int main()
{
int score,x;
char grade;
printf("Please input score:\n");
x=scanf("%d", &score);
if (score < 0 || score > 100 || x!=1)
{
printf("Input error!\n");
return 0;
}
else if (score >= 90)
grade = 'A';
else if (score >= 80)
grade = 'B';
else if (score >= 70)
grade = 'C';
else if (score >= 60)
grade = 'D';
else
grade = 'E';
printf("grade: %c\n", grade);
return 0;
}
4.4 字符类型判断
题目内容:从键盘键入任意一个字符,判断该字符是英文字母(不区分大、小写)、数字字符还是其它字符。若键入字母,则屏幕显示 It is an English character.;若键入数字则屏幕显示It is a digit character.
#include<stdio.h>
int main()
{
char ch;
printf("Input simple:\n");
scanf("%c",&ch);
if(ch<='z'&&ch>='a'||ch<='Z'&&ch>='A')
printf("It is an English character.\n");
else if(ch<='9'&&ch>='0')
printf("It is a digit character.\n");
else
printf("It is other character.\n");
return 0;
}
4.5 快递费用计算
快递费按邮件重量计算,由起重费用、续重费用两部分构成:(
1) 起重(首重)1公斤按起重资费计算(不足1公斤,按1公斤计算),超过首重的重量,按公斤(不足1公斤,按1公斤计算)收取续重费;
(2)同城起重资费10元,续重3元/公斤;
(3)寄往1区(江浙两省)的邮件,起重资费10元,续重4元;
(4)寄往其他地区的邮件,起重资费统一为15元。而续重部分,不同区域价格不同:2区的续重5元/公斤,3区的续重6.5元/公斤,4区的续重10元/公斤。
编写程序,从键盘输入邮件的目的区域编码和重量,计算并输出运费,计算结果保留2位小数。程序中所有浮点数的数据类型均为float。提示:续重部分不足一公斤,按1公斤计算。因此,如包裹重量2.3公斤:1公斤算起重,剩余的1.3公斤算续重,不足1公斤按1公斤计算,1.3公斤折合续重为2公斤。如果重量应大于0、区域编号不能超出0-4的范围。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int mark;
float weight,price;
scanf("%d,%f",&mark,&weight);
if(mark<0||weight<=0||mark>4)
printf("Error in Area\n");
else
{
if(weight<=1)
weight=1;
else
weight=(int)weight+1;
}
switch(mark)
{
case 0 : price=10+(int)(weight-1)*3;
break;
case 1 : price=10+(int)(weight-1)*4;
break;
case 2 : price=15+(int)(weight-1)*5;
break;
case 3 : price=15+(int)(weight-1)*6.5;
break;
case 4 : price=15+(int)(weight-1)*10;
break;
}
printf("Price: %5.2f\n",price);
return 0;
}
4.6 数位拆分v2.0
题目内容:从键盘上输入一个4位数的整数n,编写程序将其拆分为两个2位数的整数a和b,计算并输出拆分后的两个数的加、减、乘、除和求余运算的结果。例如n=-4321,设拆分后的两个整数为a,b,则a=-43,b=-21。除法运算结果要求精确到小数点后2位,数据类型为float。求余和除法运算需要考虑除数为0的情况,即如果拆分后b=0,则输出提示信息"The second operater is zero!"
#include<stdio.h>
int main()
{
int n,a,b;
printf("Please input n:\n");
scanf("%d",&n);
a=n/100;
b=n%100;
printf("%d,%d\n",a,b);
printf("sum=%d,sub=%d,multi=%d\n",a+b,a-b,a*b);
if(b==0) printf("The second operator is zero!\n");
else printf("dev=%.2f,mod=%d\n",a/1.0/b,a%b);
return 0;
}
4.7 出租车计价
题目内容:已知某城市普通出租车收费标准为:起步里程为3公里,起步费为8元,10公里以内超过起步里程的部分,每公里加收2元,超过10公里以上的部分加收50%的回空补贴费,即每公里3元。出租车营运过程中,因堵车和乘客要求临时停车等客的,按每5分钟加收2元计算,不足5分钟的不计费。从键盘任意输入行驶里程(精确到0.1公里)和等待时间(精确到分钟),请编程计算并输出乘客应支付的车费,对结果进行四舍五入,精确到元。
#include<stdio.h>
int main()
{
float dis,fee=0;
int tim;
printf("Input distance and time:");
scanf("%f,%d",&dis,&tim);
tim=tim/5;
fee+=2*tim;
if(dis>10){
fee+=3*(dis-10);
}
if(dis>3){
dis=dis>=10?10:dis;
fee+=2*(dis-3);
}
if(dis>0){
fee+=8;
}
printf("fee = %.0f\n",fee);
return 0;
}
4.8 数据区间判断
题目内容:从键盘输入一个int型的正整数n(已知:0<n<10000),编写程序判断n落在哪个区间。如果用户输入的数据不在指定的范围里,程序输出 “error!”。例如,输入265,则该数属于区间 100-999。
#include<stdio.h>
int main()
{
int x;
printf("Please enter the number:\n");
scanf("%d",&x);
if(x<=0||x>=10000) printf("error!\n");
else if(x>=0&&x<10) printf("%d: 0-9\n",x);
else if(x>=10&&x<100) printf("%d: 10-99\n",x);
else if(x>=100&&x<1000) printf("%d: 100-999\n",x);
else if(x>=1000&&x<10000) printf("%d: 1000-9999\n",x);
return 0;
}
4.9 计算一元二次方程的根v2.0
题目内容:根据下面给出的求根公式,计算并输出一元二次方程的两个实根,要求精确到小数点后4位。其中a,b,c的值由用户从键盘输入。如果用户输入的系数不满足求实根的要求,输出错误提示 “error!”。程序中所有的数据类型均为float。
#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,x,y;
printf("Please enter the coefficients a,b,c:\n");
scanf("%f,%f,%f",&a,&b,&c);
x=-b/2/a;
y=b*b-4*a*c;
if(y<0)
printf("error!\n");
else
printf("x1=%7.4f, x2=%7.4f\n",x+sqrt(y)/2/a,x-sqrt(y)/2/a);
return 0;
}
4.10 分数比较
题目内容:利用人工方式比较分数大小的最常见的方法是:对分数进行通分后比较分子的大小。请编程模拟手工比较两个分数的大小。首先输入两个分数分子分母的值,例如"11/13,17/19",比较分数大小后输出相应的提示信息。例如,第一个分数11/13小于第二个分数17/19,则输出"11/13<17/19"。
#include<stdio.h>
int main()
{
int a,b,c,d;
int fenshu,fenshu2;
printf("Input a/b, c/d:");
scanf("%d/%d,%d/%d",&a,&b,&c,&d);
fenshu=a*d;
fenshu2=c*b;
if(fenshu>fenshu2)
printf("%d/%d>%d/%d\n",a,b,c,d);
else if(fenshu2>fenshu)
printf("%d/%d<%d/%d\n",a,b,c,d);
else
printf("%d/%d=%d/%d\n",a,b,c,d);
return 0;
}
4.11 存款利率计算器v2.0
题目内容:设capital是最初的存款总额(即本金),rate是整存整取的存款年利率,n 是储蓄的年份,deposit是第n年年底账号里的存款总额。已知如下两种本利之和的计算方式:
按复利方式计息的本利之和计算公式为:
deposit = capital * (1 + rate)^n
按普通计息方式计算本利之和的公式为:deposit = capital * (1 + rate * n)
编程从键盘输入存钱的本金、存款期限以及年利率,然后再输入按何种方式计息,最后再计算并输出到期时能从银行得到的本利之和,要求结果保留到小数点后4位。
#include<stdio.h>
#include<math.h>
int main()
{
double capital , deposit , rate ;
int n;
char a;
printf("Input rate, year, capital:");
scanf("%lf,%d,%lf",&rate,&n,&capital);
printf("Compound interest (Y/N)?");
scanf("%c",&a);
if (a=='y'||a=='Y')
{
deposit=capital*pow(1+rate,n);
printf("deposit = %.4f\n",deposit);
}
else if(a=='n'||a=='N')
{
deposit=capital*(1+rate*n);
printf("deposit = %.4f\n",deposit);
}
else
printf("error");
return 0;
}
4.12 博弈论之Best Response
在博弈论中,有一种决策称为Best Response,通俗的意思就是选择一种策略使得团体利益最大化。C语言学习成绩的评定方式分为两种,一种是自由刷题模式(compete),没有固定标准,刷题越多者排名越靠前,其期末分数越高;另一种是规定每个人必须做够多少道题(standard),达到要求就能取得相应分数。
假设一个班级中的学生分为A、B两类,A类同学学习热情很高,乐于做题,采用compete模式可以获得成就感并且在期末拿到高分,compete模式可以让他们有10分的收益;采用standard模式他们也可以在期末拿到高分,但不能满足他们的求知欲,standard模式可以让他们有8分的收益。B类同学仅仅希望期末拿高分,如果采用compete模式,他们竞争不过A类同学,期末成绩不理想,因此compete模式能给他们6分的收益;如果采用standard模式,他们可以完成规定任务并拿到高分,因此standard模式可以让他们有10分的收益。
编程输入A类和B类同学分别占班级总人数的百分比,分别计算并输出采用compete和standard两种刷题模式下的全班总收益,并输出这个班级在这场博弈中的Best Response是哪种模式。注: 程序中使用的数据类型为float
程序运行结果示例1:
Input percent of A and B:0.2 0.8↙
compete = 6.8000
standard = 9.6000
The Best Response is standard!
程序运行结果示例2:
Input percent of A and B:0.8 0.2↙
compete = 9.2000
standard = 8.4000
The Best Response is compete!
程序运行结果示例3:
Input percent of A and B:0.5 0.5↙
compete = 8.0000
standard = 9.0000
The Best Response is standard!
输入提示信息:“Input percent of A and B:”
输入格式: “%f%f”
输出格式:“compete = %.4f\nstandard = %.4f\n”
输出提示信息:“The Best Response is compete!”
输出提示信息:“The Best Response is standard!”
#include<stdio.h>
int main()
{
float a,b,compete,standard;
printf("Input percent of A and B:");
scanf("%f%f",&a,&b);
compete=a*10+b*6;
standard=a*8+b*10;
printf("compete = %.4f\nstandard = %.4f\n",compete,standard);
if(compete>= standard)
printf("The Best Response is compete!");
else
printf("The Best Response is standard!");
return 0;
}
第五章 循环
5.1 判断一个整型数据有几位v2.0
题目内容:从键盘输入一个整型数据(int型),编写程序判断该整数共有几位,并输出包含各个数字的个数。例如,从键盘输入整数16644,该整数共有5位,其中有1个1,2个6,2个4。
程序运行结果示例1:
Please enter the number:
12226↙
12226: 5 bits
1: 1
2: 3
6: 1
程序运行结果示例2:
Please enter the number:
-12243↙
-12243: 5 bits
1: 1
2: 2
3: 1
4: 1
输入格式: “%d”
输出格式:
输入提示信息:“Please enter the number:\n”
判断该整数共有几位:“%d: %d bits\n”
包含数字0的个数:“0: %d\n”
包含数字1的个数:“1: %d\n”
包含数字2的个数:“2: %d\n”
包含数字3的个数:“3: %d\n”
包含数字4的个数:“4: %d\n”
包含数字5的个数:“5: %d\n”
包含数字6的个数:“6: %d\n”
包含数字7的个数:“7: %d\n”
包含数字8的个数:“8: %d\n”
包含数字9的个数:“9: %d\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
时间限制:500ms内存限制:32000kb
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,a,b,c,d,e,f,g,h,i,j,counter=0,num;
a=0;
b=0;
c=0;
d=0;
e=0;
f=0;
g=0;
h=0;
i=0;
j=0;
printf("Please enter the number:\n");
scanf("%d",&n);
num=n;
do{
n=abs(n);
switch(n%10)
{
case 0:a++;break;
case 1:b++;break;
case 2:c++;break;
case 3:d++;break;
case 4:e++;break;
case 5:f++;break;
case 6:g++;break;
case 7:h++;break;
case 8:i++;break;
default :j++;
}
n=n/10;
}while(n);
counter=a+b+c+d+e+f+g+h+i+j;
printf("%d: %d bits\n",num,counter);
if(a){printf("0: %d\n",a);}
if(b){printf("1: %d\n",b);}
if(c){printf("2: %d\n",c);}
if(d){printf("3: %d\n",d);}
if(e){printf("4: %d\n",e);}
if(f){printf("5: %d\n",f);}
if(g){printf("6: %d\n",g);}
if(h){printf("7: %d\n",h);}
if(i){printf("8: %d\n",i);}
if(j){printf("9: %d\n",j);}
return 0;
}
5.2 奖金计算
题目内容:企业发放的奖金根据利润提成。利润低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时,高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润i,求应发放奖金总数?
#include <stdio.h>
int main()
{
long x, y, s;
scanf("%ld", &x);
if (x < 100000 && x >=0)
s = 1;
else if (x < 200000)
s = 2;
else if (x < 400000)
s = 3;
else if (x < 600000)
s = 4;
else if (x < 1000000)
s = 5;
else if (x >= 1000000)
s = 6;
else
s = -1;
switch(s)
{
case 1: y = x * 0.1;
break;
case 2: y = 10000 + (x - 100000) * 0.075;
break;
case 3: y = 17500 + (x - 200000) * 0.05;
break;
case 4: y = 27500 + (x - 400000) * 0.03;
break;
case 5: y = 33500 + (x - 600000) * 0.015;
break;
case 6: y = 39500 + (x - 1000000) * 0.01;
break;
default:
printf("Input error!");
}
printf("bonus=%ld\n", y);
return 0;
}
5.3 程序修改—1
题目内容:修改下面这个程序使其快速计算1+2+3……+n的值,n从键盘输入。并按照下面给出的运行示例检查程序。
#include <stdio.h>
int main()
{
int i, j, sum = 0, n=100;
for (i=1,j=n; i<=j; i++,j--)
{
sum = sum + i + j;
}
printf("sum = %d", sum);
return 0;
}
//修改后
#include <stdio.h>
int main()
{
int i, j, sum = 0, n;
scanf("%d", &n);
for(i=1,j=n;i<=j;i++,j--)
{
if(i==j)
j = 0;
sum = sum + i + j;
}
printf("sum = %d", sum);
return 0;
}
5.4 程序修改—2
题目内容:修改下面这个用do-while语句实现的程序,改用while语句实现,并对比其优缺点。
#include <stdio.h>
int main()
{
int sum = 0, m;
do{
printf("Input m:\n");
scanf("%d", &m);
sum = sum + m;
printf("sum = %d\n", sum);
}while (m != 0);
return 0;
}
//修改后
#include <stdio.h>
int main()
{
int sum = 0, m;
printf("Input m:\n");
scanf("%d", &m);
while (m!=0)
{
sum = sum + m;
printf("sum = %d\n", sum);
printf("Input m:\n");
scanf("%d", &m);
}
return 0;
}
5.5 程序改错—1
题目内容:我国古代的《张丘建算经》中有这样一道著名的百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”其意为:公鸡每只5元,母鸡每只3元,小鸡3只1元。用100元买100只鸡,问公鸡、母鸡和小鸡各能买多少只?目前程序运行结果有误,请问为什么会比正确答案多出三个解?不仅要找出错误和修正错误,还要求利用以前学过的知识分析错误的原因。
#include <stdio.h>
int main()
{
int x, y, z;
for (x=0; x<=20; x++)
{
for (y=0; y<=33; y++)
{
z = 100 - x - y;
if (5*x + 3*y + z/3 == 100)
{
printf("x=%d, y=%d, z=%d\n", x, y, z);
}
}
}
return 0;
}
//修改后
#include <stdio.h>
int main()
{
int x, y, z;
for (x=0; x<=20; x++)
{
for (y=0; y<=33; y++)
{
z = 100 - x - y;
if (5*x + 3*y + (float)z/3 == 100)
{
printf("x=%d, y=%d, z=%d\n", x, y, z);
}
}
}
return 0;
}
5.6 程序改错—2
题目内容:从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“Yes!”,否则输出“No!”。已知负数、0和1都不是素数。请找出下面程序的错误并改正之,同时按照给出的运行示例检查修改后的程序。
#include <stdio.h>
#include <math.h>
int main()
{
int n, i;
printf("Input n:\n");
scanf("%d", &n);
for (i=2; i<=sqrt(n); i++)
{
if (n % i = 0)
{
printf("No!\n");
}
}
printf("Yes!\n");
return 0;
}
//修改后
#include <stdio.h>
#include <math.h>
int main()
{
int n, i, find = 0;
printf("Input n:\n");
scanf("%d", &n);
for (i=2;i<=sqrt(n);i++)
{
if (n%i == 0)
{
find = 1;
}
}
if(!find && n > 1)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
5.7 程序改错—3
题目内容:从键盘任意输入两个符号各异的整数,直到输入的两个整数满足要求为止,然后打印这两个数。请通过测试找出下面这个程序存在的问题(不止一个问题哦),并改正。同时用下面给出的运行结果示例检查修改后的程序。
#include <stdio.h>
int main()
{
int x1, x2;
do{
printf("Input x1, x2:");
scanf("%d,%d", &x1, &x2);
}while (x1 * x2 > 0);
printf("x1=%d,x2=%d\n", x1, x2);
return 0;
}
//修改后
#include<stdio.h>
int main()
{
int x1, x2, r;
do{
printf("Input x1, x2:\n");
r = scanf("%d,%d", &x1, &x2);
while (r != 2)
{
while (getchar() != '\n');
printf("Input x1, x2:\n");
r = scanf("%d,%d", &x1, &x2);
}
}while(x1 * x2 >= 0);
printf("x1=%d,x2=%d\n", x1, x2);
return 0;
}
5.8 猴子吃桃程序_扩展1
题目内容:猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入不同的天数n进行递推,即假设第n天的桃子数为1。
#include <stdio.h>
int main()
{
int n, i, x = 1;
printf("Input days:\n");
scanf("%d", &n);
for(i=1;i<n;i++)
{
x = (x + 1) * 2;
}
printf("x=%d\n", x);
return 0;
}
5.9 猴子吃桃程序_扩展2
题目内容:猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入不同的天数n进行递推,即假设第n天的桃子数为1。同时还要增加对用户输入数据的合法性验证(如:不允许输入的天数是0和负数)
#include <stdio.h>
int main()
{
int n, i, x = 1, r;
printf("Input days:\n");
r = scanf("%d", &n);
while(1)
{
while(r != 1)
{
while(getchar() == '\n');
printf("Input days:\n");
r = scanf("%d", &n);
}
if (n < 1 && r == 1)
{
printf("Input days:\n");
r = scanf("%d", &n);
}
else
{
for(i=1;i<n;i++)
{
x = (x + 1) * 2;
}
printf("x=%d\n", x);
goto end;
}
}
end:
return 0;
}
5.10 6位密码输入检测
题目内容:从键盘输入6位仅由数字0~9组成的密码。用户每输入一个密码并按回车键后,程序给出判断:如果是数字,则原样输出该数字,并提示用户目前已经输入了几位密码,同时继续输入下一位密码;否则,程序提示"error",并让用户继续输入下一位密码。直到用户输入的密码全部是数字为止。
#include <stdio.h>
int main()
{
int a=0;
char n;
printf("Input your password:\n");
do{
scanf("%c",&n);
if(n>='0'&& n<='9')
{
a++;
printf("%c, you have enter %d-bits number\n",n,a);
}
else
{
printf("error\n");
}
getchar();
}while(a<6);
return 0;
}
5.11 判断一个整型数据有几位
题目内容:从键盘输入一个整型数据(int型),编写程序判断该整数共有几位。例如,从键盘输入整数16644,该整数共有5位。
#include <stdio.h>
#include <math.h>
int main()
{
int n, x, count = 1;
printf("Please enter the number:\n");
scanf("%d", &n);
x = fabs(n);
while (x > 10)
{
count++;
x = x/10;
}
printf("%d: %d bits\n", n, count);
return 0;
}
5.12 检测输入数据中奇数和偶数的个数
题目内容:从键盘输入一系列正整数,输入-1表示输入结束(-1本身不是输入的数据)。编写程序判断输入数据中奇数和偶数的个数。如果用户输入的第一个数据就是-1,则程序输出"over!"。否则。用户每输入一个数据,输出该数据是奇数还是偶数,直到用户输入-1为止,分别统计用户输入数据中奇数和偶数的个数。
#include <stdio.h>
int main()
{
int x, odd = 0, even = 0;
printf("Please enter the number:\n");
scanf("%d", &x);
if (x == -1)
{
printf("over!\n");
}
while (x != -1)
{
if (x % 2 == 0)
{
even++;
printf("%d:even\n", x);
scanf("%d", &x);
}
else
{
odd++;
printf("%d:odd\n", x);
scanf("%d",&x);
}
}
printf("The total number of odd is %d\n", odd);
printf("The total number of even is %d\n", even);
return 0;
}
5.13 计算球的反弹高度
题目内容:一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下并反弹…,求它在第5次和第10次落地时,分别共经过了多少米?第5次和第10次反弹分别是多高?要求计算结果保留到小数点后3位。用户从键盘输入想要计算的第n次(n<=15)。程序中所有浮点数的数据类型均为float。
#include <stdio.h>
int main()
{
int n;
float h = 100, m = 100;
printf("Input:\n");
scanf("%d", &n);
printf("%d times:\n", n);
while (n-- > 1)
{
h = h / 2;
m = m + h * 2;
}
printf("%.3f\n", m);
printf("%.3f\n", h / 2);
return 0;
}
5.14 马克思手稿中的趣味数学题
题目内容:编程求解马克思手稿中的趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,请编程计算男人、女人和小孩各有几人?
#include <stdio.h>
int main()
{
int x, y, z;
printf("Man Women Children\n");
for (z=1;z<30;z++)
{
x = z - 10;
y = 40 - 2 * z;
if (x >= 0 && y >= 0)
{
printf("%3d%8d%8d\n", x, y, z);
}
}
return 0;
}
5.15 猜神童年龄
题目内容:美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是一个4位数。我年龄的4次方是一个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你编程算出他当时到底有多年轻。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int cmp ( const void *a, const void *b )
{
return *(int *)a - *(int *)b;
}
int main(void)
{
int i, a[SIZE], b[SIZE], age, flag;
long n1, n2;
for (i=0; i<10; i++)
a[i]=i;
for (age=10; age<=22; age++)
{
n1=age*age*age;
n2=n1*age;
flag=1;
i=0;
do
{
b[i]=n1%10;
n1=n1/10;
i++;
}
while(n1>0);
do
{
b[i]=n2%10;
n2=n2/10;
i++;
}
while(n2>0);
qsort(b, SIZE, sizeof(b[0]),cmp);
for(i=0; i<10; i++)
{
if(a[i]!=b[i])
{
flag=0;
break;
}
}
if(flag)
printf("age=%d\n",age);
}
return 0;
}
5.16 闰年相关的问题v3.0——计算有多少闰年
题目内容:从键盘输入你的出生年和今年的年份,编程判断并输出从你的出生年到今年之间中有多少个闰年。
#include <stdio.h>
int main()
{
int x, y, count = 0;
printf("Input your birth year:");
scanf("%d", &x);
printf("Input this year:");
scanf("%d", &y);
for (x;x<=y;x++)
{
if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0)
{
printf("%d\n", x);
count++;
}
}
printf("count=%d\n", count);
return 0;
}
5.17 闰年相关的问题v4.0——计算心跳数
题目内容:假设人的心率为每分钟跳75下,编程从键盘输入你的出生年和今年的年份,然后以年为单位计算并输出从你出生开始到目前为止的生命中已有的心跳总数(要求考虑闰年)。
#include <stdio.h>
int main()
{
int x, y, count = 0, year, day;
unsigned long beat;
printf("Input your birth year:");
scanf("%d", &x);
printf("Input this year:");
scanf("%d", &y);
year = y - x;
for (x;x<y;x++)
{
if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0)
{
count++;
}
}
day = year * 365 + count;
beat = day * 24 * 60 * 75;
printf("The heart beats in your life: %lu", beat);
return 0;
}
第六章 函数
6.1绘制金字塔
题目内容:要求用户从键盘输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案:
A
ABA
ABCBA
ABCDCBA
程序运行结果示例1:
Please input a capital:
D↙
____A
___ABA
__ABCBA
_ABCDCBA
程序运行结果示例2:
Please input a capital:
F↙
______A
_____ABA
____ABCBA
___ABCDCBA
__ABCDEDCBA
_ABCDEFEDCBA
(说明:上面运行结果示例中,每行字母前面的下划线"_"代表屏幕上实际输出的是空格,最后一行前面有一个空格,倒数第二行有两个空格,以此类推。)
#include <stdio.h>
int main()
{
char c;
int q, m, n, z;
printf("Please input a capital:\n");
scanf(" %c", &c);
for(m=65;m<=c;m++)//控制行数
{
for(q=c-m;q>=0;q--)//控制空格输出
{
printf(" ");
}
for(n=65;n<=m;n++)//控制顺序输出
{
printf("%c", n);
}
for(z=m-1;z>=65;z--)//控制逆序输出
{
printf("%c", z);
}
printf("\n");
}
return 0;
}
6.2循环嵌套的应用
题目内容:
编写程序产生如下输出:
F
FE
FED
FEDC
FEDCB
FEDCBA
#include <stdio.h>
int main()
{
char c='F';
int m, n, z, o;
for(m=65,o=1;m<=c;m++,o++)//控制行数
{
for(z=c,n=o;z>=65,n>0;z--,n--)//控制逆序输出
{
printf("%c", z);
}
printf("\n");
}
return 0;
}
6.3利用泰勒级数计算sinx的值
题目内容:利用泰勒级数计算sinx的值,要求最后一项的绝对值小于,并统计出此时累加了多少项。请用“利用前项来计算后项”的方法计算累加项,不要使用pow函数编写程序。程序中所有实数的数据类型都是double类型。
程序的运行结果示例1:
Input x:
3↙
sin(x)=0.141,count=9
程序的运行结果示例2:
Input x:
10↙
sin(x)=-0.544,count=18
输入提示信息:“Input x:\n”
输入格式: “%lf”
输出格式:“sin(x)=%.3f,count=%d\n”
#include <stdio.h>
#include <math.h>
#define EPS 1e-5
double R(double a);
int main()
{
double x, sinx = 0, n, mul, count = 0,sign = 1, a = 1;
printf("Input x:\n");
scanf("%lf", &x);
n = x;
do{
mul = n/R(a);
mul = mul * sign;
sinx = sinx + mul;
n = n * x * x;
a = a + 2;
sign = -sign;
count++;
}while (fabs(mul) >= EPS);
printf("sin(x)=%.3f,count=%d\n", (float)sinx, (int)count);
return 0;
}
double R(double a)
{
double s = 1, r;
for(r=1;r<=a;r++)
{
s = s * r;
}
return (s);
}
6.4计算100~200之间的所有素数之和
题目内容:计算100~200之间的所有素数之和,判别一个数是否是素数请用给定的函数实现。
#include <stdio.h>
#include <math.h>
int fun(int m)
{
int a, ret;
for(a=2;a<=sqrt(m);a++)
{
if (m % a == 0)
{
ret = 0;
break;
}
if (m % a != 0)
{
ret = 1;
}
}
return (ret);
}
int main()
{
int sum = 0, m, sign;
for(m=100;m<=200;m++)
{
sign = fun(m);
if (sign == 1)
{
sum = sum + m;
}
else
continue;
}
printf("sum=%d\n", sum);
return 0;
}
6.5编程实现一个输入指定范围内的整数的函数
题目内容:编程实现一个输入指定范围内的整数的函数getint,其完整的函数原型为:int getint(int min, int max);,它负责接收用户的输入进行验证,保证接收的一定是一个介于min和max之间([min, max]区间内)的一个整数并最后返回该整数。如果用户输入不合法,则会提示继续输入,直到输入合法时为止。要求编写完整的程序并测试你所写的getint函数。
#include <stdio.h>
int getint(int min, int max);
int main()
{
int min, max, ret;
printf("Please enter min,max:\n");
scanf("%d,%d", &min, &max);
printf("Please enter an integer [%d..%d]:\n", min, max);
ret = getint(min, max);
printf("The integer you have entered is:%d\n", ret);
return 0;
}
int getint(int min, int max)
{
int a;
scanf("%d", &a);
while (a>=max || a<=min)
{
printf("Please enter an integer [%d..%d]:\n", min, max);
scanf("%d", &a);
}
return (a);
}
6.6程序改错v2.0
题目内容:下面代码的功能是将百分制成绩转换为5分制成绩,具体功能是:如果用户输入的是非法字符或者不在合理区间内的数据(例如输入的是a,或者102,或-45等),则程序输出 Input error!,并允许用户重新输入,直到输入合法数据为止,并将其转换为5分制输出。目前程序存在错误,请将其修改正确。并按照下面给出的运行示例检查程序。
#include<stdio.h>
int main()
{
int score;
char grade;
printf("Please input score:");
scanf("%d", &score);
if (score < 0 || score > 100)
printf("Input error!\n");
else if (score >= 90)
grade = 'A’;
else if (score >= 80)
grade = 'B';
else if (score >= 70)
grade = 'C';
else if (score >= 60)
grade = 'D';
else
grade = 'E';
printf("grade:%c\n", grade);
return 0;
}
//修改后
#include <stdio.h>
int main()
{
int x, ret;
char a;
printf("Please input score:\n");
ret = scanf("%d", &x);
while (ret != 1 || x<0 || x>100)
{
while (getchar() != '\n');
printf("Input error!\n");
printf("Please input score:\n");
ret = scanf("%d", &x);
}
if (x>=90)
{
a = 'A';
}
else if (x>=80)
{
a = 'B';
}
else if (x>=70)
{
a = 'C';
}
else if (x>=60)
{
a = 'D';
}
else
{
a = 'E';
}
printf("grade: %c\n", a);
return 0;
}
6.7编程计算a+aa+aaa+…+aa…a(n个a)的值
题目内容:编程计算 a+aa+aaa+…+aa…a(n个a)的值,n和a的值由键盘输入。例如,当n=4,a=2,表示计算2+22+222+2222的值。
#include <stdio.h>
#include <math.h>
long Y(int a, int n);
int main()
{
int a, n;
long sum = 0;
printf("Input a,n:\n");
scanf("%d,%d", &a, &n);
printf("sum=%ld\n", Y(a,n));
return 0;
}
long Y(int a, int n)
{
int count, sign, x, m=0;
long sum=0;
for(count=1,sign=0;count<=n;count++,sign++)
{
x = a * pow(10,sign);
m = m + x;
sum = sum + m;
}
return sum;
}
6.8搬砖问题
题目内容:n块砖( 27<n<=77 ),36人搬,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?请用穷举法编程求解,n的值要求从键盘输入。输出结果按照男人数量升序给出(见下面示例3)。
#include <stdio.h>
int main()
{
int n, men, women, children, y, z;
printf("Input n(27<n<=77):\n");
scanf("%d", &n);
for (men=0;men*4<=n;men++)
{
for(women=0;women*3<=n;women++)
{
children = 36 - women - men;
if (men+women+children==36 && 8*men+6*women+children== 2*n)
{
printf("men=%d,women=%d,children=%d\n", men, women, children);
}
else ;
}
}
return 0;
}
6.9编程输出某年某月有多少天(考虑到闰年)
题目内容:从键盘输入一个年份和月份,输出该月有多少天(考虑闰年),用switch语句编程。
程序运行结果示例1:
Input year,month:
2015,3↙
31 days
程序运行结果示例2:
Input year,month:
2015,4↙
30 days
程序运行结果示例3:
Input year,month:
2016,2↙
29 days
程序运行结果示例4:
Input year,month:
2014,2↙
28 days
程序运行结果示例5:
Input year,month:
2015,13↙
Input error!
#include <stdio.h>
int R(int m);
int main()
{
int year, month, ret;
printf("Input year,month:\n");
scanf("%d,%d", &year, &month);
ret = R(year);
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:printf("31 days\n");
break;
case 4:
case 6:
case 9:
case 11:printf("30 days\n");
break;
case 2:
if (ret == 1)
{
printf("29 days\n");
}
else
{
printf("28 days\n");
}
break;
default:printf("Input error!\n");
}
return 0;
}
int R(int m)
{
int r;
if (m % 4 == 0 && m % 100 != 0 || m % 400 == 0)
{
r = 1;
}
else
{
r = 0;
}
return (r);
}
6.10计算阶乘的和v2.0
题目内容:假设有这样一个三位数m,其百位、十位和个位数字分别是a、b、c,如果m= a!+b!+c!,则这个三位数就称为三位阶乘和数(约定0!=1)。请编程计算并输出所有的三位阶乘和数。
#include <stdio.h>
long Fact(int n);
int main()
{
int m, n, a, b, c;
for (a=0;a<10;a++)
{
for (b=1;b<10;b++)
{
for (c=1;c<10;c++)
{
n = Fact(a) + Fact(b) + Fact(c);
m = a * 100 + b * 10 + c;
if (m == n)
{
printf("%d\n", m);
}
}
}
}
return 0;
}
long Fact(int n)
{
int i;
long result = 1;
for (i=1;i<=n;i++)
{
result *= i;
}
return (result);
}
6.11计算最大的三位约数
题目内容:从键盘任意输入一个数n(1000<=n<=1000000),编程计算并输出n的所有约数中最大的三位数(即最大的三位约数)。如果n小于1000或者大于1000000,则输出“Input error!”。
#include <stdio.h>
int Func(int n);
int main()
{
int n, m;
printf("Input n:");
scanf("%d", &n);
if (n<1000 || n>1000000)
{
printf("Input error!\n");
}
else
{
m = Func(n);
printf("%d\n", m);
}
return 0;
}
int Func(int n)
{
int i, m;
for (i=1;i<=n;i++)
{
if (n % i == 0)
{
m = n / i;
if (m > 100 && m < 1000)
break;
else
;
}
}
return m;
}
6.12孔融分梨
题目内容:孔融没有兄弟姐妹,到了周末,就找堂兄孔明、堂姐孔茹、堂弟孔伟等7个堂兄妹来到家里玩。孔融妈妈买了8个梨给孩子们吃,结果小黄狗桐桐淘气叼走了一个,大花猫鑫鑫偷偷藏了一个。孔融抢过剩下的6个梨,妈妈止住他,说他要和大家平分吃。孔融不高兴,说8个人怎么分6个梨?妈妈说可以用分数解决这个问题。孔融学过分数,说把每个梨切8个相等的块,每个人拿6块就行了。妈妈说不用切那么多块,每个梨切4个相等的块,每个人拿3块正好。孔融糊涂了。孔明说,我来教你。于是孔明给孔融讲起了分数的化简。
分数化简要化简到最简形式,比如12/20可以化简成6/10和3/5,但3/5是最简形式;100/8可以化简成 50 /4和 25 /2 , 而25/2 为最简形式。为了降低难度,不要求将假分数(如7/2)化简成带分数(3 )形式。请编程帮助孔融将任意一个分数化简成最简形式。先从键盘输入两个整数m和n(1<=m,n<=10000) ,其中m表示分子,n表示分母。然后输出分数化简后的最简形式。
#include <stdio.h>
int Gcd(int a, int b);
int main()
{
int m, n, i;
printf("Input m,n:");
scanf("%d,%d", &m, &n);
i = Gcd(m, n);
if (i != -1)
{
m = m / i;
n = n / i;
printf("%d/%d\n", m, n);
}
else
{
printf( "Input error!\n");
}
return 0;
}
int Gcd(int a, int b)
{
int r, i;
if (a < 1 || b > 10000 || b == 0)
{
return -1;
}
else
{
for(r=1;r<=a;r++)
{
if(a % r == 0 && b % r == 0)
{
i = r;
}
}
}
return i;
}
6.13素数求和
题目内容:从键盘任意输入一个整数n,编程计算并输出1~n之间的所有素数之和。
函数原型:int IsPrime(int x);
函数功能:判断x是否是素数,若函数返回0,则表示不是素数,若返回1,则代表是素数
#include <stdio.h>
#include <math.h>
int IsPrime(int x);
int main()
{
int n, sum = 0, r,q;
printf("Input n:");
scanf("%d", &n);
for(r=1;r<=n;r++)
{
q = IsPrime(r);
if (q == 1)
{
sum = sum + r;
}
else ;
}
printf("sum=%d\n",sum);
return 0;
}
int IsPrime(int x)
{
int i, p = 1;
if (x<=1)
{
return 0;
}
else
{
for(i=2;i<=sqrt(x);i++)
{
if (x % i == 0)
{
p = 0;
}
}
}
return p;
}
第七章 递归
7.1 n层嵌套平方根的计算
题目内容:
编写程序利用递归法实现如下所示n层嵌套平方根的计算:
递归函数原型:double Y(double x, int n);
程序运行结果示例1:
Please input x and n:16,1↙
Result=4.00
程序运行结果示例2:
Please input x and n:16,2↙
Result=4.47
程序运行结果示例3:
Please input x and n:16,3↙
Result=4.52
程序运行结果示例4:
Please input x and n:16,0↙
Result=0.00
输入提示信息:“Please input x and n:”
输入格式: “%lf,%d”
输出格式: “Result=%.2f\n”
#include <stdio.h>
#include <math.h>
// 递归函数原型
double Y(double x, int n) {
// 递归终止条件,当n为0时,按照示例4的要求返回0.00
if (n == 0) {
return 0.00;
}
// 当n为1时,直接返回x的平方根
else if (n == 1) {
return sqrt(x);
}
// 当n大于1时,递归调用Y函数,每次调用减少n的值
else {
return sqrt(Y(x, n - 1));
}
}
int main() {
double x;
int n;
// 输入提示信息
printf("Please input x and n:");
// 输入格式
scanf("%lf,%d", &x, &n);
// 调用递归函数并输出结果
double result = Y(x, n);
// 输出格式
printf("Result=%.2f\n", result);
return 0;
}
7.2 递归法求和
题目内容:
用递归方法计算如下求和计算
sum = 1 + 2 + 3 + … + n
递归函数原型:int Sum(int n);
程序运行结果示例1:
Please input n:5↙
sum=15
程序运行结果示例2:
Please input n:0↙
data error!
程序运行结果示例3:
Please input n:-3↙
data error!
输入提示信息:“Please input n:”
输入错误提示信息:“data error!\n”
输入格式:“%d”
输出格式:“sum=%d\n”
#include <stdio.h>
// 递归函数原型
int Sum(int n) {
// 基本情况:当n等于1时,返回1
if (n == 1) {
return 1;
}
// 错误处理:当n小于1时,返回错误标志-1
else if (n < 1) {
return -1;
}
// 递归情况:否则,返回n加上前n-1项的和
else {
return n + Sum(n - 1);
}
}
int main() {
int n;
// 输入提示信息
printf("Please input n:");
scanf("%d", &n);
// 调用递归函数
int result = Sum(n);
// 根据结果进行输出
if (result == -1) {
// 输入错误提示信息
printf("data error!\n");
} else {
// 正确情况输出格式
printf("sum=%d\n", result);
}
return 0;
}
7.3 猴子吃桃程序_扩展3
题目内容:
猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入天数n,即假设第n天的桃子数为1。
要求采用递归法求解。
递归函数原型:int Monkey(int n, int x);
函数功能:从第n天只剩下一个桃子反向逆推出第1天的桃子数
程序运行结果示例1:
Input days n:5↙
x=46
程序运行结果示例2:
Input days n:10↙
x=1534
输入提示信息:“Input days n:”
输入格式: “%d”
输出格式:“x=%d\n”
#include <stdio.h>
// 递归函数原型
int Monkey(int n) {
// 基本情况:第n天剩下1个桃子
if (n == 1) {
return 1;
}
// 递归情况:逆推前一天的桃子数
else {
// 第n天剩下的桃子数是第n-1天剩下桃子数的一半零一个的两倍加一
return (Monkey(n - 1) + 1) * 2;
}
}
int main() {
int n;
// 输入提示信息
printf("Input days n:");
scanf("%d", &n);
// 调用递归函数并输出结果
int x = Monkey(n);
// 输出格式
printf("x=%d\n", x);
return 0;
}
7.4 网购打折商品V2.0
题目内容:
某网上购物网站对用户实行优惠,买家购物货款p越多,则折扣越多。
标准如下:
p<100元 没有折扣
100元≤p<200元 5%折扣
200元≤p<500元 8%折扣
100元≤p<1000元 10%折扣
1000元≤p 15%折扣
#include <stdio.h>
double calculateDiscountedPrice(double p) {
double discountedPrice = p; // 默认没有折扣
if (p >= 1000) {
discountedPrice = p * 0.85; // 15%折扣
} else if (p >= 200 && p < 1000) {
discountedPrice = p * 0.9; // 10%折扣
} else if (p >= 200 && p < 500) {
discountedPrice = p * 0.92; // 8%折扣
} else if (p >= 100 && p < 200) {
discountedPrice = p * 0.95; // 5%折扣
}
// 如果p<100元,则保持原价,即没有折扣
return discountedPrice;
}
int main() {
double p;
// 提示用户输入购物金额
printf("Please enter the shopping amount: ");
scanf("%lf", &p);
// 计算折扣后的价格
double finalPrice = calculateDiscountedPrice(p);
// 输出最终的支付金额
printf("The final payment amount after discount is: %.2f\n", finalPrice);
return 0;
}
第八章 处理数据
8.1 摘苹果
题目内容:
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当他不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度(已知在100cm到200cm之间,包括100cm和200cm),以及陶陶把手伸直时能达到的最大高度(已知在100cm到120cm之间,包括100cm和120cm),请你编写程序帮助陶陶计算一下他能摘到的苹果数目。假设他碰到苹果,苹果就会掉下来。
函数原型:int GetApple(int a[], int height, int n);
函数功能:计算淘淘能摘到的苹果数目
函数参数:数组a保存苹果到地面的高度;height代表陶陶把手伸直时能达到的最大高度;n为苹果数
函数返回值:淘淘能摘到的苹果数目
#include <stdio.h>
// 函数原型
int GetApple(int a[], int height, int n) {
int count = 0; // 用于计数陶陶能摘到的苹果数目
int maxReach = height + 30; // 陶陶站在板凳上能够触及的最大高度
// 遍历每个苹果的高度
for (int i = 0; i < n; i++) {
// 如果苹果的高度小于等于陶陶能够触及的最大高度,则计数器加1
if (a[i] <= maxReach) {
count++;
}
}
return count; // 返回陶陶能摘到的苹果数目
}
int main() {
int appleHeights[10]; // 保存10个苹果到地面的高度
int height; // 陶陶把手伸直时能达到的最大高度
// 输入陶陶把手伸直时能达到的最大高度
printf("Enter TaoTao's maximum reach height: ");
scanf("%d", &height);
// 输入10个苹果到地面的高度
printf("Enter the heights of 10 apples: ");
for (int i = 0; i < 10; i++) {
scanf("%d", &appleHeights[i]);
}
// 调用函数并输出结果
int result = GetApple(appleHeights, height, 10);
printf("TaoTao can pick %d apples.\n", result);
return 0;
}
8.2 好数对
题目内容:
已知一个集合A,对A中任意两个不同的元素求和,若求得的和仍在A内,则称其为好数对。例如,集合A={1 2 3 4},1+2=3,1+3=4,则1,2和1,3 是两个好数对。编写程序求给定集合中好数对的个数。
注:集合中最多有1000个元素,元素最大不超过10000
#include <stdio.h>
#define MAX_ELEMENT 10001 // 集合中元素的最大值加1
int main() {
int n; // 集合A中的元素个数
int A[MAX_ELEMENT] = {0}; // 初始化标记数组,用于快速检查一个数是否在集合A中
int element;
int goodPairs = 0; // 好数对的个数
// 输入集合A中的元素个数
printf("Enter the number of elements in set A: ");
scanf("%d", &n);
// 读取集合A中的每个元素,并在标记数组中做标记
printf("Enter the elements of set A: ");
for (int i = 0; i < n; i++) {
scanf("%d", &element);
A[element] = 1; // 标记该元素存在于集合A中
}
// 遍历集合A中的每一对不同的元素
for (int i = 0; i < MAX_ELEMENT; i++) {
if (A[i]) { // 如果元素i在集合A中
for (int j = i + 1; j < MAX_ELEMENT; j++) {
if (A[j] && (i + j < MAX_ELEMENT) && A[i + j]) {
goodPairs++; // 如果i和j的和也在集合A中,则增加好数对计数
}
}
}
}
// 输出好数对的个数
printf("Number of good pairs in set A: %d\n", goodPairs);
return 0;
}
8.3 组合三位数
题目内容:
将0到9这十个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的1/2,是第三个3位数的1/3。问应当怎样分,编写程序实现。
#include <stdio.h>
int main() {
int a, b, c; // 分别代表三个3位数
int used[10]; // 用于标记数字是否被使用
// 遍历所有可能的a的值(100到999之间)
for (a = 100; a <= 999; a++) {
// 清除标记
for (int i = 0; i < 10; i++) {
used[i] = 0;
}
// 标记a中使用的数字
used[a / 100] = 1; // 百位
used[a / 10 % 10] = 1; // 十位
used[a % 10] = 1; // 个位
b = 2 * a; // 第二个3位数是第一个的两倍
c = 3 * a; // 第三个3位数是第一个的三倍
// 检查b和c是否超出范围
if (b > 999 || c > 999) {
continue;
}
// 标记b中使用的数字
if (used[b / 100] || used[b / 10 % 10] || used[b % 10]) {
continue;
}
used[b / 100] = 1;
used[b / 10 % 10] = 1;
used[b % 10] = 1;
// 标记c中使用的数字
if (used[c / 100] || used[c / 10 % 10] || used[c % 10]) {
continue;
}
used[c / 100] = 1;
used[c / 10 % 10] = 1;
used[c % 10] = 1;
// 检查是否所有数字都被使用了
int allUsed = 1;
for (int i = 0; i < 10; i++) {
if (!used[i]) {
allUsed = 0;
break;
}
}
// 如果所有数字都被使用,则输出结果
if (allUsed) {
printf("A = %d, B = %d, C = %d\n", a, b, c);
}
}
return 0;
}
8.4 求100以内的最大素数
题目内容:
编程计算n(n<=500)以内的10个最大素数及其和,分别输出这最大的10个素数及其和。n的值要求从键盘输入。要求10个素数按从大到小的顺序输出。
#include <stdio.h>
#include <math.h>
// 函数:判断一个数是否为素数
int isPrime(int num) {
if (num <= 1) return 0; // 小于等于1的不是素数
int sqrtNum = (int)sqrt(num); // 计算平方根,减少循环次数
for (int i = 2; i <= sqrtNum; i++) {
if (num % i == 0) return 0; // 如果能被除了1和它自身以外的数整除,则不是素数
}
return 1; // 是素数
}
int main() {
int n;
printf("Enter n (n <= 500): ");
scanf("%d", &n);
if (n > 500) {
printf("n should be less than or equal to 500.\n");
return 0;
}
int primes[10]; // 存储找到的10个素数
int count = 0; // 素数的计数器
int sum = 0; // 素数的总和
// 从n开始向下遍历,寻找10个素数
for (int i = n; i >= 2 && count < 10; i--) {
if (isPrime(i)) {
primes[count] = i; // 存储找到的素数
sum += i; // 累加素数的和
count++; // 更新找到的素数数量
}
}
// 检查是否找到了10个素数
if (count < 10) {
printf("There are less than 10 prime numbers within %d.\n", n);
return 0;
}
// 输出10个素数及其和
printf("The 10 largest primes within %d are:\n", n);
for (int i = 0; i < 10; i++) {
printf("%d ", primes[i]);
}
printf("\nThe sum of these primes is: %d\n", sum);
return 0;
}
第九章 指针
9.1 重复数字检查
题目内容:
从键盘输入一个数,检查这个数中是否有重复出现的数字。如果这个数中有重复出现的数字,则显示“Repeated digit!”;否则显示“No repeated digit!”。
已知函数原型:
int CountRepeatNum(int count[], int n);
若有重复数字,则该函数返回重复出现的数字;否则返回-1.
#include <stdio.h>
// 辅助函数,用于统计数字n中每个数字出现的次数
void FillCountArray(int count[], int n) {
while (n > 0) {
int digit = n % 10; // 获取最低位的数字
count[digit]++;
n /= 10; // 移除已处理的最低位数字
}
}
// 检查是否有重复数字的函数
int CountRepeatNum(int count[], int n) {
FillCountArray(count, n);
for (int i = 0; i < 10; i++) {
if (count[i] > 1) {
return i; // 返回第一个重复出现的数字
}
}
return -1; // 如果没有重复数字,返回-1
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
int count[10] = {0}; // 初始化计数数组
int repeatedNum = CountRepeatNum(count, n);
if (repeatedNum != -1) {
printf("Repeated digit!\n");
} else {
printf("No repeated digit!\n");
}
return 0;
}
9.2 教授的课
题目内容:
教授正在为一个有N个学生的班级讲授离散数学课。他对某些学生缺乏纪律性很不满意,于是决定:如果课程开始后上课的人数小于K,就取消这门课程。从键盘输入每个学生的到达时间,请编程确定该课程是否被取消。如果该门课程被取消,则输出“Yes”,否则输出“No”。假设教授在时刻0开始上课。如果一个学生的到达时间是非正整数,则表示该学生在上课前进入教室。如果一个学生的到达时间是正整数,则表示该学生在上课后进入教室。如果一个学生在时刻0进入教室,也被认为是在上课前进入教室。假设到达时间的绝对值不超过100,学生数N不超过1000。要求在输入学生的到达时间之前,先输入N和K。
#include <stdio.h>
int main() {
int N, K; // N是学生总数,K是上课前必须到达的最少学生数
printf("Enter the number of students (N) and the threshold (K): ");
scanf("%d %d", &N, &K);
int arrivalTime; // 学生到达时间
int onTimeCount = 0; // 准时或提前到达的学生数量
printf("Enter the arrival times of %d students: ", N);
for (int i = 0; i < N; i++) {
scanf("%d", &arrivalTime);
if (arrivalTime <= 0) { // 如果学生在上课前到达
onTimeCount++; // 增加准时或提前到达的学生数量
}
}
if (onTimeCount >= K) { // 如果准时或提前到达的学生数量满足最少到达学生数K
printf("No\n"); // 课程照常进行
} else {
printf("Yes\n"); // 否则,课程被取消
}
return 0;
}
9.3 寻找鞍点
题目内容:
请编程找出一个M*N矩阵中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。如果矩阵中没有鞍点,则输出“No saddle point!”
#include <stdio.h>
#define MAX_M 100
#define MAX_N 100
int main() {
int m, n;
printf("Enter the dimensions of the matrix (M N): ");
scanf("%d %d", &m, &n);
int matrix[MAX_M][MAX_N];
printf("Enter the elements of the matrix:\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
int maxRow[MAX_M], minCol[MAX_N];
// 初始化行的最大值和列的最小值
for (int i = 0; i < m; i++) maxRow[i] = matrix[i][0];
for (int j = 0; j < n; j++) minCol[j] = matrix[0][j];
// 找到每行的最大值和每列的最小值
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] > maxRow[i]) maxRow[i] = matrix[i][j];
if (matrix[i][j] < minCol[j]) minCol[j] = matrix[i][j];
}
}
int hasSaddlePoint = 0;
// 检查鞍点
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == maxRow[i] && matrix[i][j] == minCol[j]) {
printf("Saddle point found at (%d, %d) with value %d\n", i, j, matrix[i][j]);
hasSaddlePoint = 1;
}
}
}
if (!hasSaddlePoint) {
printf("No saddle point!\n");
}
return 0;
}
9.4 计算三位阶乘和数
题目内容:
试求出所有三位阶乘和数:m=a!+b!+c!(其中a为百位数字,b为十位数字,c为个位数字。约定0!=1,并输出所有的m)
def factorial(n):
"""计算n的阶乘"""
if n == 0:
return 1
else:
return n * factorial(n-1)
for i in range(100, 1000):
a = i // 100 # 取百位数字
b = (i // 10) % 10 # 取十位数字
c = i % 10 # 取个位数字
if i == factorial(a) + factorial(b) + factorial(c):
print(i)
第十章 字符串
10.1 数字字符串转换为整型数
题目内容:
从键盘输入一串字符(假设字符数少于8个),以回车表示输入结束,编程将其中的数字部分转换为整型数并以整型的形式输出。
函数原型为 int Myatoi(char str[]);
其中,形参数组str[]对应用户输入的字符串,函数返回值为转换后的整型数。
#include <stdio.h>
int Myatoi(char str[]) {
int num = 0;
int i = 0;
// 处理可能存在的负号
if (str[0] == '-') {
i = 1;
}
// 遍历字符串并将数字部分转换为整型数
while (str[i] >= '0' && str[i] <= '9') {
num = num * 10 + (str[i] - '0');
i++;
}
// 处理负数情况
if (str[0] == '-') {
num = -num;
}
return num;
}
int main() {
char str[8];
printf("Enter a string: ");
scanf("%s", str);
int result = Myatoi(str);
printf("Converted integer: %d\n", result);
return 0;
}
10.2 查找子串
题目内容:
用字符数组作函数参数,编程实现在从键盘输入的字符串(假设长度小于80)中查找与指定的子串,并输出该子串在字符串中首次出现的位置,如果该字符不存在,则输出"Not found!"。
函数原型:int SearchString(char s[], char d[])
函数功能:在字符数组s中查找子串d,返回d在s中首次出现的位置,若找不到,则返回-1。
#include <stdio.h>
#include <string.h>
int SearchString(char s[], char d[]) {
int i, j, k;
int len_s = strlen(s);
int len_d = strlen(d);
for (i = 0; i <= len_s - len_d; i++) {
for (j = i, k = 0; k < len_d && s[j] == d[k]; j++, k++);
if (k == len_d) return i;
}
return -1;
}
10.3 统计重复字符
题目内容:
输入一串字符(字符数小于80),以回车表示输入结束,编程计算并输出这串字符中连续重复次数最多的字符和重复次数。如果重复次数最多的字符有两个,则输出最后出现的那一个。
已知函数原型:
//函数功能:统计字符串中连续重复次数最多的字符及其重复的次数
//函数参数:str指向待统计的字符串,指针形参tag返回重复字符最后出现的下标位置
//函数返回值:返回字符重复的次数
int CountRepeatStr(char str[], int *tag);
#include <stdio.h>
int CountRepeatStr(char str[], int *tag) {
int maxCount = 0;
int count = 1;
char maxChar = str[0];
*tag = 0;
for (int i = 1; str[i] != '\0'; i++) {
if (str[i] == str[i-1]) {
count++;
} else {
if (count > maxCount) {
maxCount = count;
maxChar = str[i-1];
*tag = i - 1;
}
count = 1;
}
}
return maxCount;
}
int main() {
char str[80];
printf("Enter a string: ");
scanf("%s", str);
int tag;
int result = CountRepeatStr(str, &tag);
printf("Most repeated character: %c\n", str[tag]);
printf("Number of repetitions: %d\n", result);
return 0;
}
10.4 凯撒密码
题目内容:
凯撒密码是罗马扩张时期朱利斯•凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令,其原理很简单,就是通过将字母表中的字母移动一定位置而实现加密。例如,每个字母按字母表顺序向后移3位,如a加密后变成d,b加密后变成e,……x加密后变成a,y加密后变成b,z加密后变成c。请编写一个程序,将用户从键盘输入的文本字符串(只包含a~z的字符且长度小于100)进行加密后输出。
函数原型:void Caesar(char c[]);
函数功能:计算凯撒密码
#include <stdio.h>
#include <string.h>
void Caesar(char c[]) {
int k = 3; // 移动的位数,这里取3
int i;
int len = strlen(c); // 获取字符串长度
for (i = 0; i < len; i++) {
if (c[i] >= 'a' && c[i] <= 'z') { // 只对小写字母进行加密
c[i] = ((c[i] - 'a' + k) % 26) + 'a'; // 移动并计算新位置
}
}
printf("Encrypted string: %s\n", c);
}
int main() {
char text[100];
printf("Enter text to encrypt (lowercase letters only): ");
scanf("%s", text);
Caesar(text);
return 0;
}
第十一章
11.1 山地训练
题目内容:
为了能在下一次跑步比赛中有好的发挥,小白在一条山路上开始了她的跑步训练。她希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:女孩子独自进山的时间不得超过M秒(1 <= M <= 10,000,000)。假设整条山路划分成T个长度相同的路段(1 <= T <= 100,000),并且小白用si表示第i个路段的路况,用u、f、d这3个字母分别表示第i个路段是上坡、平地、下坡。小白跑完一段上坡路的耗时是U秒(1 <= U <= 100),跑完一段平地的耗时是F秒(1 <= F <= 100),跑完一段下坡路的耗时是D秒(1 <= D <= 100)。注意,沿山路原路返回时,原本是上坡的路段变成了下坡路段,原本是下坡的路段变成了上坡路段。小白想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多少个路段。请你编程帮助她计算。
函数原型:long Fun(long M, long T, long U, long F, long D, char str[]);
函数功能:计算在限时M秒内T个路段的情况下,最多往返可跑的路段数。
参数:M,T,U,F,D分别代表限时、路段数,以及上坡、平地、下坡的耗时
数组str保存整条山路的路段状况
返回值:最多可跑的路段数
程序运行结果示例1:
Input M,T,U,F,D:13 5 3 2 1↙
Input conditions of road:ufudf↙
num=3
程序运行结果示例2:
Input M,T,U,F,D:4000 8 18 10 5↙
Input conditions of road:fuffdfud↙
num=7
进山时间等信息的输入提示: “Input M,T,U,F,D:”
路况输入提示信息: “Input conditions of road:”
进山时间等数据的输入格式: “%ld%ld%ld%ld%ld”
路况等数据的输入格式: “%s”
输出格式: “num=%ld\n”
#include <stdio.h>
#include <string.h>
long Fun(long M, long T, long U, long F, long D, char str[]) {
long time = 0; // 当前跑步所用的时间
long num = 0; // 最多可跑的路段数
for (int i = 0; i < T; i++) {
if (str[i] == 'u' || str[i] == 'd') { // 上坡或下坡
time += U + D;
} else { // 平地
time += 2 * F;
}
if (time <= M) { // 如果当前耗时不超过限制
num++;
} else { // 如果当前耗时超过限制,则不能再继续跑了
break;
}
}
return num;
}
int main() {
long M, T, U, F, D;
char str[100000];
printf("Input M,T,U,F,D:");
scanf("%ld %ld %ld %ld %ld", &M, &T, &U, &F, &D);
printf("Input conditions of road:");
scanf("%s", str);
long num = Fun(M, T, U, F, D, str);
printf("num=%ld\n", num);
return 0;
}
11.2 奇偶数分离
题目内容:
输入n个整数(n从键盘输入,假设n的值不超过100),按奇偶数分成两组并输出。输出两行,第一行为所有奇数,第二行为所有偶数,保持数据的相对顺序与输入顺序相同。
函数原型如下所示:
void Seperate(int a[], int n); //数组a[]存放用户输入的n个整数
解题思路:用两个循环分别输出奇数和偶数,在输出第一个数时用"%d"格式字符,在输出其余数时用",%d"格式字符,用标志变量记录和判断是否是第一个奇数或偶数。
程序运行结果示例1:
Input n:7↙
Input numbers:5 9 47 82 0 6 7↙
5,9,47,7
82,0,6
程序运行结果示例2:
Input n:8↙
Input numbers:-2 3 5 0 23 62 79 83↙
3,5,23,79,83
-2,0,62
输入提示信息: “Input n:”
"Input numbers:"
输入格式: “%d”
每行第一个数据的输出格式:“%d”
每行第二个及以后数据的输出格式:“,%d”
#include <stdio.h>
void Seperate(int a[], int n) {
int oddFlag = 0; // 标志变量,记录是否为第一个奇数
int evenFlag = 0; // 标志变量,记录是否为第一个偶数
printf("Output:\n");
printf("Odd numbers:");
for (int i = 0; i < n; i++) {
if (a[i] % 2 != 0) { // 奇数
if (oddFlag == 0) {
printf("%d", a[i]);
oddFlag = 1;
} else {
printf(",%d", a[i]);
}
}
}
printf("\nEven numbers:");
for (int i = 0; i < n; i++) {
if (a[i] % 2 == 0) { // 偶数
if (evenFlag == 0) {
printf("%d", a[i]);
evenFlag = 1;
} else {
printf(",%d", a[i]);
}
}
}
printf("\n");
}
int main() {
int n;
int a[100];
printf("Input n:");
scanf("%d", &n);
printf("Input numbers:");
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
Seperate(a, n);
return 0;
}
11.3 子串判断
题目内容:从键盘输入两个长度小于80的字符串A和B,且A的长度大于B的长度,编程判断B是不是A的子串,如果是,则输出”Yes”,否则输出”No”。这里所谓的该串的子串是指字符串中任意多个连续的字符组成的子序列。
函数原型:int IsSubString(char a[], char b[]);
函数功能:判断b是否是a的子串,是则返回1,否则返回0
程序运行结果示例1:
Input the first string: Abcdefghijk123↙
Input the second string: 123↙
Yes
程序运行结果示例2:
Input the first string: abefsfl↙
Input the second string: befs↙
Yes
程序运行结果示例3:
Input the first string: aAbde↙
Input the second string: abc↙
No
输入第一个字符串的提示信息: “Input the first string:”
输入第二个字符串的提示信息: “Input the second string:”
输入格式: 用 gets()函数
输出格式:
是子串,输出: “Yes\n”
不是子串,输出: “No\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
#include <stdio.h>
#include <string.h>
int IsSubString(char a[], char b[]) {
int lenA = strlen(a);
int lenB = strlen(b);
for (int i = 0; i <= lenA - lenB; i++) {
int j;
for (j = 0; j < lenB; j++) {
if (a[i + j] != b[j]) {
break;
}
}
if (j == lenB) {
return 1; // 找到子串,返回1
}
}
return 0; // 没有找到子串,返回0
}
int main() {
char a[80], b[80];
printf("Input the first string:");
gets(a);
printf("Input the second string:");
gets(b);
if (IsSubString(a, b)) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
11.4 星期查找
题目内容:
任意输入英文的星期几,通过查找如图所示的星期表,输出其对应的数字,若查到表尾,仍未找到,则输出错误提示信息。
提示:用一个二维字符数组weekDay来存放如图所示的星期表的内容(字符串)。输入待查找的字符串,然后在星期表中顺序查找与输入字符串相匹配的字符串。找到的字符串在星期表数组中的第一维下标(行号)即为题目所求。
程序运行结果示例1:
Please enter a string:
Friday↙
Friday is 5
程序运行结果示例2:
Please enter a string:
Fruday↙
Not found!
输入提示信息:“Please enter a string:\n”
输入格式: 字符串输入采用gets()函数
输出格式:
找到了,输出:“%s is %d\n”
没找到,输出:“Not found!\n”
#include <stdio.h>
#include <string.h>
int main() {
char weekday[7][11] = {"Sunday", "Monday", "Turesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char s[11];
printf("Please enter a string:\n");
gets(s);
for (int i = 0; i < 7; i++) {
if (!strcmp(s, weekday[i])) {
printf("%s is %d\n", weekday[i], i);
return 0;
}
}
printf("Not found!\n");
return 0;
}
第十二章
12.1 计算时间差v2.0
题目内容:
用结构体定义时钟类型,编程从键盘任意输入两个时间(例如4时55分和1时25分),计算并输出这两个时间之间的间隔。要求不输出时间差的负号。结构体类型定义如下:
typedef struct clock
{
int hour;
int minute;
int second;
} CLOCK;
函数原型: CLOCK CalculateTime(CLOCK t1, CLOCK t2);
函数功能:计算并返回两个时间t1和t2之间的差
程序运行结果示例1:
Input time one:(hour,minute):4,55↙
Input time two: (hour,minute):1,25↙
3hour,30minute
程序运行结果示例2:
Input time one:(hour,minute):1,33↙
Input time two: (hour,minute):5,21↙
3hour,48minute
输入提示: “Input time one:(hour,minute):”
"Input time two: (hour,minute):"
输入格式: “%d,%d”
输出格式:“%dhour,%dminute\n”
#include <stdio.h>
typedef struct clock {
int hour;
int minute;
int second;
} CLOCK;
CLOCK CalculateTime(CLOCK t1, CLOCK t2) {
CLOCK diff;
int total_seconds;
// 将时间转换为总秒数计算差值
total_seconds = (t2.hour - t1.hour) * 3600 +
(t2.minute - t1.minute) * 60 +
(t2.second - t1.second);
// 如果差值为负数,取绝对值
if (total_seconds < 0) {
total_seconds = -total_seconds;
}
// 将总秒数转换为时分秒格式
diff.hour = total_seconds / 3600;
diff.minute = (total_seconds % 3600) / 60;
diff.second = total_seconds % 60;
return diff;
}
int main() {
CLOCK t1, t2, diff;
// 从键盘读入两个时间
printf("Enter time 1 (hh:mm:ss):\n");
scanf("%d:%d:%d", &t1.hour, &t1.minute, &t1.second);
printf("Enter time 2 (hh:mm:ss):\n");
scanf("%d:%d:%d", &t2.hour, &t2.minute, &t2.second);
// 计算时间差并输出结果
diff = CalculateTime(t1, t2);
printf("Time difference: %02d:%02d:%02d\n", diff.hour, diff.minute, diff.second);
return 0;
}
12.2 奖学金发放
题目内容:
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,每项奖学金获取的条件分别如下:
-
院士奖学金:期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生每人均可获得8000元;
-
五四奖学金:期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生每人均可获得4000元;
-
成绩优秀奖:期末平均成绩高于90分(>90)的学生每人均可获得2000元;
-
西部奖学金:期末平均成绩高于85分(>85)的西部省份学生每人均可获得1000元;
-
班级贡献奖:班级评议成绩高于80分(>80)的学生干部每人均可获得850元;
只要符合上述条件就可获得相应的奖项,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚明的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。
现在给出若干学生的相关数据(假设总有同学能满足获得奖学金的条件),请编程计算哪些同学获得的奖金总数最高。
结构体类型定义如下:
typedef struct winners
{
char name[20];
int finalScore;
int classScore;
char work;
char west;
int paper;
int scholarship;
} WIN;
函数原型:void Addup(WIN stu[], int n);
函数原型:int FindMax(WIN student[], int n);
程序运行结果示例:
Input n:4↙
Input name:YaoMing↙
Input final score:87↙
Input class score:82↙
Class cadre or not?(Y/N):Y↙
Students from the West or not?(Y/N):N↙
Input the number of published papers:0↙
name:YaoMing,scholarship:4850
Input name:ChenRuiyi↙
Input final score:88↙
Input class score:78↙
Class cadre or not?(Y/N):N↙
Students from the West or not?(Y/N):Y↙
Input the number of published papers:1↙
name:ChenRuiyi,scholarship:9000
Input name:LiXin↙
Input final score:92↙
Input class score:88↙
Class cadre or not?(Y/N):N↙
Students from the West or not?(Y/N):N↙
Input the number of published papers:0↙
name:LiXin,scholarship:6000
Input name:ZhangQin↙
Input final score:83↙
Input class score:87↙
Class cadre or not?(Y/N):Y↙
Students from the West or not?(Y/N):N↙
Input the number of published papers:1↙
name:ZhangQin,scholarship:8850
ChenRuiyi get the highest scholarship 9000
输入学生人数提示:“Input n:”
输入学生姓名提示:“Input name:”
输入学生期末平均成绩提示:“Input final score:”
输入学生班级评议成绩提示:“Input class score:”
输入是否为学生干部提示:“Class cadre or not?(Y/N):”
输入是否为西部学生提示:“Students from the West or not?(Y/N):”
输入发表文章数量提示:“Input the number of published papers:”
输入格式:
输入学生人数:"%d"
输入学生姓名:"%s"
输入学生成绩:"%d"
输入是否为学生干部:" %c" (注意:%c前面有一个空格)
输入是否为西部学生:" %c" (注意:%c前面有一个空格)
输入发表文章数量: "%d"
输出格式:
输出学生获得的奖学金: "name:%s,scholarship:%d\n"
输出获得奖学金总数最高的学生:"%s get the highest scholarship %d\n"
#include <stdio.h>
typedef struct winners
{
char name[20];
int finalScore;
int classScore;
char work;
char west;
int paper;
int scholarship;
} WIN;
void Addup(WIN stu[], int n)
{
for (int i = 0; i < n; i++)
{
if (stu[i].finalScore > 80 && stu[i].paper >= 1)
{
stu[i].scholarship += 8000;
}
if (stu[i].finalScore > 85 && stu[i].classScore > 80)
{
stu[i].scholarship += 4000;
}
if (stu[i].finalScore > 90)
{
stu[i].scholarship += 2000;
}
if (stu[i].finalScore > 85 && stu[i].west == 'Y')
{
stu[i].scholarship += 1000;
}
if (stu[i].classScore > 80 && stu[i].work == 'Y')
{
stu[i].scholarship += 850;
}
}
}
int FindMax(WIN student[], int n)
{
int maxScholarship = 0;
int index = 0;
for (int i = 0; i < n; i++)
{
if (student[i].scholarship > maxScholarship)
{
maxScholarship = student[i].scholarship;
index = i;
}
}
return index;
}
int main()
{
int n;
printf("Input n:");
scanf("%d", &n);
WIN student[n];
for (int i = 0; i < n; i++)
{
printf("Input name:");
scanf("%s", student[i].name);
printf("Input final score:");
scanf("%d", &student[i].finalScore);
printf("Input class score:");
scanf("%d", &student[i].classScore);
printf("Class cadre or not?(Y/N):");
scanf(" %c", &student[i].work);
printf("Students from the West or not?(Y/N):");
scanf(" %c", &student[i].west);
printf("Input the number of published papers:");
scanf("%d", &student[i].paper);
student[i].scholarship = 0;
}
Addup(student, n);
int maxIndex = FindMax(student, n);
printf("%s get the highest scholarship %d\n", student[maxIndex].name, student[maxIndex].scholarship);
return 0;
}
12.3 评选最牛群主v1.0
题目内容:
现在要评选最牛群主,已知有3名最牛群主的候选人(分别是tom,jack和rose),有不超过1000人参与投票,最后要通过投票评选出一名最牛群主,从键盘输入每位参与投票的人的投票结果,即其投票的候选人的名字,请你编程统计并输出每位候选人的得票数,以及得票数最多的候选人的名字。候选人的名字中间不允许出现空格,并且必须小写。若候选人名字输入错误,则按废票处理。
程序运行结果示例1:
Input the number of electorates:8↙
Input vote 1:tom↙
Input vote 2:jack↙
Input vote 3:rose↙
Input vote 4:tom↙
Input vote 5:rose↙
Input vote 6:rose↙
Input vote 7:jack↙
Input vote 8:rose↙
Election results:
tom:2
jack:2
rose:4
rose wins
程序运行结果示例2:
Input the number of electorates:5↙
Input vote 1:tom↙
Input vote 2:mary↙
Input vote 3:rose↙
Input vote 4:jack↙
Input vote 5:tom↙
Election results:
tom:2
jack:1
rose:1
tom wins
提示输入候选人数量:“Input the number of electorates:”
提示输入候选人: “Input vote %d:”
输入格式:
输入候选人数量:"%d"
输入候选人姓名:"%s"
输出格式:
输出候选人得票数:"%s:%d\n"
输出票数最多的候选人姓名:"%s wins\n"
输出评选结果提示信息:“Election results:\n”
#include <stdio.h>
#include <string.h>
#define MAX_CANDIDATES 3
#define MAX_NAME_LENGTH 20
typedef struct {
char name[MAX_NAME_LENGTH];
int votes;
} Candidate;
int main() {
int numCandidates;
printf("Input the number of electorates:");
scanf("%d", &numCandidates);
Candidate candidates[MAX_CANDIDATES];
for (int i = 0; i < numCandidates; i++) {
printf("Input vote %d:", i + 1);
scanf("%s", candidates[i].name);
candidates[i].votes = 0;
}
int numVotes;
printf("\nInput the number of votes:");
scanf("%d", &numVotes);
for (int i = 0; i < numVotes; i++) {
char vote[MAX_NAME_LENGTH];
printf("Input vote %d:", i + 1);
scanf("%s", vote);
for (int j = 0; j < numCandidates; j++) {
if (strcmp(vote, candidates[j].name) == 0) {
candidates[j].votes++;
break;
}
}
}
printf("\nElection results:\n");
int maxVotes = 0;
char winner[MAX_NAME_LENGTH];
for (int i = 0; i < numCandidates; i++) {
printf("%s:%d\n", candidates[i].name, candidates[i].votes);
if (candidates[i].votes > maxVotes) {
maxVotes = candidates[i].votes;
strcpy(winner, candidates[i].name);
}
}
printf("\n%s wins\n", winner);
return 0;
}
12.4 星期判断
题目内容:请输入星期几的第一个字母(不区分大小写)来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母(小写),否则输出“data error”。
程序运行结果示例1:
please input the first letter of someday:
S↙
please input second letter:
u↙
sunday
程序运行结果示例2:
please input the first letter of someday:
F↙
friday
程序运行结果示例2:
please input the first letter of someday:
h↙
data error
第一个字母的输入提示信息:“please input the first letter of someday:\n”
第二个字母的输入提示信息:“please input second letter:\n”
用户输入错误提示信息:“data error\n”
输入格式: " %c" (注意:%c前面有一个空格)
输出格式:
星期一:“monday\n”
星期二:“tuesday\n”
星期三:“wednesday\n”
星期四:“thursday\n”
星期五:“friday\n”
星期六:“saturday\n”
星期日:“sunday\n”
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main() {
char first, second;
printf("please input the first letter of someday:\n");
scanf(" %c", &first);
if (isalpha(first)) {
printf("please input second letter:\n");
scanf(" %c", &second);
if (isalpha(second)) {
if (tolower(first) == 'm' && tolower(second) == 'o') {
printf("monday\n");
} else if (tolower(first) == 't' && tolower(second) == 'u') {
printf("tuesday\n");
} else if (tolower(first) == 'w' && tolower(second) == 'e') {
printf("wednesday\n");
} else if (tolower(first) == 't' && tolower(second) == 'h') {
printf("thursday\n");
} else if (tolower(first) == 'f' && tolower(second) == 'r') {
printf("friday\n");
} else if (tolower(first) == 's' && tolower(second) == 'a') {
printf("saturday\n");
} else if (tolower(first) == 's' && tolower(second) == 'u') {
printf("sunday\n");
} else {
printf("data error\n");
}
} else {
printf("data error\n");
}
} else {
printf("data error\n");
}
return 0;
}