一、C语言的发展历程
机器语言(第一代语言)-汇编语言(第二代语言)-结构化语言-面向对象语言(第三代高级语言)
高级语言(速度最快) a+b 汇编语言 ADD AX,BX 机器语言 0000 0001 1101 10000
C的优点:代码量小 速度快(所以windows Linux以及unix系统都是C或C++编程语言编写的) 功能强大 C的缺点 危险性高,开发周期长(写大程序时很容易崩溃),可移植性不强
C语言的应用领域
系统软件开发(操作系统 三个)驱动程序:主板驱动、显卡驱动、摄像头驱动
数据库 DB2 Oracle Sql Server
应用办公软件:wps 图形图像多媒体:Photoshop 嵌入式软件开发 智能手机、掌上电脑 游戏开发:2D 3D
第一个例子--------------一元二次方程求解
#include <stdio.h>
#include <math.h>
int main()
{
int a, b, c;
int res, dei;
float x1, x2;
float x;
printf("请输入abc的值:");
scanf("%d%d%d", &a, &b, &c);
dei = b * b - 4 * a * c;
// printf("%d",a);
// printf("%d",b);
// printf("%d",c);
// printf("%d",dei);
if (dei > 0)
{
printf("该方程有两个不等的解");
x1 = (-b + sqrt(dei)) / 2 * a;
x2 = (-b - sqrt(dei)) / 2 * a;
printf("%f%f", x1, x2);
}
if (dei == 0)
{
printf("该方程有两个相等的解");
x = (-b + sqrt(dei)) / 2 * a;
printf("%f", x);
}
else
{
printf("该方程无解");
}
return 0;
}
二、C语言编程知识
1、cpu 内存条(在主板插着) 硬盘 显卡 主板 显示器之间的关系
先把硬盘上的数据调用在内存条上去,cpu在处理内存条中的数据,如果是图像的话通过显卡在显示器上输出,如果是声音的话,通过声卡输出
主板提供了以上传输的地方,cpu 内存条以及显卡硬盘都是在主板上的。
2、helloworld程序的运行
点击运行按钮,生成exe程序,让操作系统调用cpu去执行这个文件 即所有软件的运行都建立在操作系统上,靠调用cpu来运行
3、什么是数据类型
编程的第一步是进行数据的存储,存储在计算机中
基本类型数据(不可进行分割整数,浮点数,字符) 复合类型数据(结构体 枚举 共用体)
4、什么是变量
变量就是一个容器,保存数据在计算机中 int i; i=3;3最终是存放在内存(空闲的单元)中,程序终止时,3所占的空间被释放掉。
变量所对用的就是内存中空闲的单元。变量的本质是内存中一段存储空间
5、cpu 内存条 编译器 操作系统之间的关系
编译器发出请求,操作系统调用cpu在内存条分配变量地存储空间
6、变量为什么要初始化
初始化就是给变量赋值,没赋值就输出,可以输出为任意值0101码
7、如何定义变量
数据类型 变量名=要赋的值 等价于 数据类型 变量名;变量名=要赋的值;
8、什么是进制
十进制 逢十进一 二进制 逢二进一
进制转换
八进制前面加0,十六进制前要加0x或0X,十进制前面啥也不加
9、常量在C中如何表示
整数:十进制 十六进制 八进制
字符常量 单个字符用单引号,字符串用双引号
10、常量是以什么样的二进制代码存储在计算机中
编码 计算机中以二进制编码存放,整数是以补码的形式转化为二进制代码存储在计算机中
实数是以IEEE754标准转化为二进制代码存储在计算机中,字符的本质实际也是与整数存储方式(ASCII)相同。
11、代码规范化
整齐,程序不容易出错 代码要成对的敲比如括号
一般的程序 先定义变量 对变量进行操作 输出值
12、什么是字节
存储数据的一个单位,硬件所能访问的最小单位 1字节==8位 cpu只能控制字节,不能按位控制
1K==1024字节 1M==1024k 1G=1024M
320G----实际只有300G,换算单位不一样,买电脑的是以1000为单位,电脑硬件是以1024为单位的
13、不同类型数据之间相互赋值的问题 暂不考虑 要学补码
int i=45;long j=102345 i=j;很容易丢失数据,但是如果int i刚可以把j的数据放下就不会丢失了。
单C语言是可以相互转换的,不会出错
14、什么是ASCII
任何一个ASCII都可以转化为十进制数
ASCII不是一种值,而是一种规定。规定了不同的字符是使用哪一个整数值去表示
15、字符本质上与整数的存储方式相同(字符的存储)
16、基本输入与输出函数
printf() --将变量的内容输出到显示器 \n转义字符
printf("%d",i) %d的意思是把i以十进制形式输出 d是十进制 i对应的是二进制代码010101,%d指示把i以十进制形式输出
printf("%d %d",i,j) 一个输出控制符对应一个参数 输出 i j,输出控制符(以%号开头的,%d %ld %f %lf %x %c %o)和输出参数的个数要一一对应
printf("i=%d,j=%d",i,j)
17、为什么需要输出控制符
01组成的代码可以表示数据也可以表示指令
如果表示的数据的话,那么同样的01代码以不同的输出格式输出就会有不同的输出结果
scanf() 通过键盘将数据输入到变量中,两种用法:用法一:scanf("输入控制符",输入参数)
将从键盘输入的字符转换为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中
C语言中输入控制符和输出控制符是一样的,
scanf("%d",&i); &i表示i的地址,&是一个取地址运算符
scanf("m%d",&i) 键盘输入m123 √ 含有非输入控制符的用法 非输入控制符必须原样输入
一次多个变量输入呢?
scanf("%d %d",&i ,&j);由键盘输入两个数字 由空格隔开
scanf("%d,%d",&i,&j); 存在非输入控制符逗号,键盘也要输入逗号,即非输入控制符必须原样输入
18、运算符
算数运算符 + - * / %
关系运算符 > >= <= != ==
逻辑运算符 ! &&(并且 一假都假) || (或 一真则真) !真==假
&&左边的表达式为假,右边的表达式肯定不会执行 //不含有分号的是表达式,含有分好的是语句
||左边的表达式为真 右边的表达式肯定不会执行
赋值运算符 + += a+=3 a=a+3
优先级别:算数>关系>赋值
取余运算符 结果是整除后的余数,其余数的符号与被除数相同
-13%3=-1
19、scanf函数总结 即只有两种用法
1、没有输入控制符
2、有输入控制符空格或逗号
scanf("非输入控制符 输入控制符",输入参数)
将从键盘输入的字符转换为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中
非输入控制符必须原样输入
20、流程控制
1、什么是流程控制
程序代码执行的顺序
2、流程控制的分类
顺序执行
选择执行
某些代码可能执行,也可能不执行,有选择的执行代码
21、分类
1、if
最简单的用法 if(表达式) 豫剧 如果表达式为真,执行语句,如果表达式为假,则不执行
if的范围问题
if(表达式)
语句A;
语句B;
if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行,或者说,语句B一定会执行。
if默认只能控制一个语句的执行或不执行,如果想控制多个语句的执行或不执行,就必须把这些语句用{}括起来
if-else
if-else if-else
C语言对真假的处理
非零是真,零是假
if举例--求分数等级
22、如何看懂一个程序(分三步)
1、流程,先执行哪一个,后执行哪一个
2、每个语句的功能
3、试数,修改参数
23、循环
循环定义: 某些代码会被重复执行
循环分类: for while do while
#include<stdio.h>
int main(void)
{
int i;
int sum=0;
for(i=1;i<=99;++i)
sum=sum+i;
printf("sum=%d\n",sum);
return 0;
}
注:先执行i 在执行i<=99 然后执行sum=sum+i 最后执行++i,sum=sum+i标志着一次循环结束执行,然后再判断i是否符合取值范围。符合的话继续执行循环,不符合的话循环终止。
另外如果sum不赋值的话就是一个“垃圾值”,即就是一个随机值,不确定值,再继续执行循环的话输出的值依旧是”垃圾值“。
目的: 明白循环的流程(单个for循环的使用 多个for循环的嵌套使用),循环很重要。
for(1; 2 ;3)
语句A
for(1; 2; 3)
for(4; 5;6)
A;
B;
//双重循环 先执行1 2 4 5 然后执行语句A 语句B不属于此循环 ,所以不会在循环中执行语句B。
//一个分号结束是一个语句 6执行完后执行5 内部执行结束后在执行外部循环。
while
1、执行顺序
格式:while(表达式)
语句;
2、与for循环的相互比较
for和while可以相互转化 但for的逻辑性更强,更不容易出错,推荐多使用for循环
for(1;2;3)
A;
等价于
1;
while(2)
{
A;
3;
}
//从键盘输入一串数字 判断是不是回文数,是的话输出yes 否则输出no
#include<stdio.h>
int main()
{
int num;
int s;
int sum=0;
printf("请输入一个数字");
scanf("%d", &num);
printf("%d",num);
s=num;
while(s>0)
{
sum=sum*10+s%10;
s=s/10;
}
printf("%d", num);
if(s==sum)
{ printf("yes");
}
else
{
printf("no");
}
return 0;
}
do...while
do
{
}
while(表达式);
do while 并不等价与for,也不等价于while 主要用于人机交互和一元二次方程
switch
#include<stdio.h>
int main()
{
int val;
printf("请输入您要进入的楼层:");
scanf("%d",&val);
switch(val)
{
case 1:
printf("1层开!\n");
break;
case 2:
printf("2层开!\n");
break;
case 2:
printf("3层开!\n");
break;
default:
printf("无");
break;
}
}
case1 case 2 case 3和default是程序的入口,当一旦找到程序的入口后,就没有入口了,顺序执行, 1 2 3 和default就失效了,只顺序执行。
break和continue
break: 用于循环是来终止循环
用于switch是来终止switch
break不能直接用于if,除非if是属于循环的一个子句。
for(i=0;i<3;i++)
{
if(3>2)
break;
printf("嘿嘿"); //永远也不会输出
}
break是用来终止for循环的。
break用于多个for循环:
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<3;i++)
{
for(j=1;j<4;++j)
break; //在多层循环中 break 只能终止离他最近的一个循环
printf("hahahha");
}
return 0;
}
在多层switch嵌套中,break也只能终止离他最近的一个switch。
continue
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环
for(1:2:3)
{
A;
B;
continue; //如果执行该语句,则执行完该语句后·,会执行语句3,C和D都会被跳过去不执行
C;
D;
}