news 2026/5/27 8:14:13

《C语言学习:编程例题》B

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《C语言学习:编程例题》B

写在前面:本笔记为个人学习各平台C语言系列课程所作,仅供交流学习,不得作他用。

1. 字符型多次读入/getchar函数

#include <stdio.h> int main() { char c; int letter = 0, blank = 0, digit = 0, other = 0; int count = 0; while (count < 10) { c = getchar(); if (c == '\n') { blank++; count++; continue; } count++;// 正常字符,计数+1 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {letter++;} else if (c == ' ') {blank++;} else if (c >= '0' && c <= '9') {digit++;} else {other++;} } printf("letter = %d, blank = %d, digit = %d, other = %d", letter, blank, digit, other); return 0; }

(1)getchar函数一次读入一个字符。即使你在终端里输入很多个字符,他一次也只能读第一个然后跳出。所以需要实现多个输入,需要准备循环。

(2)scanf对空格和回车敏感,当类似的字符需要作为可被读取到的输入时,用getchar。

(3)回车/r,ASCII码13,作用是让光标回到当前行最左边,不向下移动;换行/n,ASCII码10,作用是让光标向下移动,不回到最左边。只是现在电脑的回车键是连用两个功能的。

(4)在windows系统下,终端处换行系统会读到/r和/n。在linux和MAC系统下,换行只会读到/n。但是用getchar去读字符时,/r/n会被合并为/n,所以只会读到换行/n

2. 百分数输出(整数不精确)

这道题我原来写的代码是这样的:

#include <stdio.h> int main(){ int v1=0;int v2=0; scanf("%d %d",&v1,&v2); if(1.0*v1<v2*1.1){printf("OK");} else if(1.0*v1>=1.1*v2 && v1<v2*1.5){printf("Exceed %d%. Ticket 200",(int)1.0*v1/v2);} else{printf("Exceed %d%. License Revoked",(int)1.0*v1/v2);} return 0; }

这样在输入110和100时会进入第一个判断分支,原因是计算机内部整数不精确,用浮点数计算时第一个分支成立了。为解决这一问题,全部*10改用整数计算:

#include <stdio.h> int main() { int v1 = 0, v2 = 0; scanf("%d %d", &v1, &v2); // 全部用整数运算,避免浮点数误差 if (v1 * 10 < v2 * 11) { printf("OK"); } else if (v1 * 10 < v2 * 15) { // 计算超速百分比 int percent = (v1 - v2) * 100 / v2; printf("Exceed %d%%. Ticket 200", percent); } else { int percent = (v1 - v2) * 100 / v2; printf("Exceed %d%%. License Revoked", percent); } return 0; }

而且在printf里打%时,要连续输入两个%%。

3. 分硬币(想的比较复杂的一道题)

#include <stdio.h> int main(){ int n;int f;int t;int o;int c=0; scanf("%d",&n); f=n/5; while(f>=1){ t=(n-5*f)/2;o=n-5*f-2*t; while(t>=1){ if(o>=1){printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",f,t,o,f+t+o);c++;} if(t==1){break;} t--;o=o+2; } f--; } printf("count = %d",c); return 0; }

4. 字符加密(注意" "和‘ ’的区别)

#include <stdio.h> int main(){ char a; a=getchar(); while(a!='\n'){ if(a>='a' && a<'z'){printf("%c",a+'A'-'a'+'B'-'A');} else if(a=='z'){printf("A");} else if(a=='Z'){printf("a");} else if(a>='A' && a<'Z'){printf("%c",a+'a'-'A'+'b'-'a');} else{printf("%c",a);} a=getchar(); } return 0; }

printf()里,输出要用双引号“”。表达字符的加减或者比较运算时,得用单引号‘’

5. 简单计算器(字符操作)

#include <stdio.h> int main() { int result = 0;int num = 0;char op = 0;char c;int error = 0; // 1. 读取第一个操作数 while ((c = getchar()) != '+' && c != '-' && c != '*' && c != '/' && c != '=') { if(c >= '0' && c <= '9') {num = num * 10 + (c - '0');} else{error = 1;break;} } if (error) {printf("ERROR");return 0;} if (c == '=') {printf("%d", num);return 0;} // 只有一个数的情况 result = num;op = c;num = 0;//到此,c读到一个操作符并传给了op // 2. 循环处理后续运算符和操作数 while ((c = getchar()) != '=') { if (c >= '0' && c <= '9') {num = num * 10 + (c - '0');} else if (c == '+' || c == '-' || c == '*' || c == '/') { // 先计算上一步的结果 switch (op) { case '+': result += num; break; case '-': result -= num; break; case '*': result *= num; break; case '/': if (num == 0) {error = 1;break;} result /= num;break; default: error = 1; break; } if (error) break; // 更新运算符,重置临时数 op = c;num = 0; } else {error = 1;break;} } // 3. 处理最后一次运算(读到=时,还没算上一次的运算符) if (!error) { switch (op) { case '+': result += num; break; case '-': result -= num; break; case '*': result *= num; break; case '/': if (num == 0) {error = 1;} else {result /= num;} break; default: error = 1; break; } } // 4. 输出结果 if (error) {printf("ERROR");} else {printf("%d", result);} return 0; }

(1)如何实现字符拼接,使用string库。

#include <stdio.h> #include <string.h> // 必须加!strcat 在这个头文件里 int main() { // 注意:str1 必须足够大!能装下拼接后的所有字符 char str1[100] = "hello"; char str2[] = " world"; strcat(str1, str2); // 把 str2 拼到 str1 后面 printf("%s", str1); // 输出:hello world return 0; }

(2)这道题主要是比较复杂,第一步操作后,c已经读到了第一个操作符并传给了op。第二步开始读第二个操作数,读到第二个操作符时停止,计算上一步运算,然后重置参数计算。同时要注意error。

6. 泰勒函数求余弦(最后一项)

注意描述!这里说的是最后一项绝对值小于e,这小于e的一项也是要加进去的!!!

double funcos(double e, double x) { double sum = 1.0; // 第一项 1 先放进去 double term = 1.0; // 存当前项 int n = 1; // 计数 // 核心:当前项 >= e 才继续算下一项并累加 while (fabs(term) >= e) { // 递推计算下一项 term = term * (-x * x) / ((2*n - 1) * (2*n)); sum = sum + term; n++; } return sum; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 8:14:10

从结构化到面向对象:系统架构设计方法的核心演进

在系统架构设计师的考试体系中&#xff0c;“设计方法”是决定软件系统质量与可维护性的关键内容。当前主流的两种设计方法——结构化分析与设计、面向对象的分析设计&#xff0c;分别代表了不同时代、不同场景下的工程化思维。理解并掌握它们&#xff0c;是架构师必备的能力。…

作者头像 李华
网站建设 2026/5/27 8:12:07

2. PPT模板的二维码能不能去掉、怎么去掉,图片中的水印怎么去掉

PPT模板的二维码能不能去掉、怎么去掉&#xff0c;能不能帮我去掉&#xff1f;在我们提供的参考论文中都有水印、二维码等防止同行恶意抄袭的防伪手段&#xff0c;下面教大家怎么去除打开PPT启用编辑、然后选中二维码点击删除就可以去掉文字的水印去除方式也是一样的&#xff0…

作者头像 李华
网站建设 2026/5/27 8:12:05

4. 我认为内容不全/不对怎么办

我认为内容不全/不对怎么办如果您发现我们提供的资料&#xff08;如论文模板、PPT模板、讲解视频等&#xff09;中存在内容不全或与您的理解、实物功能不符的情况&#xff0c;您可以随时向我们反馈具体问题和修改建议&#xff0c;我们会在后续会中统一收集、评估并逐步优化。需…

作者头像 李华
网站建设 2026/5/27 8:11:11

【CGLIB】`NoOp` 回调的作用是什么?在什么情况下会用到它?

CGLIB NoOp 回调深度解析&#xff1a;透明代理的基石与多回调协同的核心占位符 用户问题原文&#xff1a;NoOp 回调的作用是什么&#xff1f;在什么情况下会用到它&#xff1f; 在超大规模分布式系统中&#xff0c;动态代理常被用于实现精细化控制——我们希望对某些方法进行拦…

作者头像 李华