习题8-7 字符串排序 (20 分)
本题要求编写程序,读入5个字符串,按由小到大的顺序输出。
输入格式:
输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。
输出格式:
按照以下格式输出排序后的结果:
After sorted:
每行一个字符串
输入样例:
red yellow blue black white
输出样例:
After sorted:
black
blue
red
white
yellow
//1.scanf("%s", a[i]); 2. strcpy(); 3.strcpy(); 4.printf("\n%s", a[i]); 的应用
#include <stdio.h>
#include <string.h>
int main()
{
char a[5][80], b[80], c;
int i, j;
for(i = 0; i < 5; i++)
{
scanf("%s", a[i]);
}
for(i = 0; i < 5; i++)
{
for(j = i + 1; j < 5; j++)
if(strcmp(a[i], a[j]) > 0)
{
strcpy(b, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], b);
}
}
printf("After sorted:");
for(i = 0; i < 5; i++)
{
printf("\n%s", a[i]);
}
return 0;
}
练习8-8 移动字母 (10 分)
本题要求编写函数,将输入字符串的前3个字符移到最后。
函数接口定义:
void Shift( char s[] );
其中char s[]
是用户传入的字符串,题目保证其长度不小于3;函数Shift
须将按照要求变换后的字符串仍然存在s[]
里。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 10
void Shift( char s[] );
void GetString( char s[] ); /* 实现细节在此不表 */
int main()
{
char s[MAXS];
GetString(s);
Shift(s);
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
abcdef
输出样例:
defabc
//1.理解错误:是将前三个放到最后,不是让前三个和后三个互换2.函数Shift
须将按照要求变换后的字符串仍然存在s[]
里。3.strlen()函数
void Shift( char s[] )
{
int l, i, j;
char c[3];
for(i = 0; i < 3; i++)
{
c[i] = s[i];
}
l = strlen(s);
for(j = 3; j < l; j++)
{
s[j - 3] = s[j];
}
for(i = 0; i < 3; i++)
{
s[l - 3 + i] = c[i];
}
}
习题8-4 报数 (20 分)
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
本题要求编写函数,给出每个人的退出顺序编号。
函数接口定义:
void CountOff( int n, int m, int out[] );
其中n
是初始人数;m
是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff
将每个人的退出顺序编号存在数组out[]
中。因为C语言数组下标是从0开始的,所以第i
个位置上的人是第out[i-1]
个退出的。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 20
void CountOff( int n, int m, int out[] );
int main()
{
int out[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
CountOff( n, m, out );
for ( i = 0; i < n; i++ )
printf("%d ", out[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
11 3
输出样例:
4 10 1 7 5 2 11 9 3 6 8
//1.count 初始化为0,每当if的条件满足时再加1比较好 2.while循环里再套一个for循环比较好
void CountOff( int n, int m, int out[] )
{
int i, j = 1, count = 0;
for(i = 0; i < n; i++)
out[i] = 0;
i = 0;
while(j <= n)
{
for(i = 0; i < n; i++)
{
if(out[i] == 0)
{
count++;
if(count == m)
{
out[i] = j;
j++;
count = 0;
}
}
}
}
}
习题8-5 使用函数实现字符串部分复制 (20 分)
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数接口定义:
void strmcpy( char *t, int m, char *s );
函数strmcpy
将输入字符串char *t
中从第m
个字符开始的全部字符复制到字符串char *s
中。若m
超过输入字符串的长度,则结果字符串应为空串。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char t[MAXN], s[MAXN];
int m;
scanf("%d\n", &m);
ReadString(t);
strmcpy( t, m, s );
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
7
happy new year
输出样例:
new year
//1.先计算数组t的长度 2.数组shi是以单个字符的形式逐个赋值的,最后要手动加‘\0’
void strmcpy( char *t, int m, char *s )
{
int i = 0, j = 0, k = 0;
while(t[k] != '\0')
{
k++;
}
if(m > k)
s[j] = '\0';
else
for(i = m - 1; i < k; i++, j++)
{
s[j] = t[i];
}
s[j] = '\0';
}