C语言学习笔记——谭浩强《C程序设计》例题练习+补充练习

1.1要求在屏幕上输出“This is a C program.”

#include<stdio.h>
int main()                         //int main后面忘记加()
{
printf("This is a C program.\n");      //换行是\n,在(“ “)里面,忘了加”;”
return 0;                         //忘写return 0;
}

1.2求两个整数之和,求123和456的和

#include<stdio.h>
int a,b,sum;
int main()
{
a=123;
b=456;
sum=a+b;
printf("the sum is:%d\n",sum);        //%d不能少,否则结果出不来,见1.2.1。输出,(“”,sum)中,sum前面不能加%
return 0;
}

1.3求两个整数中的较大者
方法一:

#include<stdio.h>
int a,b,c;
int main()
{
scanf("%d,%d",&a,&b);
if(a>=b)
c=a;
else
c=b;
printf("%d",c);
return c;
}
//不知道为什么没有用

方法二:

#include<stdio.h>
int main()
{
int max(int x,int y);
int a,b,c;
scanf("%d.%d",&a,&b);
c=max(a,b);
printf("max=%d\n",c);
return 0;                 //main函数中return语句指定的返回值一般为0
}
int max(int x,int y)
{
int z;
if(x>y)z=x;
else z=y;
return(z);             //只有通过return语句才能把求出的z值作为函数的值并返回调用他的main函数中(第8行)。不要以为在max函数中求出最大值z后就会自动的作为函数值返回调用处
}                    //不知道为啥,还是没有用

2.1求12345
方法一

#include<stdio.h>
int main()
{
int s,i;
s=1;
for(i=2;i<=5;i++)           //for循环后面不要加;,()里面用;隔开
s=s*i;
printf("%d",s);
}

方法二:

#include<stdio.h>
int main()
{
int s,i;
s=1;
i=2;
while(i<=5)
{
 s=s*i;
 i=i+1;
}
printf("%d",s);
}

2.19求多项式1-1/2+1/3-1/4…+1/99-1/100
方法一:
(1)错误示范

#include<stdio.h>
int main()
{
int sign=1,demo;        //当分母定义为整形时,结果为1,结果不准确
double term,sum=1;
for(demo=2;demo<=100;demo++)
{
sign=-1*sign;
term=sign/demo;
sum=sum+term;
}
printf("%f",sum);
}

(2)正确示范

#include<stdio.h>
int main()
{
int sign=1;
double demo,term,sum=1;               //分母demo要定义为双精度型
for(demo=2;demo<=100;demo++)
{
sign=-sign;
term=sign/demo;
sum=sum+term;
}
printf("%f\n",sum);
return 0;
}

方法二:

#include<stdio.h>
int main()
{
int sign=1;
double deno=2.0,sum=1.0,term;
while(deno<=100)
{
	sign=-sign;
	term=sign/deno;
	sum=sum+term;
	deno=deno+1;
}
printf("%f\n",sum);
return 0;
}

3.1有人用温度计测量出永华事法表示的温度(如64°F),今要求把它转换为亦设事发表示的温度(如17.8°C)。

#include<stdio.h>
int main()
{
float f,c;
scanf("%f",&f);
c=(5.0/9)*(f-32);           //用5.0才能得出正确结果。直接用5的话结果就是错误的
printf("%f\n",c);
}

3.2计算存款利息。有1000元,想存一年。有3种方法可选:(1)活期,年利率为r1,0.0036;(2)一年期定期,年利率为r2,0.0225;(3)存两次半年定期,年利率为r3,0.0198;请分别计算出一年后按3种方法所得到的本息和。

#include<stdio.h>
int main()
{
float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3;
p1=p0*(1+r1);
p2=p0*(1+r2);
p3=p0+p0/2*r3*2;
printf("%f\n%f\n%f\n",p1,p2,p3);
}

3.3给定一个大写字母,要求要小写字母输出

#include<stdio.h>
int main()
{
char a,b;
scanf("%c",&a);
b=a+32;
printf("%c\n",b);
return 0;
}

3.4给出三角形的三边长,求三角形面积
错误示范:

#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,s,area;
scanf("%f%f%f",&a,&b,&c);
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%f\n",area);
return 0;
}                               //没有考虑a,b,c的范围,导致运行结果出错   ---178

正确示范:

#include<stdio.h>
#include<math.h>
void main()
{
float a,b,c,p;
double s;
printf("please input a,b and c:");
scanf("%f%f%f",&a,&b,&c);
if(a+b>c && a+c>b && b+c>a)
{
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("the areas is:%f",s);
}
else
printf ("the line is error\n");
}                                                               ---194

例题示范:

#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,s,area;
a=3.67;
b=5.43;
c=6.21;
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("a=%f\tb=%f\tc=%f\n",a,b,c);
printf("area=%f\n",area);
return 0;
}                                                                   ---208

3.5求ax^2+bx+c=0方程的根。a,b,c由键盘输入,设b62-4ac>0
正确示范;
注意要考虑超出范围错误的情况

#include<stdio.h>
#include<math.h>
void main()
{
float a,b,c,x;
double x1,x2;
printf("please inputa,b,c:");
scanf("%f%f%f",&a,&b,&c);
if(a==0)
{x=-c/b;
printf("x=%f\n",x);
}
else
if((b*b-4*a*c)>=0)
{x1=((-b)+sqrt(b*b-4*a*c))/(2*a);
x2=((-b)-sqrt(b*b-4*a*c))/(2*a);
printf("x1=%f\nx2=%f\n",x1,x2);}
else
printf("no answer\n");
}                                                                ---228

例题示范:

#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,disc,x1,x2,p,q;
scanf("%1f%1f%1f",&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;
x2=p-q;
printf("x1=%7.2f\nx2=%7.2f\n",x1,x2);         //7.2表示指定数据占七列,其中小数占两列
return 0;
}                                       //按照书上敲出来运行有问题       ---242

3.6用%f输出实数,只能得到6位小数。

#include<stdio.h>
int main()
{
double a=1.0;         //a是双精度型
printf("%f\n",a/3);       //a/3也是双精度性,但是用%f格式声明只能输出6位小数
}                                                                   ---248

补充:用%f输出实数,得到15位小数。

#include<stdio.h>
int main()
{
double a=1.0;
printf("%20.15f\n",a/3);
}
#include<stdio.h>
int main()
{
double a=1.0;
printf("%16.15f\n",a/3);
}

3.7float型数据的有效位数

#include<stdio.h>
int main()
{
float a;               //fliat型数据只能保证6-7位有效数字
a=10000/3.0;         //因此从左面开始的第7位数字(即第三位小数)以后的数字不保证正确
printf("%f\n",a);       
return 0;
}

补充:

#include<stdio.h>
int main()
{
double a;            //将float改成double
a=10000/3.0;   
printf("%f\n",a);        //由于%f,得到6位小数
return 0;
}

3.8先后输出BOY三个字符

#include<stdio.h>
int main()
{
char a='B',b='O',c='Y';
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
return 0;
}

补充,用ASCII码表示BOY

#include<stdio.h>
int main()
{
int a=66,b=79,c=89;
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
return 0;
}
---296

补充练手

  1. 输入三角形的三边长,求三角形面积。
#include<stdio.h>
#include<math.h>
void main()
{
float a,b,c,p;
double s;
printf("please input a,b and c:");
scanf("%f%f%f",&a,&b,&c);
if(a+b>c && a+c>b && b+c>a)
{
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("the areas is:%f",s);
}
else
printf ("the line is error\n");
}

从键盘输入一个大写字母/小写字母,要求改用小写/大写字母输入。

#include<stdio.h>
void main()
{
char a;
printf("please input a word:");
scanf ("%c",&a);
if(a>='A' && a<='Z')
a=a+32;
else
if(a>='a' && a<='z')
a=a-32;
printf("%c\n",a);
}

求解ax^2+bx+c=0方程的解

#include<stdio.h>
#include<math.h>
void main()
{
	float a,b,c,x;
	double x1,x2;
	printf("please inputa,b,c:");
	scanf("%f%f%f",&a,&b,&c);
	if(a==0)
	{x=-c/b;
     printf("x=%f\n",x);
	}
	else
		if((b*b-4*a*c)>=0)
		{x1=((-b)+sqrt(b*b-4*a*c))/(2*a);
		x2=((-b)-sqrt(b*b-4*a*c))/(2*a);
		printf("x1=%f\nx2=%f\n",x1,x2);}
else
printf("no answer\n");
}

根据输入年、月,判断该月有多少天

#include<stdio.h>
#include<math.h>
int main()
{
 int year,month;
 printf("please input year,month:");
 scanf("%i%i",&year,&month);
 if((year%4 == 0 && year%100!=0)||year%400==0)
 {
 switch(month)
 {
 case 2:printf("29\n");break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:printf("31\n");break;
case 4:
case 6:
case 9:
case 11:printf("30\n");break;

 }
 }
 else
 {
switch(month)
{
 case 2:printf("28\n");break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:printf("31\n");break;
case 4:
case 6:
case 9:
case 11:printf("30\n");break;
}
 }
 
}                                                                   ---390

输出所有“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于数的本身。

#include<stdio.h>
#include<math.h>
int main()
{
int s;
for(s=100;s<=999;s++)
{
if(s==(s%10)*(s%10)*(s%10)+(((s%100)-(s%10))/10)*(((s%100)-(s%10))/10)*(((s%100)-(s%10))/10)+((s-(s%100))/100)*((s-(s%100))/100)*((s-(s%100))/100))
printf("the figures are:%i\n",s);
}
}                                                                             ---402

两乒乓球队进行比赛,各处三人。甲队为A,B,C三人,乙队为X,Y,Z三。以抽签决定比赛名单。有人向队员打听比赛名单,A说他不和X比,C说他不和X,Z比,请编程找出3赛手的名单

#include<stdio.h>
void main()
{
char i,j,k;//i是A的对手,j是B的对手,k是C的对手
for (i = 'X'; i <= 'Z'; i++)
{
for (j = 'X'; j <= 'Z'; j++)
{
if (j!=i)
{
for (k = 'X'; k <= 'Z'; k++)
{
if (k != i&&k!= j)
{
if (i != 'X'&&k != 'X'&&k != 'Z')
{
printf("A--%c\nB--%c\nC--%c\n", i, j, k);
}
}
}
}
}
}
}                                                                     ----426

设有两个矩阵A、B,编写一程序求该矩阵的成绩

#include<stdio.h>
 #include<stdlib.h>
 #define M 100
 int main(void)
 {
     int i,j,k,matrix1[M][M],matrix2[M][M],row1,col1,row2,col2,matrix[M][M];   
     /*为需要相乘的两个矩阵赋值:*/ 
     printf("输入第一个矩阵的行数和列数:"); 
     scanf("%d%d",&row1,&col1);
     printf("输入第一个矩阵:\n");
     for(i=0;i<row1;i++){
         for(j=0;j<col1;j++){
             scanf("%d",&matrix1[i][j]); 
         } 
     } 
     printf("输入第二个矩阵的行数和列数:");
     scanf("%d%d",&row2,&col2);
     printf("输入第二个矩阵:\n");
     for(i=0;i<row2;i++){
         for(j=0;j<col2;j++){
             scanf("%d",&matrix2[i][j]); 
         } 
     }
     /*初始化matrix:*/
     for(i=0;i<row1;i++){
         for(j=0;j<col2;j++){
             matrix[i][j]=0; 
         } 
     } 
     
     if(col1!=row2){
         fprintf(stderr,"enput error!");
         exit(EXIT_FAILURE); 
     } 
     printf("The result:\n"); 
     for(i=0;i<row1;i++){
         for(j=0;j<col2;j++){
             for(k=0;k<col1;k++){
                 matrix[i][j]=matrix[i][j]+matrix1[i][k]*matrix2[k][j]; 
             } 
         } 
     }
 
     for(i=0;i<row1;i++){
         for(j=0;j<col2;j++){
             printf("%d ",matrix[i][j]); 
         } 
         printf("\n"); 
     } 
     return 0;
}                                                                      ---526

输入年、月、日,计算该天是这一年的第多少天

#include<stdio.h>
void main()
{ 
int plus(int year,int month,int day);
int year,month,day,sum;
printf("please input year,month,day:");
scanf("%d%d%d",&year,&month,&day);
sum=fun(year,month,day);
printf("%d",sum);
}
int plus(int year,int month,int day)
{
int sum,i;
int a[2][12]={{31,29,31,30,31,30,31,31,30,31,30,31},{ 31,28,31,30,31,30,31,31,30,31,30,31}};
if(year%4==0&&year%100!=0||year%400==0)
{
sum=0;
for(i=0;i<month-1;i++)
{
sum=sum+a[0][i];
}
sum=sum+day;
}
else
{
sum=0;
for(i=0;i<month-1;i++)
{
sum=sum+a[1][i];
}
sum=sum+day;
}
return(sum);
}                                                             ---560

用函数实现1!+2!+3!+……+N!

#include<stdio.h>
int main()
{
int fac(int);
int sum,n,i;
sum=0;
printf("please input N:");
scanf("%d",&n);
for(i=n;i>0;i--)
{	
sum=sum+fac(i);
}
printf("%d",sum);
}

int fac(int n)
{
int sum;
if(n==1)
{
sum=1;
}
else
{
sum=fac(n-1)*n;
}
return(sum);
}                                                             ---587

用函数实现对N个数进行排序

#include <stdio.h>
#include<stdlib.h>
int main()
{ 
int fun(int [10]);
int i,a[10];
printf("排序前的顺序:");
for(i=0;i<10;i++)
{
a[i]=rand()%101;
printf("%d ",a[i]);
}
fun(a);
printf("排序后的顺序:");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
int fun(int arr[10])
{
int i,j,temp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
return 0;      
}                                                           ---627

输入3个整数,按由小到大的顺序输出

#include<stdio.h>
int main()
{
int a,b,c,*p1,*p2,*p3,p;
printf("please input three numbers:");
scanf("%d%d%d",&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
if(a>b)
{p=*p1;
*p1=*p2;
*p2=p;}
if(a>c)
{p=*p1;
*p1=*p3;
*p3=p;}
if(b>c)
{p=*p2;
*p2=*p3;
*p3=p;}
printf("%d %d %d",a,b,c);
}                                                             ---650

写一函数,将一个3*3整数矩阵转置

#include<stdio.h>
#include<stdlib.h>
int main()
{
void convert(int[3][3]);
int a[3][3],i,j;
printf("please input a matrix:");
printf("\n");
for(i=0;i<3;i++)
   for(j=0;j<3;j++)
   {
	   a[i][j]=rand()%101;
	   printf("%d ",a[i][j]);
   if(j==2)
   printf("\n");
   }
printf("\n");
printf("please input a conver matrix:");
printf("\n");
convert(a);
for(i=0;i<3;i++)
   for(j=0;j<3;j++)
   {
	  printf("%d ",a[i][j]);
   if(j==2)
   printf("\n");
   }
}

void convert(int arr[3][3])
{
int t;
t=arr[0][1];arr[0][1]=arr[1][0];arr[1][0]=t;
t=arr[0][2];arr[0][2]=arr[2][0];arr[2][0]=t;
t=arr[1][2];arr[1][2]=arr[2][1];arr[2][1]=t;   
}                                                          ---685

有一个班N个学生,5门课程。求第1门课的平均分;找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩和平均分;找出平均成绩在90以上或全部课程成绩在85分以上的学生

#include<stdio.h>
struct student
{
int num;
char name[20];
float score[5];
float aver;
};
int main()
{
void input(struct student stu[]);
struct student 2bujige(struct student stu[]);
struct student  youxiu(struct student stu[]);
struct student stu[3],*p=stu;
input(p);
 2bujige(p);
 youxiu(p);

}

void input(struct student stu[])
{
int i;
   printf("请输入各位学生的信息:学号、姓名、五门课成绩:\n");
     for(i=0;i<3;i++)
	 {
		 scanf("%d%s%f%f%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],
			 &stu[i].score[1],&stu[i].score[2],&stu[i].score[3],&stu[i].score[4]);
		 stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3]+stu[i].score[4])/5;
		 printf("\n");
	 }
	 
}

struct student  2bujige(struct student stu[])
{
int i,j;
printf("两门以上课程不及格的:\n");
  for(i=0;i<3;i++)
  {   
	  int count=0;
     for(j=0;j<5;j++)
	 {
	 if(stu[i].score[j]<60)
	 { count++;
	    if(count>2)
		 printf("学号:%d\n姓名:%s\n五门课成绩:%5.lf,%5.lf,%5.lf,%5.lf,%5.lf\n平均成绩: %6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4],stu[i].aver);
	 }  
	 }
  }
}

struct student  youxiu(struct student stu[])
{
	int i;
	  printf("平均成绩90以上或者全部课程85以上的:\n");
       for(i=0;i<3;i++)
	{
	     if(stu[i].aver>90||stu[i].score[0]>85&&stu[i].score[1]>85&&stu[i].score[2]>85&&stu[i].score[3]>85&&stu[i].score[4]>85)
           printf("学号:%d\n姓名:%s\n五门课成绩:%5.lf,%5.lf,%5.lf,%5.lf,%5.lf\n平均成绩:%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4],stu[i].aver);
	          printf("\n");
	}
}                                                                  ---743

利用结构体知识,分析以下问题。
某班级有N个学生,本学期选修5门课程,每个学生信息包括:学号,姓名,出生日期,成绩。要求:1、根据学生总分,对成绩排序,输出学生信息;2、统计班级不及格人、门次数,将其输出。

#include<stdio.h>
#define N 3
struct Student
{int num;
char name[20];
float score[3];
double aver;
};

int main()
{void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu);
struct Student stu[N],*p=stu;
input(p);
print(max(p));
return 0;
}

void input(struct Student stu[])
{int i;
printf("请输入各学生的信息:学号、姓名、3门课成绩:\n");
for(i=0;i<N;i++)
{scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
}

struct Student max(struct Student stu[])
{int i,m=0;
for(i=0;i<N;i++)
if(stu[i].aver>stu[m].aver)m=i;
return stu[m];
}

void print(struct Student stud)
{printf("\n成绩最高的学生是:\n");
printf("学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.aver);
}                                                           ---778

3.10改写例3.3,使之可以适用于任何大写字母,把它转换位小写字母,然后用putchar函数输出该小写字母

#include<stdio.h>
int main()
{
char c1,c2;
c1=getchar();
c2=c1+32;
putchar(c2);
putchar('\n');
return 0;
}

4.1在例3.5的基础上对程序进行改进。题目要求解得ax2+bx+c=0方程的根。由键盘输入a,b,c.假设a,b,c的值任意,并不保证b2-4ac>=0.需要在程序中进行判别,如果b2-4ac>=0,就计算并输出方程的两个实根,如果b2-4ac<0.就输出“此方程无实根”的信息

#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,disc,x1,x2,p,q;
scanf("%1f%1f%1f",&a,&b,&c);
disc=b*b-4*a*c;
if(disc<0)
printf("This equation hasn't real roots\n");
else
{
p=-b/(2.0 *a);
q=sqrt(disc)/(2.0*a);
x1=p+q;x2=p-q;
printf("real roots:\nx1=%7.2f\nx2=%7.2f\n",x1,x2);
}
return 0;
}

4.2输入两个师叔,按由小到大的顺序输出这两个数

#include<stdio.h>
int main()
{
float a,b,t;
scanf("%f%f",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("%5.2f,%5.2f\n",a,b);
return 0;
}

4.3输入3个数a,b,c,要求按从小到大的顺序输出

#include<stdio.h>
int main()
{
float a,b,c,t;
scanf("%f%f%f",&a,&b,&c);
if(a>b)
{
	t=a;
	a=b;
	b=t;
}
if(a>c)
{
	t=a;
	a=c;
	c=t;
}
if(b>c)
{
t=b;
b=c;
c=t;
}
printf("%5.2f,%5.2f,%5.2f\n",a,b,c);
return 0;
}

4.4输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。

#include<stdio.h>
int main()
{
char ch;
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
printf("%c\n",ch);
return 0;
}

4.5有一阶跃函数y={-1(x<0);0(x=0);1(x>0),编译程序,输入一个x值,要求输出相应的y值。

#include<stdio.h>
int main()
{
int x,y;
scanf("%d",&x);
if(x<0)
y=-1;
else
if(x==0)y=0;
else y=1;
printf("x=%d,y=%d\n",x,y);
return 0;
}

4.6要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70-84分,C等为60-69分,D等为60分以下。成绩的等级由键盘输入。

#include<stdio.h>
int main()
{
char grade;
scanf("%c",&grade);
printf("Your score:");
switch(grade)
{
case'A':printf("85-100\n");break;
case'B':printf("70-84\n");break;
case'C':printf("60-69\n");break;
case'D':printf("<60\n");break;
default:printf("enter data error!\n");
}
return 0;
}

4.7用switch语句处理菜单命令。在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个’A’或’a’字符,就会执行A操作,输入一个‘B’或’b’字符,就会执行B操作。可以按照以下思路编写程序。

#include<stdio.h>
int main()
{
void action1(int,int),action2(int,int);
char ch;
int a=15,b=23;
ch=getchar();
switch(ch)
{
case'a':
case'A':action1(a,b);break;
case'b':
case'B':action2(a,b);break;
default:putchar('\a');
}
return 0;
}
void action1(int x,int y)
{
printf("x+y=%d\n",x+y);
}
void action2(int x,int y)
{
printf("x*y=%d\n",x*y);
}

4.8写一程序,判断某一年是否为闰年。

#include<stdio.h>
int main()
{
int year,leap;
printf("enter year:");
scanf("%d",&year);
if(year%4==0)
{
	if(year%100==0)
	{
		if(year%400==0)
			leap=1;
		else
			leap=0;
	}
	else
		leap=1;
}
else
leap=0;
if(leap)
printf("%d is",year);
printf("a leap year.\n");
return 0;
}

4.9求ax^2+bx+c=0方程的解

#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,disc,x1,x2,realpart,imagpart;
scanf("%1f%1f%1f",&a,&b,&c);
printf("the equation");
if(fabs(a)<=1e-6)
printf("is not a quadratic\n");
else
{
	disc=b*b-4*a*c;
	if(fabs(disc)<=1e-6)
		printf("has two equal roots:%8.4f\n",-b/(2*a));
	else
		if(disc>1e-6)
		{
			x1=(-b+sqrt(disc))/(2*a);
			x2=(-b-sqrt(disc))/(2*a);
			printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);
		}
		else
		{
			realpart=-b/(2*a);
			imagpart=sqrt(-disc)/(2*a);
            printf("has complex roots:\n");
			printf("%8.4f+%8.4fi\n",realpart,imagpart);
			printf("%8.4f-%8.4fi\n",realpart,imagpart);
		}
}
return 0;
}

4.10运输公司对用户计算运输费用。路程越远,运费越低。标准如下。
S<250 没有折扣
250<=s<500 2%折扣
500<=s<1000 5%折扣
1000<=s<2000 8%折扣
2000<=s<3000 10%折扣
3000<=s 15%折扣

#include<stdio.h>
int main()
{
int c,s;
float p,w,d,f;
printf("please enter price,weight,discount:");
scanf("%f%f%d",&p,&w,&s);
if(s>=3000) c=12;
else c=s/250;
switch(c)
{
case0:d=0;break;
case1:d=2;break;
case2:
case3:d=5;break;
case4:
case5:
case6:
case7:d=8;break;
case8:
case9:
case10:
case11:d=10;break;
case12:d=15;break;
}
f=p*w*s*(1-d/100);
printf("freight=%10.2f\n",f);
return 0;
}

5.1求1+2+3+…+100

#include<stdio.h>
int main()
{
int i=1,sum=0;
while(i<=100)
{
sum=sum+i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}

5.2用do…while语句求1+2+3+…+100

#include<stdio.h>
int main()
{
int i=1,sum=0;
do
{
sum=sum+i;
i++;
};
while(i<=100)
printf("sum=%d\n",sum);
return 0;
}

5.4在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款人数以及平均每人捐款的数目。

#include<stdio.h>
#define SUM 100000
int main()
{
float amount,aver,total;
int i;
for(i=1,total=0;i<=1000;i++)
{
	printf("please enter amount:");
	scanf("%f",&amount);
	total=total+amount;
	if(total>=SUM)break;
}
aver=total/i;
printf("num=%d\naver=%10.2f\n",i,aver);
return 0;
}

补充练习:
输入5名学生的分数并显示它们的总分和平均分

#include <stdio.h>  
  
int main(void)  
{  
    int uchida;  
    int satoh;  
    int hiraki;  
    int masaki;  
    int sum = 0;  
  
    puts("请输入分数。");  
    printf("1号:");  scanf("%d", &uchida);  
    printf("2号:");  scanf("%d", &satoh);  
    printf("3号:");  scanf("%d", &hiraki);  
    printf("4号:");  scanf("%d", &masaki);  
    printf("5号:");  scanf("%d", &masaki);  
  
    sum += uchida;  
    sum += satoh;  
    sum += hiraki;  
    sum += masaki;  
    sum += masaki;  
      
    printf("总分:%5d\n", sum);  
    printf("平均分:%5.1f\n", (double)sum / 5);  
    return (0);  
}

依次把1,2,3,4,5赋值给数组每个元素并显示

#include <stdio.h>  
  
int main(void)  
{  
    int vc[5];                                // 包含5个元素的数组   
  
    vc[0] = 1;  
    vc[1] = 2;  
    vc[2] = 3;  
    vc[3] = 4;  
    vc[4] = 5;  
  
    printf("vc[0] = %d\n", vc[0]);  
    printf("vc[1] = %d\n", vc[1]);  
    printf("vc[2] = %d\n", vc[2]);  
    printf("vc[3] = %d\n", vc[3]);  
    printf("vc[4] = %d\n", vc[4]);  
    return (0);  
}

依次把1/2/3/4/5赋值给数组每个元素并显示 (使用for语句)

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int vc[5];                                // 包含5个元素的数组   
  
    for (i = 0; i < 5; i++)  
        vc[i] = i + 1;  
  
    for (i = 0; i < 5; i++)  
        printf("vc[%d] = %d\n", i, vc[i]);  
    return (0);  `这里写代码片`
}

将数组的全部元素赋值为(0.0)并显示

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    double vd[5];  
  
    for (i = 0; i < 5; i++)  
        vd[i] = 0.0;  
      
    for (i = 0; i < 5; i++)  
        printf("vd[%d] = %.1f\n", i, vd[i]);  
  
    return (0);  
}

从头开始顺次为数组各元素进行初始化(1,2,3,4,5)并进行显示

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int vc[5] = {1, 2, 3, 4, 5};  
  
    for (i = 0; i < 5; i++)  
        printf("vc[%d] = %d\n", i, vc[i]);  
  
    return (0);  
}

把数组中的全部元素赋值到另一个数组中

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int va[5] = {15, 20, 30};  
    int vb[5];  
  
    for (i = 0; i < 5; i++)  
        vb[i] = va[i];  
  
    puts(" va vb");  
    puts("------");  
    for (i = 0; i < 5; i++)  
        printf("%3d%3d\n", va[i], vb[i]);  
  
    return (0);  
}

输入数组元素的值并显示

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int vx[5];  
      
    for (i = 0; i < 5; i++) {  
        printf("vx[%d]:", i);  
        scanf("%d", &vx[i]);  
    }  
      
    for (i = 0; i < 5; i++)  
        printf("vx[%d]=%d\n", i, vx[i]);  
          
    return (0);      
}

对数组中的全部元素进行倒序排列

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int vx[5];  
      
    for (i = 0; i < 5; i++) {  
        printf("vx[%d]:", i);  
        scanf("%d", &vx[i]);  
    }  
      
    for (i = 0; i < 2; i++) {  
        int temp = vx[i];  
        vx[i] = vx[4 - i];  
        vx[4 - i] = temp;      
    }  
      
    for (i = 0; i < 5; i++)  
        printf("vx[%d]=%d\n", i, vx[i]);  
          
    return (0);      
}

输入5名学生的分数并显示出它们的总分和平均分

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int tensu[5];                              // 5名学生的分数  
    int sum = 0;                               // 总分  
      
    puts("请输入学生的分数。");  
    for (i = 0; i < 5; i++) {  
        printf("%2d号:", i + 1);  
        scanf("%d", &tensu[i]);  
        sum += tensu[i];  
    }  
      
    printf("总分:%5d\n", sum);  
    printf("平均分:%5.1f\n", (double)sum / 5);  
      
    return (0);          
}

输入5名学生的分数并显示出其中的最高分和最低分

#include <stdio.h>  
  
#define NUMBER 5                                      // 学生人数   
  
int main(void)  
{  
    int i;  
    int tensu[NUMBER];                               // 5名学生的分数  
    int max, min;                                    // 总分  
      
    puts("请输入学生的分数。");  
    for (i = 0; i < NUMBER; i++) {  
        printf("%2d号:", i + 1);  
        scanf("%d", &tensu[i]);  
    }  
      
    min = max = tensu[0];  
      
    for (i = 1; i < NUMBER; i++) {  
        if (tensu[i] > max)    max = tensu[i];  
        if (tensu[i] < min)    min = tensu[i];  
    }  
      
    printf("最高分:%d\n", max);  
    printf("最低分:%d\n", min);  
      
    return (0);          
}

输入5名学生的分数并显示出60分以上的一览表

#include <stdio.h>  
  
#define NUMBER 5                             // 学生人数   
  
int main(void)  
{  
    int i;  
    int snum = 0;                             // 及格学生人数  
    int tensu[NUMBER];                       // NUMBER名学生的分数  
    int succs[NUMBER];                       // 及格学生一览表(保存及格学生的下标)  
      
    puts("请输入学生的分数。");  
    for (i = 0; i < NUMBER; i++) {  
        printf("%2d号:", i + 1);  
        scanf("%d", &tensu[i]);  
        if (tensu[i] >= 60)  
            succs[snum++] = i;               // 添加到及格学生一览表中   
    }  
      
    puts("及格学生一览表");  
    puts("--------------");  
    for (i = 0; i < snum; i++)  
        printf("%2d号(%3d分)\n", succs[i] + 1, tensu[succs[i]]);  
      
    return (0);  
       
}

输入学生的分数并显示出分布情况

#include <stdio.h>  
  
#define NUMBER 80                                 // 人数上限   
  
int main(void)  
{  
    int i, j;  
    int num;                                      // 实际的人数  
    int tensu[NUMBER];                            // 学生的分数  
    int bunpu[11] = {0};                          // 分布图   
      
    printf("请输入学生人数:");  
      
    do {  
        scanf("%d", &num);  
        if (num < 1 || num > NUMBER)  
            printf("\a人数范围[1到%d] :", NUMBER);  
    } while (num < 1 || num > NUMBER);  
      
    puts("请输入学生的分数。");  
    for (i = 0; i < num; i++) {  
        printf("%2d号:", i + 1);  
        do {   
            scanf("%d", &tensu[i]);  
            if (tensu[i] < 0 || tensu[i] > 100)  
                printf("\a分数范围[0到100]:");  
        } while (tensu[i] < 0 || tensu[i] > 100) ;  
        bunpu[tensu[i] / 10]++;  
    }   
      
    puts("\n----分布图----");  
    printf("      100:");  
    for (j = 0; j < bunpu[10]; j++)  
        putchar('*');  
    putchar('\n');  
      
    for (i = 9; i >= 0; i--) {  
        printf("%3d - %3d:", i * 10, i * 10 + 9);  
        for (j = 0; j < bunpu[i]; j++)  
            putchar('*');  
        putchar('\n');  
    }  
       
     return (0);     
}

计算2行3列矩阵的和

#include <stdio.h>  
  
int main(void)  
{  
    int i, j;  
    int ma[2][3] = {{1, 2, 3}, {4, 5, 6}};  
    int mb[2][3] = {{6, 3, 4}, {5, 1, 2}};  
    int mc[2][3] ={0};  
      
    for (i = 0; i < 2; i++)  
        for (j = 0; j < 3; j++)  
            mc[i][j] = ma[i][j] + mb[i][j];   
              
    for (i = 0; i < 2; i++) {  
        for (j = 0; j < 3; j++)  
            printf("%3d", mc[i][j]);  
        putchar('\n');    
    }  
      
    return (0);  
}

计算出1000以内的质数(第1版)

#include <stdio.h>  
  
int main(void)  
{  
    int i, no;  
    unsigned long counter = 0;  
      
    for (no = 2; no <= 1000; no++) {  
        for (i = 2; i < no; i++) {          // 能被整除的不是质数   
            counter++;                      // 退出上述循环   
            if (no % i == 0)  
                break;  
        }  
        if (no == i)                        // 直到最后也未被整除   
            printf("%d\n", no);  
    }      
      
    printf("乘除运算的次数:%lu\n", counter);  
      
    return (0);  
}

计算出1000以内的质数(第2版)

#include <stdio.h>  
  
int main(void)  
{  
    int i, no;  
    unsigned long counter = 0;  
      
    no = 2;                                 // 2是偶数中唯一的质数   
    printf("%d\n", no++);   
      
    for (; no <= 1000; no += 2) {           // 只把奇数作为判断对象   
        for (i = 2; i < no; i++) {          // 能被整除的不是质数   
            counter++;                      // 退出上述循环   
            if (no % i == 0)  
                break;  
        }  
        if (no == i)                        // 直到最后也未被整除   
            printf("%d\n", no);  
    }      
      
    printf("乘除运算的次数:%lu\n", counter);  
      
    return (0);  
}

计算出1000以内的质数(第3版)

#include <stdio.h>  
  
int main(void)  
{  
    int i, no;  
    unsigned long counter = 0;  
      
    no = 2;                                 // 2是偶数中唯一的质数   
    printf("%d\n", no++);   
      
    for (; no <= 1000; no += 2) {           // 只把奇数作为判断对象   
        for (i = 3; i < no; i += 2) {       // 只判断能否被奇数整除   
            counter++;                      // 退出上述循环   
            if (no % i == 0)  
                break;  
        }  
        if (no == i)                        // 直到最后也未被整除   
            printf("%d\n", no);  
    }      
      
    printf("乘除运算的次数:%lu\n", counter);  
      
    return (0);  
}

计算出1000以内的质数(第4版)

#include <stdio.h>  
  
int main(void)  
{  
    int i, no;  
    int prime[500];                         // 用来保存质数的数组   
    int ptr = 0;                            // 已经的到的质数个数   
    unsigned long counter = 0;  
      
    prime[ptr++] = 2;  
    prime[ptr++] = 3;  
      
    for (no = 5; no <= 1000; no += 2) {     // 只把奇数作为判断对象   
        for (i = 1; i < ptr; i++) {         // 尝试能否被已经得到的质数整除   
            counter++;                       
            if (no % prime[i] == 0)         // 能被整除的不是质数   
                break;                      // 退出上述循环   
        }   
        if (ptr == i)                        // 直到最后也未被整除   
            prime[ptr++] = no;               // 添加到数组中      
    }  
      
    for (i = 0; i < ptr; i++)  
        printf("%d\n", prime[i]);  
       
    printf("乘除运算的次数:%lu\n", counter);  
  
    return (0);  
}

计算出1000以内的质数(第5版)

#include <stdio.h>  
  
int main(void)  
{  
    int i, no;  
    int prime[500];                         // 用来保存质数的数组   
    int ptr = 0;                            // 已经的到的质数个数   
    unsigned long counter = 0;  
      
    prime[ptr++] = 2;  
    prime[ptr++] = 3;  
      
    for (no = 5; no <= 1000; no += 2) {     // 只把奇数作为判断对象   
        int flag = 0;  
        for (i = 1; counter++, prime[i] * prime[i] <= no; i++) {          
            counter++;                       
            if (no % prime[i] == 0) {        // 能被整除的不是质数   
                flag = 1;  
                break;  
            }                                // 退出上述循环   
        }   
        if (!flag)                          // 直到最后也未被整除   
            prime[ptr++] = no;               // 添加到数组中      
    }  
      
    for (i = 0; i < ptr; i++)  
        printf("%d\n", prime[i]);  
       
    printf("乘除运算的次数:%lu\n", counter);  
  
    return (0);  
}

依次把0,1,2,3,4赋值给数组每个元素并显示 (使用for语句)

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int vc[5];                                // 包含5个元素的数组   
  
    for (i = 0; i < 5; i++)  
        vc[i] = i;  
  
    for (i = 0; i < 5; i++)  
        printf("vc[%d] = %d\n", i, vc[i]);  
  
    return (0);  
}

依次把5,4,3,2,1赋值给数组每个元素并显示 (使用for语句)

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int vc[5];                                // 包含5个元素的数组   
  
    for (i = 0; i < 5; i++)  
        vc[i] = 5 - i;  
  
    for (i = 0; i < 5; i++)  
        printf("vc[%d] = %d\n", i, vc[i]);  
  
    return (0);  
}

从头开始顺次为数组各元素进行初始化(5,4,3,2,1)并进行显示

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int vc[5] = {5, 4, 3, 2, 1};  
  
    for (i = 0; i < 5; i++)  
        printf("vc[%d] = %d\n", i, vc[i]);  
    
    return (0);  
}

把数组中的全部元素倒序赋值到另一个数组中

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int va[5] = {15, 20, 30};  
    int vb[5];  
  
    for (i = 0; i < 5; i++)  
        vb[i] = va[4 - i];  
  
    puts(" va vb");  
    puts("------");  
    for (i = 0; i < 5; i++)  
        printf("%3d%3d\n", va[i], vb[i]);  
  
    return (0);  
}

对数组中的全部元素进行倒序排列

#include <stdio.h>  
  
int main(void)  
{  
    int i;  
    int vx[8];  
      
    for (i = 0; i < 8; i++) {  
        printf("vx[%d]:", i);  
        scanf("%d", &vx[i]);  
    }  
      
    for (i = 0; i < 5; i++) {  
        int temp = vx[i];  
        vx[i] = vx[7 - i];  
        vx[7 - i] = temp;      
    }  
      
    for (i = 0; i < 8; i++)  
        printf("vx[%d]=%d\n", i, vx[i]);  
          
    return (0);      
}  
 
 double类型赋值给int类型  
int main(void)  
{  
    double a;  
    int b;  
      
    a = b = 1.5;  
      
    printf("a = %f\n", a);  
    printf("b = %d\n", b);  
      
    return (0);      
}

计算矩阵x和y的积

int main(void)  
{  
    int x[2][3] = {{1, 2, 3}, {4, 5, 6},};  
    int y[3][2] = {{1, 5}, {5, 3}, {8, 1}};  
    int z[2][2] = {0};  
    int i, j;  
        
    for (i = 0; i < 3; i++)  
        z[0][0] += x[0][i] * y[i][0];  
      
    for (i = 0; i < 3; i++)  
        z[0][1] += x[0][i] * y[i][1];  
          
    for (i = 0; i < 3; i++)  
        z[1][0] += x[1][i] * y[i][0];  
          
    for (i = 0; i < 3; i++)  
        z[1][1] += x[1][i] * y[i][1];  
          
    for (i = 0; i < 2; i++) {  
        for (j = 0; j < 2; j++)  
            printf("%3d", z[i][j]);  
        putchar('\n');   
    }  
      
    system("pause");  
    return (0);  
}