C语言入门经典算法与示例代码详解

南乔
南乔
发布时间:2026-10-16| 9人浏览过
原创

本文整理了C语言入门阶段最经典的18个算法示例,包括常用的循环嵌套、数组处理、字符串操作及数据结构应用。通过具体的源代码和逻辑分析,帮助初学者掌握C语言的核心语法与编程思维。

基础输出与数值运算

C语言的入门通常从控制结构和数学运算开始。以下示例展示了如何使用 for 循环进行格式化输出,以及如何通过简单的数学逻辑解决经典问题。

第1步:打印九九乘法口诀表

目的:掌握双重循环的使用及 printf 格式化输出(如左对齐占位)。

#include "stdio.h"
main()
{int i,j,result;
 for (i=1;i<10;i++)
   { for(j=1;j<10;j++)
       {
          result=i*j;
          printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/
       }
      printf("\n");/*每一行后换行*/
   }
}

第2步:求101-200间的素数及其个数

目的:理解素数判断逻辑(试除法至 sqrt(m)),优化循环次数。

#include "math.h"
main()
{
  int m,i,k,h=0,leap=1;
  printf("\n");
  for(m=101;m<=200;m++)
   { k=sqrt(m+1);
     for(i=2;i<=k;i++)
       if(m%i==0)
          {leap=0;break;}
       if(leap)    /*内循环结束后,leap依然为1,则m是素数*/ 
          {printf("%-4d",m);h++;
           if(h%10==0)
               printf("\n");
          }
     leap=1;
   }
  printf("\nThe total is %d",h);
}

第3步:找出1000以内的所有“完数”

目的:练习因子分解。完数指一个数恰好等于其真因子之和(如6=1+2+3)。

#include <stdio.h>
main()
{
  static int k[10];
  int i,j,n,s;
  for(j=2;j<1000;j++)
    {
     n=-1;
     s=j;
     for(i=1;i<j;i++)
       {if((j%i)==0)
          {  n++;
             s=s-i;
             k[n]=i;
          }
       }
  if(s==0)
   {printf("%d is a wanshu:  ",j);
    for(i=0;i<n;i++)
        printf("%d,",k[i]);
    printf("%d\n",k[n]);
   }
}
}

数组操作与矩阵变换

第4步:实现数组的逆时针旋转90度

目的:理解二维数组索引映射关系。将 a[i][j] 映射到新位置 b[3-j][i]。

#include <stdio.h>
main()
{  int  a[4][4],b[4][4],i,j;       /*a存放原始数组数据,b存放旋转后数组数据*/
   printf("input 16 numbers: ");
/*输入一组数据存放到数组a中,然后旋转存放到b数组中*/
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
       {  scanf("%d",&a[i][j]);
          b[3-j][i]=a[i][j];
        }
   printf("array b:\n");
   for(i=0;i<4;i++)
      {  for(j=0;j<4;j++)
         printf("%6d",b[i][j]);
         printf("\n");
       }
}

第5步:计算学生平均分(4x5数组应用)

目的:在多维数组最后一列/行追加统计数据。输入时注意空格分隔同一人数据,回车分隔不同人。

#include <stdio.h>
#include <stdlib.h>
main()
{ float a[4][5],sum1,sum2;
  int i,j;
  for(i=0;i<3;i++)
    for(j=0;j<4;j++)
      scanf("%f",&a[i][j]);
  for(i=0;i<3;i++)
  { sum1=0;
    for(j=0;j<4;j++)
      sum1+=a[i][j];
      a[i][4]=sum1/4;
  }
  for(j=0;j<5;j++)
  {  sum2=0;
     for(i=0;i<3;i++)
       sum2+=a[i][j];
       a[3][j]=sum2/3;
   }
   for(i=0;i<4;i++)
   {  for(j=0;j<5;j++)
      printf("%6.2f",a[i][j]);
      printf("\n");
   }
}

第6步:打印直角杨辉三角形

目的:利用 a[i][j] = a[i-1][j] + a[i-1][j-1] 动态规划思想生成数字金字塔。

#include <stdio.h>
main()
{int i,j,a[6][6];
 for(i=0;i<=5;i++)
  {a[i][i]=1;a[i][0]=1;}
 for(i=2;i<=5;i++)
    for(j=1;j<=i-1;j++)
     a[i][j]=a[i-1][j]+a[i-1][j-1];
 for(i=0;i<=5;i++)
    {for(j=0;j<=i;j++)
        printf("%4d",a[i][j]);
     printf("\n");}
}

第7步:插入排序(保持数组有序)

目的:已知数组 a 已有序,在插入新元素 x 时,需先将大于 x 的元素后移,找到空位后插入。

main()
    {  int a[10]={0,12,17,20,25,28,30};       /*a[0]为工作单元,从a[1]开始存放数据*/
       int  x , i, j=6;                         /*j为元素个数*/
       printf("Enter a number: ");  
       scanf("%d",&x);
       a[0]=x;
       i=j;                               /*从最后一个单元开始*/
       while(a[i]>x)
       {  a[i+1]=a[i]; i--;    }   /*将比x大的数往后移动一个位置*/
       a[++i]=x;
       j++;                       /*插入x后元素总个数增加*/
       for(i=1;i<=j;i++) printf("%8d",a[i]);
       printf("\n");
}

字符串处理高级技巧

第8步:字符串反序输出

方法一(数组法):使用双指针 i 和 j 从两头向中间交换字符。

#include <string.h>
main()
{  char  c[200],c1;
   int i,j,k;
   printf("Enter a string: ");
   scanf("%s",c);
   k=strlen(c);
   for (i=0,j=k-1;i<k/2;i++,j--)
     {  c1=c[i];c[i]=c[j];c[j]=c1;  }
   printf("%s\n",c);         
}

方法二(指针法):通过指针偏移 *(*(s+i)) 实现相同逻辑。

第9步:删除字符串中的指定字符

目的:使用双指针原地压缩数组。j 指向当前待写入位置,k 扫描原字符串。

#include <stdio.h>
main()
{  char  s[80],c;
   int  j,k;
   printf("\nEnter a string: ");
   gets(s);
   printf("\nEnter a character: ");
   c=getchar( );
   for(j=k=0;s[j]!= '\0';j++)
   if(s[j]!=c)
      s[k++]=s[j];
   s[k]= '\0';
   printf("\n%s",s);
}

第10步:字符串字符替换

目的:遍历字符串并逐个比对替换。需注意区分大小写。

#include<stdio.h>
replace(char *s,char c1,char c2)
{ while(*s!='\0')
   {  if (*s==c1)
         *s=c2;
         s++;  
   }
}
main()
{ FILE *fp; 
  char str[100],a,b;
   if((fp=fopen("p10_2.out","w"))==NULL) 
      { printf("cannot open the file\n");
       exit(0);                     }
   printf("Enter a string:\n");
    gets(str);
    printf("Enter a&&b:\n");
    scanf("%c,%c",&a,&b);
printf("%s\n",str);
fprintf(fp,"%s\n",str);
replace(str,a,b);
printf("The new string is----%s\n",str);
fprintf(fp,"The new string is----%s\n",str);
fclose(fp);
}

第11步:子串定位查找

目的:朴素模式匹配算法。外层循环遍历主串起始位置,内层循环逐字比对子串。

main()
{char s1[6]="thisis";char s2[5]="is";
printf("%d\n",search(s1,s2));
system("pause");
}
int search(char s1[],char s2[])
{int i=0,j,len=strlen(s2);
while(s1[i]){
 for(j=0;j<len;j++)
 if(s1[i+j]!=s2[j]) break;
 if(j>=len)return i;
 else i++;
 }
return -1;
}

第12步:判断回文字符串

目的:比较首尾对称位置的字符是否相等。

#include <stdio.h>
#include <string.h>
main()
{ char s[100];
  int i,j,n;
  printf("输入字符串:\n");
  gets(s); 
  n=strlen(s);
  for(i=0,j=n-1;i<j;i++,j--)
    if(s[i]!=s[j])   break;
  if(i>=j) printf("是回文串\n");
  else     printf("不是回文串\n");
}

 

排序算法与数学计算

第13步:冒泡排序(从大到小)

目的:经典排序算法。通过相邻元素比较交换,逐步将最大/小值沉底或冒泡至顶端。

#include<stdio.h>
void fun(int a[],int n)
{int i,j,t;
for(i=0;i<=n-1;i++)
  for(j=0;j<i;j++)
    if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
main()
{int a[10]={12,45,7,8,96,4,10,48,2,46},n=10,i;
FILE *f;
if((f=fopen("myf2.out","w"))==NULL)
   printf("open file myf2.out failed!\n");
fun(a,10);
for(i=0;i<10;i++)
   {printf("%4d",a[i]);
    fprintf(f,"%4d",a[i]);
   }
fclose(f);
}

输出

第14步:选择排序(降序排列)

目的:每一轮从未排序部分选出最大值放到已排序部分的末尾。

#include<stdio.h>
void sort(int *x,int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
 k=i;
 for(j=i+1;j<n;j++)
   if(x[j]>x[k]) k=j;
   if(k!=i)
   {
    t=x[i];
    x[i]=x[k];
    x[k]=t;
   }
}
}
void main()
{FILE *fp;
     int *p,i,a[10];
     fp=fopen("p9_1.out","w");                       
    p=a;
printf("Input 10 numbers:");
for(i=0;i<10;i++)
  scanf("%d",p++);
p=a;
sort(p,10);
for(;p<a+10;p++)
 {  printf("%d ",*p);
        fprintf(fp,"%d ",*p);  }
        system("pause"); 
    fclose(fp);
}

第15步:使用公式计算圆周率π的近似值

目的:利用级数展开(莱布尼茨级数变体)进行高精度累加。当某一项小于 eps 时停止计算。

#include<stdio.h>
double countpi(double eps)               /*eps为允许误差*/
  {
    int m=1;
     double temp=1.0,s=0;
     while(temp>=eps)
     {  s+=temp;
        temp=temp*m/(2*m+1);
        m++;
     }
     return(2*s);
  }
main()
{FILE *fp;
     double eps=1e-5,pi;
     if((fp=fopen("p7_3.out","w"))==NULL)  
   { printf("cannot open the file\n");
     exit(0);                       
   }
   pi= countpi(eps);
   printf("pi=%lf\n",pi);
fprintf(fp,"pi=%lf\n",pi);
fclose(fp);
}

第16步:古典兔子数列(斐波那契数列)

目的:利用变量迭代代替递归,高效计算大数值序列。注意使用 long 类型防止溢出。

#include <stdio.h>
main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++)
  { printf("%12ld %12ld",f1,f2);
     if(i%2==0) printf("\n");/*控制输出,每行四个*/
     f1=f1+f2; /*前两个月加起来赋值给第三个月*/
     f2=f1+f2; /*前两个月加起来赋值给第三个月*/
   }
}

结构体与内存管理

第17步:使用指针输出结构体数组

目的:通过结构体指针 ps-> 访问成员,替代数组下标法,提高代码可读性与执行效率。

struct student
{
 int num;
 char *name;
char sex;
int age;
}stu[5]={{1001,"lihua",'F',18},{1002,"liuxing",'M',19},{1003,"huangke",'F',19},{1004,"fengshou",'F',19},{1005,"Wangming",'M',18}};
main()
{int i;
struct student *ps;
printf("Num \tName\t\t\tSex\tAge\t\n");    
/*用指针变量输出结构体数组元素。*/
for(ps=stu;ps<stu+5;ps++)
printf("%d\t%-10s\t\t%c\t%d\t\n",ps->num,ps->name,ps->sex,ps->age);
/*用数组下标法输出结构体数组元素学号和年龄。*/
for(i=0;i<5;i++)
printf("%d\t%d\t\n",stu[i].num,stu[i].age);
}

第18步:构建简单单向链表

目的:理解节点的链接方式:head->next 指向第二个节点,尾节点 next=NULL。这是后续学习复杂数据结构的基础。

#define NULL 0
struct student
{ 
int num;
char *name;
int age ;
struct student *next;
};
void main()
{
struct student a,b,c,*head,*p;
a.num=1001; a.name="lihua"; a.age=18;  /*  对结点成员进行赋值  */
b.num=1002; b.name="liuxing"; b.age=19;
c.num=1003; c.name="huangke"; c.age=18;
head=&a;                           /*  建立链表,a为头结点  */
a.next=&b;
b.next=&c;
c.next=NULL;
p=head;                            /*  输出链表  */
do{
printf("%5d,%s,%3d\n",p->num,p->name,p->age);
p=p->next;
}while(p!=NULL);
}

以上就是C语言编程入门必背的示例代码整理大全的详细内容,更多关于C语言入门算法与代码的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。