开发环境
vmware虚拟机提供一个虚拟的环境,可以让操作系统运行在虚拟机中
1.1 C语言简介
C语言是世界上最流行、使用最广泛的高级程序设计语言之一,广泛用于系统与应用软件的开发。
具备很强的数据处理能力、高效、灵活、功能丰富、表达力强和较高的移植性等特点
---------------------------------------------------------------------------------------------------------------------------------
1.2 编程语言(*)
c、java、c++、C#、objective-c
C: 嵌入式(设备开发)、系统及开发(速度快)
java: android应用开发(微信、支付宝、美团)、web开发(电信收费系统、企业管理系统)
C++: 导航系统、CAD、3DMAX(软件速度快)
C#: windows平台应用软件(容易学,但需求越来越少)objective-c 苹果电脑、苹果手机上的开发语言(从2015年开始,需求越来越少)
---------------------------------------------------------------------------------------------------------------------------------
1.3 C语言开发环境(*)
vmware: 虚拟机,能用软件虚拟出硬件(cpu、内存、网卡、声卡、usb....)
在此硬件基础上再安装一个新操作系统
vmware:上可以安装windows, linux, unix(等操作系统)
Linux是一个操作系统
---------------------------------------------------------------------------------------------------------------------------------
ubuntu redhat 红旗 suse debian -----> Linux系统
命令 ls ----> list 列表 查看目录文件(文件夹子)里面的文件列表
//ls 命令,就是看看某个文件夹子里面有啥玩仍
蓝色: 目录文件 (文件夹子)
白色: 普通的文本文件
写代码的原则, 缝缝补补又三年
//框架
#include <stdio.h>
int main()
{
return 0;
}
初中数学题:
解:
1.4 打印输出 hello world
vi / vim 都可以
vim是vi的升级版本的编辑器
vim 命令
vim 是一个文本编辑器 (类似于office 2007)
1. vim hello.c //用vim编辑器打印一个文件,名字叫做hello.c
//如果文件不存在,创建并打开,如果文件存在,直接打开
进入的是一般模式 ,此时是不能往里面输入代码的
2. 按i,屏幕的左下角出现INSERT,此时的vim编辑器处于 插入模式
3. 保存并退出
按esc键,vim编辑器由 插入模式 切换到 一般模式
按Space(shift+;), 左下角出现: 编辑器由 一般模式 切换到 尾行模式(命令行模式)
:wq //w保存 q退出
:q //退出,没有保存
:wq! //强制保存退出
4. gcc 是一个编译器
gcc hello.c //gcc编译器,编译hello.c文件,生成的可执行文件是 绿色的a.out
生成的产物是 a.out
5. 运行程序 ./a.out // ./ 当前目录下的 a.out 程序
##代码演示
#####重点:
一个程序有且只能有一个main函数
main函数是一个程序的入口函数
讲解hello.c
#include <stdio.h>
//#预处理的 include 包含的意思
//.c 结尾的是C语言的源程序
//.h head 头文件
// stdio.h standard input output 标准输入输出头文件
// < > Linux系统自带的头文件
// "my.h" 自己的写的头文件用 " "
//int 整型 main函数的返回值类型 是int
//() 里面放的main函数的参数列表
int main()
{//main函数函数体开始
printf("Hello World!!\n"); // ;代表一句话的结束
//功能:在屏幕上打印输出字符串
//printf 是一个函数 格式化输出函数
// \n是换行符
//" "表达的是字符串, " "之间写什么,屏幕上就原封不动打印输出什么
return 0; //返回值的意思,返回值是0
} //main函数体的结束
//解题的 解 字
#include <stdio.h>
int main()
{
return 0;
}
####### 练习 1 新建一个文件 vim student.c 打印输出 I am a student!!
gcc student.c
#include <stdio.h>
int main()
{
printf("I am a Student!!\n");
return 0;
}
####### 练习 2 新建一个文件 vim star.c 打印输出下面的图案
*
***
*****
#include <stdio.h>
int main()
{
//方法一
printf(" *\n ***\n*****\n");
//方法二
// 只能注释一行
printf(" *\n");
printf(" ***\n");
printf("*****\n");
return 0;
}
1.5 注释(通常用于两种情况)(**)
(1)代码的解释部分
#include <stdio.h>
int main()
{
//方法一
printf(" *\n ***\n*****\n");
//方法二
// 只能注释一行
printf(" *\n");
printf(" ***\n");
printf("*****\n");
return 0;
}
(2)代码现在不需要的部分
#include <stdio.h>
int main()
{
//方法一
printf(" *\n ***\n*****\n");
//方法二
// 只能注释一行
// /* */注释多行代码,可以将 /* 和 */之间的代码都注释掉
/*
printf(" *\n");
printf(" ***\n");
printf("*****\n");
*/
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------1.6 数据的存储与运算
1.6.1 变量定义及输出
学习C语言三步走
1. 创建一个杯子
2. 往杯子里面装东西
3. 将杯子里面的东西打印输出
#include <stdio.h>
int main()
{
//定义一个整型变量a,int 整型 a 变量的名字
int a;
//给整型变量a赋值
a = 10; // = 代表的是赋值,把10装到变量a中
//将变量a中的值打印输出
printf("a is \n");
printf("a is %d\n",a);//%d是占位符,%d位置显示的内容会由变量a的值替换,其他原样输出
// " "之间的内容,原封不动的打印输出,只不过%d的位置有a的值替换
printf("a -------> %d\n",a);
return 0;
}
那么如果我们要保存小数呢???
#include <stdio.h>
int main()
{
int a;
float b;//float类型是用来保存小数的
//给整型变量a赋值
a = 10; // = 代表的是赋值,把10装到变量a中
//将变量a中的值打印输出
printf("a is \n");
printf("a is %d\n",a);//%d是占位符,%d位置显示的内容会由变量a的值替换
// " "之间的内容,原封不动的打印输出,只不过%d的位置有a的值替换
printf("a -------> %d\n",a);
b = 2.2;
printf("b的值是%f\n",b);// 打印单精度浮点类型用%f
printf("b的值是%.2f\n",b);// 打印单精度浮点类型用%f .2保存小数点后两位
return 0;
}
####### 练习 3 定义一个整型变量x, 定义一个浮点型变量y,
将-1赋值给变量x,将3.14赋值给变量y,打印
再将1 赋值给变量x,将-3.14赋值给变量y,再打印
#include <stdio.h>
int main()
{
int x;
float y;
x = -1;
y = 3.14;
// printf("x is %d\n",x);
// printf("y is %f\n",y);
printf("x is %d\ny is %f\n",x,y);
x = 1;
y = -3.14;
printf("x is %d\ny is %f\n",x,y);
// printf("x is %d\n",x);
// printf("y is %f\n",y);
return 0;
}
#include <stdio.h>
int main()
{
int a; //定义一个变量,没有初始值,默认是随机数(垃圾值)
printf("a is %d\n",a);
a = 101;
printf("a is %d\n",a);
return 0;
}
//整容手法
int a; //定义一个整型变量a
a = 10;//赋值10
//天生丽质
int a = 10;//将整型变量a初始化为10
1.6.2 如何手动输入一个数保存到变量中 scanf
#include <stdio.h>
int main()
{
int a; //定义一个变量,没有初始值,默认是随机数(垃圾值)
//思考:让变量a里面的值来自于键盘输入
printf("请您输入一个整数:\n");
scanf("%d", &a);//&取地址 &a得到的是变量a在内存当中存储的首地址
//输入的数保存到整型变量a中
printf("a is %d\n",a);
return 0;
}
##注:定义变量时需先考虑变量用来存储什么类型的数据,即存储什么类型的数据,就定义什么类型的变量。
1G --- 1024M
1M --- 1024kb
1kb --- 1024byte 字节
数据类型 格式化输入输出类型和格式 占内存空间的大小
//存整数
char 字符型 %c 1字节
short 短整型数据 %hd 2字节
int 整型数据 %d 4字节
long 长整型数据 %ld 4字节
//存小数
float 单精度浮点型(保存小数)%f 4字节
double 双精度浮点型 %lf 8字节
---------------------------------------------------------------------------------------------------------------------------------------------------
1.8 数制
十进制: 逢十进一 0 1 2 3 4
二进制: 逢二进一 000 001 010 011 100
八进制(以0开头): 逢八进一 016 007 010 ... 017 020
十六进制(以0x开头):逢十六进一 0x7a 09 0a 0b 0c 0d 0e 0f 10
0 1 2 3 4 5 6 7 8 9 A B C D E F
(***)二转八: 从右至左, 二进制的每三位算八进制的一位
(***)二转十六: 从右至左, 二进制的每四位算十六进制的一位。
十进制 ---> 二进制
十进制 ---> 八进制
十进制 ---> 十六进制
#方法: 先%再/,/到0结束
19 二进制 10011
八进制 023 010 011
十六进制 0x13 0001 0011
29 //十进制
二进制 11101
八进制 035
十六进制 0x1D
二进制 ---> 十进制
八进制 ---> 十进制
十六进制 ---> 十进制
#方法: 先标号,再求和
43210
11101
标的号对应的是2的几次幂
1*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4
1 + 0 + 4 + 8 + 16 = 29
10
035
5*8^0 + 3*8^1 = 5 + 24 == 29
10
0x1D
13*16^0 + 1*16^1 = 13 + 16 = 29
3210 8 4 2 1
8421
1111 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0
8421
1011 --->B
1100 --->C
0111 --->7
1010 --->A
0011 --->3
29
二进制 ----> 十六进制
11101
四个分一堆,最后不够的由0填充
8421 8421
0001 1101
1 D
二进制 ----> 八进制
11101
三个分一堆,最后不够的由0填充
421 421
011 101
03 5
8421
1010
A ---> 1010
9 ---> 1001
D ---> 1101
E ---> 1110
6 ---> 0110
3 ---> 0011
十六 --> 二进制 一个十六进制位 对应 四个二进制位
0xA3
A 3
1010 0011
八 ---> 二进制 一个八进制位 对应 三个二进制位
056
5 6
101 110
0xB3C 二进制 八进制 十进制
49(十进制) 二进制 八进制 十六进制
快速 二进制 ---> 十六进制
二进制 ---> 八进制
十六进制 ---> 二进制
八进制 ---> 二进制
######// 练习4:求0xff 的10进制值,2进制值, 8 进制值
######// 练习5 : 求128 的2进制, 8 进制, 16 进制
----------------------------------------------------------------------------------------------------------------------------------------------------
1.9 运算符
1.9.1 算数运算符
(1) + 加法运算符 int a = 3 + 5; //a = 8;
(2) - 减法运算符 int b = 3 - 5; //b = -2;
(3) * 乘法运算符 int c = 3 * 5; //c = 15;
(4) / 除法运算符 int d = 5 / 3; //d = 1;
(5) % 模运算符(求余运算) int e = 5 % 3; //e = 2;
####除法的考点:
5 / 2 === 2 5里面有几个2 整数 / 整数 == 整数
9 / 5 ==== 1
5.0 / 2 === 2.5
####模除运算的考点
(1) 4 % 5 == 4 较小的数 % 较大的数 == 较小的数本身 1 % 9 == 1
(2) %运算要求 % 运算符左右两边 必须是整数
2.2 % 2 错误的语法
int a = 3 + 5 * 2; // a = 13
int a = (3 + 5) * 2;// a = 16
int a = 3;
int b = 5;
int c = a + b;
###### 练习6:输入三个小数,求和,求平均值分别打印
float a;
scanf("%f",&a);
#include <stdio.h>
int main()
{
//定义三个浮点类型变量,存储小数
float a,b,c;
float sum,avg;//sum定义为float,是因为a b c 的类型是float,和是float类型
printf("Please input three number:\n");
scanf("%f%f%f",&a,&b,&c);//输入三个数
sum = a + b + c;
avg = sum / 3;
printf("sum is %.2f\navg is %.2f\n",sum,avg);
return 0;
}
1.9.2 关系运算符
(1) < 小于
(2) <= 小于等于
(3) > 大于
(4) >= 大于等于 //(1)(2)(3)(4)优先级相同(高)
(5) == 等于
(6) != 不等于 //(5)(6)优先级相同(低)
1.9.3 逻辑运算符
(1) && 逻辑与 // (a>b)&&(x>y)
(2) || 逻辑或 // (a>b)||(x>y)
(3) ! 逻辑非 // ! (a > b) ###举例:if(!a)
----------------------------------------------------------------------------------------------------------------------------------------------------
1.6 选择结构程序设计 1.6.1 if 条件判断(进一步理解上面关系运算符和逻辑运算符)
#include <stdio.h>
int main()
{
int age;
printf("Please input age:\n");
scanf("%d",&age);
if(age >= 18)//注意if()后面,不要加;号 if条件为真,执行if下面{}里面的语句
{
printf("孩子,可以上网吧了!!\n");
}
else//否则 当if条件为假的时候,执行else 下面{}里面的语句
{
printf("孩子,回家写作业去吧!!\n");
}
printf("11111111\n");
return 0;
}
(1)if-else
if(条件)//注意if()后面,不要加;号 if条件为真,执行if下面{}里面的语句
{
}
else//否则 当if条件为假的时候,执行else 下面{}里面的语句
{
}
####### 练习6: 完成如下功能:
1 显示: "please input a number:"
2 用户输入
3 判断用户输入的数是不是 大于90,是打印Yes,否打印No
#include <stdio.h>
int main()
{
int num;
printf("Please input num:\n");
scanf("%d",&num);
if(num > 90)
{
printf("Yes!!\n");
}
else
{
printf("No!!\n");
}
return 0;
}
/讲解当if条件句{ }里只有一行语句时{ }可以省略不写
##练习7:输入一个数,判断是否等于0,是打印Yes,不是打印No
方法一 用 == 做
#include <stdio.h>
int main()
{
int num;
printf("Please input num:\n");
scanf("%d",&num);
if(num == 0)
{
printf("Yes!!\n");
}
else
{
printf("No!!\n");
}
return 0;
}
方法二 用 != 做
#include <stdio.h>
int main()
{
int num;
printf("Please input num:\n");
scanf("%d",&num);
if(num != 0)
{
printf("No!!\n");
}
else// num == 0
{
printf("Yes!!\n");
}
return 0;
}
####### 练习8:
//新的知识点
if嵌套
if()
{
if()
{
}
}
1 从键盘输入一个数, 判断这个数是不是偶数,如果是偶数,打印此数
提示:a % 2
2 继续,如果是偶数,再判断这个数的一半是不是偶数
#include <stdio.h>
int main()
{
int num;
printf("Please input num:\n");
scanf("%d",&num);
if(num % 2 == 0)
{
printf("%d是偶数!!\n",num);
if(num/2%2 == 0)//进行判断一半是不是偶数的前提条件是,num已经是偶数了
{
printf("一半%d是偶数!!\n",num/2);
}
}
return 0;
}
###### 练习9:
判断一个数是否满足条件:
a) 是7的倍数
b) 不是3的倍数
如果满足,输出该数
#include <stdio.h>
int main()
{
int num;
printf("Please input num:\n");
scanf("%d",&num);
if(num % 7 == 0)
{
if(num % 3 != 0)
{
printf("%d OK!!\n",num);
}
}
return 0;
}
逻辑与
&& 逻辑与, 用在多个条件之间,用来判断多个条件是不是都满足 ----> if嵌套
同真为真,一假即假
if(条件1 && 条件2 && 条件3)
{
//执行语句
}
#include <stdio.h>
int main()
{
int height, eye, money;
printf("Please input height eye money:\n");
scanf("%d%d%d",&height,&eye,&money);
//今年23,要求高
// && 同真为真,一假即假
if(height > 180 && eye == 2 && money > 20000)//所有的条件都为真,才执行if{}里面的语句
{
printf("赶紧安排,见面!!\n");
}
else
{
printf("下一位!!\n");
}
return 0;
}
逻辑或
|| (用来判断多个条件是不是有一个满足)
输入两个数,判断是不是有一个是0 //一真即真,同假为假
#include <stdio.h>
int main()
{
int height, eye, money;
printf("Please input height eye money:\n");
scanf("%d%d%d",&height,&eye,&money);
//今年37,要求....
// || 一真即真 同假为假
if(height > 180 || eye == 2 || money > 20000)//有任意一个条件为真,都可以执行if{}里面的语句
{
printf("赶紧安排,见面!!\n");
}
else
{
printf("下一位!!\n");
}
return 0;
}
! 逻辑非 如果原来为真,取非后变为假,如果原来为假,取非后变为真
#include <stdio.h>
int main()
{
int a = 10;
printf("a is %d\n",a);// a is 10
a = !a;//10 ---> 0 真 ---> 假
printf("a is %d\n",a);// a is 0
a = !a;//0 ----> 1 假 ---> 真
printf("a is %d\n",a);//a is 1
a = !a;//1 ----> 0 真 ---> 假
printf("a is %d\n",a);//a is 0
a = !a;//0 ----> 1 假 ---> 真
printf("a is %d\n",a);//a is 1
return 0;
}
##笔试问题
if(!a) == if(a == 0)
if(a) == if(a != 0)
(1)非零即为真
(2) 真的值是1,假的值是0
(3) 逻辑非 真变为假,假变为真
if(!a) == if(a == 0)
//假设输入的是100,100代表真
if(!100) == if(100 == 0)
if(0) == if(0)
//假设输入的是0,0代表假
if(!0) == if(0 == 0)
if(1) == if(1)
if(a) == if(a != 0)
//假设输入的是100,100代表真
if(100) == if(100 != 0)
if(1) == if(1)
//假设输入的是0,0代表假
if(0) == if(0 != 0)
if(0) == if(0)
if(!a) 等价于 什么 B
{
printf("Yes!!\n");
}
A if(a != 0)
B if(a == 0)
C if(a == 10)
####考点
(1) 在C语言中非零即为真(只要不是0的数,都是真)
(2) 在C语言中真的值,通常用1来表达,假的值用0来表达
#include <stdio.h>
int main()
{
printf("3 > 2 is %d\n",3>2);
printf("2 > 3 is %d\n",2>3);
return 0;
}
if(1.22)//条件为真
if(-10)//条件为真
if(0) //条件为假 0假
###### 练习10:输入一个数,判断是否在10-100之间, 如果是打印Yes,不是打印No
#include <stdio.h>
int main()
{
int num;
printf("3 > 2 is %d\n",3>2); // 真 是 1
printf("2 > 3 is %d\n",2>3); // 假 是 0
scanf("%d",&num);
if(num >= 10 && num <= 100) //不能写成 10 <= num <= 100,因为输入任何数,10 <= num结果只有两种可能1或0,都会<=100
{
printf("Yes!!\n");
}
else
{
printf("No!!\n");
}
return 0;
}
///
关于if();加分号的问题
#include <stdio.h>
int main()
{
int a = 0;
if(a);//加;相当于执行空语句
{
printf("Hello World!!\n");
}
//加上if();加上;号后,代码相当于
//if(a)
//{
// ;
//}
//{
// printf("Hello World!!\n");
//}
//编译会不会报错?? 不会报错
//编译不报错,hello world会打印吗?? 会, 加完;号,printf不属于if条件句里面
#include <stdio.h>
int main()
{
int a = 0;
if(a);//加;相当于执行空语句
{
printf("Hello World!!\n");
}
else
{
printf("I miss you!!\n");
}
//编译会不会报错?? 编译会报错,因为有else ,if和else会被 printf("Hello World!!\n");分开
return 0;
}
///关于if()条件句{} 是否可以省略不写的问题
//当if条件句成立,执行一行执行语句是,可以省略不写
#include <stdio.h>
int main()
{
int a = 3, b = 4, c = 5;
//考点:if条件句的{}省略不写
//如果{}省略不写,相当于只有第一行代码a = b,属于if条件判断
if(a > b)
a = b;
b = c;
c = a;
//相当于
//if(a > b)
//{
// a = b;
//}
//b = c;
//c = a;
printf("%d %d %d\n",a,b,c);// 3 5 3
return 0;
}
###作业
1. 某一时间的下一秒(笔试编程题) 20 输入三个数,代表小时 分钟 秒
59
59
下一秒 21:00:00
23 23 45
23 23 46
23 59 59
00 00 00
要求,如果用户输入了错误的时间,退出 24点退出, 61秒退出
#include <stdio.h>
int main()
{
int hour,min,sec;
scanf("%d:%d:%d",&hour,&min,&sec);
//scanf格式化输入函数
//printf格式化输出函数
//中间做一个下一秒的的处理
if(hour >= 24 || min >= 60 || sec >= 60 || hour < 0 || min < 0 || sec < 0)//数据有误的时候
{
printf("您输入的数据不正确!!!!\n");
}
else//输入的数据正确
{
sec = sec + 1;//秒数必然+1
if(sec == 60)
{
sec = 0;//将自身归0
min = min + 1;//min进位
if(min == 60)
{
min = 0;//自身归0
hour = hour + 1;//小时进位
if(hour == 24)
{
hour = 0;//自身归0
}
}
}
printf("%02d:%02d:%02d\n",hour,min,sec);//2宽度为2,不足宽度的地方由0填充
}
return 0;
}
#include <stdio.h>
int main()
{
int hour,min,sec;
scanf("%d:%d:%d",&hour,&min,&sec);
//scanf格式化输入函数
//printf格式化输出函数
//中间做一个下一秒的的处理
if(hour >= 24 || min >= 60 || sec >= 60 || hour < 0 || min < 0 || sec < 0)//数据有误的时候
{
printf("您输入的数据不正确!!!!\n");
}
else//输入的数据正确
{
sec = sec + 1;//秒数必然+1
min = min + sec / 60;//进位
hour = hour + min / 60;//进位
sec = sec % 60;//如果sec是60,归0
min = min % 60;//如果min是60,归0
hour = hour % 24;//如果hour是24,归0
printf("%02d:%02d:%02d\n",hour,min,sec);//2宽度为2,不足宽度的地方由0填充
}
return 0;
}
2. 判断用户输入的年是否为闰年? 四年一润
百年不润
四百年又润 2000 yes 1900 no
//闰年的条件 条件1: 整除4但不整除100 就是闰年 2004
// 条件2: 整除400 世纪闰年
//满足条件1和条件2任意一个条件,都证明是闰年
//程序验证
// 2004 闰年
// 2000 闰年
// 1900 平年
// 1991 平年
#include <stdio.h>
int main()
{
int year;
printf("Please input year:\n");
scanf("%d",&year);
if((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
{
printf("Yes!!\n");
}
else
{
printf("No!!\n");
}
return 0;
}