1.编写程序,找出用户输入的一串数中的最大数。程序需要提示用户一个一个地输入数。当用户
输入0或负数时,程序必须显示出已输入的最大非负数:
Enter a number: 60
Enter a number: 38.3
Enter a number: 4.89
Enter a number: 100.62
Enter a number: 75.2295
Enter a number: 0
The largest number entered was 100.62
注意,输入的数不一定是整数。
#include<stdio.h>
int main()
{
float a=0,b=0;
for (a=1;a>0;b=b>a?b:a)
{
printf("Enter a number: ");
scanf("%f",&a);
if(a<=0)
break;
}
printf("\n\nThe largest number entered was %g",b);
return 0;
}
2.编写程序,要求用户输入两个整数,然后计算并显示这两个整数的最大公约数(GCD):
Enter two integers: 12 28
Greatest common divisor: 4
提示:求最大公约数的经典算法是Euclid算法,方法如下。分别让变量m和m存储两个数的值,如果n为0,那么停止操作,m中的值是GCD;否则计算m除以n的余数,把n保存到m中,并把余数保存到n中。然后重复上述过程,每次都先判定n是否为0。
#include<stdio.h>
int main()
{
int m,n,a;
printf("Enter two integers: ");
scanf("%d %d",&m,&n);
while(n!=0)
{
a=m%n;
m=n;
n=a;
}
printf("Greatest common divisor: %d",m);
return 0;
}
3.编写程序,要求用户输入一个分数,然后将其约分为最简分式:
Enter a fraction: 6/12
In lowest terms: 1/2
提示:为了把分数约分为最简分式,首先计算分子和分母的最大公约数,然后分子和分母都除
以最大公约数。
#include<stdio.h>
int main()
{
int m,n,a,b,c;
printf("Enter a fraction: ");
scanf("%d/%d",&m,&n);
a=m;
b=n;
while(n!=0){
c=m%n;
m=n;
n=c;
}
a=a/m;
b=b/m;
printf("In lowest terms: %d/%d",a,b);
return 0;
}
4.在5.2节的 broker.c 程序中添加循环,以便用户可以输入多笔交易并且程序可以计算每次的佣
金。程序在用户输入的交易额为0时终止。
Enter value of trade: 30000
Commission: $166.00
Enter value of trade: 20000
Commission: $144.00
Enter value of trade: 0
#include <stdio.h>
int main()
{
float commission, value;
printf("Enter value of trade: ");
scanf("%f", &value);
while(value!=0)
{
if (value < 2500.00f)
commission = 30.00f+ .017f * value;
else if (value < 6250.00f)
commission = 56.00f + .0066f * value;
else if (value < 20000.00f)
commission = 76.00f + .0034f * value;
else if (value < 50000.00f)
commission = 100.00f + .0022f * value;
else if (value < 500000.00f)
commission = 155.00f + .0011f * value;
else
commission = 255.00f +.0009f * value;
if (commission < 39.00f)
commission = 39.00f;
printf("Commission:$%.2f", commission);
printf("\n\nEnter value of trade: ");
scanf("%f", &value);
}
return 0;
}
5.第4章的编程题1要求编写程序显示出两位数的逆序。设计一个更具一般性的程序,可以处理一位、两位、三位或者更多位的数。提示:使用do循环将输入的数重复除以10,直到值达到0为止。
#include<stdio.h>
int main()
{
int n=0;
printf("Enter a number: ");
scanf("%d",&n);
printf("The reversal is: ");
do{
printf("%d",n%10);
n/=10;
}while(n!=0);
return 0;
}
06.编写程序,提示用户输人一个数n,然后显示出 1~n的所有偶数平方值。例如,用户输入
100,那么程序应该显示出下列内容:
4
16
36
64
100
#include<stdio.h>
int main()
{
int n;
printf ("Enter a number: ");
scanf("%d",&n);
for( int a=2; a<=n ; a+=2)
{
printf("%d\n",a*a);
}
return 0;
}
7.重新安排程序 square3.c,在for 循环中对变量主进行初始化、判定以及自增操作。不需要重写
程序,特别是不要使用任何乘法。
#include<stdio.h>
int main()
{
int n;
printf("This program prints an table of squares.\n");
printf("Enter number of enries in table: ");
scanf("%d",&n);
for(int i=1,odd=3,square=1;i<=n;i++,square+=odd,odd+=2)
{
printf("%10d%10d\n",i,square);
}
return 0;
}
8.编写程序显示单月的日历。用户指定这个月的天数和该月起始日是星期几:
Enter number of days in month: 31
Enter starting day of the week (1=Sun, 7=Sat): 3
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
提示:此程序不像看上去那么难。最重要的部分是一个使用变量 i 从1计数到n的for语句(这里 n 是此月的天数),for 语句中需要显示 i 的每个值。在循环中,用if语句判定 i 是否是一个星期的最后一天,如果是,就显示一个换行符。
#include<stdio.h>
int main()
{
int day,week;
printf("Enter number of days in month: ");
scanf("%d",&day);
printf("Enter starting day of week (1=Sun, 7=Sat): ");
scanf("%d",&week);
for(int a=1;a<week;a++)
{
printf(" ");
}
for(int i=1,b=week;i<=day;i++,b=i+week-1)
{
printf("%3d",i);
if(b%7==0)printf("\n");
}
return 0;
}
9.第2章的编程题8要求编程计算第一、第二、第三个月还贷后剩余的贷款金额。修改该程序,
要求用户输入还贷的次数并显示每次还贷后剩余的贷款金额。
#include<stdio.h>
int main()
{
float loan=0,rate=0,pay=0;
int times;
printf("Enter amount of loan: ");
scanf("%f",&loan);
printf("Enter interest rare: ");
scanf("%f",&rate);
printf("Enter monthy payment: ");
scanf("%f",&pay);
printf("Enter payment month: ");
scanf("%d",×);
float money_rate=rate/1200;
for(int i=1;i<=times;i++)
{
loan=loan-pay+loan*money_rate;
printf("Balance remaining after %d payment: %0.2f\n",i,loan);
}
return 0;
}
10、第5章的编程题9要求编写程序判断哪个日期更早。泛化该程序,使用户可以输入任意一个日
期。用 0/0/0 指示输入结束,不再输入日期。
Enter a date (mm/dd/yy): 3/6/08
Enter a date (mm/dd/yy): 5/17/07
Enter a date (mm/dd/yy): 6/3/07
Enter a date (mm/dd/yy): 0/0/0
5/17/07 is the earliest date
#include<stdio.h>
int main()
{
int m,d,y;
printf("Enter a date (mm/dd/yy): ");
scanf("%d/%d/%d",&m,&d,&y);
for(int m1,d1,y1;m1!=0||d1!=0||y1!=0; )
{
printf("Enter a date (mm/dd/yy): ");
scanf("%d/%d/%d",&m1,&d1,&y1);
if(m1==0&&d1==0&&y1==0)
break;
if(y1<y||(y1==y&&m1<m)||(y==y1&&m==m1&&d1<d))
m=m1,d=d1,y=y1;
}
printf("%d/%d/%02d is earliest date ",m,d,y);
return 0;
}
11.数学常量e的值可以用一个无穷级数表示:
e=1+1/1!+1/2!+1/3!+…
编写程序,用下面的公式计算e的近似值:
1+1/1!+1/2!+1/3!+…+1/n!
这里 n 是用户输入的整数。
#include<stdio.h>
int main()
{
int n;
float e=1.0f,a=1;
printf("Enter a number: ");
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
a*=i;
e+=1.0f/a;
}
printf("e=%f",e);
return 0;
}
12.修改编程题11,使得程序持续执行加法运算,直到当前项小于 ε 为止,其中 ε 是用户输人的较
小的(浮点)数。
#include<stdio.h>
int main()
{
float e=1.0f,a=1,n=0;
printf("Enter a number: ");
scanf("%f",&n);
for(int i=1;e<n;i++)
{
a*=i;
e+=1.0f/a;
if(e>=n)
{
e-=1.0f/a;
break;
}
}
printf("e=%f",e);
return 0;
}