计算机复试上机C语言笔记(浙大第四版编程篇)
实验3-11 求一元二次方程的根运算优先级注意加括号更改优先级纯虚部就是只有虚部的比如说2i-2i这种但是要注意题目可能还是需要输出0.002i这种实验4-1-1 统计数字字符和空格用switchswitch条件{case ‘符合什么’break}实验4-1-2 求奇数和有点迷迷的实验4-1-3 求整数的位数及各位数字之和求这种一位一位的删实验4-1-5 统计素数并求和for(int i0;in;i){i定义在for里面就无法传值出来而定义在for循环外面则作用域可以覆盖整个else分支}检验素数时可以先假设它为素数然后再通过条件判断是否为偶数遍历这个数开方后的值看是否有因子如果条件没有通过则把is_prime改为0实验4-1-6 求分数序列前N项和改变字母值的时候注意一下另外项是否也会随之而改变实验4-1-7 特殊a串数列求和做题之前先把流程给想清楚实验4-1-10 兔子繁衍问题斐波那契数列f(n) f(n-1) f(n-2)每个月的数量 前两个月的数量之和对于什么时候用for循环什么时候用while循环当明确知道要循环多少次时用for不知道要循环多少次时用while实验4-1-12 黑洞数while 循环先看门卫条件门卫让你进你才进去干活。如果一开始门卫就不让进你一次活都干不了。do-while 循环不管三七二十一先冲进去干一次活干完出来再看门卫条件。如果门卫说可以继续你再回去干第二次。do {// 循环体} while (循环条件);输出结果为 inf它是 Infinity无穷大 的缩写。意味着程序产生了一个超出浮点数表示范围的数值。实验4-2-1 求e的近似值算阶乘累加时用 item * i; sum item; 代替每次重新算阶乘防止 inf溢出并提高速度。实验4-2-4 输出三角形字符阵列在 C 语言中字符 A 的本质是 ASCII 码整数 65。A 1 就会变成 BA 2 就会变成 C实验4-2-5 输出整数各位数字当定义 a[i] 时i 此时的值是 0。意味着创建了一个长度为 0 的数组。在机试中可以直接给数组定一个大小不管题目有没有说实验4-2-7 找完数如果一个整数a除以整数b除出来的结果正好是整数且没有余数即 a \% b 0那么 b 就是 a 的因子%f(float) %lf(double)十进制小数形式普通小数比如 123.456000。%e %le(double)科学计数法形式指数形式比如 1.234560e02。实验6-2 英文字母替换加密大小写转换后移1位A 是 65B 是 66C 是 67,a 是 97b 是 98c 是 99...任意一个大写字母和它对应的小写字母之间差值永远是固定的97 - 65 32。小变大ch - a A 大变小ch - A a 后移一位ch 1实验6-4 单词首字母大写ch getchar()从输入流中读取“一个”。意思就是“请抓取一个字符并把它存进变量 ch 中。EOF 是 End Of File 的缩写意为“文件结束。告诉程序“没东西可以读了输入已经结束了ch ! EOF 意思就是“只要还没读到结束信号就继续。”scanf会自动跳过空格、换行符。如果你用 %d它会帮你把字符串“123”直接转成数字 123。getchar看到什么抓什么。空格、换行符、制表符在它眼里全是平等的字符。实验6-5 简单计算器if(scanf(%d,num2)EOF) 在if里面写scanf相当于调用了一次scanf是会传到后面的数据中去的实验7-1-1 简化的插入排序如果题目不要求你修改原数组只是让你输出结果则可以变输出边打印实验7-1-6 求一批整数中出现最多的个位数字int b[10] {0}; // 注意通常建议带上花括号实验7-1-10 组个最小数pow 函数的设计初衷是处理复杂的数学幂运算所以它的返回值永远是 double 类型。如果数据 10^9可以用 int 算。如果数据10^18可以用 long long 算。如果数据是 几十位、几百位的数字绝对不用数学算一律当成“字符串”或者“逐个打印字符”来处理实验7-2-1 求矩阵各行元素之和在 C 语言中只要你用到 累加或者 *累乘你必须亲手赋予它初始值累加器初始值必须设为 0。累乘器初始值必须设为 1。实验7-2-4 计算天数scanf格式化输入scanf 双引号里的非格式字符比如 /就像是“模具”用户的输入必须严丝合缝地对上对上了就会被自动剔除只留下你要的数字。实验7-2-5 判断上三角矩阵只有一个元素的矩阵绝对是上三角矩阵。实验7-2-7 方阵循环右移无论m多大有效的移动次数其实是 m % n。如果m5, n3右移 5 次和右移 2 次的效果是一模一样的。实验7-2-8 找鞍点break “这一关我过了我去下一关。” 只需要跳出当前这组循环后面还有别的逻辑要跑。return 0 “任务完成了收工回家” 已经拿到了最终结果程序后面剩下的代码比如打印 NONE都没必要再看了。实验7-2-10 简易连连看“行末不得有多余空格”。利用 if (j size - 1) printf( ); 这个经典句型来完美避坑实验7-3-1 字符串逆序要量字符串的长度我们需要请出 C 语言的字符串工具箱 string.h 里的卷尺strlen() 函数scanf(%s) 不能读带空格的句子 以后看到输入里有空格的字符串立刻条件反射想到 scanf(%[^\n],str)对于scanf遇到普通变量int, char, float, double 等必须加 因为要现取地址。遇到数组名通常是读字符串时如 char str[100]直接写数组名绝不能加 因为它本身就是地址。实验7-3-3 查找指定字符字符串输入需要注意缓冲区scanf 把 m 拿走了但是那个 回车符 (\n) 依然留在缓冲区里。getchar()可以吃回车实验7-3-4 字符串替换“埃特巴什码”把 A 换成 ZB 换成 YC 换成 X……也就是把大写字母表给“翻转”过来。新字母 A Z - 原字母 相当于 新字母155-原字母实验7-3-5 凯撒密码第一步归一化把字母变成 0-25 的编号str[i] - a第二步压缩偏移量防止 offset 过大offset % 26第三步处理负数核心防错 26第四步转圈与还原% 26 a实验7-3-6 字符串转换成十进制整数理解了十进制十六进制简直是依葫芦画瓢唯一的区别是“逢 16 进 1”所以每次把老结果向左推一位时不是乘 10而是乘 16。公式变成了新结果 老结果 * 16 当前位的值十六进制字母大写/小写对应的十进制真实数值A / a随便写10B / b随便写11C / c随便写12D / d随便写13E / e随便写14F / f随便写15实验7-3-7 字符转换str[i]抓取到的是一个字符char比如字符5如果你不减去0直接写result result * 10 str[i]假设当前字符是5计算机会把它的底层编号 53 直接加进去。你的算式就变成了result * 10 53这显然全乱套了5 - 0在底层也就是53 - 48算出结果等于5真实的整型数字 5实验7-3-8 输出大写英文字母char str[100];注意是char而不是int实验7-3-9 删除重复字符在 C 语言刷题比如 PTA 或 LeetCode时只要你看到以下关键词大脑就要立刻条件反射出“哈希打表法”统计频次找众数题目问“哪个字母出现的次数最多”解法建一个 256 大小的数组遇到A就让hash[65]。数组里的数字不再是 0 或 1而是变成了计数器最后看哪个箱子里的数字最大就行了。找缺失的数字题目说“1 到 100 里面少了一个数字把它找出来”。解法建 100 个箱子读到一个数字就打个勾(设为1)最后看哪个箱子是空的它就是那个“逃兵”。寻找交集题目让找两串数字里都有的数字。解法把第一串全扔进箱子打勾。遍历第二串时直接去看看对应的箱子有没有打勾。实验8-1-9 输出学生成绩动态内存你需要认识stdlib.h库里的两个核心函数。它们就像是向系统“租地”和“退租”的契约。申请租地malloc// 假设用户输入了 n我们需要 n 个整数的空间 int n; scanf(%d, n); // 向系统申请 n 个 int 大小的空间并把这块地的“门牌号指针”交给 arr int *arr (int *)malloc(n * sizeof(int));归还土地free// 用完 arr 之后必须手动归还 free(arr);实验8-2-1 找最小的字符串strcpy的全称是string copy字符串拷贝。在 C 语言的string.h武器库里它是专门用来给字符串变量赋值的“终极复印机”。字符串不能用赋值。和普通的赋值a b一样数据的流向是从右往左的。strcpy(目的地, 源头);strcmp(string compare)是专门为字符串量身定制的“铁面裁判”。它的工作原理就像是让两个单词进行从左到右的“单挑”裁判先让两边的第 1 个字母出来比 ASCII 码。如果一样大平局就让第 2 个字母出来比。一旦某一对字母分出了胜负裁判立刻吹哨停止比赛给出结果后面的字母哪怕再长也全都不看了。int result strcmp(字符串1, 字符串2); //返回值 0两个人势均力敌连最后的 \0 都一样。说明两个字符串完全相同。 //返回值 0通常是 1左边打赢了右边。说明左边的字符串在字典里排在后面更大。 //返回值 0通常是 -1左边输给了右边。说明左边的字符串在字典里排在前面更小。实验8-2-2 找最长的字符串注意最长还是最大既然比的是长度我们就不能用strcmp去逐个单挑字母了。C 语言的string.h武器库里专门为你准备了一把量长度的“尺子”strlen(字符串)string length。它会返回这个字符串里有效字符的个数不包含最后的\0。特性strlen (量身高的卷尺)sizeof (称体重的地磅)所属门派是一个函数必须加#include string.h是一个运算符C语言自带不需要头文件测量标准看实际内容遇到\0就停看物理空间不管里面有没有东西也不管\0算不算\0不算算包含在数组总空间里实验8-2-8 字符串排序冒泡排序for(int i0;i5-1;i){ for(int j0;j5-1-i;j){ if(strcmp(str[j],str[j1])0){ strcpy(temp,str[j]); strcpy(str[j],str[j1]); strcpy(str[j1],temp); } } }1. 内层循环j苦力打工人负责相邻单挑它的任务从头走到尾每次把相邻的两个元素拉出来单挑j和j1。如果左边比右边大就互换位置。2. 外层循环i项目经理负责控制轮数它的任务安排打工人干活的次数。为什么又是5 - 1想想看如果有 5 个人按身高排队只要你把最高的、第二高的、第三高的、第四高的人都挑出来排在最后剩下的最后那个人绝对就是最矮的了5 个元素只需要排 4 轮就全部搞定了。所以i从 0 循环到 3正好 4 轮。实验9-5 查找书籍%s只适合用来读单个单词遇到空格就\0结束。要读包含空格的一整句话必须请出%[^\n]或fgets// 从标准输入(stdin)读取最多 99 个字符到 str 中遇到回车也读进来然后停止 fgets(str, 100, stdin);scanf(%[^\n], str); //遇到回车就停止使用fgets时如果不想读入回车使用strcspn#include stdio.h #include string.h int main() { char str[100]; printf(请输入单词: ); fgets(str, 100, stdin); // 一击必杀绝招 str[strcspn(str, \n)] \0; printf(处理后的字符串: %s 完美\n, str); return 0; }strcspn(str, \n)会去str里找\n如果找到了就返回\n的下标。然后外面的str[下标] \0直接把它爆头替换。size_t strcspn(const char *str1, const char *str2); //str1你要扫描的目标字符串比如我们要处理的那个带有回车符的单词。 //str2一个包含所有**“违禁字符”**的黑名单字符串。strcspn的真实身份是一个侦察兵。它的任务是去目标地点侦察然后跑回来向你报告一个数字坐标/下标。假设name[i]里面装的是apple\n。 当你调用strcspn(name[i], \n)时侦察兵跑过去数了数回来向你报告“长官目标在第 5 号位置”所以这整个函数调用的结果本质上就是一个整数5。实验9-8 通讯录排序1. 核心概念什么是结构体在 C 语言中int、double、char是系统自带的“标准收纳盒”每次只能装一个单一的数据。而结构体Struct是系统赋予你的最高权限允许你把多个不同类型的数据比如姓名、年龄、工资打包在一起发明一种属于你自己的“专属档案袋自定义数据类型”。痛点解决彻底消灭“平行数组”避免姓名数组和年龄数组在排序时发生错位、张冠李戴。2. 第一步绘制“档案袋”图纸定义结构体我们要先向上帝编译器打个报告声明这个新档案袋里都装些什么。// 习惯上结构体的定义写在 main 函数的外面上方 struct Student { char name[20]; // 姓名 (字符串) int age; // 年龄 (整数) double score; // 成绩 (小数) }; // ⚠️ 致命考点大括号最后必须有一个分号 ; 绝对不能漏掉3. 第二步根据图纸制造真实的档案袋创建变量图纸有了我们就可以在main函数里用它来创建真实的变量了。int main() { // 语法struct 结构体名字 变量名; struct Student s1; // 制造了 1 个档案袋名字叫 s1 struct Student classA[50]; // 制造了 50 个档案袋结构体数组 return 0; }4. 第三步拉开拉链存取文件.点操作符想要访问结构体里面的具体内容必须使用点号.它的意思是 的”// 1. 手动赋值 s1.age 18; // s1 的 age 赋值为 18 s1.score 95.5; // s1 的 score 赋值为 95.5 strcpy(s1.name, Tom); // ⚠️ 重点字符串依然不能用 必须用 strcpy // 2. 用 scanf 读取输入 // ⚠️ 重点普通变量要加 字符数组本身就是地址不用加 scanf(%s %d %lf, s1.name, s1.age, s1.score); // 3. 用 printf 打印输出 printf(姓名:%s 年龄:%d 成绩:%.1f\n, s1.name, s1.age, s1.score);5. 结构体的“神级特权”整体一键复印这是结构体最强大的地方在 C 语言中你绝对不能把一个数组直接用赋值给另一个数组arr1 arr2是非法的。但是如果数组被装在了结构体里结构体和结构体之间可以直接用互相赋值struct Student s1; strcpy(s1.name, Jack); s1.age 20; struct Student s2; // ⚡️ 降维打击直接把 s1 连皮带骨复印给 s2 // 里面的 name 数组、age 变量会全部自动拷贝过去 s2 s1;实战意义在做通讯录、成绩单等排序题时交换两个人的位置不需要写长长的strcpy和多次数字交换只需一行temp a; a b; b temp;即可瞬间完成所有信息的同步位置对调6. 避坑指南新手必看忘写分号struct {...};结尾的分号如果漏掉编译器会报出一堆莫名其妙的错误通常报错在下一行极其难找。混淆图纸与实物不能直接给图纸赋值比如struct Student.age 18;是错的。必须先创建出s1然后s1.age 18;才对。读入字符串不加scanf(%s, s1.name);是正确的千万别写成s1.name。实验9-9 有理数比较破坏纯整数环境引入小数。你可以写成(a1 * 1.0 / b1)让它变成double去比较0.5和0.75。实验9-10 平面向量加法fabs的全称是floating-point absolute value浮点数绝对值。在 C 语言的math.h武器库里它是一块专门用来擦除小数负号的“橡皮擦”。abs()老家在stdlib.h它是**专门给整数int**用的。如果你手滑写了abs(-3.14)C 语言会极其残忍地执行向下截断先把它变成整数-3然后求绝对值最后给你返回一个纯整数3。你的精度彻底丢失了fabs()老家在math.h它是**专门给带有小数点的数double**用的。你写fabs(-3.14)它才会完美保留小数部分乖乖还给你3.14。实验10-1 圆形体体积计算器如果需要用到PI使用宏定义 (#define)#define PI 3.141592653589793 // 定义在 main 函数外面或者const double PI acos(-1.0);acos的全称是arc cosine反余弦函数。实验11-1-1 英文单词排序单引号#代表一个字符Character它的本质是 ASCII 码里的一个整数35。双引号#代表一个字符串String它的本质是一个带\0结尾的字符数组。实验11-1-7 藏头诗既然我们学过字符串结束符\0我们可以直接玩一招“过河拆桥” 我们只需要强行把第 4 个位置下标为 3改成\0str[i][3] \0;这句代码的意思是在第一个汉字前 3 个字节的背后直接立起一面叹息之墙当你用printf(%s, str[i])打印时系统读完前 3 个字节拼成了一个完美的汉字一头撞上\0立马停工。后面的“叶轻舟向东流”就全被截断隐藏了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414971.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!