自学笔记,不一定适合所有人!
目录:
第一周:
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没发现,运行的时候数据写的位置错误