class-notes/最后一舞/C语言基础进阶合集版编程题.md
2025-04-01 16:39:57 +08:00

1131 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 数组
### 1 数组的批量增
题目:设计程序,实现把一个数组的所有元素插入到另一个数组的指定索引位置
输入第一行是第一个数组的元素个数len1第二行是空格分开的len1 个元素,第三行是第二个
数组的元素个数len2第四行是空格分开的len2 个元素,第五行是插入索引位置
输出:输出第二个数组插入到第一个数组后,第一个数组的所有元素
```ini
输入样例:
3
1 2 3
2
4 5
0
输出样例4 5 1 2 3
```
```c
#include <stdio.h>
int main(){
int a[100] = {0}, b[100] = {0};
int len1, len2, index;
int i;
scanf("%d", &len1);
for(i=0;i<len1;i++){
scanf("%d", a+i);
}
scanf("%d", &len2);
for(i=0;i<len2;i++){
scanf("%d", b+i);
}
scanf("%d", &index);
for(i=len1-1;i>=index;i--){
a[i+len2] = a[i];
}
for(i=0;i<len2;i++){
a[index+i]=b[i];
}
len1+=len2;
for(i=0;i<len1;i++){
printf("%d ", a[i]);
}
return 0;
}
```
### 2 数组的批量删
题目设计程序删除数组中所有值为x 的元素
输入第一行是元素个数n第二行是空格分开的n 个元素第三行是需要删掉的标记值x
输出:删除后的数组
```ini
输入样例:
6
2 1 2 3 2 2
2
输出样例1 3
```
```c
#include <stdio.h>
int main(){
int a[100];
int len, i, j = 0, num;
scanf("%d", &len);
for(i=0;i<len;i++){
scanf("%d", a+i);
}
scanf("%d", &num);
for(i=0;i<len;i++){
if(a[i] != num){
a[j++] = a[i];
}
}
for(i=j;i<len;i++){
a[i]=0;
}
for(i=0;i<j;i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
### 3 左小右大
题目:输入一串整型正整数,设计程序,以第一个元素为基准,把比第一个元素小的都放在其左边,
比第一个元素大的放其右边,也就是“左小右大”的情况,且在此划分的前提下,要求左右两边的元
素位置相对次序依旧保持不变,也就是具有稳定性,且不开辟额外的数组空间
输入第一行是元素个数n第二行是空格分开的n 个元素总长度不超过100
输出:按照规则“左小右大”划分后且相对次序保持不变后的数组
```ini
输入样例:
8
3 1 0 5 6 2 8 0
输出样例1 0 2 0 3 5 6 8
```
```c
#include <stdio.h>
void change(int a[], int n){
int i, j, t, index=0;
for(i=1;i<n;i++){
if(a[0] > a[i]){//i当前遍历的元素下标 如果当前下标值小于中间值则进入
index++;//存储位置后移
t = a[i];//备份当前位置的值
j = i;//将当前位置的下标存储
while(j > index){//如果当前遍历位置下标大于存储位置下标则元素整体后移
a[j] = a[j-1];
j--;
}
a[index] = t;//元素整体后移后再赋值操作
}
}
for(i=0;i<n-1;i++){
if(a[i] > a[i+1]){
t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}
}
}
int main(){
int len, i;
int a[100];
scanf("%d", &len);
for(i=0;i<len;i++){
scanf("%d", a+i);
}
change(a, len);
for(i=0;i<len;i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
### 4 数组逆序
题目:编写程序,将给定的几个整数存入数组中,将数组中的这几个数逆序存放,再按顺序输出数
组中的元素
输入输入在第一行中给出一个正整数n(1 ≤n≤ 10)。第二行输入几个整数,用空格分开
输出:在一行中输出这几个整数的处理结果,相邻数字中间用个空格分开
```ini
输入样例
4
10 8 1 2
输出样例2 1 8 10
```
```c
#include <stdio.h>
int main(){
int a[10];
int n;
scanf("%d", &n);
for(int i=n-1;i>=0;i--){
scanf("%d", &a[i]);
}
for(int i=0;i<n;i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
### 5 数组循环右移
题目:设计程序,实现数组元素的整体循环右移
输入第一行是元素个数n第二行是空格分开的n 个元素第三行是数组整体右移的步数step
输出:整体右移后的数组
```ini
输入样例:
4
1 2 3 4
2
输出样例:
3 4 1 2
```
```c
#include <stdio.h>
int main(){
int n, step, t;
scanf("%d", &n);
int a[n];//C99及以上C语言标准中可以使用
for(int i=0;i<n;i++){
scanf("%d", &a[i]);
}
scanf("%d", &step);
for(int i=0;i<step;i++){//控制移动次数
t = a[0];
for(int j=0;j<n-1;j++){
a[j] = a[j+1];
}
a[n-1] = t;
}
for(int i=0;i<n;i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
### 6 最值交换
题目:编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数
交换,最后输出交换后的序列。题目保证最大和最小值都是唯一的
输入输入在第一行中给出一个正整数N第二行给出N 个整数,数字间以空格分隔
输出:在一行中顺序输出交换后的序列
```ini
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8
```
**会改变其他元素位置**
```c
#include <stdio.h>
int main(){
int n, max, min, t;
scanf("%d", &n);
int a[n];
max = min = 0;
for(int i=0;i<n;i++){
scanf("%d", &a[i]);
if(a[max] < a[i]){
max = i;
}
if(a[min] > a[i]){
min = i;
}
}
t = a[min];
a[min] = a[0];
a[0] = t;
if(max == 0){
max = min;
}
t = a[max];
a[max] = a[n-1];
a[n-1] = t;
for(int i=0;i<n;i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
**不会改变其他元素位置**
```c
#include <stdio.h>
int main(){
int n, max, min, t;
scanf("%d", &n);
int a[n];
max = min = 0;
for(int i=0;i<n;i++){
scanf("%d", &a[i]);
if(a[max] < a[i]){
max = i;
}
if(a[min] > a[i]){
min = i;
}
}
for(int i=max;i<n-1;i++){
t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}
if(max < min){
min--;
}
for(int i=min;i>=1;i--){
t = a[i];
a[i] = a[i-1];
a[i-1] = t;
}
for(int i=0;i<n;i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
### 7 数组排序
题目:输入一串整型正整数,设计程序,给输入的数组排序
输入输入在第一行中给出一个正整数N(<10)第二行给出N 个整数,数字间以空格分隔
输出:递增排序后的数据
```ini
输入样例:
4
3 2 10 5
输出样例2 3 5 10
```
```c
#include <stdio.h>
int main(){
int a[10];
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%d", &a[i]);
}
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(a[j] > a[j+1]){
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for(int i=0;i<n;i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
### 8 谁频次最高
题目:统计一个整型序列中出现次数最多的整数及其出现次数
输入输入在一行中给出序列中整数个数N(0<N<1000)以及N 个整数。数字间以空格分隔
输出:在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字
是唯一的
```ini
输入样例:
11
10 3 2 -1 5 3 4 3 0 3 2
输出样例3 4
```
```c
#include <stdio.h>
int main(){
int n, max_count=0, max_num, t;
scanf("%d", &n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d", &a[i]);
}
for(int i=0;i<n-1;i++){
t = 0;
for(int j=i+1;j<n;j++){
if(a[i] == a[j]){
t++;
}
}
if(t > max_count){
max_count = t;
max_num = a[i];
}
}
printf("%d %d\n", max_num, max_count+1);
return 0;
}
```
### 9 矩阵运算
题目:给定一个𝑛 × 𝑛的方阵请定义一个函数func计算该矩阵除副对角线、最后一列和最后一
行以外的所有元素之和,副对角线为从矩阵的右上角至左下角的连线
输入输入第一行给出正整数n(1 <n ≤ 10)随后n 行每行给出n 个整数,以空格分隔
输出:在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和
```ini
输入样例:
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
输出样例35
方阵中主对角线、副对角线的索引和方阵的行、列有什么关系?
```
```c
#include <stdio.h>
int main(){
int n, s = 0;
scanf("%d", &n);
int a[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d", &a[i][j]);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i != n-1 && j != n-1 && i+j != n-1){
s += a[i][j];
}
}
}
printf("%d\n", s);
return 0;
}
```
### 10 矩阵乘积
题目给定一个m×n的矩阵A再给定一个给定一个n×p 的矩阵Bm,n,p<10求矩阵的乘积
输入第一行给出两个整数代表矩阵A 的维度m 和n随后m 行每行输入以空格分隔的n 个整数,
第同时下一行给出两个整数代表矩阵B 的维度n 和p随后n 行每行输入以空格分隔的p 个整数
输出A 和B 相乘后的结果
```ini
输入样例:
2 3
1 2 3
4 5 6
3 2
1 0
0 1
1 2
输出样例:
4 8
10 17
```
```c
#include <stdio.h>
int main(){
int m, n, s;
scanf("%d %d", &m, &n);
int a[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d", &a[i][j]);
}
}
int q,p;
scanf("%d %d", &q, &p);
int b[q][p];
for(int i=0;i<q;i++){
for(int j=0;j<p;j++){
scanf("%d", &b[i][j]);
}
}
printf("\n");
for(int i=0;i<m;i++){//数组a行下标
for(int k=0;k<p;k++){//数组b的列下标
s = 0;
for(int j=0;j<n;j++){//数组a的列下标和数组b的行下标
s+= a[i][j] * b[j][k];
}
printf("%d ", s);
}
printf("\n");
}
return 0;
}
```
<img src="https://yp.smallkun.cn/markdown/image-20250322222018779.png!compress" alt="image-20250322222018779" style="zoom:50%;" />
### 11 找字符索引
题目:编写程序,从给定字符串中查找某指定的字符所在的索引位置
输入:输入的第一行是单个待查找的字符。第二行是以回车结束的非空字符串(不超过80 个字符)
输出如果找到在一行内按照格式“index=下标”,输出该字符在字符串中所对应的下标(下标从0
开始),如果该字符出现多次,则返回最后一次出现的索引位置,否则输出"Not Found"
```ini
输入样例:
m
programming
输出样例index=7
```
```c
#include <stdio.h>
int main(){
char target, *p;
char str[100];
char *index = NULL;
p = str;
scanf("%c", &target);
scanf("%s", str);
while(*p != '\0'){
if(*p == target){
index = p;
}
p++;
}
if(index != NULL){
printf("index=%d\n", index-str);
}else{
printf("Not Found\n");
}
return 0;
}
```
### 12 大小写转换
题目:编写程序,对一个以“#”结束的字符串,把小写字母全部转换成大写字母,把大写字母全部
转换成小写字母,并逆序输出结果
输入:一个以“#”结束的字符串不超过100 个字符
输出:在一行中输出大小写转换后的结果字符串
```ini
输入样例:
Ab!23
cD &*%$
.,#
输出样例:
,.
$%*& dC
32!Ba
```
```c
#include <stdio.h>
int main(){
char ch;
char str[100];
char *p = str;
while((ch=getchar())!= '#'){
if(ch >= 'a' && ch <= 'z'){
*p = ch-32;
}else if(ch >= 'A' && ch <= 'Z'){
*p = ch+32;
}else{
*p = ch;
}
p++;
}
while(p!= str){
p--;
putchar(*p);
}
printf("\n");
return 0;
}
```
### 13 字符串比较
题目编写程序将两个不包含换行符的字符串s1 和s2 比较若s1>s2输出1若s1=s2输出
0否则输出-1要求不要用strcmp 函数
输入输入总共两行第一行是第一个字符串第二行是第二个字符串字符串的长度均小于100
输出:第一个字符串和第二个字符串比较后的结果
```ini
输入样例:
love
love
输出样例0
```
```c
#include <stdio.h>
int main(){
char str1[100], str2[100];
char *p, *q, flag;
p = str1;
q = str2;
gets(str1);
gets(str2);
while(*p != '\0' && *q != '\0'){
if(*p > *q){
flag = 1;
break;
}else if(*p < *q){
flag = -1;
break;
}
p++;
q++;
}
if(*p == '\0' && *q == '\0'){
flag = 0;
}
if(*p != '\0' && *q == '\0'){
flag = 1;
}
if(*p == '\0' && *q != '\0'){
flag = -1;
}
printf("%d\n", flag);
return 0;
}
```
### 14 字符串排序
题目:编写程序,实现字符串之间的升序排序并输出结果
输入第一行是一个整数n 代表n 个字符串n<10 且每个字符串长度都小于80接下来n 行都
是字符串
输出:递增排序后的结果
```ini
输入样例:
3
abc
b
aaaaa
输出样例:
aaaaa
abc
b
```
```c
#include <stdio.h>
#include <string.h>
int main(){
int n, i, j;
scanf("%d", &n);
char str[n][80];
char temp[80];
for(i=0;i<n;i++){
scanf("%s", *(str+i));
}
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(strcmp(*(str+j), *(str+j+1)) == 1){
strcpy(temp, *(str+j));
strcpy(*(str+j), *(str+j+1));
strcpy(*(str+j+1), temp);
}
}
}
for(i=0;i<n;i++){
printf("%s\n", *(str+i));
}
return 0;
}
```
### 15 字符串插入
题目:编写程序,实现字符串的插入
输入输入总共三行第一行是第一个字符串第二行是第二个字符串字符串的长度均小于100
且不包含换行符,第三行是代表第二个字符串插入至第一个字符串的位置
输出:把第二个字符串插入到第一个字符串的指定位置后面的结果
```ini
输入样例:
abc
ee
2
输出样例aeebc
```
```c
#include <stdio.h>
#include <string.h>
int main(){
char str1[100], str2[100];
int n, i;
char *p, *q;
scanf("%s %s", str1, str2);
scanf("%d", &n);
for(i=0;i<strlen(str2);i++){
p = str1+strlen(str1);
while(p>=str1+n+i-1){
*(p+1) = *p;
p--;
}
}
p = str1+n-1;
q = str2;
while(*q != '\0'){
*p = *q;
p++;
q++;
}
printf("%s\n%s", str1, str2);
return 0;
}
```
### 16 字符串删除
题目:编写程序,删除字符串中指定的子字符串
输入输入总共两行第一行是原字符串第二行是需要删除的字符串字符串的长度均小于100
且不包含换行符
输出:删除指定字符串后的新的字符串结果
```ini
输入样例:
abcddeef
dee
输出样例abcdf
```
```c
#include <stdio.h>
#include <string.h>
int main(){
char str1[100], str2[100];
int n;
char *p, *q;
scanf("%s", str1);
scanf("%s", str2);
p = str1;
while(*p != '\0'){
q = str2;
while(*q == *p && *q != '\0'){
p++;
q++;
}
if(*q == '\0'){
q = p;
while(*q != '\0'){
*(q-strlen(str2)) = *q;
q++;
}
*(q-strlen(str2))='\0';
p-=strlen(str2);
}
if(*q != str2){
p-= q-str2;
}
p++;
}
printf("%s\n", str1);
return 0;
}
```
---
## 进制转换
### 1 整数二进制
题目:编写程序,把十进制正整数转换为二进制,其中输入的正整数的二进制长度不会超过 32位
输入:一个正整数 n
输出:正整数的二进制格式
```ini
输入样例17
输出样例10001
```
```c
#include <stdio.h>
int main(){
int a[32];
int n, i=0;
scanf("%d", &n);
while(n){
a[i++] = n%2;
n/=2;
}
i--;
while(i>=0){
printf("%d", a[i]);
i--;
}
printf("\n");
return 0;
}
```
### 2 小数二进制
题目:编写程序,把一个浮点数转换为二进制格式,其中整数部分为 0当小数部分的二进制无穷
尽时,保留 32 位长度即可
输入:一个浮点数,范围为 0.0<x<1.0
输出:该浮点数的二进制表示方法
```ini
输入样例0.7
输出样例0.10110011001100110011001100110011
```
```c
#include <stdio.h>
int main(){
float n;
int b[32], i = 0, j;
scanf("%f", &n);
while(n && i < 32){
b[i++]=(int)(n*2);
n*=2;
n-=(int)n;
}
printf("0.");
i--;
for(j=0;j<=i;j++){
printf("%d", b[j]);
}
printf("\n");
return 0;
}
```
### 3 二进制转十进制
题目:输入一个整数的二进制,设计程序,输出该二进制的十进制结果
输入:一 二进制表示的整数,长度不会超过 32
输出:转换成十进制后的结果
```ini
输入样例1001
输出样例9
```
```c
#include <stdio.h>
#include <string.h>
int main(){
char str[100];
int b[100];
int i, j = 0, sum=0, t=1;
gets(str);
for(i=strlen(str)-1;i>=0;i--){
b[j++] = str[i]-48;
}
for(i=0;i<j;i++){
sum += t*b[i];
t*=2;
}
printf("(%s)B=(%d)D\n", str,sum);
return 0;
}
```
### 4 二进制转十六进制
题目:给定一个二进制数,请输出其十六进制
输入:一串二进制表示的整数,长度不会超过 32
输出:转换成十六进制的结果,字母统一为大写
```ini
输入样例111000001
输出样例1C1
```
```c
#include <stdio.h>
int main(){
char str[100];
char h[100] = {0};
int i, j = 0, sum, t, k, n=4;
gets(str);
for(i=strlen(str)-1;(i+1)/4 && i > 0;i-=4){
sum = 0;
t = 1;
for(k=0;k<4;k++){
sum += (str[i-k]-48)*t;
t*=2;
}
if(sum <= 9){
h[j++] = sum+48;
}else{
h[j++] = sum-10+65;
}
}
if(i >= 0){
sum = 0;
t = 1;
while(i >= 0){
sum += (str[i]-48)*t;
t*=2;
i--;
}
h[j++] = sum+48;
}
j--;
while(j >= 0){
printf("%c", h[j--]);
}
printf("\n");
return 0;
}
```
### 5 大整数的加法
题目:设计程序,求两个不超过 200 位的十进制非负整数的和
输入:有两行,每行是一个不超过 200 位的非负整数,不会有多余的前导 0
输出:一行,即相加后的结果。结果里不能有多余的前导 0
```ini
输入样例:
22222222222222222222
33333333333333333333
输出样例:
55555555555555555555
```
```c
```
### 6.大整数的乘法
题目:设计程序,求两个不超过 200 位的十进制非负整数的乘积
输入:有两行,每行是一个不超过 200 位的非负整数,不会有多余的前导 0
输出:一行,即相加后的结果。结果里不能有多余的前导 0
```ini
输入样例:
55555
1234567
输出样例:
68586369685
```
```c
```
---
## 文件
### 1 文件字符统计
题目给定一个文件“test1.txt“请统计文件中的英文字母字符和数字字符的个数
输入给定的一个文件“test1.txt“
输出:英文字母和数字的个数,用空格隔开
```ini
输入样例一个文件假设内容为ab\n123\n***\n
输出样例2 3
```
### 2 文件合并
题目给定两个文件“test1.txt“和”test2.txt“请把两个文件中的内容合并到一起并写入到新的文
件”test3.txt”之中
输入两个文件“test1.txt“和”test2.txt“
输出合并后的文件“test3.txt“
```ini
输入样例:
假设 test1.txt 的内容为ab\ncd
假设 test2.txt 的内容为efg\nhi
输出样例test3.txt 的内容ab\ncdefg\nhi
```
### 3 写入数据到文件
题目编写程序实现把从键盘敲入的字符数据都追加存入文件“test.txt”中直到敲入 ctrl+z 结束,
注意是追加写入,也就是说文件中原本的内容依旧保留
输入从键盘敲入字符假设敲入了“abc\ndef”原本的“test.txt“文件中的内容为“我爱中国”
输出:写入后的文件,按照输入的方式写入后,结果应该为:“我爱中国 abc\ndef“