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
补充练手
- 输入三角形的三边长,求三角形面积。
#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);
}