学习内容
注释的使用
#include的作用
main函数介绍
printf函数格式化输出
C语言基本数据类型
scanf函数格式化输入
变量
运算符
循环:if
工资实战
年龄转换实战
1. 注释的使用
// 注释内容
单行注释:用于一行简短的注释,不需要换行的情况。
/* 注释内容 */
多行注释:注释内容过多,需要换行的情况。
/** 注释内容 */
文档注释(用于生成开发者文档):java语言特有的注释,其中的注释内容可以被JDK提供的工具 javadoc 所解析,生成一套能够以网页形式体现程序的说明文档
2. #include的作用
include---宏 用来导入头文件。如果系统已经提供某些功能的实现,只需要使用include将这些功能所在的头文件导入进来就可以了。
< >
用来导入系统提供的类库,如:stdio.h stdlib.h math.h string.h
,
" "
用来导入自己定义的头文件,如:calculate.h
。
#include <stdio.h>
编译器首先从系统的类库里面去查找这个头文件,如果没有,再到自己的文件中查找,否则报错。
#include "stdio.h"
编译器首先从自己的文件中去查找这个头文件,如果没有,再到系统的类库里面查找,否则报错。
3. main函数的使用
main函数 = 代码块 = 完成特定功能,所有的程序的入口点都是main函数。
int返回值,用来记录当前程序的运行状态,0:正常结束 资源自由分配,非0:1 异常结束 没收资源。
int argc
:参数个数 argument count,char* argv[]
:每个参数组成的字符串数组。int main(int argc, char *argv[]) { printf("%d\n",argc); printf("%s\n",argv[0]); return 0; } 输出: 1 G:\ThridStudy\C_Project\Project1.exe(.c文件编译生成的exe文件所在的位置)
4. printf函数格式化输出
printf输出语句,用来让终端输出数据。
打印常量字符串:
printf("hello world");
转义字符:\n 的意思是回车换行,将当前位置移到下一行的开头。\r 的意思是回车,将当前位置移到本行的开头。\t 的意思是水平制表符,将当前位置移到下一个tab位置。
int main(int argc, char *argv[]) { printf("helloworld\t"); printf("%d\n",argc); printf("%s\r",argv[0]); getchar(); return 0; }
5. C语言基本数据类型
① 首先明确,C标准并没有具体给出规定哪个基本类型应该是多少个字节数,而且这个也与OS、编译器有关
② 虽然16位、32位或者64位的机子各种类型并不一样,但有几条规则(ANSI/ ISO制定):
short 至少占用2个字节
int 建议为一个机器字长,32位环境下为4字节,64位环境下为8字节
short 的长度不能大于int, long 的长度不能小于int
③ 基本数据类型参照表格:
类型 描述 16位 32 位 64位 打印方式 char 字符,如:'a','d' 1 1 1 %c short 短整型 2 2 2 %hd int 整型,如1,2341 2 4 4 %d long 长整型 4 4 8 %ld float 单精度浮点数,如1.5,82.0 4 4 4 %f double 双精度浮点数 8 8 8 %f 在自己的平台上可以使用
printf("%d\n",sizeof(int));
测试具体的数据。注意:
1. C语言中printf输出float和double都可以用%f,而double型数据还可以用%lf。
2. scanf当中若是对双精度的变量赋值是必须是%后跟lf,而printf当中可以用%f也可以用%lf没有限制。
3. printf() 只会看到双精度数,printf 的 %f 格式总是得到 double,所以在 printf() 中使用 %f 跟 %lf 的输出显示效果是一样的。
4. 对于变量来说,double 类型比 float 类型的精度要高。double 精度更高,是指它存储的小数位数更多,但是输出默认都是 6 位小数。如果你想输出更多小数,可以自己控制,比如 %.10lf 就输出 10 位小数。
④ 控制输出格式:
%md:要求输出字段宽度为m,右对齐,不够左端补空格,大于m按实际输出,如%3d。
%0md:要求输出字段宽度为m,右对齐,不够左端补0,大于m按实际输出,如%02d。
%m.nd:要求输出字段宽度为m,右对齐,后面n个位置当做小数,没有的补0,最前面m-n个没有的补空格,如%3.2d。
6. scanf函数格式化输入
- scanf输入语句,用来向终端输入数据。
int a = 0; scanf("%d",&a); printf("%d",a);
当用户在终端输入数据时,数据会被存放到缓冲流,scanf用于在缓冲流中找到数据将其放入到给定的位置。
放入到给定的位置就是保存输入的数据,保存数据需要用到变量,我们只需要把数据送到对应变量的地址,就存储好了该数据,就可以通过该变量使用该数据。所以使用
&
获得变量a
的地址。int a = 0; scanf("jack%d",&a); printf("%d",a);
- 此时输入数据必须按照
jack+数据
的格式,才可以将数据送入到变量中。所以,scanf函数中" "
里面的内容用来控制输出格式。int a = 0; int b = 0; scanf("%d %d",&a,&b); printf("%d %d",a,b);
- 利用上面的输出格式一次性输入两条数据。
7. 变量
变量是程序可操作的存储区的名称;变量的类型决定了变量存储的大小;变量的名称可以由下划线,字母,数字组成,它必须以字母或者下划线开头。简单的说变量就是用来记录数据的。
变量的声明:没有分配内存空间,使用的时候才会分配,如
int a;
变量的定义:立刻为我们分配内存空间 赋初值,如
int a = 0;
变量的使用:
int num1,num2; scanf("%d %d",&num1,&num2); printf("%d %d\n",num1,num2);
- bool类型的变量(需要导入stdbool.h),其值非零即真(1),零为假(0)。
bool status = -3; printf("%d\n",status);//结果是1
8. 运算符
- 算术运算符:
运算符 描述 + 把两个操作数相加 - 第一个操作数减去第二个操作数 * 把两个操作数相乘 / 两个数相除,取商 % 两个数相除,取余 ++ 自增运算符,整数值加1 -- 自减运算符,整数值减1 注意:a++是先赋值后运算,++a是先运算后赋值
- 逻辑运算符
运算符 描述 && 逻辑与运算符,如果两个操作数都非零,则条件为真 || 逻辑或运算符,如果两个操作数有任意一个非零,则条件为真 * 逻辑非运算符,逆转操作数的逻辑状态
- 关系运算符
运算符 描述 == 检查两个操作数的值是否相等,如果相等则条件为真 != 检查两个操作数的值是否相等,如果不相等则条件为真 > 判断左操作数的值是否大于右操作数的值,如果是则条件为真 < 判断左操作数的值是否小于右操作数的值,如果是则条件为真 >= 判断左操作数的值是否大于或等于右操作数的值,如果是则条件为真 <= 判断左操作数的值是否小于或等于右操作数的值,如果是则条件为真
- 赋值运算符
运算符 实例 = C=A+B,将A+B的值赋给C += C += A 相当于 C = A + C -= C -= A 相当于 C = A - C *= C *= A 相当于 C = A * C /= C /= A 相当于 C = A / C %= C %= A 相当于 C = A % C
9. 循环:if
- if语句的形式:C 语言把任何非0和非null的值假定为 true,把0或 null 假定为 false。
if (条件) { 条件成立要做的事 } if (条件) { 条件成立要做的事 }else{ 条件不成立要做的事 } if (条件1) { 条件1成立要做的事 }else if (条件2){ 条件2成立,条件1不成立要做的事 }else if (条件3){ 条件3成立,条件1,2不成立要做的事 } ... }else{ 以上条件都不成立要做的事 }
- 问号表达式:(也称之为三目运算符)
(表达式1)?(表达式2):(表达式3),如果表达式1成立则执行表达式2,否则执行表达式3
a>b ? s = a+b : s = a-b
这里的例子,如果 a > b,那么 s 的值是a+b,否则 s 的值是a-b
- 逗号表达式:
将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值
(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,最终结果是14
int temp = 1; if(temp--,temp){ printf("temp是1"); }else{ printf("temp是0"); } 输出结果: temp是0
10. 工资实战
- 优化前:
#include <stdio.h> int main(){ int salary = 0;//记录工资 int pay = 0; //税后工资 //接收输入 printf("请输入工资:"); scanf("%d",&salary); //开始计算 if(salary < 5000){ pay = salary; }else if(salary > 5000 && salary < 8000){ int tax = (salary - 5000)*0.1; pay = salary - tax; }else if(salary > 8000 && salary < 10000){ int tax = (salary-8000)*0.15 + 3000*0.1; pay = salary - tax; }else{ int tax = (salary - 10000)*0.2 + 2000*0.15 + 3000*0.1; pay = salary - tax; } printf("到手工资: %d",pay); return 0; }
- 优化后:
#include <stdio.h> int main(){ int salary = 0;//记录工资 int tax = 0; //税 //接收输入 printf("请输入工资:"); scanf("%d",&salary); //开始计算 if(salary < 5000){ tax = 0; }else if(salary > 5000 && salary < 8000){ tax = (salary - 5000)*0.1; }else if(salary > 8000 && salary < 10000){ tax = (salary-8000)*0.15 + 3000*0.1; }else{ tax = (salary - 10000)*0.2 + 2000*0.15 + 3000*0.1; } printf("到手工资: %d",salary - tax;); return 0; }
11. 年龄转换实战
#include <stdio.h> //输入年龄 20 //your age is twenty; int main(){ int age = 0; //保存个位数 21%10 = 1 char* gewei[] = {"","one","two","three","four","five","six","seven","eight","nine"}; //保存10-19 char* temp[] = {"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"}; //保存十位 char* shiwei[] = {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"}; printf("请输入年龄:"); scanf("%d", &age); char *name;//保存每次取出的字符串 if(age < 10){ //直接访问各位数数组 name = gewei[age]; }else if(age >= 10 && age <= 19){ //获取个位数 int index = age % 10; name = temp[index]; } else{ //获取个位数 int g = age % 10; //获取十位数 int s = age / 10; //取出对应的单词 int sString = shiwei[s-2]; int gString = gewei[g]; printf("your age is %s-%s\n" ,sString,gString); //程序还未运行完毕就提前结束 return 0; } printf("your age is %s\n",name); return 0; }