【C语言刷题】第十天:加量加餐继续,代码题训练,融会贯通IO模式

发布于:2025-07-05 ⋅ 阅读:(17) ⋅ 点赞:(0)


🔥个人主页:艾莉丝努力练剑

❄专栏传送门:《C语言》《数据结构与算法》C语言刷题12天IO强训LeetCode代码强化刷题

🍉学习方向:C/C++方向

⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平



前言:上一篇博客又带大家刷了一些相对来说简单的代码题目,本篇文章我们将继续练习下面的题目。这些题目的难度已经有的挖了大坑,大家做的时候要留意,如果做不出来,看了代码演示后要自己多敲几遍,去理解代码的逻辑。

宇宙安全声明:鉴于博主能力有限,本专栏适用于代码小白刷题,大佬们多多包涵(抱拳)!


目录

正文

一、班级成绩输入输出

二、矩阵元素定位

三、序列重组矩阵

四、最高身高

五、矩阵相等判定

六、上三角矩阵判定

七、矩阵转置

八、矩阵交换

九、杨辉三角

十、井字棋

结尾


正文

一、班级成绩输入输出

BC101 班级成绩输入输出

这道题没什么好讲的,我们写一个嵌套循环,先输入各科成绩,再加起来,输出各科成绩和总分即可。注意打印各科成绩的时候有一个空格。

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>

int main()
{
    int i = 0;
    for (i = 0; i < 5; i++)
    {
        double sum = 0.0;
        int j = 0;
        double score = 0.0;
        for (j = 0; j < 5; j++)
        {
            scanf("%lf", &score);
            sum += score;
            printf("%.1lf ", score);
        }
        printf("%.1lf\n", sum);
    }
    return 0;
}

也可以这样写——

#include <stdio.h>

int main()
{
    int i = 0;
    double score[5] = { 0 };
    for (i = 0; i < 5; i++)
    {
        int j = 0;
        double sum = 0.0;
        for (j = 0; j < 5; j++)
        {
            scanf("%lf", &score[j]);
            sum += score[j];
        }
        for (j = 0; j < 5; j++)
        {
            printf("%.1lf ", score[j]);
        }
        printf("%.1lf\n", sum);
    }
    return 0;
}

二、矩阵元素定位

BC102 矩阵元素定位

我们直接看代码——

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>

int main()
{
    int m = 0;
    int n = 0;
    int x = 0;
    int y = 0;
    scanf("%d %d", &n, &m);
    //这是c99语法-变长数组,但是数组不能初始化
    int arr[n][m];
    //具体给值也行
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d ", &arr[i][j]);
        }
    }
    scanf("%d %d", &x, &y);
    printf("%d\n", arr[x - 1][y - 1]);
    return 0;
}

当然,如果我们直接把这组代码放到VS2022上调试,会报这样的错误—— 

大家想想,怎么改就可以了,可以把你想到的答案在评论区展示一下。 

uu们一定要读题读仔细,n和m是有范围的,我们改一下——

#include <stdio.h>

int main()
{
    int m = 0;
    int n = 0;
    int arr[5][5] = { 0 };
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d ", &arr[i][j]);
        }
    }
    int x = 0;
    int y = 0;
    scanf("%d %d", &x, &y);
    printf("%d\n", arr[x - 1][y - 1]);
    return 0;
}

三、序列重组矩阵

BC103 序列重组矩阵

看完题目,我们直接尝试写出代码——

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d%d", &n, &m);
    int i = 0;
    int tmp = 0;
    for (i = 1; i <= m * n; i++)
    {
        scanf("%d", &tmp);
        printf("%d ", tmp);
        if (i % m == 0)
            printf("\n");
    }
    return 0;
}

 空格可以在取地址那儿,也可以直接放在两个%d之间——

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int i = 0;
    int tmp = 0;
    for (i = 1; i <= m * n; i++)
    {
        scanf("%d", &tmp);
        printf("%d ", tmp);
        if (i % m == 0)
            printf("\n");
    }
    return 0;
}

当然,我们还有另外一种写法,数组的写法——

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    int arr[10][10] = { 0 };
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr[i][j]);
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

四、最高身高

BC104 最高身高

思路:先输入n和m,再创建x和y并赋初值,写一个for循环嵌套,输入身高,再比较大小,比出最高的身高就会跳出循环, 输出打印最高身高——

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    int max = 0;
    int x = 0;
    int y = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            int height = 0;
            scanf("%d ", &height);
            if (height > max)
            {
                x = i;
                y = j;
                max = height;
            }
        }
    }
    printf("%d %d", x + 1, y + 1);
    return 0;
}

写里面也可以——

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int max = 0;
    int x = 0;
    int y = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            int height = 0;
            scanf("%d ", &height);
            if (height > max)
            {
                x = i;
                y = j;
                max = height;
            }
        }
    }
    printf("%d %d", x + 1, y + 1);
    return 0;
}

可以都在前面创建好变量——

#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int height = 0;
    int max = 0;
    int j = 0;
    int i = 0;
    int x = 0;
    int y = 0;
    for (; i < n; i++)
    {
        for (; j < m; j++)
        {
            scanf("%d ", &height);
            if (height > max)
            {
                x = i;
                y = j;
                max = height;
            }
        }
    }
    printf("%d %d", x + 1, y + 1);
    return 0;
}

五、矩阵相等判定

BC105 矩阵相等判定

(一)直接写 

 我们试着把代码写出来——

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d%d", &n, &m);
	int a1[n][m];
	int a2[n][m];
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a1[i][j]);
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a2[i][j]);
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			if (a1[i][j] != a2[i][j])
				break;
		}
	}
	if (i == n && j == m)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

题目有范围要求:1 < m,n < 10——

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d%d", &n, &m);
	int a1[10][10];
	int a2[10][10];
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a1[i][j]);
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a2[i][j]);
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			if (a1[i][j] != a2[i][j])
				break;
		}
	}
	if (i == n && j == m)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

(二)四种方法

1、思路一
#include <stdio.h>
 int main()
 {
	 int n = 0;
	 int m = 0;
	 int arr1[10][10] = { 0 };
	 int arr2[10][10] = { 0 };
	 //输入n和m
	 scanf("%d%d", &n, &m);
	 //输入第一矩阵的数据
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 scanf("%d", &arr1[i][j]);
		 }
	 }
	 //输入第二个矩阵的数据
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 scanf("%d", &arr2[i][j]);
		 }
	 }
	 //比较两个数组对应位置的元素
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 if (arr1[i][j] != arr2[i][j])
			 {
				 printf("No\n");
				 return 0;
			 }
		 }
	 }
	 printf("Yes\n");
	 return 0;
 }
2、思路二:if、else判断,break
 //if、else判断,break
#include <stdio.h>
 int main()
 {
	 int n = 0;
	 int m = 0;
	 int arr1[10][10] = { 0 };
	 int arr2[10][10] = { 0 };
	 //输入n和m
	 scanf("%d%d", &n, &m);
	 //输入第一矩阵的数据
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 scanf("%d", &arr1[i][j]);
		 }
	 }
	 //输入第二个矩阵的数据
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 scanf("%d", &arr2[i][j]);
		 }
	 }
	 //比较两个数组对应位置的元素
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 if (arr1[i][j] != arr2[i][j])
				 break;
		 }
	 }
	 if (i == n && j == m)
	 {
		 printf("Yes\n");
	 }
	 else
	 {
		 printf("No\n");
	 }
	 return 0;
 }
3、思路三
#include <stdio.h>
int main()
{
	 int n = 0;
	 int m = 0;
	 int arr1[10][10] = { 0 };
	 int arr2[10][10] = { 0 };
	 //输入n和m
	 scanf("%d%d", &n, &m);
	 //输入第一矩阵的数据
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 scanf("%d", &arr1[i][j]);
		 }
	 }
	 //输入第二个矩阵的数据
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 scanf("%d", &arr2[i][j]);
		 }
	 }
	 //比较两个数组对应位置的元素
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 if (arr1[i][j] != arr2[i][j])
			 {
				 printf("No\n");
				 break;
			 }
		 }
		 if (arr1[i][j] != arr2[i][j])
		 {
			 break;
		 }
	 }
	 if (i == n)
		 printf("Yes\n");
	 return 0;
}
4、思路四:goto语句
//goto语句
#include <stdio.h>
int main()
{
	 int n = 0;
	 int m = 0;
	 int arr1[10][10] = { 0 };
	 int arr2[10][10] = { 0 };
	 //输入n和m
	 scanf("%d%d", &n, &m);
	 //输入第一矩阵的数据
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 scanf("%d", &arr1[i][j]);
		 }
	 }
	 //输入第二个矩阵的数据
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 scanf("%d", &arr2[i][j]);
		 }
	 }
	 //比较两个数组对应位置的元素
	 for (i = 0; i < n; i++)
	 {
		 for (j = 0; j < m; j++)
		 {
			 if (arr1[i][j] != arr2[i][j])
			 {
				 printf("No\n");
				 goto next;
			 }
		 }
		 if (arr1[i][j] != arr2[i][j])
		 {
			 break;
		 }
	 }
	 next:
	 if (i == n)
		 printf("Yes\n");
	 return 0;
}

总结一下,这四种方法里面最简单的其实是第一种方法,其他方法都不如第一种方法简单。

六、上三角矩阵判定

BC106 上三角矩阵判定

(一)直接写 

 我们把代码敲一下——

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[n][n];
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	//判断
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (i > j)
			{
				if (arr[i][j] != 0)
				{
					//下三角有不是0的就不满足
					printf("NO");
					return 0;
				}
			}
		}
	}
	printf("YES");
	return 0;
}

 同样的道理——

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[10][10];
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	//判断
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (i > j)
			{
				if (arr[i][j] != 0)
				{
					//下三角有不是0的就不满足
					printf("NO\n");
					return 0;
				}
			}
		}
	}
	printf("YES");
	return 0;
}

(二)两种思路

有可能会录不完的,我们不关心这个问题,我们考虑的是YES还是NO。

1、思路一
#include <stdio.h>

int main()
{
	int n = 0;
	int arr[10][10] = { 0 };
	scanf("%d", &n);
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (i > j)
			{
				if (arr[i][j] != 0)
				{
					printf("NO\n");
					return 0;
				}
			}
		}
	}
	printf("YES\n");
	return 0;
}
2、 思路二

比前面少了两个For循环——


#include <stdio.h>

int main()
{
	int n = 0;
	int arr[10][10] = { 0 };
	scanf("%d", &n);
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
			if (i > j)
			{
				if (arr[i][j] != 0)
				{
					printf("NO\n");
					return 0;
				}
			}
		}
	}
	printf("YES\n");
	return 0;
}

 

七、矩阵转置

BC107 矩阵转置

我们直接写—— 

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d%d", &n, &m);
	int a[n][m];
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	//转置
	for (i = 0; i < m; i++)//3
	{
		for (j = 0; j < n; j++)//2
		{
			printf("%d ", a[j][i]);
		}
		printf("\n");
	}
	return 0;
}

如果你放心不下,想在VS2022里面测试一下的话——

#include <stdio.h>

int main()
{
	int n = 0;
	int m = 0;
	scanf("%d%d", &n, &m);
	int arr[10][10] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	//输出转置后的矩阵
	for (i = 0; i < m; i++)//3
	{
		for (j = 0; j < n; j++)//2
		{
			printf("%d ", arr[j][i]);
		}
		printf("\n");
	}
	return 0;
}

八、矩阵交换

BC108 矩阵交换

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>
int main()
{
	int m = 0;//列
	int n = 0;//行
	int arr[10][10] = { 0 };
	int cnt = 0;//操作的次数
	char op = 0;//代表操作的字符
	int a = 0;
	int b = 0;
	//读取数据
	scanf("%d%d", &n, &m);
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	scanf("%d", &cnt);
	for (i = 0; i < cnt; i++)
	{
		//读取操作指令
			   //注释解释:
			   //scanf("%d", &a);
			   //scanf(" %c", &c);
              // 消耗 %d 后的所有后继空白符,然后读一个 char
		scanf(" %c %d %d", &op, &a, &b);
		//执行操作
		if (op == 'r')
		{
			//交换a和b行
			for (j = 0; j < m; j++)
			{
				int tmp = arr[a - 1][j];
				arr[a - 1][j] = arr[b - 1][j];
				arr[b - 1][j] = tmp;
			}
		}
		else if (op == 'c')
		{
			//交换a和b列
			for (j = 0; j < n; j++)
			{
				int tmp = arr[j][a - 1];
				arr[j][a - 1] = arr[j][b - 1];
				arr[j][b - 1] = tmp;
			}
		}
	}
	//输出
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

1、如果是%c读取字符,一定要清理前面输入时留下的空白字符;

2、注意二维数组的下标。

九、杨辉三角

BC109 杨辉三角

我们之前写过杨辉三角的题目,但是比这个简单,我们先看看这道题的代码—— 

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>
int main()
{
	int arr[30][30] = { 0 };
	int i = 0;
	int j = 0;
	int n = 0;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j <= i; j++)
		{
			if (i == j)
				arr[i][j] = 1;
			if (j == 0)
				arr[i][j] = 1;
			if (i > 1 && j > 0)
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j <= i; j++)
		{
			printf("%5d", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 这道题就要这样写了——

#define  _CRT_SECURE_NO_WARNINGS  1

#include<stdio.h>

int YangHuiTriAngle(int arr[][4],int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			if (i == 0 || i == j)
			{
				arr[i][j] = 1;
			}
			else
			{
				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
			}
		}
	}
}

int main()
{
	int arr[4][4] = { 0 };
	YangHuiTriAngle(arr, 4);
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			printf("%d ", arr[i][j]);
		}
	}
	printf("\n");
	return 0;
}

十、井字棋

BC110 井字棋

这道题我们写出来是这样的—— 

#define  _CRT_SECURE_NO_WARNINGS  1

#include <stdio.h>
int main()
{
	char arr[3][3] = { 0 };
	int i = 0;
	int j = 0;
	char flag = 'c';
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			scanf("%c", &arr[i][j]);
			getchar();
		}
	}
	for (i = 0; i < 3; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2])
		{
			flag = arr[i][1];
			break;
		}
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])
		{
			flag = arr[1][i];
			break;
		}
	}

	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])
	{
		flag = arr[1][1];
	}
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])
	{
		flag = arr[1][1];
	}

	if (flag == 'K')
		printf("KiKi wins!");
	else if (flag == 'B')
		printf("BoBo wins!");
	else
		printf("No winner!");

	return 0;
}

结尾

往期回顾:

【C语言刷题】第九天:加量加餐继续,代码题训练,融会贯通IO模式

【C语言刷题】第八天:加量加餐继续,代码题训练,熟练IO模式

【C语言刷题】第七天:加量加餐继续,代码题训练,熟练IO模式

【C语言刷题】第六天:继续加量加餐,代码题训练,熟练IO模式

【C语言刷题】第五天:继续加量加餐,代码题训练,熟练IO模式

【C语言刷题】第四天:继续加量加餐,代码题入门,熟练IO模式

【C语言刷题】第三天:继续加量加餐,代码题入门,熟练IO模式

【C语言刷题】第二天:加量加餐,代码入门,熟悉IO模式

【C语言刷题】第一天:简单代码入门,熟悉IO模式

结语:本篇文章带大家刷了十道题目,大家认真思考一下,结合知识点就能想出来,大家一定要及时回顾前面刷过的题目。本文到这里就结束了,希望对友友们有所帮助。本文的代码相比起之前的题目,难度上已经有了加深,大家要上手操作,后面的代码题难度上整体是逐渐递增的,博主控制了难度,这样友友们能比较丝滑地上手敲下去。