# 第一章 进入C语言程序世界
## 1.1 了解C语言的程序结构
一个完整的程序是由一个main()函数(有且仅有一个)和其他函数构成的。
### 1.1.1 C语言的程序结构分析
下面从简单的C语言程序实列入手,分析C语言程序的结构和特点。先看下面C程序的例题。
【例1.1】仅由main()函数构成的C语言程序。
程序代码如下:
```c
#include<stdio.h>
int main(void) /*主函数*/
{
int a,b; /*声明部分,定义两个整型变量*/
a=1; /*给变量a赋初值1*/
b=a+1; /*将a+1的值赋值给b*/
printf("b=%d ",b); /*输出b的值*/
return 0;
}
程序的运行结果为:
2
```
说明:这个是一个完整的C程序,包含一个main()函数(也叫主函数),程序中用到的两个存放整型的变量a、b,必须先定义:int a,b;。int 表示定义为十进制整型变量。程序中的每一行结束时用分号“:”分隔,调用printf()函数可以完成数据的输出。/*...*/表示注释,只是对程序起到说明作用,程序执行时注释语句不执行,花括号{}表示main()函数的开始和结束。
#include<stdio.h>时预编译处理命令。C语言规定,调用系统提供的标准库函数(如标准输出函数printf())时,必须在程序开头使用这种命令,将库函数的函数原型所在的头文件包含进来。#include\<stdio.h>表示将标准输入/输出的库函数包含进来,由于printf()时标准的输出库函数,所以改程序编写时要求加入#include<stdio.h>。
说明:这个是一个完整的C程序,包含一个main()函数(也叫主函数),程序中用到的两个存放整型的变量a、b,必须先定义:int a,b;。int 表示定义为十进制整型变量。程序中的每一行结束时用分号“:”分隔,调用printf()函数可以完成数据的输出。/\*...\*/表示注释,只是对程序起到说明作用,程序执行时注释语句不执行,花括号{}表示main()函数的开始和结束。#include\<stdio.h>时预编译处理命令。C语言规定,调用系统提供的标准库函数(如标准输出函数printf())时,必须在程序开头使用这种命令,将库函数的函数原型所在的头文件包含进来。#include\\\<stdio.h>表示将标准输入/输出的库函数包含进来,由于printf()时标准的输出库函数,所以改程序编写时要求加入#include\<stdio.h>。
【例1.2】仅由main()函数和其他函数构成的C语言程序。
```c
void myoutput(void) // 自定义函数,名称是myoutput
{
printf("\n*** hello! Howdo you do ? ***\n");// 输出字符串
}
int main(void)// 主函数
{
myoutput();//调用自定义函数myoutput()
printf("main run is ok\n");
return 0;
}
```
## 1.2 简单的C语言程序
【例1.3】设计一个简单的C语言程序。 已知 a=3,b=5,求sum=2\*a+b;
```c
#include<stdio.h>
int main(void)
{
int a,b,sum;
a=3,b=5;
sum = 2*a + b;
printf("sum=%d \n",sum);
printf(" main run is ok \n");
return 0;
}
运行结果:sum=11
```
【例1.3】设计一个简单的C语言程序。 已知 a=3,b=5,求sum=2\*a+b;
***
# 第二章 编制C程序的基础知识
## 2.1常量与变量
常量:是一种在程序运行过程中其类型和值保持固定不变的量。如 123,0,5.60等。
变量:是一种在程序执行中可以改变、可以赋值的量。
变量的三要素:类型、名称、值。如 `int a,b,c;`
## 2.2 C语言的基本数据类型
数据类型:1.基本类型、2.指针类型、3.构造类型、4.空类型
1.基本类型:1.1整型、1.2字符型、1.3实型(单精度、双精度)、1.4枚举类型
2.指针类型
3.构造类型:数组类型、结构体类型、共同体类型
4.空类型
***
### 2.2.1 整型数据
2.2.2.1 整型常量(二进制、十进制、八进制、十六进制)
2.2.2.2 整型变量
***
【例2.2】整型变量的定义与使用。
```c
#include<stdio.h>
int main(void)
{
int a,b;
unsigned int t;
a=1;
b=-2;
t=5;
a=a+b;
b=b+t;
printf("a=%d ,b=%d \n",a,b);
return 0;
}
运行结果:a=-1 ,b=3
```
【例2.3】整型数据的运算。
```c
#include<stdio.h>
int main(void)
{
int a,b;
a=23767;
b=a+1;
printf("a=%d ,b=%d \n",a,b);
return 0;
}
运行结果:a=23767 ,b=23768
```
### 2.2.2 实型数据
【例2.4】实型数据的不同表示。
```c
#include<stdio.h>
int main(void)
{
float a=12.3;
printf("a=%f \n",a);
printf("a=%e \n",a);
return 0;
}
运行结果:
a=12.300000
a=1.230000e+001
note:对于每一个变量都应在使用前加以定义。
```
【例2.5】实型变量的定义与使用。
```c
#include<stdio.h>
int main(void)
{
float x=2,y=3,t;
t=x;
x=y;
y=t;
printf("x=%f y=%f \n",x,y);
return 0;
}
运行结果:x=3.000000 y=2.000000
```
【例2.6】实型数据的舍入误差。
```c
#include<stdio.h>
int main(void)
{
float a,b;
a=123456.789e5;
b=a+20;
printf("b=%f \n",b);
return 0;
}
运行结果:b=12345678848.000000
```
### 2.2.2 字符型数据
【例2.7】转义字符的使用。
```c
#include<stdio.h>
int main(void)
{
printf("ab\tcde\n");
printf("f\101\n");
return 0;
}
运行结果:
ab cde
fA
```
【例2.8】字符型变量与整型数的运算。
```c
#include<stdio.h>
int main(void)
{
char a,b;
a='a';
b='b';
printf("a=%d,b=%d \n",a,b);
printf("a+1=%c,b+1=%c \n",a+1,b+1);
return 0;
}
运行结果:
a=97,b=98
a+1=b,b+1=c
```
【例2.9】将小写字母转换成大写字母。
```c
#include<stdio.h>
int main(void)
{
char c1,c2;
c1='a';
c2='b';
c1=c1-32;
c2=c2-32;
printf("c1=%c c2=%c\n",c1,c2);
return 0;
}
运行结果:
c1=A c2=B
```
## 2.3 C语言的常用运算符和表达式
### 2.3.1算术运算符及其表达式
【例2.10】算术运算符的使用。
```c
#include<stdio.h>
int main(void)
{
int x,y;
x=-3+4*5-6;
y=-3*4%-5/5;/* 相当于-12%-5结果为-2,再计算-2/5,结果为0 */
printf("x=%d y=%d ",x,y);
return 0;
}
运行结果:
x=11 y=0
```
### 2.3.2 赋值运算符及其表达式
【例2.11】复合的赋值运算符的应用。
```c
#include<stdio.h>
int main(void)
{
int x,y;
x=-3+4*5-6;
y=-3*4%-5/5;/* 相当于-12%-5结果为-2,再计算-2/5,结果为0 */
printf("x=%d y=%d ",x,y);
return 0;
}
运行结果:
x=11 y=0
```
### 2.3.3自增和自减预算符和强制类型运算发
【例2.12】强制类型转换符的使用。
```c
int main(void)
{
int a,x,y,b,z,k;
a=5;
x=a++;
y=a;
printf("x=%d,y=%d\n",x,y);
b=5;
z=++b;
k=b;
printf("z=%d,k=%d",z,k);
return 0;
}
运算结果:
x=5,y=6
z=6,k=6
```
【例2.13】强制类型转换符的使用。
```c
#include<stdio.h>
int main(void)
{
float x;
int y;
x=3.6;
y=(int)x;
printf("x=%f,y=%d\n",x,y);
return 0;
}
运行结果:
x=3.600000,y=3
```
【例2.13】综合应用实例。
```c
#include<stdio.h>
int main(void)
{
int a,b,c;
float x,y,z;
a=b=1;
b+=2; // 相当于b=b+2
x=a++; // 先引用a的值赋值给x, a再自增为2
y=--b; // b先自减1,再赋值给y
z=-(--b);
c=(int)z; // 强制类型转换
printf("x=%f,y=%f,z=%f \n",x,y,z);
printf("a=%d,b=%d,c=%d \n",a,b,c);
return 0;
}
运行结果:
x=1.000000,y=2.000000,z=-1.000000
a=2,b=1,c=-1
```
【例2.14】赋值运算和逗号运算的使用。
```c
#include<stdio.h>
int main(void)
{
int a,b,c;
float x;
b=1;
a=b+(c=2);
x=(a++,b+a,c);
printf("x=%f,a=%d,b=%d,c=%d \n",x,a,b,c);
return 0;
}
运行结果:
x=2.000000,a=4,b=1,c=2
```
【例2.15】定义一个符号常量PI表示Π, 求圆的面积。
```c
#include<stdio.h>
int main(void)
{
int r;
float s;
r=1;
s=PI*r*r;
printf("s=%f ",s);
return 0;
}
运行结果:
s=3.141590
```
【例2.16】整型、实型、字符型数据变量的定义与使用。
```c
#include<stdio.h>
int main(void)
{
int a,b;
long int n;
float x,y;
char c1;
a=1;
b=-2;
x=1.2;
y=2.1;
n=128765;
c1='a';
printf("\n");
printf("a=%d b=%d \n",a,b);
printf("x+y=%f ",x+y);
printf("n=%ld\n",n); //“%ld”表示输出的数据为long int型数据
printf("c1=%c c1=%d",c1,c1);
return 0;
}
运行结果:
a=1 b=-2
x+y=3.300000 n=128765
c1=a c1=97
```
# 第三章 编制C程序的基础知识
## 3.1 结构化程序设计的三种基本结构
### 1.顺序结构
程序语句是按顺序书写的,语句的执行也是顺序执行的。
### 2.选择结构
当程序执行到某一语句时,要进行条件判断从两条或两条以上执行路径中选择一条,因此又称为分支结构。
### 3.循环结构
当满足某种条件循环条件时,将一条或多条语句重复的执行若干次,直到不满足循环条件为止。循环结构有两种:1.当型循环结构,2.直到型循环结构。
【例3.1】分析一下程序的结构并体会程序的执行过程。
```c
#include<stdio.h>
int main(void)
{
int a,b,c;
float x,y;
a=b=c=2;
x=3.0;
y=a*x+b*x*x+c;
printf("y=%f\n",y);
return 0;
}
运行结果:
y=26.000000
```
## 3.2 数据的输入与输出
### 3.2.1 格式输出函数printf()
【例3.2】 已知圆的半径r=1.5,求圆的周长 length = 2Πr。
```c
#include<stdio.h>
int main(void)
{
float r,length,pi=3.14159;
r=1.5;
length = 2*pi*r;
printf("r=%7.2f,length=%7.2f\n",r,length);
return 0;
}
运行结果:
r= 1.50,length= 9.42
```
【例3.3】printf()函数典型格式输出应用 。
```c
#include<stdio.h>
int main(void)
{
int a=100;
float b=123.4567;
printf("a=%d,a=%5d,a=%-5d,a=%2d \n",a,a,a,a);
printf("b=%f,%10f\n",b,b);
printf("b=%10.2f,%-10.2f,%.2f\n",b,b,b);
printf("a+b=%f\n",a+b);
return 0;
}
运行结果:
a=100,a= 100,a=100 ,a=100
b=123.456703,123.456703
b= 123.46,123.46 ,123.46
a+b=223.456696
```
### 3.2.2 格式化输入函数scanf()
【例3.4】 多种类型数据的输入。
```c
#include<stdio.h>
int main(void)
{
int a;
float b;
char c;
printf("input a b c :");
scanf("%d %f %c",&c,&b,&c);
printf("a=%d,b=%.3f,c=%c ",a,b,c);
return 0;
}
输入:1234 1234.5678 c
运行结果:a=0,b=1234.568,c=c
```
【例3.5】 按照指定的域宽截断输入数据。
```c
#include<stdio.h>
int main(void)
{
int a;
float b,c;
scanf("%2d%3f%4f",&a,&b,&c);
printf("a=%d,b=%f,c=%f\n",a,b,c);
return 0;
}
输入: 12345678987654321
运行结果:a=12,b=345.000000,c=6789.000000
```
【例3.6】空格作为默认的数据输入分隔符 。
```c
#include<stdio.h>
int main(void)
{
int a;
float b,c;
scanf("%d%f%f",&a,&b,&c);
printf("a=%d,b=%f,c=%f\n",a,b,c);
return 0;
}
输入:12 345 6789
运行结果:
a=12,b=345.000000,c=6789.000000
```
### 3.2.3 单个字符输入/输出函数( getchar()/putchar() )
【例3.7】键盘输入一个大写字母,要求以小写字母输出 。
```c
#include<stdio.h>
int main(void)
{
char c1,c2;
c1=getchar();
putchar(c1);
putchar('\n');
printf("c1=%c,c1=%d\n",c1,c1);
c2=c1+32;
printf("c2=%c,c2=%d\n",c2,c2);
return 0;
}
输入:A
运行结果:
A
c1=A,c1=65
c2=a,c2=97
```
## 3.3 顺序结构程序设计举例
【例3.8】 实现华氏温度与摄氏温度转换。输入一个华氏温度,要求输出摄氏温度。华氏温度转化成摄氏温度的公式为C=5/9(F-32),取两位小数。
```c
#include<stdio.h>
int main(void)
{
float F,c;
scanf("%f",&F);
printf("F=%f\n",F);
c=5.0/9*(F-32);
printf("c=%.2f\n",c);
return 0;
}
输入:12
运行结果:
F=12.000000
c=-11.11
```
【例3.9】 编写一个简单的译码程序。译码规律是:用原来的字母后的第n个字母替代原来的字母(假定其后面的第n个字母在字母z之前)。
```c
#include<stdio.h>
int main(void)
{
char c1,c2,c3,c4,c5,c6,c7;//定义字符变量
int n;
printf("n=");
scanf("%d",&n);
c1='c';
c2='h';
c3='i';
c4='n';
c5='e';
c6='s';
c7='e';
printf("源码是:%c%c%c%c%c%c%c\n",c1,c2,c3,c4,c5,c6,c6,c7);//输出源码
c1+=n;
c2+=n;
c3+=n;
c4+=n;
c5+=n;
c6+=n;
c7+=n;
printf("译码是:%c%c%c%c%c%c%c\n",c1,c2,c3,c4,c5,c6,c7);
return 0;
}
输入:6
运行结果:
input:chiness
output:inotkyk
```
【技能训练一】 编写程序,计算小明考试的总分和平均分(已知物理、数学、化学、英语成绩)。
```c
#include<stdio.h>
int main(void)
{
return 0;
}
运行结果:
```
【技能训练二】 printf()函数的使用。若a=1,b=2,x=1.2,y=2.1,n=128765,c1='a',
想得出以下的输出格式和结果,请写出程序(包括定义变量类型和输出)。
a= 1 b= 2
x=1.200000,y=2.100000
y-x= 0.90,x+y= 3.30
n= 128765
c1='a' or 97
```c
#include<stdio.h>
int main(void)
{
int a,b;
long int n;
float x,y;
char c1;
a=1;
b=2;
x=1.2;
y=2.1;
n=128765;
c1='a';
printf("\n");
printf("a=%2d b=%2d \n",a,b);
printf("x=%8.6f,y=%8.6f\n",x,y);
printf("y-x=%5.2f,x+y=%5.2f \n",y-x,x+y);
printf("n=%9ld\n",n);
printf("c1='%c' or %d\n",c1,c1);
return 0;
}
运行结果:
a= 1 b= 2
x=1.200000,y=2.100000
y-x= 0.90,x+y= 3.30
n= 128765
c1='a' or 9s
```
* 习题
```c
问题1:阅读以下程序代码,当输入数据的形式为:25,13,10,正确的输出结果是多少?
#include<strdio.h>
int main(void)
{
int x,y,z;
scanf("%d,%d,%d",&x,&y,&z);
printf("x+y+z=%d\n",x+y+z);
return 0;
}
输入:25,13,10
输出:x+y+z=48
```
```c
问题2:以下程序执行的结果是多少?
#include<strdio.h>
int main(void)
{
int n=2,m=2;
printf("%d,%d\n",++m,n--);
return 0;
}
输出:3,2
```
```c
问题3:以下程序执行的结果是多少?
#include<strdio.h>
int main(void)
{
int a=2,b=5;
printf("a=%%d,b=%%d\n",a,b);// scanf()中的“%%”表示输出%本身。
return 0;
}
输出:a=%d,b=%d
```
```c
问题4:执行下列程序时输入:2468101,程序执行的结果是多少?
#include<strdio.h>
int main(void)
{
int x,y;
scanf("%2d%*2d%2d",&x,&y);//"%*d"表示虚度一个十进制整数,将其放弃而不存储
printf("x=%d y=%d\n",x,y);
printf("x+y=%1d\n",x+y);
return 0;
}
输出:
x=24 y=10
x+y=34
```
```c
问题5:执行下列程序时输入:aceg,程序执行的结果是多少?
#include<strdio.h>
int main(void)
{
char x,y;
x=getchar();
y=getchar();
putchar(x);
putchar('\n');
putchar(y);
return 0;
}
输入:aceg
输出:
a
c
```
|