C语言的一些简单练习题(下)

简介: C语言的一些简单练习题(下)

3.打印乘法口诀表

首先我们先来打印最简单的九九乘法表

#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\t", i, j, i * j);
    }
    printf("\n");
  }

就是一个很简单的for循环嵌套就完毕了。

那么我们来尝试一下输入一个数字任意打印这个乘法口诀表,并且让他稍作停留后进行清屏

#include<stdio.h>
#include <windows.h>//Sleep函数引入的头文件
#include <stdlib.h>
//system函数是标准库stdlib.h中的一个函数,用于执行操作系统命令。因此,要使用system函数,只需在代码中包含stdlib.h头文件即可。但是,system("cls")命令是Windows系统特定的清屏命令,所以在非Windows系统上,该命令可能不起作用。请注意,在使用system函数时要小心,因为它会调用操作系统的命令,可能会有一些安全风险。
void print(int n)
{
  int i = 0;
  int j = 0;
  // 使用两层循环打印乘法口诀表
  for (i = 1; i <= n; i++)
  {
    for (j = 1; j <= i; j++)
    {
    // 打印乘法表达式(i*j),并保持对齐
      printf("%d*%d=%2d\t", i, j, i * j);
    }
    printf("\n");// 换行
  }
}
int main()
{
  int n = 0;
  do
  {
      // 提示用户输入一个数字
    printf("输入一个数字打印乘法口诀表(输入0程序结束):");
    scanf("%d", &n);
    // 调用print()函数打印乘法表
    print(n);
    if (n != 0)
    {
      Sleep(3000);// 程序暂停3秒
      system("cls");// 清屏命令,用于清除上一次打印的乘法表
    }
    else
    {
      printf("程序结束");
    }
  } while (n);// 当n不等于0时,循环继续,n=0时,条件为假,退出循环,程序结束
  return 0;
}

那么我们在改进的代码中实现了输入一个数字自定义打印乘法口诀表,并且该乘法口诀表停留了3s就进行清屏,继续进行操作。

在这里不想自动清屏的小伙伴可以尝试在do while循环中在嵌套一个循环、分支来就行选择性清屏,感兴趣的小伙伴可以尝试尝试噢。

4.查找

问题描述:在一段序列中查找到输入的数字,打印其下标

#include<stdio.h>
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int k = 0;
  printf("输入你想查找的数值");
  scanf("%d", &k);//7
  //遍历
  int i = 0;
  int flag = 0;
  for (i = 0; i < 10; i++)
  {
    if (arr[i] == k)
    {
      printf("找到了,下标是:%d\n", i);
      flag = 1;
      break;
    }
  }
  if (flag == 0)
    printf("找不到\n");
  return 0;
}

我们使用一个for循环去直接把序列中遍历一遍,找到了就把它打印出来,就很简单的解决了这个问题

但是如果是很长的一段有序序列中呢,这样的写法就有些没那么好用,在这里我们使用二分查找

#include <stdio.h>
// 查找给定的数值 x 在数组 arr 中的下标
void find(int x, int arr[], int length)
{
    int left = 0;        // 左边界索引
    int right = length - 1;  // 右边界索引
    int flag = 0;        // 标记是否找到
    while (left <= right)
    {
        int mid = (right - left) / 2 + left;  // 中间索引
        if (x > arr[mid])  // 如果 x 大于中间值,向右边查找
        {
            left = mid + 1;
        }
        else if (x < arr[mid])  // 如果 x 小于中间值,向左边查找
        {
            right = mid - 1;
        }
        else  // 找到了 x
        {
            printf("找到了,%d的下标是%d\n", x, mid);
            flag = 1;
            break;
        }
    }
    // 如果没有找到 x
    if (x != 0 && flag == 0)
    {
        printf("找不到该下标\n");
    }
    // 如果输入的是 0,表示退出程序
    if (x == 0 && flag == 0)
    {
        printf("退出程序");
    }
}
int main()
{
    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  // 给定的数组
    int k = 0;  // 输入的数值
    int length = sizeof(arr) / sizeof(arr[0]);  // 数组的长度
    do
    {
        scanf("%d", &k);  // 读取输入的数值
        find(k, arr, length);  // 调用 find 函数进行查找
    } while (k);  // 如果输入为 0,退出程序
    return 0;
}

这样的道理就类似于路人甲买了一双鞋是500块以内,让路人乙来猜,路人甲给提示高了还是低了,路人乙猜250块,甲回答低了,那么范围就从0到500变成了250到500,以此类推,这样效率会比从1猜到500高得多。

这样的代码我们可以实现多组输入来查找数值,将寻找的过程封装到find函数中不断去调用就可以了。

5.猜数字游戏

通过上面的二分查找,我们可以来实现一个简单的猜数字游戏

接下来,我们来实现代码

#include <stdio.h>
#include <stdlib.h> // 包含rand()和srand()函数所需的头文件
#include <time.h> // 包含time()函数所需的头文件
void game()
{
    srand((unsigned int)time(NULL)); // 设置随机数种子,确保每次运行生成不同的随机数序列
    int ret = rand() % 500 + 1; // 生成0到500之间的随机数
    int guess = 0;
    printf("输入你猜想的数字: ");
    while (1)
    {
        scanf("%d", &guess);
        if (guess > ret)
        {
            printf("猜大了\n");
        }
        else if (guess < ret)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("猜对了,该数字是%d\n", guess);
            break;
        }
    }
    printf("继续玩扣1,不想玩了扣0\n");
}
void menu()
{
    printf("\t********猜数字********\t\t\n");
    printf("\t**********************\t\t\n");
    printf("\t********1.Play********\t\t\n");
    printf("\t********0.Exit********\t\t\n");
    printf("\t**********************\t\t\n");
}
int main()
{
    int input = 0;
    menu();
    srand((unsigned int)time(NULL)); // 设置随机数种子
    do
    {
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("The game is out\n");
            break;
        default:
            printf("Resume load\n");
        }
    } while (input);
    return 0;
}

这样我们就实现了一个猜0到500数字的非常简单的小游戏。感兴趣的小伙伴们可以根据自己的需求进行改进尝试噢。

6.模拟用户登录

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

//设置密码为"123456"

接下来,我们来实现代码

#include<stdio.h>
#include<string.h>
int main()
{
    int i = 0;  // 用于记录密码尝试的次数的计数器
    char password[20] = { 0 };  // 存储输入的密码的字符数组
    while (i < 3)  // 最多尝试三次密码
    {
        printf("输入密码->:\n");  // 提示用户输入密码
        scanf("%s", password);  // 从用户输入中读取密码并存储在 password 数组中
        if (strcmp(password, "123456") == 0)  // 将用户输入的密码与预设密码进行比较
        {
            printf("登陆成功\n");  // 如果密码正确,输出登录成功的消息
            break;  // 跳出循环,结束登录验证
        }
        else
        {
            printf("密码错误\n");  // 如果密码错误,输出密码错误的消息
        }
        i++;  // 增加密码尝试的次数计数器
    }
    if (i == 3)  // 如果已经尝试了三次密码
    {
        printf("三次密码均输入错误,退出登录\n");  // 输出密码尝试次数超过限制的消息
    }

首先我们需要来设置一个字符串型的数组用来接收密码,然后输入密码,进行判断是否正确,循环3次,均失败后退出登录。

在这里我们用到了strcmp()函数,给大家 稍微介绍一下这个函数

strcmp() 函数用于比较两个字符串。它是 C 标准库中的一个字符串函数,位于 <string.h> 头文件中。

函数原型如下所示:

int strcmp(const char *str1, const char *str2);

该函数接受两个字符串作为参数 str1 和 str2,并返回一个整数值。

strcmp() 函数的返回值有以下三种可能的情况:

如果 str1 和 str2 字符串相等,则返回值为 0。
如果 str1 字符串小于 str2 字符串,则返回值为负数。
如果 str1 字符串大于 str2 字符串,则返回值为正数。

7.编写代码,演示多个字符从两端移动,向中间汇聚

我们就以:”Long live the People’s Republic of China!“字符来实现这个程序

#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
  char arr1[] = "Long live the People’s Republic of China!";
  char arr2[] = "                                          ";
  int left = 0;
  int right = strlen(arr1) - 1;  // 修正:使用 arr1 的长度来初始化 right
  while (left <= right)
  {
    arr2[left] = arr1[left];
    arr2[right] = arr1[right];
    printf("%s\n", arr2);
    Sleep(500);
    system("cls");
    left++;
    right--;
  }
  printf("%s", arr2);
  return 0;
}

首先,我们需要设置两个字符型数字,一个用来存放Long live the People’s Republic of China!,另一个存放空格用来显示推进过程,小伙伴们也可以用其他符号来代替,然后我们设置一个循环,把第一个数组的最左侧字符赋予给第二个数组的最右侧,最右侧数组同样赋予给第二个数组的最右侧,之后打印出来第二个数组,后停留半秒,进行承平操作,同时把最左测设置为自增,最右侧设置为自减,就实现了这样的循环,最后把整个字符串打印出来就完成了代码要求。

以上就是个人拙见,有不同看法欢迎小伙伴们留言

目录
相关文章
|
4天前
|
C语言
C语言练习题
C语言练习题
16 0
|
4天前
|
C语言
c语言编程练习题:7-50 输出华氏-摄氏温度转换表
c语言编程练习题:7-50 输出华氏-摄氏温度转换表
39 0
|
4天前
|
C语言
c语言编程练习题:7-49 Have Fun with Numbers
c语言编程练习题:7-49 Have Fun with Numbers
33 0
|
4天前
|
C语言
c语言编程练习题:7-46 爬动的蠕虫
c语言编程练习题:7-46 爬动的蠕虫
32 0
|
4天前
|
C语言
c语言编程练习题:7-45 找完数
c语言编程练习题:7-45 找完数
34 0
|
4天前
|
C语言 CDN
c语言编程练习题:7-44 黑洞数
c语言编程练习题:7-44 黑洞数
23 0
|
4天前
|
移动开发 C语言
c语言编程练习题:7-43 Shuffling Machine
c语言编程练习题:7-43 Shuffling Machine
33 0
|
4天前
|
C语言
c语言编程练习题:7-60 Welcome to You!
c语言编程练习题:7-60 Welcome to You!
42 0
|
4天前
|
C语言
c语言编程练习题:7-52 求简单交错序列前N项和
c语言编程练习题:7-52 求简单交错序列前N项和
32 0
|
4天前
|
C语言
c语言编程练习题:7-51 求奇数分之一序列前N项和
c语言编程练习题:7-51 求奇数分之一序列前N项和
32 0