C语言编程入门:10个经典实战小程序解析
探索C语言基础逻辑的最佳方式是研读经典案例。本文整理了包含数学运算、流程控制及字符处理的10个代表性程序,深入解析其背后的算法思路与代码实现细节。
基础逻辑与循环应用
第1步:使用三重循环生成不重复三位数
该案例旨在解决排列组合问题。通过三个嵌套的 for 循环分别代表百位、十位和个位,遍历1至4的数字。利用 if (i!=k && i!=j && j!=k) 条件确保三位数字互不相同,并通过 printf 输出所有符合条件的组合。
main()
{
int i,j,k;
printf("\n");
for(i=1;i<5;i++) // 百位循环
for(j=1;j<5;j++) // 十位循环
for (k=1;k<5;k++) // 个位循环
{
if (i!=k&&i!=j&&j!=k) // 确保数字互异
printf("%d,%d,%d\n",i,j,k);
}
}
第2步:实现阶梯式利润提成计算
此题考察复杂的条件分支与数据类型选择。关键点在于根据利润区间分段计算奖金,并定义奖金变量为 long int 以防止溢出。预先计算各阈值区间的累计奖金(如 bonus1 为10万时的奖金),可简化后续 if-else 的逻辑判断。
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
// 预计算各阶段基准奖金
bonus1=100000*0.1;
bonus2=bonus1+100000*0.75;
bonus4=bonus2+200000*0.5;
bonus6=bonus4+200000*0.3;
bonus10=bonus6+400000*0.15;
scanf("%ld",&i);
if(i<=100000) bonus=i*0.1;
else if(i<=200000) bonus=bonus1+(i-100000)*0.075;
else if(i<=400000) bonus=bonus2+(i-200000)*0.05;
else if(i<=600000) bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000) bonus=bonus6+(i-600000)*0.015;
else bonus=bonus10+(i-1000000)*0.01;
printf("bonus=%d",bonus);
}
第3步:利用完全平方数性质反推整数
题目要求在10万以内寻找满足特定条件的整数。分析指出:若整数 $x$ 加100后是平方数,再加168(即总共加268)也是平方数。代码通过 sqrt() 函数开方,并验证 x*x == i+100 来确认整数解,这是验证完全平方数的有效手段。
#include "math.h"
main()
{
long int i,x,y,z;
for (i=1;i<100000;i++)
{
x=sqrt(i+100); /*计算加100后的平方根*/
y=sqrt(i+268); /*计算加268后的平方根*/
if(x*x==i+100&&y*y==i+268) /*验证是否为整数平方*/
printf("\n%ld\n",i);
}
}
第4步:计算日期在一年中的序数
该程序涉及时间逻辑处理。核心步骤是先通过 switch 语句累加前几个月的天数,再加上当月日期。特别注意闰年判断逻辑:(year%400==0 || (year%4==0 && year%100!=0))。如果是闰年且月份大于2月,总天数需额外加1。
main()
{
int day,month,year,sum,leap;
printf("\nplease input year,month,day\n");
scanf("%d,%d,%d",&year,&month,&day);
switch(month)
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break; // 注意闰年修正
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("data error");break;
}
sum=sum+day;
if(year%400==0||(year%4==0&&year%100!=0)) leap=1;
else leap=0;
if(leap==1&&month>2) sum++;
printf("It is the %dth day.",sum);
}
第5步:通过交换法对三个整数排序
目标是将输入的x, y, z按从小到大的顺序输出。算法策略是始终将最小值置换到x位置:首先比较x与y,若x大则交换;接着比较x与z,若x大则交换。此时x已是最小值。最后只需比较y与z并交换即可确保有序。
main()
{
int x,y,z,t;
scanf("%d%d%d",&x,&y,&z);
if (x>y) { t=x; x=y; y=t; } // 确保x<=y
if (x>z) { t=x; x=z; z=t; } // 确保x<=z,此时x最小
if (y>z) { t=y; y=z; z=t; } // 确保y<=z
printf("small to big: %d %d %d\n",x,y,z);
}
图形输出与字符控制
第6步:输出字母C图案
这是一个简单的控制台绘图练习。通过多行 printf 语句,利用空格和星号 * 的组合,模拟出字母“C”的形状。虽然代码中包含一行
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









