C语言程序设计精髓习题总汇(上)

文章目录

    • 第一章 认识变量和常量
          • 1.1 hello world!
          • 1.2 在屏幕上输出多行信息
          • 1.3 计算半圆弧长以及半圆的面积
          • 1.4 计算长方形体积
    • 第二章 计算
          • 2.1 输出逆序数
          • 2.2 计算总分和平均数
          • 2.3 存款利率计算器V1.0
          • 2.4 数位拆分v1.0
          • 2.5 求正/负余数
          • 2.6 身高预测
          • 2.7 求一元二次方程的根
    • 第三章 输入输出
          • 3.1 日期显示
          • 3.2 产品信息格式化
          • 3.3 计算两个数的平方和
          • 3.4 逆序数的拆分计算
          • 3.5 拆分英文名
          • 3.6 计算体指数
          • 3.7 学分绩计算
          • 3.8 一尺之锤,日取其半
          • 3.9 网购打折商品V1.0
          • 3.10 计算时间差V1.0
    • 第四章 选择
          • 4.1 检测用户错误输入
          • 4.2 闰年判断
          • 4.3 程序改错
          • 4.4 字符类型判断
          • 4.5 快递费用计算
          • 4.6 数位拆分v2.0
          • 4.7 出租车计价
          • 4.8 数据区间判断
          • 4.9 计算一元二次方程的根v2.0
          • 4.10 分数比较
          • 4.11 存款利率计算器v2.0
          • 4.12 博弈论之Best Response
    • 第五章 循环
          • 5.1 判断一个整型数据有几位v2.0
          • 5.2 奖金计算
          • 5.3 程序修改—1
          • 5.4 程序修改—2
          • 5.5 程序改错—1
          • 5.6 程序改错—2
          • 5.7 程序改错—3
          • 5.8 猴子吃桃程序_扩展1
          • 5.9 猴子吃桃程序_扩展2
          • 5.10 6位密码输入检测
          • 5.11 判断一个整型数据有几位
          • 5.12 检测输入数据中奇数和偶数的个数
          • 5.13 计算球的反弹高度
          • 5.14 马克思手稿中的趣味数学题
          • 5.15 猜神童年龄
          • 5.16 闰年相关的问题v3.0——计算有多少闰年
          • 5.17 闰年相关的问题v4.0——计算心跳数
    • 第六章 函数
          • 6.1绘制金字塔
          • 6.2循环嵌套的应用
          • 6.3利用泰勒级数计算sinx的值
          • 6.4计算100~200之间的所有素数之和
          • 6.5编程实现一个输入指定范围内的整数的函数
          • 6.6程序改错v2.0
          • 6.7编程计算a+aa+aaa+…+aa…a(n个a)的值
          • 6.8搬砖问题
          • 6.9编程输出某年某月有多少天(考虑到闰年)
          • 6.10计算阶乘的和v2.0
          • 6.11计算最大的三位约数
          • 6.12孔融分梨
          • 6.13素数求和

第一章 认识变量和常量

1.1 hello world!

题目内容:使用printf()屏幕上输出hello world!

#include 
int main()
{
  printf(“hello world!\n”);
  return 0;
}
1.2 在屏幕上输出多行信息

题目内容:使用printf()函数在屏幕上输出多行信息:
hello world!
hello hit!
Hello everyone!

#include 
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
#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
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
#include
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 
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
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
#include 
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
#include 
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
int main()
{
    printf("negative: %d\n",-11%5);
    printf("positive: %d\n",-11%5+5);
    return 0;
}

2.6 身高预测

题目内容:已知小明(男孩)爸爸的身高是175厘米,妈妈的身高是162厘米。小红(女孩)爸爸的身高是169厘米,妈妈的身高是153厘米,按照下面公式,预测并输出小明和小红的遗传身高(不考虑后天因素)。

#include
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 求一元二次方程的根

C语言程序设计精髓习题总汇(上)_第1张图片

#include
#include
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
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
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
#include
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
#include
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
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
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
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
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
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
#include
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
#include
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 
#include 
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   
 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
       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
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 
#include 
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
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
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

#include
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
#include
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 
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
#include
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
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 
#include 
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 
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  
  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 
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  
  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 
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 
  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 
  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 
   #include 
   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 
#include 
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 
  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                           
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 
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 
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 
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 
#include 
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 
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 
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 
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   
#include   
#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 
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 
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 
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 
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 
#include 
#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 
#include 
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 
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
   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 
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 
#include 

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

#include 
int main()
{
	int n, men, women, children, y, z;
	printf("Input n(27);
	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 
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 
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 
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 
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 
#include 
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;
}

你可能感兴趣的:(C语言程序设计精髓习题总汇(上))