自学笔记,不一定适合所有人!
目录:
第一周:
1.1编程软件:
Windows:Devc++ 5.6.3
1.2第一个c程序:

#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
点击编译运行后保存为c source files文件
一次编译之后可以多次运行
1.3详解第一个程序:
#include <stdio.h>
int main()
{
return 0;
}
//程序格式框架,本课程所有程序都有这一段
输出:
出现错误:
对C语言而言换行,空格不代表什么
往前往后猜错误
切记:不要用中文输入法!!!(双引号以外)
1.4 做点计算:

后面运算结果会填充到%d
四则运算:
第二周:
2.1变量:
2.1.1变量定义:
算找零:
需要:
1.有地方放数字
2.有办法输入数字
3.输入数字可以参与运算
#include <stdio.h>
int main()
{
int price = 0;
printf("请输入金额(元):");
scanf("%d", &price);
int change = 100 - price;
printf("找您%d元。\n", change);
return 0;
}
就是这个啦
(今后仅仅展示大括号里面的内容)
编译运行后在终端输入数值,按下回车
如何输入:
输入的东西去哪里了?
变量--->存放数据

变量定义:

C语言区分大小写,变量不能和保留字相同
保留字很多但不用背诵
2.1.2变量赋值和初始化:
赋值:
初始化:
就会出现奇怪的数据
变量初始化:
2.1.3变量输入:

不是整数直接按照price=0执行
2.1.4常量VS变量:
常量:
用大写,固定数字尽量用常量,免得莫名其妙
常量放在开头


const:
改进一下:



输入一个数字,空格再输入
如果输入的不是数字,a,b也没有初始化就会有奇怪的数据出现
2.1.5浮点数:
身高计算:
printf("请输入身高英尺和英寸:");
int foot;
int inch;
scanf("%d %d",&foot, &inch);
prinft("身高是%f米.\n",((foot + inch / 12) * 0.3048));
结果输入的英寸数据不起作用
为啥?

浮点数:

改进:


全新版本:
数据值改为double,用lf而不是d

数据类型:

整数:

2.2表达式:
2.2.1表达式:

count = count + 1整个式子是一个表达式
运算符:


计算:

计算符号:

计算时间差:

改进:

2.2.2运算符优先级:
运算符优先级:

单目:

赋值运算符:

嵌入式赋值:

计算复利:


由于C语言没有幂运算符号,因此只能用循环来解决
现在还无法计算!
2.2.3交换变量:


加入第三者:

2.2.4复合赋值和递增递减:
复合赋值:


递增递减运算符:

前后缀:


禁止套娃:
第三周:判断:
3.1判断:
3.1.1做判断:
计算时间差:

如果


if 语句:

3.1.2判断条件:
关系运算:


优先级:


3.1.3找零计算机:



注释:

/* */注释:


3.1.4否则的话:





比较数的大小:

方案一:

方案二:

方案三:

方案一肯定不行,方案三很聪明,但是有些人读不懂,因此方案二的傻瓜式写法更好
3.1.5if语句再探:

if之后没有{}只能接上一句,加了{}才可以有多句语句

第一个无论如何都会输出“再见”
第二个只有条件成立才输出“再见”
3.2分支:
3.2.1嵌套的if-else:
三个数找最大:



嵌套的判断:

else的匹配:

缩进:



这个else是if(player2move ==2)的

第一个if匹配第二个else
第二个if匹配第一个else

else和第二个if匹配

加了{}后else就和第一个if匹配
好的编程习惯:

3.2.2级联的 if-else if:
分段函数:



第一种写法比较好,第二种写法限定了数据的使用
3.2.3 if-else常见错误:
尊重warning!!!

忘了大括号:

if之后的分号:

错误使用=和==
代码风格:


都可以选择
3.2.4多路分支:
传统的if else会一个条件一个条件判断,这样比较慢
使用Switch-case就不会了

break

注意:
case语句是执行起点,没有break则一直执行知道遇到break或者结束为止
case相当于站牌
第四周:循环:
4.1循环
4.1.1循环:
读读几位数:


人和计算机:


换个思维:




使用while循环:

4.1.2while循环:


while循环:


看程序运行结果:

验证:

调试:

4.1.3do-while循环:
数位数的算法:

do-while循环:


左边do-while
右边while
两种循环:

4.2循环的应用:
4.2.1循环计算:

小套路:


保证输入1时结果准确
ret = 1
x > 2时对于其他数可以,但是对于1不行

循环执行101次
最后输出0
count = -1

任然循环101次,但打印结果只有100次
4.2.2猜数游戏:



随机数:

%100:

4.2.3平均数:
读变量:

算法:



int x;
int n = -1;
int a;
do {
printf("输入数字:");
scanf("%d", &x);
n ++;
a += x;
}while(x != -1);
printf("平均数为:%f", 1.0*a/n);
4.2.4整数逆序:
整数分解:

逆序:

第五周:循环控制:
5.1:第三种循环:
5.1.1for循环:
求阶乘:

while:

for:

for循环:


第一个:初始条件
第二个:判断条件
第三个:执行操作
小套路:






5.1.2循环的计算和选择:



5.2循环控制:
5.2.1循环控制:
素数:

break和continue:


5.2.2嵌套循环:

#include <stdio.h>
int main()
{
int x;
//int isPrime=1;
for ( x=1; x<=100; x++ ) {
int i;
int isPrime = 1; // x是素数
for ( i=2; i<x; i++ ) {
if ( x % i == 0 ) {
isPrime = 0;
break;
}
}
if ( isPrime == 1 ) {
printf("%d\n", x);
}
}
return 0;
}
输出前50个素数:
#include <stdio.h>
int main()
{
int x;
int count = 0;
for (x=1;count<50;x++) {
int i;
int a = 1;
for (i=2;i<x;i++) {
if (x%i == 0 ) {
a = 0;
break;
}
}
if ( a == 1) {
count ++;
printf("%d\t", x);
if ( count % 5 == 0) {
printf("\n");
}
}
}
return 0;
}
5.2.3从嵌套循环中跳出:
凑硬币:

#include <stdio.h>
int main() {
int x;
printf("输入金额");
scanf("%d",&x);
int one, two, five;
for (one=1;one<x;one++) {
for (two=1;two<x/2;two++) {
for (five=1;five<x/5;five++) {
if (one*1 + two*2 + five*5 == x) {
printf("%d个一角%d个二角%d个五角可以凑到%d元\n", one, two, five, x);
}
}
}
}
return 0;
}
结果太多了我只要一个
#include <stdio.h>
int main() {
int x;
printf("输入金额");
scanf("%d",&x);
int one, two, five;
for (one=1;one<x;one++) {
for (two=1;two<x/2;two++) {
for (five=1;five<x/5;five++) {
if (one*1 + two*2 + five*5 == x) {
printf("%d个一角%d个二角%d个五角可以凑到%d元\n", one, two, five, x);
break;
}
}
}
}
return 0;
}
加个break咋没用?
原来
接力但是
但是goto更安逸:
#include <stdio.h>
int main() {
int x;
printf("输入金额");
scanf("%d",&x);
int one, two, five;
for (one=1;one<x;one++) {
for (two=1;two<x/2;two++) {
for (five=1;five<x/5;five++) {
if (one*1 + two*2 + five*5 == x) {
printf("%d个一角%d个二角%d个五角可以凑到%d元\n", one, two, five, x);
goto out;
}
}
}
}
out:
return 0;
}
很好
5.3循环应用:
5.3.1求前n项和:
#include <stdio.h>
int main() {
double sum;
int n,i;
n = 10;
for (i=1;i<=n;i++) {
sum += 1.0/i;
}
printf("结果是%f", sum);
return 0;
}

带有符号:
#include <stdio.h>
int main() {
double sum, sign=1.0;
int i,n;
printf("输入第n项");
scanf("%d", &n);
for (i=1;i<=n;i++) {
sum += sign/i;
sign = -sign;
}
printf("%f", sum);
return 0;
}
5.3.2整数分解:








#include <stdio.h>
int main() {
int x=123456;
printf("请输入正整数:");
scanf("%d", &x);
int t = x;
int count = 1;
while (t > 9) {
t /= 10;
count *= 10;
//printf("%d\n", count);
}
int a;
while (count > 0) {
a = x / count;
x %= count;
printf("%d", a);
if (count > 9) {
printf(" ");
}
count /= 10;
}
printf("\n");
return 0;
}
总算是折腾会了
5.3.3最大公约数:


辗转相除法:

#include <stdio.h>
int main() {
int a,b,c;
printf("输入第一个数的值:\n");
scanf("%d", &a);
printf("输入第二个数的值:\n");
scanf("%d", &b);
while ( b > 0) {
c = a % b;
a = b;
b = c;
}
printf("最大公约数是:%d", a);
return 0;
}
第六周:数据类型
6.1数据类型:
6.1.1数据类型:

类型有何不同:

sizeof:

6.1.2整数:

6.1.3 整数内部表达:

怎么表达负数:

二进制负数:

补码:

6.1.4整数的范围:
数的范围:

整数范围:



整数越界:

相当于经度闭环
6.1.5整数格式化:
整数输入输出:

八进制和十六进制:


6.1.6 选择整数类型:

6.1.7浮点类型:

浮点数输入输出:

科学计数法:

输出精度:

6.1.8浮点数范围和精度:
超过范围的浮点数:

浮点运算的精度:
浮点数的内部表达:

选择浮点类型:
6.1.9字符类型:

字符输入输出:

混合输入:

字符运算:

大小写转换:

6.1.10逃逸字符:

制表位:

光标移到固定位置,不是移动固定位数
6.1.11类型转换:
自动类型转换:
强制类型转换:


6.1.12逻辑类型:

6.2其他运算
6.2.1逻辑类型



理解一下:

优先级:


短路:

6.2.2条件运算:
条件运算符:

优先级:

嵌套表达式:

逗号运算:

在for中使用:

第七章:函数
7.1函数定义和使用:
7.1.1 初见函数:
求和:


函数:
7.1.2函数定义和调用

函数调用:

函数返回:

7.1.3从函数中返回:

为了单一出口,尽量只有一个return

没有返回值的函数:

7.2函数的参数和变量:
7.2.1函数原型:



7.2.2参数传递:
调用函数:

如果类型不匹配:

穿进去了什么:
只是把ab的值传了进去,ab没进去

7.2.3本地变量:



7.2.4其他细节:
没有参数时:

符号运算符:



第八章:数组:
8.1数组:
8.1.1初试数组

如何记录很多数:

这如何是个头?
数组:

8.1.2数组的定义和使用:
定义数组:

数组是什么:


数组的单元:

有效的下标范围:




8.1.3数字统计:

#include <stdio.h>
int main() {
const int Num = 10;
int x;
int count[Num];
int i;
for ( i=0; i<Num; i++ ) {
count[i] = 0;
}
scanf("%d", &x);
while ( x!= -1) {
if ( x>=0 && x<=9 ) {
count[x]++;
}
scanf("%d", &x);
}
for ( i=0; i<Num; i++) {
printf("%d:%d\n", i, count[i]);
}
return 0;
}
8.2数组的运算:
8.2.1数组的运算:


数组的集成初始化:


数组的大小:

数组的赋值:

遍历数组:


8.2.2素数:
判断素数:





构造素数表:



8.2.3二维数组:
二维数组的遍历:
二维数组的初始化:







第九章:指针
9.1指针:
9.1.1取地址运算:


相邻数组地址单元相差4
9.1.2指针:
指针:

*是加在p上面的,与他远离int与否无关,第三四个式子意思:
指针p和 整数q
指针变量:

作为参数的指针:





32位机器的地址和int大小相同,scanf没发现,运行的时候数据写的位置错误









被折叠的 条评论
为什么被折叠?



