今天换了一个老师给我们讲C基础,讲的内容有点多,但是感觉比前面shell脚本好多了,可能也是因为好多内容之前shell里面讲到过吧。就是二进制八进制十进制十六进制搞的我还是很懵。
老师上来就先给我们列了一个大纲:
先获取数据
1.常量 2.数据类型 3.定义变量取名规则 9.数组 10.指针
11.结构体 12.链表 13.文件 14.函数 15.字符串(用双引号括起来的) 16.冒泡排序,选择排序,插入排序,快速排序
4.scanf()可以获得键盘上的数据
对数据进行各种各样的操作
6.运算符 7.条件判断 8.循环
输出要得到的数据
5.printf()数据输出
常量:
1.不变的量
2.可以直接使用的量
分类:
1.直接常量:
1,整型:2
2,浮点型:1.2
3,字符型:a.'b' b.'\n' c."sdasfd"
2.标识符常量:SUM
#define SUM 50 宏定义
整型常量的表示:(这是我感觉最难的地方)
1,二进制:满二进一 每一位上只有0或1
2,八进制:以0开头 每一位满八进一
例:010
18^1+08^0
3,十进制:满十进一 0 表示负数的时候在前面加符号
4,十六进制:满十六进一 以0x或0X开头 a\A(10)b\B(11)c\C(12)d\D(13)e\E(14)f\F(15)
例:0x1b
116^1+b16^0=27
0x12
116^1+216^0=18
2.基本数据类型
整型变量:
基本整型:int 例:int a; 4字节
长整型:long[int] 8字节
短整型:
浮点型变量:实数
单精度型:float 例:float a;4个字节
双精度型:double 8个字节
字符型常量:用来接收一个字符型常量
char 例:char a='a'; 1个字节
定义变量:
格式:datatype name;
例:int a;
1.定义变量的时候给他赋值(初始化):
float b=1.2;
2.先定义再赋值;
char c;
c='a';
3.同一个数据类型可以定义多个变量
int a,b=15,c;
变量名:
1,只能是由数字、字母、下划线组合而成
2,数字不能打头
3,在C语言中区分大小写,所以变量名a和A不是同一个变量
4,变量名不能含有除下划线之外的任何一个特殊字符
5,int float double等成为C语言中的保留字,不能用来作为变量名
第一个C程序:"hello world"
1.新建源文件(.c为后缀的文件名)
vim 1.c
2.一个c项目只能有一个主函数main();主函数的第一个"("是程序开始执行的入口,")"是程序结束的出口
3.编译生成可执行文件
gcc 1.c生成可执行的二进制文件 a.out
4.编译并运行可执行的二进制文件
./a.out
编译的几个步骤
1.预处理:在编译程序前的准备工作,包含头文件的内容等
gcc -E 1.c -o 1.i
2.编译:进行类型检查,生成汇编代码
gcc -S 1.i -o 1.s
3.汇编:生成目标文件(二进制文件)
gcc -c 1.s -o 1.o
4.链接:链接库是生成可执行文件
gcc 1.o -o 1
同时编译运行多个文件
gcc 1.c 2.c 3.c 生成可执行文件a.out
标准输出函数printf():向显示屏输出数据
整型
十进制:
1,%d: int a=5;printf("a=%d\n",a);
2,%5d:输出的数据占5个字宽,从右边开始排
3,%ld:输出长整型数据
八进制
%o
十六进制
%x
例:
int a=-1;
printf("%d %o %x\n",a,a,a);
原码:
10000000000000000000000000000001
补码:
11111111111111111111111111111111
37777777777
ffffffff
数据在存储的时候是补码,显示的时候显示的是补码
原码:
二进制数,最高位是符号位,正数-0,负数-1
补码:
正数的补码=原码
负数的补码:原码的符号位不变,其余位取反,然后再加1
实型(浮点型)
1.%f 例:float a=1.2 说明整数部分原样输出,小数部分默认输出六位,第七位四舍五入
2.%m.nf:输出的数据占m个字宽,包括小数点,小数部分占n个字宽
3.$.nf:限制小数部分输出n位
4.%lf:double型数据输出
字符型
1.%c
例:char c='a';printf("%c\n",c);
2.%5c:输出的数据占5个字宽
字符串
%s
例:printf("%s\n","fsdfreg");
scanf():从键盘获取数据的输入:
例:int a;
scanf("%d",&a)
scanf("%d"(不要加-n),&(有一个&符号)a)
练习:定义int a float b char c 3个变量 一次性从键盘给他们赋值,并输出
1.scanf函数的格式控制符同printf,在" "中除了格式控制符之外,有什么字符,在输入数据的时候都要原样输入。如果只有格式控制符,且紧紧相邻,那么输入的时候各数据默认以空白键(空格,tab,回车)间隔,在此要特别注意字符型变量,它会取空白键
通常为了防止意外,通过各格式控制符间有空格。
2.残留回车
#include <stdio.h>
void main()
{
char a;
char c;
scanf("%c%*c",&a);
printf("a=%c\n",a);
scanf("%c%*c",&c);
printf("c=%c\n",c);
}
ASCii码:在存储字符的时候,每个字符有一个对应的数字,存储该数字几存储该字符,该数字即为字符的ASCII。
'a':97
'0':48
1.每一个字母后一个比前一个码值大1,数字也一样
2。对应字符的小写字符的码值比大写字符的码值大32.
练习:输入一个大写字母,输出他对应的小写字母
#include <stdio.h>
void main()
{
char c='A';
printf("%c\n",c+32);
}
注意:字母<=>ASCII
sizeof(类型/变量名):计算该类型或者变量在内存中占的字节数
#include<stdio.h>
void main()
{
int a;
printf("%ld,%ld\n",sizeof(int),sizeof(a));
}
转义字符:以反斜线开头,后面接一个或多个普通字符,能够实现特点功能的字符
\n: 换行
\r: 回车
\b: 退格
\:
\t: 制表符tab
': '
": "
算术运算符:
加(+)减(-)乘(*)除()求模/求余(%)
1.两个整数相除 5/2 值为整数,小数部分直接舍掉
2.求余的两个操作数都必须是整数
自动类型转换
1.把实型的数据赋给整型的数据,小数部分舍掉
2.把整型赋给实型,多6个0
强制类型转换:
强制类型转换运算符:()
#include<stdio.h>
void main()
{
float a=5.2
printf("%f\n",(float)((int)a%3));
}
练习:有4个水渠abcd往一个池子里注水,单开a,3天注满;单开b,1天注满;单开c,4天注满,单开d,5天注满,abcd同时开,几天注满?
#include<stdio.h>
void main()
{
float a=1/(1.0/3+1.0/1+1.0/4+1.0/5);
printf("%f\n",a);
}
getchar():
功能:
获取一个字符,返回获取到的那个字符,
例:
#include <stdio.h>
void main()
{
char c;
c=getchar();
printf("%c\n",c);
}
1.吸收残留残留回车
2.用来暂停一段程序
例:
#include <stdio.h>
#include <stdlib.h>
void main()
{
while(1)
{
// system("clear");
printf("xxx\n");
getchar();
}
}
putchar(字符常量/字符变量):用来向终端输出一个字符
#include<stdio.h>
#include<stdlib.h>
void main()
{
char a='a';
putchar(a);
putchar('a');
putchar('\n');
}
练习:输入boy,输出boy
#include <stdio.h>
#include <stdlib.h>
void main()
{
putchar(98);
putchar(111);
putchar(121);
putchar('\n');
}
或
#include <stdio.h>
#include <stdlib.h>
void main()
{
putchar(getchar());
putchar(getchar());
putchar(getchar());
putchar('\n');
}
自增运算符:使自身的值加1
前++:++i<=>i=1;i=i+1先加后用
后++:i++<=>i=1;i=i+1先用后加
自减运算符:使自身的值减1
前--:同上
后--:同上
条件结构:
1.简单if语句
格式:
if(条件)
{
语句
}
如果条件成立,就执行对应的语句,如果条件不成立,就去执行后面的指令(如果有的话)
2.两路分支结构:
格式:
if(条件)
{
语句1
}
else
{
语句2
}
如果条件成立,就执行语句1,否则就执行语句2
3.多路分支结构
if(条件1)
{
语句1
}
else if(条件2)
{
语句2
}
else if(条件3)
{
语句3
}
……
else
{
语句n
}
如果条件1成立,则执行语句1,否则继续判断条件2是否成立,如果成立则执行语句2,否则继续判断条件3是否成立,继续一次执行,如果都不成立,执行else对应的语句n。
练习:输入一个数,判断是奇数还是偶数
#include <stdio.h>
void main()
{
int a;
printf("请输入一个数:");
scanf("%d",&a);
if(a%2 == 0)
{
printf("是偶数!\n");
printf("xxx\n");
}
else
printf("是奇数!\n");
printf("ccc\n");
}
//1.一个等号表赋值,2个等号表判断
注释:1.//表示注释一行
2./* …… */表多行注释
3.注释不会参与编译,只是为了方便程序员阅读。注释不是文档,不要太多,要适当
写代码的时候要注意书写规范
1.通常是一条指令占一行,如果程序过短,也可以多条指令占一行
2.每条语句以分号结尾
3.程序结构要层次分明,要有锯齿状。同一层次的代码左对齐,不同层次的一个tab键进去
逻辑运算符:
与(&&):
条件1 && 条件2
条件1和条件2同时成立,整个表达式才成立,结果是1,否则,结果为0
条件的真假:假(0)->真(非0)
或(||):
条件1 || 条件2
条件1和条件2只要一个有成立,整个表达式就成立,结果是1,否则,结果为0
非(!):
!条件
条件为假,则表达式为真,1
条件为真,则表达式为假,0
判断某一年是否为闰年
条件:能够被4整除但不能够被100整除或者是能够被400整除
#include <stdio.h>
void main()
{
int year;
printf("请输入一个年份:");
scanf("%d",&year);
if((year%4==0 && year%100!=0) || year%400==0)
{
printf("是闰年!\n");
}
else
{
printf("不是闰年!\n");
}
}
a+=b <=> a=a+b;
#include <stdio.h>
void main()
{
int a=2,b=50;
if(a+=b || b)
{
printf("%d %d\n",a,b);
}
}
练习:根据输入期末考试成绩给出相应的判断,成绩大于等于90为“优”,大于等于80小于90为“良”,大于等于60小于80为“中”,其余为“差”。
#include <stdio.h>
void main()
{
float score;
printf("请输入分数:");
scanf("%f",&score);
if(score>=90)
{
printf("优!\n");
}
else if(score>=80)
{
printf("良!\n");
}
else if(score>=60)
{
printf("中!\n");
}
else
{
printf("差!\n");
}
}
课后作业:
1.复习今天内容,明天课堂提问
2.预习循环
3.每日一题:
根据输入的三种商品的价格,如果有一种商品的价格大于50或者总价大于100,享受15%的优惠。计算最后应付的款。