目录
前言
这是培训的第二个周末,闭眼细想,明显感觉学的东西比上周要多,这周里结束了C语言基础这一部分,补充学习了控制语句、新学了一维数组、二维数组、字符数组、字符串、指针和函数,重点难点是后面的指针和函数,也是老师花了最多篇幅讲解的,因此篇文章也将会,对指针和函数做着重复习和回顾。
同样,写此文章,是想以这种碎碎念的方式回顾重点、重复盲点、加深印象,复习、总结和反思本周的学习,仅供后期自己回顾使用。知识体系不完善,内容也不详细,仅供笔者复习使用。如果是有需要笔记,或者对这方面感兴趣,可以私信我,发你完整的知识体系和详细内容的笔记。如有任何错误请多指正,也欢迎友好交流,定会虚心听取大佬的宝贵意见!
周一
一、switch..case
1.1 注意事项
1.switch后面()里的表达式: 变量或者完整表达式。
一般是是整型或者字符的(不能是浮点型的)
2.case后面的表达式: switch后面()中表达式可能的结果。
3.break的作用: 执行完某个分支的代码块就立即结束整个switch..case语句。
如果不加 break,程序会继续向下执行下面case的代码块,直到遇到break或者整个switch..case语句结束,这种现象叫做---“case击穿”
4.default 分支相当于 if..else 语句中的else部分,如果前面的case都不满足,则执行default分支,如果不关心其他分支的情况,整个default分支都可以不要
1.2 使用练习
编码实现一个简易的计算器功能( + - * 功能即可):
要求在终端输入表达式,输出计算的结果
如:输入:5+6 则输出 11
#include <stdio.h> int main(){ int lvalue = 0; char operator = 0; int rvalue = 0; scanf("%d%c%d", &lvalue, &operator, &rvalue); switch(operator){ case '+': printf("%d + %d = %d\n", lvalue, rvalue, lvalue + rvalue); break; case '-': printf("%d - %d = %d\n", lvalue, rvalue, lvalue - rvalue); break; case '*': printf("%d * %d = %d\n", lvalue, rvalue, lvalue * rvalue); break; default: printf("目前只支持 + - * 运算\n"); break; } return 0; }
二、循环控制语句
2.1 使用goto实现循环
2.1.1 注意事项
goto本身是用来实现代码跳转的。
注意:只能在同一个函数中实现跳转。
注意:goto的跳转对代码的逻辑性和易读性有一定的影响,所以要谨慎使用。
2.1.2 循环实现
使用 goto 实现 计算 1+2+3+....+100 的和。
#include <stdio.h> int main(int argc, const char *argv[]) { int sum = 0; int i = 1;//既用来控制循环结束 又用来控制每次加的值 //一般用来控制循环结束的变量 称之为 循环变量 一般使用 i j k 等表示 LOOP: sum = sum + i; i++; if(i <= 100){ goto LOOP; } printf("sum = %d\n", sum);//5050 return 0; }
2.2 while循环
优先使用while循环的情况:循环次数不确定情况。
2.2.1 格式
while(表达式){
循环体;//就是要循环执行的代码块
}
2.2.2 代码练习
猴子吃桃问题:
猴子第一天摘了若干个桃,当即就吃了一半数量的桃,没吃过瘾,又多吃了一个;第二天又将剩下的桃,吃了一半,没吃过瘾,又多吃了一个;以后的每天,依次类推,都吃掉一半数量再多一个。直到第10天再想吃桃的时候,发现只剩下一个了。
问:猴子第一天摘了多少个桃。使用while循环实现。
思路:第十天剩1个,第9天剩(1+1)*2个,以此类推,借助循环,day>1是循环条件。
#include <stdio.h> int main(){ int count = 1; int i = 0; while(i < 9){ count = (count+1) * 2; i++; } printf("第1天有 %d 个桃\n", count);//1534 return 0; }
2.3 do..while 循环
优先使用do..while循环的情况:在循环开始之前,需要先执行一次循环内的代码。
2.3.1 格式
注意:while后要加一个分号!
do{
代码块;
}while(表达式);
2.3.2 while和do ..while的区别
while : 先判断 后执行
do_while: 先执行 后判断
不管表达式为真还是为假,do_while里面的代码块 至少要执行一次。
2.4 for 循环
优先使用for循环的情况:循环区间明确的情况。
2.4.1 格式
这三个表达式,如果哪个不需要,可以不写,但是两个引号“ ;; ”必须要写。
for(表达式1;表达式2;表达式3){ 循环体; }
2.4.2 代码练习
1、输出 [100,999] 范围内所有的水仙花数:
水仙花:个*个*个 + 十*十*十 + 百*百*百 == 自身
如:153 就是一个水仙花数
153 == 1*1*1 + 5*5*5 + 3*3*3 = 1+125+27 == 153
#include <stdio.h> int main(int argc, const char *argv[]) { int num = 0; int g = 0; int s = 0; int b = 0; for(num = 100; num <= 999; num++){ g = num % 10; s = num / 10 % 10; b = num / 100; if(num == g*g*g + s*s*s + b*b*b){ printf("%d 是水仙花数\n", num); } } return 0; }2、输出 [2,100] 范围内所有的质数
#include <stdio.h> int main(){ int num = 0; int i = 0; for(num = 2; num <= 100; num++){ for(i = 2; i < num; i++){ if(num % i == 0){ break; } } if(i == num){ printf("%d 是质数\n", num); } } return 0; }
2.5 死循环
//所谓的死循环就是程序一直在循环中执行循环体,无限循环。
while(1){ //常用的写法
//循环体
}
for(;;){ //注意,表达式可以不写,但是两个分号必须要写,否则报错
//循环体
}
2.6 辅助控制关键字
2.6.1 break
1、break可用在switch..case 语句中,表示执行完某个分支就立即结束整个switch..case语句。
2、break也可以用在循环中,表示结束本层循环。
2.6.2 continue
continue只能用在循环中,表示结束本层的本次循环。
2.6.3 return
1、 return用在函数中,是用来返回函数执行的结果的。
2、 如果在主函数中使用 return,表示立即结束整个程序。
周二
一、数组
数组是构造类型,是用来存储一组相同的数据类型的数据的。
数组的元素在内存上的都是连续的,不管几维数组,都是连续的。
1.1 一维数组
格式: 存储类型 数据类型 数组名[下标]
例如: 默认为auto int s[10]
一维数组: 下标只有一个数的数组
注意:
在定义数组时,下标必须是常量,表示告诉操作应该给这个数组分配多大的内存空间;
在其他场景下,既可以是常量,也可以是变量,也可以是表达式,表示访问数组中的第几个元素。
1.2 数组越界问题
#include <stdio.h>
#define N 5
int main(int argc, const char *argv[])
{
int s[N];
//使用数组时一定要注意检查边界
//数组越界的错误编译器不会检查 需要程序员自己检查
//数组越界的错误是不可预知的
//可能不报错
//可能段错误
//也可能修改了不该修改的数据
s[234789] = 100;
printf("s[234789] = %d\n", s[234789]);
return 0;
}
1.3 二维数组
下标有两个的数组:s[3][4],第一个下标表示行数,第二个表示列数。
1.4 编码练习
使用二维数组保存杨辉三角,并输出。
#include <stdio.h> int main(){ int s[10][10] = {0}; int i = 0; int j = 0; //控制行 for(i = 0; i < 10; i++){ s[i][0] = 1; //控制列 for(j = 1; j <= i; j++){ s[i][j] = s[i-1][j-1] + s[i-1][j]; } } //输出 for(i = 0 ; i < 10; i++){ for(j = 0; j <= i; j++){ printf("%4d", s[i][j]); } putchar(10); } return 0; }
二、冒泡排序
2.1 原理动图

2.2 代码实现(以降序为例)
#include <stdio.h>
int main(){
int s[10] = {12, 34, 56, 5, 14, 98, 60, 68, 70, 17};
int len = sizeof(s)/sizeof(s[0]);
int i = 0;
int j = 0;
int temp = 0;
for(i = 0; i < 10; i++){
printf("%d ", s[i]);
}
printf("\n");
for(j = 0; j < len-1; j++){
for(i = 0; i < len-1-j; i++){
if(s[i] < s[i+1]){
temp = s[i];
s[i] = s[i+1];
s[i+1] = temp;
}
}
}
i = 0;
for(i = 0; i < 10; i++){
printf("%d ", s[i]);
}
printf("\n");
return 0;
}
周三
一、字符数组和字符串
1.1 概述
字符数组:数组中的每个元素都是一个char类型的变量;
char s1[5] = {'h','e','l','l','o'};
字符串:连续的字符,在字符数组中以‘\0’结尾。
char s3[6] = "12345"; //比较常用的写法
1.2 几个注意事项
1、char s[]="hqyj"; sizeof(s4) 结果是5 因为结尾的 '\0' 也会被计算;
&nb


最低0.47元/天 解锁文章
2402

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



