学懂C语言(三十九):C语言编程实践---从实例精通C语言

目录

实例1:字符转 ASCII 码

 实例2:交换两个数的值

实例3:判断奇数/偶数

实例4:判断元音/辅音

实例5: 判断闰年

实例6:求两数的最大公约数

实例7:求两数最小公倍数

实例8: 阶乘

实例9:判断数字为几位数

实例10:判断回文数

实例11:判断素数

实例12 :判断两个数之间的素数

实例13:使用函数判断两数间的素数

实例14:求一个整数的所有因数

实例15:实现简单的计算器

实例16:计算一个数是否可为两个素数之和

实例17:字符串翻转

实例18:查找字符在字符串中出现的次数

实例19: 约瑟夫生者死者小游戏

实例20: 五人分鱼


实例1:字符转 ASCII 码

#include <stdio.h>
int main()
{
    char c;
    printf("输入一个字符: ");
 
    // 读取用户输入
    scanf("%c", &c);  
    
    // %d 显示整数
    // %c 显示对应字符
    printf("%c 的 ASCII 为 %d", c, c);
    return 0;
}

运行结果:

输入一个字符: a
a 的 ASCII 为 97

基础知识扩展

ASCII 定义了 128 个字符。

分类:

  • 一:0-31、127(删除键)是控制字符
  • 二:空白字符:空格(32)、 制表符、 垂直制表符、 换行、 回车。
  • 三:可显示字符:a-z、A-Z、0-9、~、!、@、、%、^、&、#、$、*、(、)、-、+、{、}、[、]、'、"、<、>、,、?、/、|、\、_、:、;、.,还有顿号、。

ASCII 表:

ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32空格(space)64@96`(反引号)
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39'71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92\124|
29GS61=93]125}
30RS62>94^126
31US63?95_127DEL

 实例2:交换两个数的值

方法一、使用临时变量

以下实例演示了交换两个浮点数的值。

#include <stdio.h>
 
int main()
{
      double firstNumber, secondNumber, temporaryVariable;
 
      printf("输入第一个数字: ");
      scanf("%lf", &firstNumber);
 
      printf("输入第二个数字: ");
      scanf("%lf",&secondNumber);
 
      // 将第一个数的值赋值给 temporaryVariable
      temporaryVariable = firstNumber;
 
      // 第二个数的值赋值给 firstNumber
      firstNumber = secondNumber;
 
      // 将 temporaryVariable 赋值给 secondNumber
      secondNumber = temporaryVariable;
 
      printf("\n交换后, firstNumber = %.2lf\n", firstNumber);
      printf("交换后, secondNumber = %.2lf", secondNumber);
 
      return 0;
}

运行结果:

输入第一个数字: 1
输入第二个数字: 2

交换后, firstNumber = 2.00
交换后, secondNumber = 1.00

方法一、不使用临时变量

不使用临时变量交换两个整数的值:

#include <stdio.h>
 
int main() {
   int a, b;
 
   a = 11;
   b = 99;
 
   printf("交换之前 - \n a = %d, b = %d \n\n", a, b);
 
   a = a + b;  // ( 11 + 99 = 110)  此时 a 的变量为两数之和,b 未改变
   b = a - b;  // ( 110 - 99 = 11)  
   a = a - b;  // ( 110 - 11 = 99)
 
   printf("交换后 - \n a = %d, b = %d \n", a, b);
}

运行结果:

交换之前 - 
 a = 11, b = 99 

交换后 - 
 a = 99, b = 11 

实例3:判断奇数/偶数

#include <stdio.h>
 
int main()
{
    int number;
 
    printf("请输入一个整数: ");
    scanf("%d", &number);
 
    // 判断这个数除以 2 的余数
    if(number % 2 == 0)
        printf("%d 是偶数。", number);
    else
        printf("%d 是奇数。", number);
 
    return 0;
}

运行结果:

请输入一个整数: 5
5 是奇数。

实例4:判断元音/辅音

判断输入的字母是元音,还是辅音。

英语有26个字母,元音只包括 a、e、i、o、u 这五个字母,其余的都为辅音。y是半元音、半辅音字母,但在英语中都把他当作辅音。

#include <stdio.h>
 
int main()
{
    char c;
    int isLowercaseVowel, isUppercaseVowel;
 
    printf("输入一个字母: ");
    scanf("%c",&c);
 
    // 小写字母元音
    isLowercaseVowel = (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
 
    // 大写字母元音
    isUppercaseVowel = (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U');
 
    // if 语句判断
    if (isLowercaseVowel || isUppercaseVowel)
        printf("%c  是元音", c);
    else
        printf("%c 是辅音", c);
    return 0;
}

运行结果:

输入一个字母: G
G 是辅音

实例5: 判断闰年

用户输入年份,判断该年份是否为闰年。

#include <stdio.h>
 
int main()
{
    int year;
 
    printf("输入年份: ");
    scanf("%d",&year);
 
    if(year%4 == 0)
    {
        if( year%100 == 0)
        {
            // 这里如果被 400 整数是闰年
            if ( year%400 == 0)
                printf("%d 是闰年", year);
            else
                printf("%d 不是闰年", year);
        }
        else
            printf("%d 是闰年", year );
    }
    else
        printf("%d 不是闰年", year);
    
    return 0;
}

运行结果:

输入年份: 1990
1990 不是闰

实例6:求两数的最大公约数

用户输入两个数,求这两个数的最大公约数。

#include <stdio.h>
 
int main()
{
    int n1, n2, i, gcd;
 
    printf("输入两个正整数,以空格分隔: ");
    scanf("%d %d", &n1, &n2);
 
    for(i=1; i <= n1 && i <= n2; ++i)
    {
        // 判断 i 是否为最大公约数
        if(n1%i==0 && n2%i==0)
            gcd = i;
    }
 
    printf("%d 和 %d 的最大公约数是 %d", n1, n2, gcd);
 
    return 0;
}

运行结果:

输入两个正整数,以空格分隔: 81 153
81 和 153 的最大公约数是 9

实例 - 使用 while 和 if

#include <stdio.h>
int main()
{
    int n1, n2;
    
    printf("输入两个数,以空格分隔: ");
    scanf("%d %d",&n1,&n2);
 
    while(n1!=n2)
    {
        if(n1 > n2)
            n1 -= n2;
        else
            n2 -= n1;
    }
    printf("GCD = %d",n1);
 
    return 0;
}

运行结果:

输入两个数,以空格分隔: 81 153
GCD = 9

实例7:求两数最小公倍数

用户输入两个数,求这两个数的最小公倍数。

实例 - 使用 while 和 if

#include <stdio.h>
 
int main()
{
    int n1, n2, minMultiple;
    printf("输入两个正整数: ");
    scanf("%d %d", &n1, &n2);
 
    // 判断两数较大的值,并赋值给 minMultiple
    minMultiple = (n1>n2) ? n1 : n2;
 
    // 条件为 true
    while(1)
    {
        if( minMultiple%n1==0 && minMultiple%n2==0 )
        {
            printf("%d 和 %d 的最小公倍数为 %d", n1, n2,minMultiple);
            break;
        }
        ++minMultiple;
    }
    return 0;
}

运行结果:

输入两个正整数: 72 120
72 和 120 的最小公倍数为 360

实例8: 阶乘

一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且 0 的阶乘为 1。自然数 n 的阶乘写作 n!。

n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,1!=1,n!=(n-1)!×n。

实例

#include <stdio.h>
 
int main()
{
    int n, i;
    unsigned long long factorial = 1;
 
    printf("输入一个整数: ");
    scanf("%d",&n);
 
    // 如果输入是负数,显示错误
    if (n < 0)
        printf("Error! 负数没有阶乘jiechen");
 
    else
    {
        for(i=1; i<=n; ++i)
        {
            factorial *= i;              // factorial = factorial*i;
        }
        printf("%d! = %llu", n, factorial);
    }
 
    return 0;
}

实例 - 使用递归

#include <stdio.h>
long int multiplyNumbers(int n);
 
int main()
{
    int n;
    printf("输入一个整数: ");
    scanf("%d", &n);
    printf("%d! = %ld", n, multiplyNumbers(n));
    return 0;
}
long int multiplyNumbers(int n)
{
    if (n > 1)
        return n*multiplyNumbers(n-1);
    else
        return 1;
}

实例9:判断数字为几位数

用户输入数字,判断该数字是几位数。

#include <stdio.h>
int main()
{
    long long n;
    int count = 0;
 
    printf("输入一个整数: ");
    scanf("%lld", &n);
 
    while(n != 0)
    {
        // n = n/10
        n /= 10;
        ++count;
    }
 
    printf("数字是 %d 位数。", count);
}

实例10:判断回文数

判断一个数是否为回文数。

设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数

#include <stdio.h>
 
int main()
{
    int n, reversedInteger = 0, remainder, originalInteger;
 
    printf("输入一个整数: ");
    scanf("%d", &n);
 
    originalInteger = n;
 
    // 翻转
    while( n!=0 )
    {
        remainder = n%10;
        reversedInteger = reversedInteger*10 + remainder;
        n /= 10;
    }
 
    // 判断
    if (originalInteger == reversedInteger)
        printf("%d 是回文数。", originalInteger);
    else
        printf("%d 不是回文数。", originalInteger);
    
    return 0;
}

实例11:判断素数

质数(prime number)又称素数,有无限个。质数定义为在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数,这样的数称为质数。

#include <stdio.h>
 
int main()
{
    int n, i, flag = 0;
 
    printf("输入一个正整数: ");
    scanf("%d",&n);
 
    for(i=2; i<=n/2; ++i)  {
        // 符合该条件不是素数
        if(n%i==0)  {
            flag=1;
            break;
        }
    }
    if(n <=1 ) {
        flag=1; // 1 和 0 不是素数
    }
    if (flag==0)
        printf("%d 是素数",n);
    else
        printf("%d 不是素数",n);
    
    return 0;
}

运行结果:

输入一个正整数: 29
29 是素数

实例12 :判断两个数之间的素数

#include <stdio.h>
 
int main()
{
    int low, high, i, flag;
    printf("输入两个整数: ");
    scanf("%d %d", &low, &high);
 
    printf("%d 与 %d 之间的素数为: ", low, high);
 
    while (low < high)
    {
        flag = 0;
 
        for(i = 2; i <= low/2; ++i)
        {
            if(low % i == 0)
            {
                flag = 1;
                break;
            }
        }
 
        if (flag == 0)
            printf("%d ", low);
 
        ++low;
    }
 
    return 0;
}

运行结果:

输入两个整数: 100  200
100 与 200 之间的素数为: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199

实例13:使用函数判断两数间的素数

#include <stdio.h>
 
int checkPrimeNumber(int n);
int main()
{
    int n1, n2, i, flag;
 
    printf("输入两个正整数: ");
    scanf("%d %d", &n1, &n2);
    printf("%d 和 %d 间的素数为: ", n1, n2);
 
    for(i=n1+1; i<n2; ++i)
    {
        // 判断是否为素数
        flag = checkPrimeNumber(i);
 
        if(flag == 1)
            printf("%d ",i);
    }
    return 0;
}
 
// 函数定义
int checkPrimeNumber(int n)
{
    int j, flag = 1;
 
    for(j=2; j <= n/2; ++j)
    {
        if (n%j == 0)
        {
            flag =0;
            break;
        }
    }
    return flag;
}

输出结果为:

输入两个正整数: 10 30
10 和 30 间的素数为: 11 13 17 19 23 29

实例14:求一个整数的所有因数

假如a*b=c(a、b、c都是整数),那么我们称a和b就是c的因数。

#include <stdio.h>
 
int main()
{
    int number, i;
 
    printf("输入一个整数: ");
    scanf("%d",&number);
 
    printf("%d 的因数有: ", number);
    for(i=1; i <= number; ++i)
    {
        if (number%i == 0)
        {
            printf("%d ",i);
        }
    }
 
    return 0;
}

运行结果:

输入一个整数: 60
60 的因数有: 1 2 3 4 5 6 10 12 15 20 30 60

实例15:实现简单的计算器

# include <stdio.h>
 
int main() {
 
    char operator;
    double firstNumber,secondNumber;
 
    printf("输入操作符 (+, -, *, /): ");
    scanf("%c", &operator);
 
    printf("输入两个数字: ");
    scanf("%lf %lf",&firstNumber, &secondNumber);
 
    switch(operator)
    {
        case '+':
            printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber + secondNumber);
            break;
 
        case '-':
            printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber - secondNumber);
            break;
 
        case '*':
            printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber * secondNumber);
            break;
 
        case '/':
            printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber / secondNumber);
            break;
 
        // operator doesn't match any case constant (+, -, *, /)
        default:
            printf("Error! operator is not correct");
    }
    
    return 0;
}

输出结果为:

输入操作符 (+, -, *, /): *
输入两个数字: 4 5
4.0 * 5.0 = 20.0

 

实例16:计算一个数是否可为两个素数之和

#include <stdio.h>
 
int checkPrime(int n);
int main()
{
    int n, i, flag = 0;
 
    printf("输入正整数: ");
    scanf("%d", &n);
 
    for(i = 2; i <= n/2; ++i)
    {
        // 检测判断
        if (checkPrime(i) == 1)
        {
            if (checkPrime(n-i) == 1)
            {
                printf("%d = %d + %d\n", n, i, n - i);
                flag = 1;
            }
 
        }
    }
 
    if (flag == 0)
        printf("%d 不能分解为两个素数。", n);
 
    return 0;
}
 
// 判断素数
int checkPrime(int n)
{
    int i, isPrime = 1;
 
    for(i = 2; i <= n/2; ++i)
    {
        if(n % i == 0)
        {
            isPrime = 0;
            break;
        }  
    }
 
    return isPrime;
}

输出结果为:

输入正整数: 34
34 = 3 + 31
34 = 5 + 29
34 = 11 + 23
34 = 17 + 17

实例17:字符串翻转

使用递归来翻转字符串。

#include <stdio.h>
void reverseSentence();
 
int main()
{
    printf("输入一个字符串: ");
    reverseSentence();
 
    return 0;
}
 
void reverseSentence()
{
    char c;
    scanf("%c", &c);
 
    if( c != '\n')
    {
        reverseSentence();
        printf("%c",c);
    }
}

输出结果为:

输入一个字符串: abcdefg
gfedcba

实例18:查找字符在字符串中出现的次数

查找字符在字符串中的起始位置(索引值从 0 开始)。

#include <stdio.h>
 
int main()
{
   char str[1000], ch;
   int i, frequency = 0;
 
   printf("输入字符串: ");
   fgets(str, (sizeof str / sizeof str[0]), stdin);
 
   printf("输入要查找的字符: ");
   scanf("%c",&ch);
 
   for(i = 0; str[i] != '\0'; ++i)
   {
       if(ch == str[i])
           ++frequency;
   }
 
   printf("字符 %c 在字符串中出现的次数为 %d", ch, frequency);
 
   return 0;
}

实例19: 约瑟夫生者死者小游戏

30 个人在一条船上,超载,需要 15 人下船。

于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。

如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

#include<stdio.h>
 
int c = 0;
int i = 1;
int j = 0;
int a[30] = { 0 };
int b[30] = { 0 };
 
int main() {
    while (i<=31) {
        if (i == 31) {
            i = 1;
        } else if (c == 15) {
            break;
        } else {
            if (b[i] != 0) {
                i++;
                continue;
            } else {
                j++;
                if (j != 9) {
                    i++;
                    continue;
                } else {
                    b[i] = 1;
                    a[i] = j;
                    j = 0;
                    printf("第%d号下船了\n", i);
                    i++;
                    c++;
                }
            }
        }
    }
}

执行以上实例,输出结果为:

第9号下船了
第18号下船了
第27号下船了
第6号下船了
第16号下船了
第26号下船了
第7号下船了
第19号下船了
第30号下船了
第12号下船了
第24号下船了
第8号下船了
第22号下船了
第5号下船了
第23号下船了

实例20: 五人分鱼

A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。

日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。

B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 。

C、D、E依次醒来,也按同样的方法拿鱼。

问他们台伙至少捕了多少条鱼?以及每个人醒来时见到了多少鱼?

#include <stdio.h>
int main(){
    int n,x,j,k,l,m;
    for(n=5;;n++){
        j=4*(n-1)/5;
        k=4*(j-1)/5;
        l=4*(k-1)/5;
        m=4*(l-1)/5;
        if(n%5==1&&j%5==1&&k%5==1&&l%5==1&&m%5==1){
            printf("至少合伙捕鱼:%d条\n",n);
            printf("分别见到鱼的条数:%d %d %d %d\n",j,k,l,m);
            break;
        }
    }
    return 0;
}

以上实例输出结果为:

至少合伙捕鱼:3121条
分别见到鱼的条数:2496 1996 1596 1276

实例21: 报数游戏

n个人围成一圈,进行顺序排号, 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的使原来第几号的那位。(要求用指针)

#include <stdio.h> // 头文件

int main() { // 主函数
    int i, k, n, m; // 定义整型变量
    int num[50]; // 定义整型数组
    int *p; // 定义指针变量
    printf("输入n="); // 提示语句
    scanf("%d", &n); // 键盘输入

    // 判断输入的有效性
    if (n <= 0 || n > 50) {
        printf("请输入一个有效的数字(1-50)。\n");
        return 1; // 返回错误代码
    }

    p = num; // 指针指向数组
    for (i = 0; i < n; i++) {
        *(p + i) = i + 1; // 以1至n为序给每个人编号
    }

    i = 0; // i为每次循环时计数变量
    k = 0; // k为按1,2,3报数时的计数变量
    m = 0; // m为退出人数

    while (m < n - 1) { // 当退出人数比n-1少时执行循环体
        if (*(p + i) != 0) { // 如果当前位置不为0
            k++; // 报数
        }
        if (k == 3) { // 如果报到3
            *(p + i) = 0; // 对退出的人的编号置为0
            k = 0; // 重置报数
            m++; // 退出人数加1
        }
        i++; // 移动到下一个人
        if (i == n) { // 报数到尾后,i恢复为0
            i = 0;
        }
    }

    // 找到最后一个留下的人的编号
    for (i = 0; i < n; i++) {
        if (*(p + i) != 0) {
            printf("最后一个留下的人是: %d\n", *(p + i)); // 输出结果
            break; // 找到后退出循环
        }
    }

    return 0; // 主函数返回值为0
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿享天开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值