初阶C语言--训练题(1)

下面是一些与初阶C语言难度相符的训练题,每一个题都有多种代码实现方式,我们尽量选择最简便的方法来实现

一、

💓打印9*9乘法口诀表

思路:
9*9乘法口诀表一共有9行9列,也就是第一行打印1的乘法,第二行打印2的乘法,第三行打印3的乘法以此类推,就可以得到9*9的乘法口诀表
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
.....
所以呢,我们要设置两个循环变量,先控制打印多少行,再控制打印多少列

代码解析:

#include <stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    for (i = 1; i <= 9; i++)   //设置打印多少行
    {
        for (j = 1; j <= i; j++) //根据行来控制打印多少列
        {
            printf("%d*%d=%-2d ", i, j, i * j);  //采用左对齐使其看起来更加美观
        }
        printf("\n");      //每打印完一行都要换行
    }
    return 0;
}
%2d--右对齐
%-2d--左对齐
%d与%-2d区别:
使用%-2d之后会使乘法口诀表变得更加美观

二、

💓求10个整数中最大的整数

思路:
求最大值的题在之前的训练题里面也有,但是是求两个数的最大值,如果求两个数的最大值使用if else语句、条件操作符都可以解决,但是如果求多个数就得换一种思路:
假设有一个整型数组,里面有10个元素,我们可以采用下标的方式访问这些元素,然后设置一个变量max来存放最大值,假设下标为0的元素就是最大值,并将其存放进max中,然后用数组中其他元素与这个max中的元素进行比较,如果比max中这个元素大,就将其替换,如果没有它大,就让下一个元素比较,直到将数组中的全部元素比较完

代码解析:

#include <stdio.h>
int main()
{
    int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    int i = 0;
    //假设下标为0的元素就是最大值
    int max = arr[0];
    for (i = 1; i < 10; i++)
    {
        if (arr[i] > max) //如果比max大则会替换
        {
            max = arr[i];
        }
    }
    printf("max=%d", max);
    return 0;
}

三、

💓计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果

我们可以先来观察一下题目,我们可以先实现1+2+3+4+5+6+7+8+9+....+100,然后对其进行调整修改
//1~100之和
#include <stdio.h>
int main()
{
    int i = 0;
    int sum = 0;
    for (i = 1; i <= 100; i++)
    {
        sum += i;
    }
    printf("sum=%d\n", sum);
    return 0;
}
写出1~100之和之后再将其转化为1/1+1/2+1/3+...+1/100:
#include <stdio.h>
int main()
{
    int i = 0;
    double sum = 0;
    int m = 1;
    for (i = 1; i <= 100; i++)
    {
        sum += 1.0/i;         //在求和时转化,由于求出来的是小数所以要使用double类型的sum
    }
    printf("sum=%lf\n", sum);
    return 0;
}
经过一步一步的转化,可以发现,这个表达式第一项是正数,第二项是负数,第三项又是正数,第四项又是负数......所以我们可以创建一个变量,用来改变正负
#include <stdio.h>
int main()
{
    int i = 0;
    double sum = 0;
    int m = 1;       //创建一个改变正负的变量m
    for (i = 1; i <= 100; i++)
    {
        sum += 1.0 / i * m;
        m = -m;      //每一次乘完之后将m改变为-m
    }
    printf("sum=%lf\n", sum);
    return 0;
}

四、

💓编写程序数一下 1到 100 的所有整数中出现多少个数字9

个位出现9:9 19 29 39 49 59 69 79 89 99
十位出现9:90 91 92 93 94 96 97 98 99
要计算1~100的整数中出现了几次9,那就要考虑个位和十位,如果出现了九就计算一次,如果没有出现9就让下一个数再检验,当两位数除以10的商就是十位的数字,取模得到的余数就是个位的数字

代码演示:

#include <stdio.h>
int main()
{
    int count = 0;
    int i = 0;
    int num = 1;
    for (i = 0; i < 100; i++)
    {
        if (num / 10 == 9)     //表示十位是否为9
        {
            count++;
        }
        if (num % 10 == 9)     //表示个位是否为9
        {
            count++;
        }
        num++;
    }
    printf("%d", count);
    return 0;
}
注:这里不能使用if(num/10==9){}else if(num%10==9){}
求个位和十位上的9分别是独立的

五、

💓实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

💓如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表

要求通过输入n打印n的乘法口诀表,既然我们已经可以打印9*9的乘法口诀表那就可以在9*9的乘法口诀表代码上入手,将设置的9行9列来通过我们自行输入来控制打印几行几列

代码演示:

//要求设计函数来实现
#include <stdio.h>
void Print(int n)
{
    int i = 0;
    int j = 0;
    for (i = 1; i <= n; i++)    //控制打印几行几列通过我们输入的n来控制
    {
        for (j = 1; j <= i; j++)
        {
            printf("%d*%d=%-2d ", i, j, i * j);
        }
        printf("\n");
    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    Print(n);
    return 0;
}

六、

💓实现一个函数来交换两个整数的内容

交换两个整数的内容,有许多老铁很快会反应出来将a的值赋给b,将b的值赋给a,这样想也对,取决与怎样使用代码来实现,在代码中如果我们非常简单的写出这样的代码:
int main()
{
int a = 20;
int b = 10;
a = b;
b = a;
return 0;
}
那这可就错了,这样是不会交换的,为什么呢?举一个生活中的例子:
有一瓶酱油和一瓶醋,我们需要将酱油装进装醋的瓶子、将醋装进装酱油的瓶子来进行交换,如果按照上面代码这样来交换,意思就是直接将酱油倒进醋瓶子,又将醋瓶子里的倒进酱油瓶子,这样子倒会将两个液体混合无法达到交换瓶子的目的,我们应该先找一个空瓶子,然后将其中醋先倒进空瓶子里,再将酱油倒进醋瓶子,再将醋倒进酱油瓶子就可以达到交换的目的,所以呢,我们需要先创建一个变量用来协助交换, 假设先不使用函数来进行交换:

代码演示:

//普通实现
#include <stdio.h>
int main()
{
    int a = 20;
    int b = 10;
    printf("交换前:a=%d b=%d\n", a, b);
    int tmp = 0;
    tmp = a;   //将a装进空瓶子,这时的a里面就没有东西
    a = b;      //然后将b装进a,这时a里面就存放的b的值
    b = tmp;    //这时b又空了,将tmp里面的a又装进b里面
    printf("交换后:a=%d b=%d\n", a, b);
    return 0;
}
需要借助另外的一个变量来进行交换两个数,如果使用函数来交换两个数会是怎样的效果
我们将交换的过程放进函数中

代码演示:

//函数实现
#include <stdio.h>
void Print(int a, int b)
{
    int tmp = 0;
    tmp = a;
    a = b;
    b = tmp;
}
int main()
{
    int a = 20;
    int b = 10;
    printf("交换前:a=%d b=%d\n", a, b);
    Print(a, b);
    printf("交换后:a=%d b=%d\n", a, b);
    return 0;
}
可以看到,在使用函数来进行交换过程之后居然不能实现交换,这里就要涉及到函数在传值时的细节
函数在传参时要使用传址调用,传址调用时形参是实参地址的一份拷贝,形参指向的实体是实参,对形参解引用后,拿到的内容就是实参,因此对形参解引用之后的内容进行修改,改变的就是实参,所以我们需要传地址

代码演示:

#include <stdio.h>
void Print(int* a, int* b) //接收地址使用指针
{
    int tmp = 0;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
int main()
{
    int a = 20;
    int b = 10;
    printf("交换前:a=%d b=%d\n", a, b);
    Print(&a, &b);    //将地址传给函数
    printf("交换后:a=%d b=%d\n", a, b);
    return 0;
}

七、

💓函数实现判断一个年份是否为闰年

闰年判断的条件是:
1.十年一闰百年不闰:即如果year能够被4整除,但是不能被100整除,则year是闰年
2.每四百年再一闰:如果year能够被400整除,则year是闰年
要求使用函数来实现,就需要使用if语句来判断是否为闰年

代码演示:

#include <stdio.h>
//设置一个函数
//若year为闰年则返回1
//不为闰年则返回0
int LeapYear(int year)
{
    if (((0 == year % 4) && (0 != year % 100)) || (0 == year % 400))  //判断条件
    {
        return 1;      //是闰年返回1
    }
    else
    {
        return 0;     //不是则返回0
    }
}
int main()
{
    int year = 0;
    scanf("%d", &year);
    int flag = LeapYear(year);
    if (flag == 1)         //如果返回值是1则为闰年
    {
        printf("%d是闰年\n", year);
    }
    else             //返回值不是1,则不为闰年
    {
        printf("%d不是闰年\n", year);
    }
    return 0;
}

八、

💓计算n的阶乘

1! 1
2! 1*2
3! 1*2*3
4! 1*2*3*4
可以设置一个循环,每一次循环加1,然后每一次的循环变量都相乘,循环n次就可以达到阶乘的目的

代码演示:

//计算n的阶乘
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    //这里不能初始化为0
    //ret = ret*i
    int ret = 1;
    int i = 0;
    for (i = 1; i <= n; i++)
    {
        ret *= i;
    }
    printf("%d的阶乘是:%d\n", n, ret);
    return 0;
}

九、

💓函数实现 1!+2!+3!+……+n!

上面一个题求出了单个数的阶乘,多个数的阶乘累加求和就需要在此基础上加上求和代码,另外需要使用函数来完成
int factorial_sum(int n)
{
    int ret = 1;
    int i = 0;
    int sum = 0;
    for (i = 1; i <= n; i++)
    {
        //求阶乘
        ret *= i;
        //求和
        sum += ret;
    }
    return sum;
}
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int sum = factorial_sum(n);
    printf("%d", sum);
    return 0;
}

十、

💓模拟用户登录输入密码情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序

要实现上述情景,首先得有输入三次密码的机会,因此可以设置一个循环3次的循环,然后每一次循环内部要判断密码是否相等,要判断字符串相不相等就得使用strcmp函数,如果三次均输入错误就终止循环
#include <stdio.h>
#include <string.h>
//假设正确密码是123456
int main()
{
    char password[20] = { 0 };  //存放密码
    int flag = 0;
    int i = 0;
    int count = 3;
    for (i = 0; i < 3; i++)
    {
        printf("请输入密码:");
        scanf("%s", password);
        if (strcmp(password, "123456") == 0)  //判断输入的密码与正确密码是否相等
        {
            flag = 1;          //如果正确则跳出循环
            printf("密码正确!\n");
            break;
        }
        else
        {
            printf("密码错误!请重新输入:\n");
            count--;
            printf("警告:您还剩%d次机会,请注意!\n", count);
        }
    }
    if (flag == 0)  //如果循环结束flag还没有被改为1,那就证明三次机会均用完
    {
        printf("三次密码均错误,退出程序!\n");
    }
    return 0;
}

本期分享就到此结束,后续还会给大家分享一些习题,感谢大家学习!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stackY、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值