前言
今天是刷题第14天,放弃不难,但坚持一定很酷~
临近期末,集中把模拟卷的编程题都刷一下
C语言百日刷题第十四天
- 前言
- 模拟题(一)
- 1.设计程序实现比较两数大小
- 2.排序成绩
- 模拟题(二)
- 1.求最大值与平均值
- 2.找二维数组的最小值下标
- 模拟题(三)
- 1.转置矩阵
- 2.字符串连接
模拟题(一)
1.设计程序实现比较两数大小
设计程序实现比较两数大小,若相等,输出两数相等;若不等,则输出较大值。
方法一:正常使用else if
语句逐个比较
#include<stdio.h>
int main()
{
int a, b,max;
printf("请输入两个数:");
scanf("%d %d", &a, &b);
max = a;
if (a == b)
printf("两个数相等!");
else if (a > b)
{
printf("最大值为:%d", max);
}
else
{
max = b;
printf("最大值为:%d", max);
}
return 0;
}
方法二:使用三目运算符
#include<stdio.h>
int main()
{
int a, b;
printf("请输入两个数:");
scanf("%d %d", &a, &b);
if (a == b)
printf("这两个数相等!");
else
{
int max = a > b ? a : b;
printf("最大值为:%d", max);
}
return 0;
}
2.排序成绩
从键盘输入10名学生的成绩数据,按成绩从高到低的顺序排列并输出。(提示:用数组存放成绩数据)
主要考排序算法,排序算法一共有十种,这里我就写个三种我常用的吧。
方法一:快速排序法
#include<stdio.h>
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i++; while (q[i] > x);
do j--; while (q[j] < x);
if (i < j)
{
int tmp;
tmp = q[i];
q[i] = q[j];
q[j] = tmp;
}
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
int main()
{
int arr[10];
printf("请依次输入十名同学的成绩:\n");
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
quick_sort(arr, 0, 9);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
方法二:冒泡排序法
#include<stdio.h>
void bubble_sort(int arr[], int len) {
int i, j, temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] < arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
int main()
{
int arr[10];
int len = sizeof(arr) / sizeof(arr[0]);
printf("请依次输入十名同学的成绩:\n");
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
bubble_sort(arr, len);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
方法三:希尔排序
#include<stdio.h>
void shell_sort(int arr[], int len) {
int gap, i, j;
int temp;
for (gap = len >> 1; gap > 0; gap >>= 1)
for (i = gap; i < len; i++) {
temp = arr[i];
for (j = i - gap; j >= 0 && arr[j] < temp; j -= gap)
arr[j + gap] = arr[j];
arr[j + gap] = temp;
}
}
int main()
{
int arr[10];
int len = sizeof(arr) / sizeof(arr[0]);
printf("请依次输入十名同学的成绩:\n");
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
shell_sort(arr, len);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
模拟题(二)
1.求最大值与平均值
输入5个数,求它们中最大值和平均值并输出。
#include<stdio.h>
int main()
{
int arr[5], max;
float ave;
float sum = 0.0;
for (int i = 0; i < 5; i++)
scanf("%d", &arr[i]);
max = arr[0];
for (int i = 0; i < 5; i++)
{
sum += arr[i];
if (max < arr[i])
max = arr[i];
}
ave = sum / 5;
printf("最大值是:%d 平均值是:%f", max, ave);
return 0;
}
2.找二维数组的最小值下标
从键盘上输入一个4*3的整型数组,找出数组中的最小值及其在数组中的下标。
#include <stdio.h>
int main()
{
int a[4][3] = {0};
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &a[i][j]);
}
}
int row = 0, col= 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
if (a[i][j] < a[row][col])
{
row = i;
col = j;
}
printf("该数组的最小的数是%d\n", a[row][col]);
printf("所处的位置为数组的第%d行第%d列\n", row + 1, col + 1);
}
二维数组需要两个for循环进行控制,一个控制行,一个控制列。
其他的和求一维数组的最小值和下标没多大的区别。
模拟题(三)
1.转置矩阵
用指针的方法处理:写一个函数,将3*3的整型矩阵转置
转置:第一行变为第一列…最后一行变为最后一列
要求使用指针写这个转置函数,那就使用数组指针来间接进行转置操作
#include<stdio.h>
void move(int(*pa)[3])
{
int i, j, temp;
for (i = 0; i < 3; i++)
for (j = 0; j < i; j++)
{
temp = *(*(pa + i) + j);
*(*(pa + i) + j) = *(*(pa + j) + i);
*(*(pa + j) + i) = temp;
}
}
int main()
{
int a[3][3];
int temp;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
printf("转置前的数组为:\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
printf("%5d ", a[i][j]);
printf("\n");
}
move(a);
printf("转置后的数组为:\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
printf("%5d ", a[i][j]);
printf("\n");
}
return 0;
}
2.字符串连接
用指针的方法处理:写一个函数,将两个字符串连接。
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest)
{
dest++;
}
while (*dest = *src)
{
dest++;
src++;
}
return ret;
}
int main()
{
char str1[30],str2[30];
scanf("%s", str1);
scanf("%s", str2);
my_strcat(str1, str2);
printf("连接后的结果为:%s", str1);
}