
1. C语言入门从Hello World到温度转换第一次接触C语言时我盯着那个简单的Hello World程序看了整整半小时。现在回想起来那些看似简单的printf和scanf函数其实是打开编程世界大门的钥匙。让我们从最基础的输入输出开始逐步深入C语言的奇妙世界。温度转换是个不错的起点。记得我第一次写华氏度转摄氏度的程序时把公式写反了结果输出了零下40度的荒谬结果。正确的做法是这样的#includestdio.h int main() { double celsius, fahrenheit; printf(请输入华氏温度); scanf(%lf, fahrenheit); celsius 5 * (fahrenheit - 32) / 9; printf(摄氏温度为%.2lf\n, celsius); return 0; }这里有几个新手常踩的坑变量类型要用double而不是float保证计算精度scanf的格式字符串要和变量类型严格匹配printf中的%.2lf表示保留两位小数2. 格式化输出与进制转换的艺术当我们需要整齐地输出数据时格式化输出就派上用场了。记得有次我帮朋友写个人信息输出程序结果所有信息都挤在一起完全没法看。后来学会了使用%-8d这样的格式控制符问题迎刃而解。#includestdio.h int main() { char initial; int birthYear, height; printf(输入首字母、出生年份和身高(cm)); scanf(%c,%d,%d, initial, birthYear, height); int age 2023 - birthYear; printf(首字母:%-8c年龄:%-8d身高:%-8d, initial, age, height); return 0; }进制转换是另一个实用技能。有次面试就被问到如何输出一个数的不同进制表示#includestdio.h int main() { int num; printf(输入一个整数); scanf(%d, num); printf(十进制:%d\n八进制:%o\n十六进制:%x\n, num, num, num); return 0; }3. 选择结构从成绩评定到闰年判断if-else和switch-case是程序做出决策的基础。我清楚地记得第一次用switch写成绩评定程序时忘记加break导致的瀑布效应——所有case都被执行了一遍。正确的成绩评定应该是这样的#includestdio.h int main() { int score; printf(输入成绩(0-100)); scanf(%d, score); if(score 60) { printf(不及格\n); } else { switch(score/10) { case 6: printf(及格\n); break; case 7: printf(中等\n); break; case 8: printf(良好\n); break; case 9: case 10: printf(优秀\n); break; } } return 0; }闰年判断是另一个经典案例。很多人会忽略能被400整除的年份也是闰年这一特殊情况#includestdio.h int main() { int year; printf(输入年份); scanf(%d, year); if((year%40 year%100!0) || year%4000) { printf(%d年是闰年\n, year); } else { printf(%d年不是闰年\n, year); } return 0; }4. 循环结构从数列求和到图形打印循环是自动化处理重复任务的关键。我第一次写倒数和程序时忘记处理整数除法的问题结果所有项都是0。正确的做法是要进行类型转换#includestdio.h int main() { int n; double sum 0.0; printf(输入项数); scanf(%d, n); for(int i1; in; i) { sum 1.0/i; // 关键的类型转换 } printf(前%d项和为%.4lf\n, n, sum); return 0; }打印图形是检验循环掌握程度的绝佳练习。记得我第一次尝试打印菱形时花了一整天调整空格和星号的数量#includestdio.h int main() { int n; printf(输入菱形高度(奇数)); scanf(%d, n); // 上半部分 for(int i1; in/21; i) { for(int ji; jn/2; j) printf( ); for(int j1; j2*i-1; j) printf(*); printf(\n); } // 下半部分 for(int i1; in/2; i) { for(int j1; ji; j) printf( ); for(int j1; jn-2*i; j) printf(*); printf(\n); } return 0; }5. 函数与算法质数判断与完全数当程序变得复杂时函数就派上用场了。写一个判断质数的函数是理解函数设计的经典案例#includestdio.h #includestdbool.h bool isPrime(int n) { if(n 1) return false; for(int i2; i*in; i) { if(n%i 0) return false; } return true; } int main() { int num; printf(输入一个正整数); scanf(%d, num); if(isPrime(num)) { printf(%d是质数\n, num); } else { printf(%d不是质数\n, num); } return 0; }完全数Perfect Number是另一个有趣的数学概念。我第一次写完全数程序时没有重置sum变量导致结果完全错误#includestdio.h int main() { int limit; printf(查找多少以内的完全数); scanf(%d, limit); for(int num1; numlimit; num) { int sum 0; for(int divisor1; divisornum/2; divisor) { if(num%divisor 0) sum divisor; } if(sum num) printf(%d , num); } printf(\n); return 0; }6. 综合应用解二次方程与利润计算把多个知识点综合运用才能解决实际问题。解二次方程需要考虑判别式的各种情况#includestdio.h #includemath.h int main() { double a, b, c; printf(输入二次方程系数(a b c)); scanf(%lf %lf %lf, a, b, c); double delta b*b - 4*a*c; if(delta 1e-6) { // 两个不等实根 printf(x1%.3lf\nx2%.3lf\n, (-bsqrt(delta))/(2*a), (-b-sqrt(delta))/(2*a)); } else if(fabs(delta) 1e-6) { // 相等实根 printf(x1x2%.3lf\n, -b/(2*a)); } else { // 复数根 printf(x1%.3lf%.3lfi\nx2%.3lf-%.3lfi\n, -b/(2*a), sqrt(-delta)/(2*a), -b/(2*a), sqrt(-delta)/(2*a)); } return 0; }利润计算展示了多条件判断的实际应用。记得处理边界值时特别小心#includestdio.h int main() { int profit; printf(输入利润金额); scanf(%d, profit); double bonus 0; if(profit 100000) { bonus profit * 0.1; } else if(profit 200000) { bonus 100000*0.1 (profit-100000)*0.075; } else if(profit 400000) { bonus 100000*0.1 100000*0.075 (profit-200000)*0.05; } // 其他区间类似处理 printf(奖金%d\n, (int)bonus); return 0; }7. 数组与字符串处理实战数组是处理批量数据的利器。字符数组特别适合处理字符串操作比如统计算术题的正确率#includestdio.h #includestring.h int main() { char equation[100]; int correct 0; printf(输入算术题(以#结束)\n); while(1) { fgets(equation, 100, stdin); if(equation[0] #) break; int a, b, result; char op; sscanf(equation, %d%c%d%d, a, op, b, result); if(op ab result) correct; else if(op - a-b result) correct; } printf(正确题数%d\n, correct); return 0; }8. 经典算法问题换零钱与最大数查找换零钱问题展示了多重循环的威力。我第一次写这个程序时循环边界设置错误导致结果多了很多#includestdio.h int main() { int total; printf(输入总金额); scanf(%d, total); int count 0; for(int coin10; coin1total; coin1) { for(int coin20; coin2total/2; coin2) { for(int coin50; coin5total/5; coin5) { if(coin1 2*coin2 5*coin5 total) { count; } } } } printf(兑换方式有%d种\n, count); return 0; }查找最大数是理解循环和条件判断配合的经典案例。关键是要初始化max为一个足够小的值#includestdio.h #includelimits.h int main() { int num, max INT_MIN; printf(输入一系列整数(0结束)); while(1) { scanf(%d, num); if(num 0) break; if(num max) max num; } printf(最大值是%d\n, max); return 0; }