zoukankan      html  css  js  c++  java
  • 适合初学C语言是练习的代码

    作为一个小白,自己学C的时候就想找些代码练练手,就整理了一些。

    1.最大公约数和最小公倍数

    # include <stdio.h>
    int main(void)
    {
         int i, j;
        int p, q;
        int m, n;
        printf("请输入您想要操作的两个数:");
        scanf("%d %d", &p, &q);
        i = p;
        j = q;
        // 将较小的数放在 i, 较大的数放在 j
        int temp;
        if (i>j)
        {
          temp = j;
          j = i;
          i = temp;
        }
        int r;
        r = j%i;
        while (r!=0)
        {
           j = i;
          i = r;
          r = j%i;
        }
        m = i;
        n = (p*q)/m;
        printf("最大公约数为:%d 最小公倍数为:%d ", m, n);
        return 0;
    }
     

    2.

     将大写字母与小写字母相互转换

    # include <stdio.h>
    int main(void)
    {
       char big, small;
       big = getchar();
       small = big + 32;
       putchar(small);
     
       return 0;
    } 

    3.约瑟夫环问题

     问题描述:
         杰克船长想要从 20 个水手中选出一个人做大副,为了公平
      起见,所有人围坐成一个圈,依次从 1 ~ 3 循环报数,当
      报到 3 时的人退出,最后的人即为大副。如果你想要做大副
      你要坐在那个位子?

    # include <stdio.h>
    # define PERSON_CNT 20
    # define OUT_NUM 3
    int main(void)
    {
       int Person[PERSON_CNT] = {0}, count, PersonOut;
       int i;
       // 为每个人编号,编号是下标加 1 
       for (i=0; i<PERSON_CNT; ++i)
           Person[i] = i + 1;
       //  记录报数的人的人数 
       PersonOut = PERSON_CNT;
       count = 0;
       while (PersonOut > 1)   // 判断还剩下一个人 
       {
          for (i=0; i<PERSON_CNT; ++i)  // 一个个报数排除 
          {
             if (Person[i] != 0)
             {
                count++;  // 报数循环 
                if (count == OUT_NUM)
                {
                   // 将出局的人打印出来 
                   printf("No.%-2d Out! 
    ", Person[i]);
                   Person[i] = 0;  // 将编号设置为 0
                   count = 0;  // 将计数器归零
                   PersonOut--; 
                 } 
              } 
            }
         }
       for (i=0; i<PERSON_CNT; ++i)
       {
          if (Person[i] != 0)
              printf("The last person is No.%-2d!
    ", Person[i]);
        }   
     
       return 0;
    } 

    4. 杨辉三角

       问题描述:
           要求程序输出一个由数字组成的等腰三角形,三角形
        的两个腰上的数字和顶角上的数字都为以,而三角形
        内的每个数字等于它上一行正对的头顶上的两数字的
        和。
     数学分析结果:
        为了使输出结果是等腰三角形,可知道若三角形共有
        n 行,则第 i 行之前需要输出的空格数为 n-i-1个。
     代码分析:
        下面的代码是将数据做了类似与数组的处理,每行的
        每个数都是从第 0 行 第 0 个数据开始 

    # include <stdio.h>
    int main(void)
    {
       int i, n, r, j, s;
       printf("请输入您想要输出的行数:");
       scanf("%d", &n);
       for (i=0; i<n; ++i)   // 控制行的循环 
       {
           for (j=0; j<=n-1-i; ++j)   // 控制每行前面要输出的空格
            printf("  ");  // 里面是两个空格。 
           for (r=0; r<=i; ++r)   // 控制每一行的每个数字的输出{
           {
             s = 1;     //  每个数据都相当于 i 个数中取 r 的数的组合数,求组合数的值 
             for (j=0; j<=r; j++)  // 求组合数 
                if (j!=0)   // 每行第零个数都是 1  
                   s = s * (i-r+j) / j;  
             printf("%4d", s);   // 输出第 i 行的第 r 个数 
            } 
            printf("
    ");  // 每行输出结束后,输出换行 
        } 
     
        return 0;
     } 

    5.输出三位数的逆序数

    # include <stdio.h>
    int main(void)
    {
       int number_1;
       printf("请输入一个三位数:");
       scanf("%d", &number_1);
       int i, j, k;
       i = number_1/100;
       j = (number_1 - i*100)/10;
       k = number_1%10;
       int number_2;
       number_2 = i + j*10 + k*100;
       printf("%d", number_2);
     
     return 0;
    }

    6.十进制转化为二进制数

    # include <stdio.h>
    # define N 16  // 两个字节 
    int main(void)
    {
     unsigned int decimal;  // 定义无符号十进制数 
     int arry[N], i, j;
     printf("请输入您想要转换的数:");
     scanf("%d", &decimal);
     i = 0;
     do
     {
      arry[i] = decimal%2;
      ++i;
      decimal /= 2;
     } while (decimal);
     printf("
    转换后的二进制数为:");
     for (j=i-1; j>=0; --j)  // 逆序输出 
     {
      printf("%d", arry[j]);
      if (j%4 == 0 && j != 0)  // 每个四位打印分隔符 
      {
       printf("  ");
       } 
     }
     printf("
    ");
     
     return 0;
     } 

    7. 生成随机数种子

       srand 函数

    # include <stdio.h>
    # include <time.h>
    # include <stdlib.h>
    int main(void)
    {
     srand(time(0));
     printf("%ld", 10000 + rand()%90000);
     
     return 0;
     } 

    每次运行后产生的结果都不相同。 

    8.判断某年是否为闰年

    # include <stdio.h>
    int main(void)
    {
     int i;
     printf("请输入您想要判定的年份:");
     scanf("%d", &i);
     if (i%4==0 && i%100!=0 ||i%400==0)
       printf("%d 年是闰年!
    ", i);
     else 
       printf("%d年不是闰年!
    ", i);
     
     return 0;
    }

    9.日期转换,将年月日转换成某年的第几天

    # include <stdio.h>
    int main(void)
    {
     int DayTab[2][12] = {
         {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
         {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
     };  // 使用一个二维数组储存闰年和非闰年的每月的天数 
     int Year, Month, Day, DayCnt, Leap, i;
     printf("请按照年月日的顺序输入日期:");
     // 获取日期 
     scanf("%d%*c%d%*c%d", &Year, &Month, &Day);
     /*
         由于无法保证用户输入日期的格式,使用%*c表示跳过一个输
      入的字符,如要跳过两个字符,使用&2*c 
     */ 
     DayCnt = Day;
     // 判断是否为闰年
     Leap = Year%4 == 0 && Year%100 != 0 || Year%400 == 0;
     for (i=0; i<Month-1; ++i)
     {
         DayCnt += DayTab[Leap][i];
     }
     printf("%d年%d月%d日是%d年的第%d天!
    ", Year, Month, Day, Year, DayCnt);
      
     return 0;
     } 

    10.

       取出一个整数的第 k 位
       问题描述:即将一个数的二进制数的从右数起的第
       k 为二进制数字输出。

    # include <stdio.h>
    int main(void)
    {
     int i, j, k;
     printf("请输入您想要操作的数:");
     scanf("%d", &i);
     printf("请输入您想要拿出的位数:");
     scanf("%d", &j);
     i >>= j-1;  // 将 i 向右移动 j-1 位
     k = i&1;   // 按位与运算
     printf("%d
    ", k); 
     
     return 0;
     } 

    11.判断一个数字是否为素数

    # include <stdio.h>
    int main(void)
    {
     int i, j;
     printf("请输入您想要判定的数:");
     scanf("%d", &i);
     for (j=2; j<i; ++j)
     {
      if (i%j == 0)
        break;
        } 
     if (j == i)
         printf("%d是素数!
    ", i);
     else
         printf("%d不是素数!
    ", i);
     
     return 0;
     } 

    12. 矩阵转置  将一个 3*4 的矩阵转置成一个 4*3 的矩阵

    # include <stdio.h>
    # include <time.h>
    # include <stdlib.h>
    int main(void)
    {
     srand(time(0));  // 生成随机数种子 
     int arry_1[3][4], arry_2[4][3];
     int i, j;
     for (i=0; i<3; ++i)
         for (j=0; j<4; ++j)
         {
          arry_1[i][j] = rand()%100;   // 生成随机数 
      }
     for (i=0; i<3; ++i)
         for (j=0; j<4; ++j)
         {
          arry_2[j][i] = arry_1[i][j];  // 矩阵转置 
       } 
     for (i=0; i<3; ++i)  // 打印原矩阵 
     {
      for (j=0; j<4; ++j)
      {
       printf("%-4d", arry_1[i][j]);
      }
      printf("
    ");
     }     
     for (i=0; i<4; ++i)  // 打印转置后的矩阵 
     {
      for (j=0; j<3; ++j)
      {
       printf("%-4d", arry_2[i][j]);
      }
      printf("
    ");
     }
     
     return 0;
     } 

    13.九九乘法口诀表

    # include <stdio.h>
    int main(void)
    {
     int i, j, k;
     for (i=1; i<=9; ++i)
     { 
       for (j=1; j<=i; ++j)
       {
        k = j*i;
        printf("%2d * %2d = %2d", j, i, k);
       }
       printf("
    "); 
     } 
     
     return 0;
     } 

    14.

       比赛选手评分
       规则:去除最高分和最低分,以剩下的分数的平均分为准。

    # include <stdio.h>
    // 前置申明 
    double MAX(double *, int);
    double MIN(double *, int);
    int main(void)
    {
     int i;   // 裁判人数 
     double sum = 0, ave, max, min, score[i]; 
     // 数据代表 总分,平均分,最高分,最低分,每个裁判各处的分数
     printf("请输入裁判人数:");
     scanf("%d", &i);
     printf("
    请输入每个裁判给的分数:");
     int j;
     for (j=0; j<i; ++j)  // 输入裁判评分情况 
     {
      scanf("%lf", &score[j]);
     }
     max = MAX(score, i);  //求出最高分 
     min = MIN(score, i);  //求出最低分
     for (j=0; j<i; ++j)
     {
      sum += score[j];
      } 
     ave = (sum - min - max) * (1.0/(i - 2));
     printf("选手总分为:%lf,选手平均得分为:%lf", sum, ave);
     
     return 0;
    }
    // 求最大值 
    double MAX(double * a, int i)
    {
     double max;
     for (int j=0; j<i-1; ++j)
     {
      if (a[j] > a[j+1])
        max = a[j];
      else
        max = a[j+1];
     }
     return max;
    }
    // 求最小值 
    double MIN(double * a, int i)
    {
     double min;
     for (int j=0; j<i-1; ++j)
     {
      if (a[j] < a[j+1])
        min = a[j];
      else
        min = a[j+1];
     }
     return min;
    }

    15. Fibonacci

    # include <stdio.h>
    int main(void)
    {
     int i, j, k;
     int val;
     i = 1;
     j = 1;
     for (k = 1; k <= 20; ++k)
     {
      if (1 == k)
      val = i;
      else if (2 == k)
      val = j;
      else
      {
       val = i + j;
       i = j;
       j = val;
      }
         printf("%d
    ", val);  
     }
     
     return 0;
     
     // 次程序和上一个程序的区别是使用循环和选择将数组替换了 
    }

    16.

       猴子吃桃问题:
       猴子第一天摘了若干个桃子,当即吃了一半零一个,以后每天
       都吃剩下的一半零一个,到第十天,准备吃的时候,只剩下了
       一个,问最开始猴子摘了多少个桃子。 

    # include <stdio.h>
    int main(void)
    {
     int i, sum = 1;
     for (i=0; i<9; ++i)
     {
      sum = (sum+1) * 2;
     }
     printf("%d", sum);
     
     return 0;
     } 
     

    17.将一个整数的二进制表示的第 k 位清零

    # include <stdio.h>
    int main(void)
    {
     int i, j, k;
     printf("请输入您想要操作的数和所操作的位数:");
     scanf("%d %d", &i, &j);
     k = i&~(1<<j-1);
     printf("%o,%o
    ", i, k);
     
     return 0;
     } 

    18. 交换两数的值

    # include <stdio.h>
    int main(void)
    {
     int i, j, temp;
     printf("请输入两个需要被交换的数:");
     scanf("%d %d", &i, &j);
     temp = i;
     i = j;
     j = temp;
     printf("%d, %d", i, j);
     
     return 0;
     } 
  • 相关阅读:
    vs2017 离线安装。
    c# begin & end.
    vc++ 下的WaitForSingleObject
    c# 工厂模式 ,委托 ,事件。
    微信分享 andriod studio
    mac osx 10.9 ftp server端口
    win32 调用多媒体函数PlaySound()
    [汇编语言]-第九章 在屏幕中间分别显示绿底红色,白底蓝色字符串"welcome to masm!"
    [汇编语言]-第九章 jcxz,loop指令,转移位移的意义
    补码
  • 原文地址:https://www.cnblogs.com/lnlin/p/6565451.html
Copyright © 2011-2022 走看看