...
一些程序英语单词
void/ vɔɪd / n.空白 array / əˈreɪ / n.数组 string / strɪŋ / n.串
character n.字符 string n.字符串;线、细绳;
第一章 C语言预备知识
C++兼容大部分C语言的语法,而不兼容的语法,我们在日常的使用中,几乎是不会遇到的
使用C++源文件可以编译C语言代码
c语言关键字
printf函数
printf("占位1 占位2", 替换1, 替换2);
printf是一个变参函数,(参数个数和参数类型都是不确定的)
第一个参数必须是字符串,
第一个参数是需要输出的内容
第二级参数及后续参数将依次替换占位符
占位符的类型和数量需要和后续参数一一对应
输入输出缓存
输出函数有输出缓存,输入函数有输入缓存
我们往洗衣机里加衣服,往往时积攒一定数量后再扔洗衣桶里;缓存区相当于存放脏衣服的筒子,存放一定量的数据,在等待批量处理。
刷新缓存区:我们将1.数据发送到目的地,2.再清空缓存区,就是刷新缓存区。
输出缓存区
我们向控制台输出字符时,程序会先将打印的字符串,放到输出缓存区中,到特定时刻会一起显示到控制台上。
在计算机中需要将显示在屏幕上的数据发送到显卡,再由显卡进行显示。显然,累计一串字符再批量发送,比起一个一个发送更有效率。
输出缓存是系统行为,而不是函数特性
对于windows系统来说,数据一旦被写入到输出缓存区,就会立刻被刷新,然后显示
linix:数据中有换行符,立刻刷新缓存区,如果没有换行,直等到系统结束之后,才会刷新(行缓存:一行结束(换行符\n)之后必须刷新缓存)
#include <stdio.h> #include <windows.h> int main_h1() { for (int i = 0; i < 10; i++) { printf("Hello world %d", i); Sleep(500); } return 0; }
输入缓存区
输入函数属于阻塞函数
当输入缓存区没有内容时,程序将阻塞在输入函数中,等待用户从键盘输入字符,并按回车确认。
只有当我们按下回车键,也就是输入换行符\n,输入的字符串将进入输入缓存区。
接下来,输入函数将1.从输入缓存区中获取字符,2.删除缓存区中得到的字符,并3.解除阻塞状态,继续执行代码。
只有当输入缓存区没有字符时,输入函数才会进入阻塞状态
getchar:输入一个字符
scanf:输入一行字符串
#include <stdio.h> //输入缓存区 int main_h2(){ //输入helloworldhelloworld //--变量声明 char str[20]; int i = 0; //--数据处理-- //循环之后i的值刚好是所输入字符的后一个 while (i <= 18) { str[i++] = getchar(); if (str[i-1] == '\n') //看看在输入的字符是不是回车,是的话就跳出循环,不再输入字符。 { break; } } str[i] = '\0'; //字符串结束的标志 //--数据输出-- printf( str); scanf("%s", str); printf(str); return 0; }
getch函数,相当于无缓存的getchar
getche函数,会将输入的字符打印在控制台上,无需再次调用putchar打印
//不带缓存的输入函数 //getch函数,相当于无缓存的getchar //getche函数,会将输入的字符打印在控制台上,无需再次调用putchar打印 int main_h3() { while (1) { char c; c = _getche(); //无需回车,没有缓存区,getch立刻获取对应字符 // putchar(c); if (c == 'q') { break; } } return 0; } //总结练习 int main() { char c ; c = getchar(); putchar(c); c = _getch(); putchar(c); c = getchar(); putchar(c); return 0; }
第二章 计算
1 关于sacnf
scanf
读入整数:scanf("%d", a);
输出整数:printf("%d", a);
读入浮点数:scanf("%lf", c);
输出浮点数:printf("%f", c);
scanf_s
scanf_s括号内有三个参数,最后一个是变量a所占据空间的大小(单位为字节),可以用sizeof函数表示。
scanf_s("%c %c", &a, sizeof(a), &b, sizeof(b)); // 可不要写成 scanf_s("%c%c",&a,&b,1,1); 这样会出错的
scanf_s("%d %d", &a, &b, sizeof(a),sizeof(b)); // 如果输入整型数据,sizeof()在所有取地址的后面;而和上面一样输入字符的话,每个取地址后面都要有
如果输入的字符个数>=数组元素个数,是不会打印数组中的元素的。(而scanf函数就会打印出)
2 表达式
运算符表示动作;
算子参与运算的东西;
四则运算
c语言:加 减 乘 除 括号 取余(取余数,如9%2=1)
计算时间差程序
3 运算符优先级
结合关系:单目和赋值运算符 自右向左 运算
单目:就是给一个数取相反数或者不变(如a*-b 就是a乘以b的相反数)
4 复合赋值
5个算数运算符(+ - * / %)可以和唯一一个赋值运算符结合起来,形成5个复合赋值运算符(+= 、-+ 、*= 、/=、%=)
算术运算符+赋值运算符=复合赋值运算符(注意不要有空格,如a += 5,就是a=a+5)
递增递减运算符:++ --,作用是加一或减一
a++ 就是 a = a+1 (a += 1)
- 前缀与后缀,都是给a加了1
- a++ 是以前的那个值
- a-- 是以后的那个值
对于表达式,后缀是以前的值,前缀是以后的值
数据类型
第三章 判断与循环
循环条件必须以关系运算符来表示,满足则继续循环;不满足则结束循环。
for(1; 判断; 3);
do{}while(判断)
while(判断)
1 关系运算符
== 相等
!= 不相等
>大于
>= 大于或等于
< 小于
<= 小于或等于
关系运算的结果
成立 为 1
不成立为 0
优先级
赋值运算<关系运算<算数运算
如int r = a>0 把a>0的真假01值代入r中
连续的运算从左到右进行
2 否则的话,else
if( the condition ){ your function }
else{ your condition }
如果成立的话,运行后面
如果不成立的话,另一个运行
写代码有的时候是你能不能让更多的人读懂你的代码
3 判断与循环
if判断
if ( the formula ) //如果小括号里面的关系运算为1,则继续
{ } //如果为零,则跳过花括号继续运行
对所有循环:条件成立,继续循环;条件不成立,离开循环
while循环
1.一个数字有几位数?
2.数位数的算法
while循环:当条件满足时,就一直做这个循环
一定要有走出循环的条件
总结:if和while竟然只有一次和多次的区别
if是判断是不是,然后就走了
while除了要判断是不是,是的话增加条件继续循环,直到不是就走了(反之同理)
列出变量表格法是人脑模拟计算机的一种有效手段,特别是对于循环程序来说。
在程序中加上“//”使得这行程序失效
对于编程中的除法运算,对于/10,就是划掉最后一位
2.printf here或者printf 数值 可以起到标记的作用
dowhile循环
dowhile格式
do
{
} while();
dowhile循环和while循环的唯一区别就是while先判断条件,dowhile后判断条件
左边是dowhile循环, 右边是while循环
for循环
结构
for(初始条件;循环条件;每轮循环结束完要做的动作) {}
算法:阶乘
for 等于 对于
for(count=1;count>0;count--)
对于初始化的count=1,判断count是否大于0,如果是就执行循环体,执行完循环体一次后,再让count减1;重新判断count是否大于0,就这样循环,直到count<=0就退出循环
for 循环的循环次数
for(i=0;i<n;i++) 表示 1.循环n次 2.初始值i=0,循环结束以后i=n
for(i=1;i<=n;i++) 表示 1.循环n次 2.初始值i=1,循环结束以后i=n+1
for 与 while 的异同:for和while是等价的,总可以找到办法可以互换
//三种循环for、 while、 dowhile
//三种循环的使用条件
如果有固定次数 用for
如果必须执行一次 用do while
其他用 while
第四周 进一步的判断与循环
一、逻辑运算
- 逻辑运算是对逻辑量进行的运算。结果只有0或1
- 逻辑量是关系运算或逻辑运算的结果
! 逻辑 非 !a a是对的,结果就是错。a是错的结果就是对。
&& 逻辑 与 a&&b a,b都对结果是对,否则都是错
|| 逻辑 或 a||b 一个对,结果就是对
如何表达x在(4,6)?
错误示范:4<x<6的结果是一个逻辑值(0或1)
正确示范:4<x && x<6
!a<20 意思是 先计算“!”运算符,a如果为0,!a为1;a如果不为0,!a为0
优先级
短路
条件运算
三个例子
如第一个,如果m小于n的话,那么结果是x,否则是a+5
最好不用嵌套的条件表达式
逗号运算符
只在if中使用
//嵌套的if-else
- 如果没有{}的话,else和最近的if匹配
建议
- if和else后面接{},即使只有一句话
代码:求三个数中最大的那个数
嵌套的if-else语句
//2级联的if else-if
分段函数的代码
这是一个递进的关系
单一出口:只有一个printf比较好
//多路分支 switch-case
惯例
switch(){}
switch(控制表达式只能是整数)
{
case 常量:
语句
...
case 常量:
语句
...
case 常量:
语句
...
default:
语句
...
}
case 1,2,3..像是一个位置点,一个路牌,不能阻止语句往后走,直到遇到一个break
只有当碰到break的时候离开
代码:成绩转换
利用除以十划去最后一位的性质
//循环计算
log2x的代码
小套路int t=x 最后输出t,就可以防止最后输出x
x>1等价于x>=2
第二个例子
模拟比较少的次数,做推断
如何判断一次循环完成? 可以在其中输出一个数,最终输出了几个数,就完成了几次循环
4.4.2 算正整数的平均数代码
4.4.3猜数代码
随机数每次召唤rand()就得到一个随机的整数
小套路:x%n的结果是[0,n-1]之间的一个整数,特别地,x%100的结果在[0,99]之间,相当于划掉除了最后两位的前面所有数,只保留最后两位数
另外,用二分法最多7次就能求出来结果
4.4.5 求一个整数的逆序
- %10 得到个位数
- /10 划去个位数
- *10 往左移动一位
4.5 判断和循环常见的错误
永远在if和else后面加{}
一定不能在if()后加上;这样的意思是if语句在这里就结束了,后面的大括号也就是正常运行
初学者一开始就尊重warning
if和else后面加大括号{}
大括号内的内容增加一个缩进
第五章 循环控制
1 循环控制
素数:只能被1和自己整除 不包括1 5=1*5
如何判断一个自然数是不是素数,就看它能不能被1和它本身之间的数整除
break:跳出for{循环体},打破循环,出去
continue:跳过for循环在这一轮中剩下的语句,进入下一轮的for循环;剩下的不做了,回去做新一轮循环;
判断一个数是不是素数
2 多重循环
如何用1角、2角、5角的硬币凑出10元一下的金额呢?
break和continue只能对它所在的那层循环做
3 循环应用
求最大公约数
正序分解正整数
第六章 函数
1 初见函数
以下两个例子来说明函数的重要性与必要性!
素数求和
求和
2 函数的定义和调用
下图是函数的定义格式:
调用函数
格式:
函数名称 (参数列表);
参数列表中的参数会被按照顺序依次用来初始化函数中的参数
4 从函数中返回值
如果函数需要返回一个结果,那么需要用return把那个结果交给调用它的地方
return语句做两件事
1.停止函数执行
2.送回一个值
return两种写法
1.return;
2.return 表达式;
一个函数可以出现多个return,但是这样写错之后修改会很麻烦。
没有返回值的函数:void 函数名,可以没有return
如果函数有返回值,则必须使用带值得return
5 函数声明(也叫函数原型)
格式:
数据类型 函数名称(数据类型 数据名称, 数据类型 数据名称); //函数声明 也叫函数原型 (参数列表里的是形式参数)也可以不写形参,只写数据类型
...
数据类型 函数名称(数据类型 数据名称, 数据类型 数据名称) //函数定义
{
函数体
}
函数告诉编译器这个函数的三要素: