C语言的基本开发流程
编辑源代码-->编译-->链接-->执行
.c .obj .exe
- 预处理
头文件展开、宏替换、删除注释、处理条件编译
gcc:gnu(开源计划) c compiler(编译器)
gcc -E main.c -o main.i
- 编译
将代码翻译成汇编指令,逐行进行语法检查
gcc -S main.i -o main.s
- 汇编
将汇编文件编译成机器码文件(二进制文件)
gcc -c main.s -o main.o
- 链接
生成符号表、链接库文件
gcc main.o -o main.exe
- 一步登天:gcc main.c -o main.exe
标识符
简述
标识符:变量名、函数名
保留字:系统已经占用的关键字
关键字:C语言中预定的具有特定含义的词,也称保留字。共有32个。
标识符:用来标识变量、符号常量、数组、函数的名字
组成:
- 只能由英文字母、数字和下划线组成
- 第一个字符不能是数字(防止他是16进制数字),只能是字母或下划线
分隔符:有逗号和空格两种
逗号一般分割变量或参数,空格用于分割单词
命名规则
- 不能与关键字同名
- 不能以数字命名
- 见名知意
- 不能与关键字同名
- 区分大小写
命名规范
匈牙利命名 tree_hei
驼峰命名:
- 小驼峰 treeHei
- 大驼峰 TreeHei
数据类型
数据类型 | 占据内存大小 | 数据范围 | 格式字符 |
int(整型) | 4字节 | +21亿~-21亿 | %d |
short(短整型) | 2字节 | -32768 ~ + 32767 | %hd |
long(长整型) | 8字节 | +21亿~-21亿 | %ld |
long long | 8字节 | -2^63(-9.2233720368548e+18) ~ 2^63-1(9.2233720368548e+18) | %lld |
float(单精度型) | 4字节 | -3.4x10 -38 ~ 3.4x10 38 | %f、%e、%a |
double(双精度型) | 8字节 | -1.7x10 -308 ~ 1.7x10 308 | %f、%e、%a |
long double | 8字节 | -1.7x10 -308 ~ 1.7x10 308 | %lf、%le、%la |
char(字符型) | 1字节 | -128~127 | %c |
格式符与变量存储数据应当一致,不对应会出现数据错误,如:
上面unsigned为无符号,储存不应为负数,此题中负号不表示数值,而作为最高位的值(负号为1),所以值为2^16-1。
运算符
算术运算符
详细知识点及运算符优先级见此篇文章:http://t.csdnimg.cn/QdM6D
那么如何使a、b类型不变(均为int),得出想要的小数结果呢?
我们只需要使地板除(/)左右两边任意一方为小数即可,由此我们可以使用类型转换:
- 强制类型转换
强制类型转换:将数据强行转换为你想要的类型--2级
float c = ( float ) a / b ;
float优先级(强制类型转换优先级)为2级,高于地板除(/)3级,高于赋值(=)
- 自动类型转换
自动类型转换:低类型数据与高类型数据进行运算,结果为高类型数据
易出bug但不易被发现,举个例子:
逻辑运算符
&&:逻辑与/并且 11级
左右两边条件都为真,结果为真;左右任意一边条件为假,结果为假
| |:逻辑或/或者 12级
左右两边条件都为假,结果为假;左右任意一边条件为真,结果为真
! :逻辑非 2级
非真为假,非假为真
有括号先算括号里的(括号优先级为1级)
流程控制
- 顺序结构
以函数为单元,自上而下执行。若当前行为函数调用语句,则执行该函数后回来继续往下执行
- 选择结构
也称为分支结构,根据某个条件选择执行某个语句(根据输入不同选择执行不同语句)
1、 if分支结构
单分支
if(条件){
}
条件为真则执行对应语句,条件为假则不执行
双分支
if(条件){
}
else{
}
若if条件为真,则执行对应代码;
若if条件为假,则执行else代码。
多分支
if(条件){
}
else if(条件){
}
else{
}
代码放在这里:
#include <stdio.h>
int main(){
int score=0;
scanf("%d",&score);
if(score >= 90 && score <= 100){
printf("优秀");
}else if(score >= 80 && score < 90){
printf("良好");
}else if(score >= 70 && score < 80){
printf("中等");
}else if(score >= 60 && score < 70){
printf("及格");
}else if(score >= 0 && score < 60){
printf("不及格");
} else{
printf("成绩出错,请联系教务处");
}
return 0;
}
2、switch分支结构(遇break停止执行,不遇到则从选择条件继续执行直到所有语句执行完毕)
switch(整型变量/字符变量){
case a(同类型常量) :(可有若干条语句)
break;
case b :
break;
······
default :
}
- 循环结构
for循环(明确循环次数及规律)
while循环(循环次数不明确,需根据循环体的执行情况来决定)
do···while循环(至少执行一次)
break:立即结束循环
continue:跳过本次循环
练习
1.输入整数,若该整数为3的整数倍输出yes,否则输出no
2.输入整数,若该整数在200-400之间,输出OK
3.输入整数,若该数字在91-100之间,输出A
若该数字在81-90之间,输出B
若该数字在60-80之间,输出C
若该数字在0-60之间,输出D
其他,输出other
4.输入两个整数,输出他们的较大值
5.输入一个整数,输出它的绝对值
6.输入三个数,判断是否为连续数,是输出yes,不是输出no(连续数指1 2 3或3 2 1)
7.输入一个华氏温度F,输出摄氏温度,计算公式为c=5/9*(F-32),要求结果保留两位小数(地板除问题)
8.两数交换
9.三个数求最大值
10.某小区采取阶梯用电收费 100度以下收费0.49元 100-200度收费0.79元 201-300度1.0元
300度以上1.35元 输入用电量 输出费用(以元为单位 结果保留两位小数)
代码如下:
//输入整数,若该整数为3的整数倍输出yes,否则输出no
#include <stdio.h>
int main(){
int num=0;
scanf("%d",&num);
if(num%3==0){
printf("yes");
}else{
printf("no");
}
return 0;
}
//输入整数,若该整数在200-400之间,输出OK
#include <stdio.h>
int main(){
int num=0;
scanf("%d",&num);
if(num >= 200 && num <= 400){
printf("OK");
}
return 0;
}
//输入整数,若该数字在91-100之间,输出A
//若该数字在81-90之间,输出B
//若该数字在60-80之间,输出C
//若该数字在0-60之间,输出D
//其他,输出other
#include <stdio.h>
int main(){
int num=0;
scanf("%d",&num);
if(num > 90 && num <= 100){
printf("A");
}else if(num > 80 && num <= 90){
printf("B");
}else if(num > 60 && num <= 80){
printf("C");
}else if(num >= 0 && num <= 60){
printf("D");
}else{
printf("other");
}
return 0;
}
//输入两个整数,输出他们的较大值
#include <stdio.h>
int main(){
int a=0;
int b=0;
scanf("%d %d",&a,&b);
if(a >= b){
printf("%d",a);
}else {
printf("%d",b);
}
return 0;
}
//输入一个整数,输出它的绝对值
#include <stdio.h>
int main(){
int num=0;
scanf("%d",&num);
if(num >= 0){
printf("%d",num);
}else {
printf("%d",-num);
}
return 0;
}
//输入三个数,判断是否为连续数,是输出yes,不是输出no(连续数指1 2 3或3 2 1)
#include <stdio.h>
int main(){
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d",&a,&b,&c);
if((b == a + 1 && b == c - 1) || (b == a - 1 && b == c + 1)){
printf("yes");
}else {
printf("no");
}
return 0;
}
//输入一个华氏温度F,输出摄氏温度,计算公式为c=5/9*(F-32),要求结果保留两位小数(地板除问题)
#include <stdio.h>
int main(){
int F=0;
scanf("%d",&F);
float c=5.0/9*(F-32);
printf("%.2f",c);
return 0;
}
//两数交换
#include <stdio.h>
int main(){
int a=0;
int b=0;
scanf("%d %d",&a,&b);
int c = 0;
c = a;
a = b;
b = c;
printf("交换后的结果为:%d %d",a,b);
return 0;
}
//三个数求最大值
#include <stdio.h>
int main(){
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d",&a,&b,&c);
int max = 0;
if(a >= b && a >= c){
max = a;
}else if(b >= c && b >= a){
max = b;
}else{
max = c;
}
printf("最大值为:%d",max);
return 0;
}
//某小区采取阶梯用电收费 100度以下收费0.49元
// 100-200度收费0.79元
// 201-300度1.0元
// 300度以上1.35元
// 输入用电量 输出费用(以元为单位 结果保留两位小数)
#include <stdio.h>
int main(){
int num=0;
scanf("%d",&num);
double cost = 0;
if(num < 100){
cost = num * 0.49;
}else if(num >= 100 && num <= 200){
cost = 0.79 * (num - 100) + 49;
}else if(num >= 201 && num <= 300){
cost = 1.0 * (num - 200) + 128;
}else{
cost = 1.35 * (num - 300) + 228;
}
printf("费用为:%.2f",cost);
return 0;
}