目录
写在开头
本文代码是我自己所作,可能部分代码不够简练,效率不高,但都能运行成功。本人水平有限,大家见谅,多多交流
正文
第1关:选择法排序
本关任务:使用选择法排序编写一个能为数组进行升序排序的程序。
根据提示,在右侧编辑器补充
void inArray(int arr[],int n)
、void selectSort(int arr[],int n)
和void outArray(int arr[],int n)
的函数定义,这三个函数的输入均是一个长度不大于100
的无序数组arr
,以及数组的长度n
,请在函数selectSort
中使用选择法对数组元素进行升序排序,函数inArray
用于输入数组的n
个元素,函数outArray
用于输出数组的n
个元素。测试输入:
5 //数组长度
11 6 24 20 3 //数组的每个元素
预期输出:
3 6 11 20 24
#include<stdio.h>
void inArray(int arr[],int n)
{
int i=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
}
void selectSort(int arr[],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(arr[i]>arr[j])
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
void outArray(int arr[],int n)
{
int i=0;
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
}
第2关:二分段交换
本关任务:输入
n
个整数到数组u
中,再输入正整数k(0< k < n )
,k
将数组u
的n
个元素划分为u[0]
,……,u[k-1]
和u[k]
,……,u[n-1]
两段,将两段元素交换位置但仍然存放在数组u
中,输出重新排列后的数组元素。示例如下: 假设
n=7
,k=3
; 数组元素u[0]
,……,u[6]
依次为1, 2, 3, 4, 5, 6, 7
; 则被交换的两段元素是:u[0]
,……,u[6]
交换的结果是4, 5, 6, 7, 1, 2, 3
。测试输入:
7 //数组长度
1 2 3 4 5 6 7 //数组元素
3 //正整数k
预期输出:4 5 6 7 1 2 3
#include<stdio.h>
void move(int arr[],int n,int k){
/********** Begin **********/
int i=0;
int tmp;
int j=k-1;
int m=n-1;
while(i<j)
{
tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
i++;
j--;
}
i=0;
j=k;
while(j<m)
{
tmp=arr[j];
arr[j]=arr[m];
arr[m]=tmp;
j++;
m--;
}
i=0;
m=n-1;
while(i<m)
{
tmp=arr[i];
arr[i]=arr[m];
arr[m]=tmp;
i++;
m--;
}
/********** End **********/
}
//1 2 3 4 5 6 7 原顺序
//3 2 1 4 5 6 7 前k个逆置
//3 2 1 7 6 5 4 后面逆置
//4 5 6 7 1 2 3 整体逆置
第3关:计数器
本关任务:编程统计输入的一段文字中每个数字字符、 每个英文字符(不区分大小写)和其他字符出现的次数(要求用数组元素作为每个数字字符、每个英文字符、和其他字符出现的次数的计数器)。
如:输入
12L C
,统计的结果为:1
个1
,1
个2
,1
个L
,1
个C
,一个其他字符(空格)。测试输入:
hust is my home!2019!
预期输出:
0:1 1:1 2:1 9:1 E:1 H:2 I:1 M:2 O:1 S:2 T:1 U:1 Y:1 others:5
#include<stdio.h>
#include<ctype.h>
int main()
{
/********** Begin **********/
// [0-9] digit
// [10-35] alpha
// [36] others
char ch;
int counter[37] = { 0 };//把37个空间全部赋0,方便计数
while ((ch = getchar()) != '\n')
{
if (isdigit(ch))//不想用函数可以写成 if(ch>='0'&&ch<='9')
counter[ch - '0']++;
else if (isalpha(ch))//或者 if(toupper(ch)>='A'&&toupper(ch)<='Z'),toupper函数是小写转大写
counter[toupper(ch) - 'A' + 10]++;
else
counter[36]++;//空格的情况
}
for (char ch = '0'; ch <= '9'; ch++)
if (counter[ch - '0'])//这里很巧妙,如果某数没有出现,就不输出它的计数器
printf("%c:%d\n", ch, counter[ch - '0']);
for (char ch = 'A'; ch <= 'Z'; ch++)
if (counter[ch - 'A' + 10])
printf("%c:%d\n", ch, counter[ch - 'A' + 10]);
if (counter[36]) printf("others:%d\n", counter[36]);
/********** End **********/
return 0;
}
第4关:复制字符数组
本关任务:编写函数
strnCpy(t,s,n)
。它将字符数组
s
中的前n
个字符复制到字符数组t
中,并形成字符串。测试输入:
lang 9 预期输出:lang
#include<stdio.h>
void strnCpy(char t[],char s[],int n)
{
/********** Begin **********/
int i=0;
for(i=0;(s[i]!='\0')&&i<n;i++)
{
t[i]=s[i];
}
t[i]='\0';
//printf("%s",t);
/********** End **********/
}
第5关:进制转换
本关任务:输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符(
'\0'
)结束转换。1.测试输入:
55
//程序的输入不会有十六进制的前缀预期输出:
85
2.测试输入:
f1r2
//程序的输入不会有十六进制的前缀预期输出:
241
#include<stdio.h>
#include<string.h>
void conversion(char str[])
{
/********** Begin **********/
int i = 0, j=0,num = 0, sum = 0,len=0;
//int len = strlen(str);//这种方法会将非16进制数记录在内
while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
{
len++;
i++;
} //遍历数组记录16进制数的个数,非16进制数不计在内
i = 0;
while (str[i] != '\0')
{
//字符转数字
if (str[i] >= '0' && str[i] <= '9')
num = str[i] - '0';
else if (str[i] >= 'a' && str[i] <= 'f')
num = str[i] - 'a' + 10;
else if (str[i] >= 'A' && str[i] <= 'F')
num = str[i] - 'A' + 10;
else
break;//遇到'\0'之前的第一个非十六进制数就停止循环
for (j = 0; j < len - 1; j++)
{
num = num * 16;
}
sum += num;
i++;
len--;
}
printf("%d\n", sum);
/********** End **********/
}
第6关:回文判断
本关任务:编写一个测试一个串是否为回文的递归函数,是回文,函数返回
1
;不是回文,返回0
。并且在主函数中调用该函数,判断输入的字符串是否为回文串。回文是正读和反读都一样的串,例如:
“abcba”
和“otto”
就是回文。主函数中若输入的字符串是回文,则输出“Yes”
,否则输出“No”
。测试输入:
abcdedcba
预期输出:
Yes
#include<stdio.h>
#include<string.h>
#define SIZE 100
/**** 在下面编写满足任务要求的递归函数isPalindrome,是回文返回1,不是返回0 *******/
/********** Begin ***********/
int isPalindrome(char arr[],int len)
{
int i=0;
while(arr[i]==arr[len-1]&&i<len-1)
{
i++;
len--;
}
if(i>=len-1)
return 1;
else
return -1;
}
/********** End **********/
int main()
{
/**** 输入字符串,调用函数isPalindrome判断是否为回文串,然后输出结果 *******/
/********** Begin ***********/
char arr[SIZE];
scanf("%s",arr);
int len=strlen(arr);
int num=isPalindrome(arr,len);
if(num==1)
printf("Yes");
else
printf("No");
/********** End **********/
return 0;
}
写在最后
👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!