1 最简单的C语言程序
程序总是从main函数开始执行的
- 在屏幕上输出Hello World!
#include<stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
- 求两个整数之和
#include<stdio.h>
int main(){
int a,b,sum;
a=12;
b=28;
sum=a+b;
printf("sum=%d\n",sum);
return 0;
}
- 求两个数中的较大数
#include <stdio.h>
int max(int a,int b);
int main(){
int a,b,c;
printf("请输入两个整数:\n");
scanf("%d%d",&a,&b);
c=max(a,b);
printf("两个数的较大数为:%d\n",c);
return 0;
}
int max(int a,int b){
int z;
z=(a>b)?a:b;
return z;
}
2 顺序结构程序设计
简单的顺序程序设计
VC++6.0中,编译系统把所有的实数都当成双精度数处理
- 计算华氏温度(公式为:c=5/9*(f-32))
#include <stdio.h>
int main(){
float c;
float f=64.0;
c=5.0/9*(f-32);
printf("f=%f\nc=%f\n",f,c);
return 0;
}
- 计算存款1年的本息和
#include <stdio.h>
int main(){
float p0; //本金
float p1; //存款1年活期本息和
float p2; //存款1年定期本息和
float p3; //存款两次半年定期本息和
int a;
printf("请输入想要存入的金额:");
scanf("%f",&p0);
printf("请选择想要存款的方式:\n");
printf("1.存款1年活期,利息为0.0036\n");
printf("2.存款1年定期,利息为0.0225\n");
printf("3.存款两次半年定期,利息为0.0198\n");
scanf("%d",&a);
switch(a){
case 1:printf("您选择的存款方式为:存款1年活期,利息为0.0036\n存款1年后本息和为:%f\n",p1=p0*(1+0.0036));break;
case 2:printf("您选择的存款方式为:存款1年定期,利息为0.0225\n存款1年后本息和为:%f\n",p2=p0*(1+0.0225));break;
case 3:printf("您选择的存款方式为:存款两次半年定期,利息为0.0198\n存款1年后本息和为:%f\n",p3=p0*(1+0.0198/2)*(1+0.0198/2));break;
}
return 0;
}
不同数据类型间的混合运算
- 给定一个大写字母,要求用小写字母输出
#include <stdio.h>
int main(){
char c1,c2;
printf("请输入一个大写字母:");
scanf("%c",&c1);
c2=c1+32;
printf("您输入的大写字母为%c\n对应的小写字母为%c\n",c1,c2);
return 0;
}
赋值语句
- 给出三角形的三边长,求三角形面积
#include <stdio.h>
#include <math.h>
int main(){
double a,b,c,s,area;
printf("请输入三角形的三条边长:");
scanf("%lf%lf%lf",&a,&b,&c);
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("三角形的面积为%lf\n",area);
return 0;
}
数据的输入输出
- 求ax2+bx+c=0方程的根。(假设b2-4ac>0)
#include <stdio.h>
#include <math.h>
int main(){
double a,b,c,disc,x1,x2;
printf("Plese input a,b,c:");
scanf("%lf%lf%lf",&a,&b,&c);
disc=b*b-4*a*c;
x1=(-b+sqrt(disc))/(2.0*a);
x2=(-b-sqrt(disc))/(2.0*a);
printf("x1=%lf,x2=%lf\n",x1,x2);
return 0;
}
- 保留双精度型的不同小数位数
#include <stdio.h>
int main(){
double a;
printf("Plese input a number:");
scanf("%lf",&a);
printf("%f\n",a);
printf("%lf\n",a);
printf("%7.2f\n",a);
printf("%20lf\n",a);
return 0;
}
字符输入输出
- 输入一个大写字母,显示其对应的小写字母
#include <stdio.h>
int main(){
char c1,c2;
c1=getchar();
c2=c1+32;
putchar(c1);
putchar(c2);
putchar('\n');
return 0;
}
3 选择结构程序设计
选择结构和条件判断
- 求ax2+bx+c=0的根
#include <stdio.h>
#include <math.h>
int main(){
double a,b,c,disc,x1,x2;
printf("Please input a,b,c:");
scanf("%lf%lf%lf",&a,&b,&c);
disc=b*b-4*a*c;
if(disc<0)
printf("该方程无实数根!\n");
else{
printf("x1=%f\n",x1=(-b+sqrt(disc))/(2*a));
printf("x2=%f\n",x2=(-b-sqrt(disc))/(2*a));
}
}
用if语句实现选择结构
- 输入两个实数,按从小到大的顺序输出
#include<stdio.h>
int main(){
float a,b,t;
printf("Please input two numbers:");
scanf("%f%f",&a,&b);
if(a>b){
t=a;
a=b;
b=t;
}
printf("%5.2f%5.2f\n",a,b);
return 0;
}
- 输入3个数,按从小到大输出
#include<stdio.h>
int main(){
float a,b,c,t;
printf("Please input three numbers:");
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\t%5.2f\t%5.2f\n",a,b,c);
return 0;
}
条件运算符和条件表达式
- 输入一个字母,若是大写字母,转换为小写后输出
#include <stdio.h>
int main(){
char ch;
printf("请输入一个字母:");
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
printf("%c\n",ch);
return 0;
}
用switch语句实现多分支选择结构
- 按考试等级输出分数段,A:85-100,B:70-84,C:60-69,D:< 60
#include <stdio.h>
int main(){
char grade;
printf("Please input your grade(A、B、C or D):");
scanf("%c",&grade);
printf("Your score:");
switch(grade){
case 'A': printf("85-100");break;
case 'B': printf("70-84");break;
case 'C': printf("60-69");break;
case 'D': printf("<60");break;
default : printf("Enter data error!");
}
printf("\n");
return 0;
}
- 用switch语句处理菜单命令
#include <stdio.h>
void action1(int,int);
void action2(int,int);
int main(){
int a=5,b=6;
char ch;
/*printf("Please input two numbers:");
scanf("%d%d",&a,&b);
printf("Please select an actions(A/a or B/b):");*/
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);
}
- 输入一个年份,判断是否为闰年
#include <stdio.h>
int main(){
int month;
printf("Please input a month:");
scanf("%d",&month);
if(((month%4==0)&&(month%100!=0))||(month%400==0))
printf("%d年是闰年!\n",month);
else
printf("%d年不是闰年!\n",month);
return 0;
}
4 循环结构程序设计
break:结束整个循环,跳出循环体,执行循环之后的语句
continue:结束本次循环,接着执行下一次循环
用while语句实现循环
- 求1+2+3+···+100的和
#include <stdio.h>
int main(){
int n=1,sum=0;
while(n<=100){
sum+=n;
n++;
}
/*do{
sum+=n;
n++;
}while(i<=100);*/
printf("sum=%d\n",sum);
return 0;
}
用break语句提前终止循环
- 在全系1000名学生中举行慈善募捐,当总数达到10万时结束,统计此时捐款的人数及平均没人捐款的数目
#include <stdio.h>
#define SUM 100000
int main(){
float amount,ave,total;
int i;
for(i=1,total=0;i<=1000;i++){
printf("Please input amount:");
scanf("%f",&amount);
total+=amount;
if(total>=SUM)
break;
}
ave=total/i;
printf("num=%d\nave=%f\n",i,ave);
return 0;
}
用continue提前结束本次循环
- 输出100~200不能被3整除的数
#include <stdio.h>
int main(){
int n;
for(n=100;n<=200;n++){
if(n%3==0)
continue;
printf("%d ",n);
}
printf("\n");
return 0;
}
- 输出一个4*5的矩阵
#include <stdio.h>
int main(){
int i,j,n=0;
for(i=1;i<=4;i++)
for(j=1;j<=5;j++,n++){
if(n%5==0)
printf("\n");
printf("%d\t",i*j);
}
printf("\n");
return 0;
}
5 利用数组处理批量数据
引用一维数组元素
- 对10个数组元素依次赋值0-9,再逆序输出
#include <stdio.h>
int main(){
int n,a[10];
for(n=0;n<10;n++)
a[n]=n;
for(n=9;n>=0;n--)
printf("%d ",a[n]);
printf("\n");
return 0;
}
- 用数组来处理Flbonacci数列问题
#include <stdio.h>
int main(){
int i;
int a[20]={1,1};
for(i=2;i<20;i++)
a[i]=a[i-2]+a[i-1];
for(i=0;i<20;i++){
if(i%5==0)
printf("\n");
printf("%7d ",a[i]);
}
printf("\n");
return 0;
}
冒泡排序
每次比较相邻两个数,将小的调到前面
- 输入10个数,将它们按从小到大排序输出(冒泡排序)
#include <stdio.h>
int main(){
int i,j,t;
int a[10];
printf("Please input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(j=0;j<9;j++)
for(i=0;i<9-j;i++){
if(a[i]>a[i+1]){
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
引用二维数组
- 输入一个2行3列的二维数组,将其行列交换位置后输出到另一个数组
#include <stdio.h>
int main(){
int a[2][3];
int b[3][2];
int i,j;
printf("Please input 6 numbers for array a:");
for(i=0;i<=1;i++)
for(j=0;j<=2;j++)
scanf("%d",&a[i][j]);
printf("array a:\n");
for(i=0;i<=1;i++){
for(j=0;j<=2;j++){
printf("%d ",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("array b:\n");
for(i=0;i<=2;i++){
for(j=0;j<=1;j++)
printf("%d ",b[i][j]);
printf("\n");
}
return 0;
}
打擂台法求最值
- 输入一个3*4的矩阵,输出最大的元素及其行列号(打擂台法)
#include <stdio.h>
int main(){
int a[3][4];
int i,j,row=0,colum=0;
int max=0;
printf("Please input 12 numbers:");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
for(i=0;i<3;i++)
for(j=0;j<4;j++){
if(a[i][j]>max){
max=a[i][j];
row=i;
colum=j;
}
}
printf("max=%d\nrow=%d\ncolum=%d\n",max,i,j);
return 0;
}
引用字符数组中的元素
- 输出一个菱形
#include <stdio.h>
int main(){
int i,j;
char a[][5]={
{' ',' ','*'},
{' ','*',' ','*'},
{'*',' ',' ',' ','*'},
{' ','*',' ','*'},
{' ',' ','*'}
};
for(i=0;i<5;i++){
for(j=0;j<5;j++)
printf("%c",a[i][j]);
printf("\n");
}
return 0;
}
- 输入一行字符,统计其中有多少单词,单词之间用空格分开
#include <stdio.h>
int main(){
char string[100];
int i,num=0,word=0;
char c;
gets(string);
for(i=0;(c=string[i])!='\0';i++){
if(c==' ')
word=0;
else if(word==0){
word=1;
num++;
}
}
printf("There are %d words in this line.\n",num);
return 0;
}
6 用函数实现模块化程序设计
实参和形参间的数据传递
- 输入两个整数,输出其中较大者
#include <stdio.h>
int max(int x,int y);
int main(){
int a,b;
printf("Please input two integer numbers:");
scanf("%d%d",&a,&b);
printf("max is %d\n",max(a,b));
return 0;
}
int max(int x,int y){
int z;
z=x>y?x:y;
return (z);
}
函数原型
- 输入两个实数,用一个函数求出它们之和
#include <stdio.h>
float add(float,float);
int main(){
float a,b,c;
printf("Please input two numbers:");
scanf("%f%f",&a,&b);
printf("sum=%.2f\n",c=add(a,b));
return 0;
}
float add(float x,float y){
return (x+y);
}
函数的嵌套调用
在调用一个函数的过程中,又调用另一个函数
- 输入4个整数,找出其中最大的数
#include <stdio.h>
int max4(int,int,int,int);
int max2(int,int);
int main(){
int a,b,c,d,max;
printf("Please inout 4 integer numbers:");
scanf("%d%d%d%d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d\n",max);
return 0;
}
int max4(int a,int b,int c,int d){
return max2(max2(max2(a,b),c),d);
}
int max2(int a,int b){
return (a>=b?a:b);
}
函数的递归调用
在调用一个函数的过程中,又直接或间接调用该函数本身
- 用递归方法求n!
#include <stdio.h>
int f(int);
int main(){
int n;
printf("Please input an integer number:");
scanf("%d",&n);
printf("%d!=%d\n",n,f(n));
return 0;
}
int f(int n){
int m;
if(n<0)
printf("n<0,data is error!\n");
else if(n==0||n==1)
m=1;
else
m=n*f(n-1);
return m;
}
数组元素作函数实参
数组元素可以作函数实参,不能作函数形参
数据传输方向是从实参到形参,单向传递
- 输入10个数,要求输出其中值最大的元素和该数是第几个数
#include <stdio.h>
int max(int,int);
int main(){
int a[10],m,n,i;
printf("Please input 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=1,m=a[0],n=0;i<10;i++)
if(max(m,a[i])>m){
m=max(m,a[i]);
n=i;
}
printf("The largest number is %d\nIt is the %dth number\n",m,n+1);
return 0;
}
int max(int x,int y){
return x>y?x:y;
}
一维数组名作函数参数
- 输入10个学生的成绩放入一维数组score中,求平均成绩
#include <stdio.h>
float aver(float a[ ],int n);
int main(){
float score[10];
int i;
printf("Please input 10 scores:");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
printf("The average score is %.2f\n",aver(score,10)); //函数调用数组时,直接用数组名
return 0;
}
float aver(float a[ ],int n){
float sum=a[0];
for(int i=1;i<n;i++)
sum=sum+a[i];
return (sum/10);
}
选择法排序
- 用选择法对数组中的10个整数按由小到大排序
#include <stdio.h>
void sort(int array[],int n);
int main(){
int i,a[10];
printf("Please input 10 integer numbers:");
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
sort(a,10);
return 0;
}
void sort(int array[],int n){
int i,j,t;
for(i=0;i<n-1;i++){
//每比完一次后,最小的数就在第一个,然后从第二个数继续比较,所以j=i+1
for(j=i+1;j<n;j++){
if(array[i]>array[j]){
t=array[j];
array[j]=array[i];
array[i]=t;
}
}
}
for(i=0;i<n;i++)
printf("%d ",array[i]);
printf("\n");
}
多维数组名作函数参数
二维数组作形参时,第2维大小不能省略,且要与实参数组第2维大小相同
- 输入一个3*4的矩阵,求所有元素中的最大值
#include <stdio.h>
int max(int array[][4]);
int main(){
int i,j,a[3][4];
printf("Please input 12 integer numbers:");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
printf("The a[3][4] is:\n");
for(i=0;i<3;i++){
for(j=0;j<4;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
printf("Max is %d\n",max(a));
return 0;
}
int max(int array[][4]){
int i,j;
int max=array[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]>max)
max=array[i][j];
return (max);
}
全局变量
- 有一个一维数组,内放10个学生的成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分
#include <stdio.h>
float Max=0,Min=0;
float aver(float array[],int n);
int main(){
int i;
float a[10],ave;
printf("Please input 10 numbers:");
for(i=0;i<10;i++)
scanf("%f",&a[i]);
printf("Max=%.2f\nMin=%.2f\naverage=%.2f\n",Max,Min,aver(a,10));
return 0;
}
float aver(float array[],int n){
float ave;
float sum=array[0];
int i;
Max=Min=array[0];
for(i=1;i<n;i++){
if(array[i]>Max)
Max=array[i];
else if(array[i]<Min)
Min=array[i];
sum+=array[i];
}
ave=sum/n;
return (ave);
}
全局变量与局部变量同名的情况
- 调用函数比较两数的大小
#include <stdio.h>
int a=3,b=5;
int max(int,int);
int main(){
int a;
a=8;
printf("max=%d\n",max(a,b));
return 0;
}
int max(int a,int b){
return a>b?a:b;
}
7 善于利用指针
简单使用指针变量
- 通过指针变量访问整型变量
#include <stdio.h>
int main(){
int a=100,b=10;
int *p1,*p2;
p1=&a;
p2=&b;
printf("a=%d\tb=%d\n",a,b);
printf("p1=%d\tp2=%d\n",*p1,*p2);
return 0;
}
引用指针变量
- 输入a和b两个整数,用指针实现按先大后小的顺序输出a和b
#include <stdio.h>
int main(){
int a,b;
int *p1,*p2;
printf("Please input two integer numbers:");
scanf("%d%d",&a,&b);
p1=&a;
p2=&b;
if(a<b){
p1=&b;
p2=&a;
}
printf("a=%d\tb=%d\nmax=%d\n",a,b,*p1);
return 0;
}
指针变量作为函数参数
- 输入a和b两个整数,用指针作为函数参数,实现按先大后小的顺序输出a和b
#include <stdio.h>
void swap(int *p1,int *p2);
int main(){
int a,b;
int *pointer1,*pointer2;
printf("Please input two integer numbers:");
scanf("%d%d",&a,&b);
pointer1=&a;
pointer2=&b;
swap(pointer1,pointer2);
printf("a=%d\tb=%d\nmax=%d\n",a,b,*pointer1);
return 0;
}
void swap(int *p1,int *p2){
int temp;
if(*p1<*p2){
temp=*p1;
*p1=*p2;
*p2=temp;
}
}
通过指针引用数组元素
- 有一个整型数组a,有10个元素,用指针输出数组中的全部元素
#include <stdio.h>
int main(){
int a[10],*p;
printf("Please input 10 integer numbers:");
for(p=a;p<(a+10);p++)
scanf("%d",p);
for(p=a;p<(a+10);p++)
printf("%d ",*p);
printf("\n");
return 0;
}
9 用户自己建立数据类型
结构体变量的初始化和引用
- 把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息
#include <stdio.h>
struct Student{
long int num;
char name[20];
char sex;
char addr[20];
};
int main(){
struct Student stu={2018140467,"LiaoYuanyang",'M',"淮工宋跳校区"};
printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n",stu.num,stu.name,stu.sex,stu.addr);
return 0;
}
- 输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩
#include <stdio.h>
int main(){
struct Student{
int num;
char name[20];
float score;
}stu1,stu2;
printf("请输入第1个学生的学号、姓名和成绩:");
scanf("%d%s%f",&stu1.num,stu1.name,&stu1.score);
printf("请输入第2个学生的学号、姓名和成绩:");
scanf("%d%s%f",&stu2.num,stu2.name,&stu2.score);
printf("The higher score is:\n");
if(stu1.score>stu2.score)
printf("%d %s %6.2f\n",stu1.num,stu1.name,stu1.score);
else if(stu1.score<stu2.score)
printf("%d %s %6.2f\n",stu2.num,stu2.name,stu2.score);
else{
printf("%d %s %6.2f\n",stu1.num,stu1.name,stu1.score);
printf("%d %s %6.2f\n",stu2.num,stu2.name,stu2.score);
}
return 0;
}
用结构体变量和结构体变量的指针作函数参数
- 有10个学生,每个学生的数据包括学号、姓名、3门课成绩,输入10个学生的数据,要求输出3门课的总平均成绩,以及最高分的学生的数据
#include <stdio.h>
#define N 10
struct Student{
int num;
char name[10];
float score[3];
float aver;
};
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu1);
int main(){
struct Student stu[N],*p;
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=1;i<N;i++){
if(stu[i].aver>stu[m].aver)
m=i;
}
return stu[m];
}
void print(struct Student stu1){
printf("\n成绩最高的学生是:\n");
printf("学号:%d\n姓名:%s\n三门课成绩:%8.2f%8.2f%8.2f\n平均成绩:%8.2f\n",
stu1.num,stu1.name,stu1.score[0],stu1.score[1],stu1.score[2],stu1.aver
);
}
10 基本的代码规范
程序版式
注释规范
写注释给谁看?
写注释最重要的功效在于传承
好的注释
在哪些地方写注释
灵活注释