7-1 | 统计大写辅音字母 |
7-2 | 统计字符出现次数 |
7-3 | 字符串逆序 |
7-4 | 字符串字母大小写转换 |
7-5 | 查找指定字符 |
7-6 | 字符串转换成十进制整数 |
7-7 | 输出大写英文字母 |
7-8 | 删除重复字符 |
7-9 | 字符串替换 |
7-10 | 字符转换 |
7-11 | 字符串循环左移 |
7-12 | Q进制转换成T进制 |
所有题目都只需要 #include <stdio.h>,不每个都写了。
7-1 统计大写辅音字母 (15 分)
英文辅音字母是除A
、E
、I
、O
、U
以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。
输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出字符串中大写辅音字母的个数。
输入样例: HELLO World!
输出样例: 4
int main()
{
char ch;
int cnt = 0;
while((ch = getchar()) != '\n') // "!=" 优先级比 "=" 高,所以需要小括号
if(ch >= 'B' && ch <= 'Z' && ch != 'E' && ch != 'I' && ch != 'O' && ch != 'U')
++cnt;
printf("%d\n", cnt);
return 0;
}
7-2 统计字符出现次数 (20 分)
本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
输入格式:
输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式:
在一行中输出给定字符在给定字符串中出现的次数。
输入样例:
programming is More fun!
m
输出样例: 2
int main()
{
int cur = 0, cnt = 0;
char str[80];
char ch, target;
while((ch = getchar()) != '\n') // 因为是后输入要找的字符,所以只能先全读到字符数组中
str[cur++] = ch;
scanf("%c", &target);
for(int i = 0; i < cur; i++)
if(target == str[i])
++cnt;
printf("%d\n", cnt);
return 0;
}
7-3 字符串逆序 (15 分)
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:
在一行中输出逆序后的字符串。
输入样例:
Hello World!
输出样例:
!dlroW olleH
int main()
{
int cur = 0;
char str[81], ch;
while((ch = getchar()) != '\n')
str[cur++] = ch;
for(int i = cur - 1; i >= 0; i--)
printf("%c", str[i]);
return 0;
}
7-4 字符串字母大小写转换 (15 分)
本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。
输入格式:
输入为一个以“#”结束的字符串(不超过30个字符)。
输出格式:
在一行中输出大小写转换后的结果字符串。
输入样例:
Hello World! 123#
输出样例:
hELLO wORLD! 123
int main()
{
char ch;
while((ch = getchar()) != '#')
{
if(ch >= 'a' && ch <= 'z') printf("%c", ch + 'Z' - 'z');
else if(ch >= 'A' && ch <= 'Z') printf("%c", ch - 'Z' + 'z');
else printf("%c", ch);
}
return 0;
}
7-5 查找指定字符 (15 分)
本题要求编写程序,从给定字符串中查找某指定的字符。
输入格式:
输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
输出格式:
如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
解:
需要注意的是,用getchar(),把第一行后边的空格读掉。
int main()
{
char ch, target;
int idx = -1, cur = 0;
scanf("%c", &target);
getchar();
while((ch = getchar()) != '\n')
{
if(ch == target) idx = cur;
++cur;
}
if(idx == -1) printf("Not Found\n");
else printf("index = %d\n", idx);
return 0;
}
7-6 字符串转换成十进制整数 (15 分)
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
解:
这道题要判断每个字符是不是16进制字符,因为不区别大小写,所以需要判断三种情况,还需要判断 '-' 是不是出现在第一个十六进制字符前边。判断好这两个就解决了。
int main()
{
int flaghex = 0, minus = 0; // 是否已经出现过16进制字符,是否是负数
int sum = 0;
char ch;
while((ch = getchar()) != '#')
{
if(ch >= '0' && ch <= '9')
{
flaghex = 1;
sum = sum * 16 + (ch - '0');
}
else if(ch >= 'a' && ch <= 'f')
{
flaghex = 1;
sum = sum * 16 + (ch - 'a') + 10;
}
else if(ch >= 'A' && ch <= 'F')
{
flaghex = 1;
sum = sum * 16 + (ch - 'A') + 10;
}
else if(ch == '-' && flaghex == 0) // '-'出现在第一个十六进制数前边
minus = 1;
}
if(minus == 1) printf("%d\n", -sum);
else printf("%d\n", sum);
return 0;
}
7-7 输出大写英文字母 (15 分)
本题要求编写程序,顺序输出给定字符串中所出现过的大写英文字母,每个字母只输出一遍;若无大写英文字母则输出 “Not Found”。
输入格式:
输入为一个以回车结束的字符串(少于80个字符)。
输出格式:
按照输入的顺序在一行中输出所出现过的大写英文字母,每个字母只输出一遍。若无大写英文字母则输出“Not Found”。
解:
只需要用一个数组记录一下26个字母是否出现过就行了。
int main()
{
static int alp[26]; // 全部初始化为0,表示26个字母是否出现过
int flag = 0; // 为判断 Not Found
char ch;
while((ch = getchar()) != '\n')
{
if(ch > 'Z' || ch < 'A') continue; // 不是就跳过
if(alp[ch - 'A'] == 0) // 还没出现过
{
printf("%c", ch);
alp[ch - 'A'] = 1;
flag = 1;
}
}
if(flag == 0) printf("Not Found\n");
return 0;
}
7-8 删除重复字符 (20 分)
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
每次读进来一个字符,在已经存起来的数组里边找并找合适位置插入,如果找到了相同的,就跳过,因为重复了。
int main()
{
char res[82], ch;
int cur = 0;
while ((ch = getchar()) != '\n')
{
int flag = 0; // 判断是否出现过,或者成功插入了
for (int i = 0; i < cur; i++)
{
if (res[i] == ch) // 出现过,直接跳过
{
flag = 1;
break;
}
if (res[i] > ch) // ascii 码的比较, 插入在这个位置前边
{
for (int j = cur; j > i; j--) // i右边所有元素右移一位
res[j] = res[j - 1];
res[i] = ch; // ch 插入到i位置
++cur; // res大小加一
flag = 1;
break;
}
}
if (flag == 0) // 没有出现过,而且res里都比ch小
res[cur++] = ch; // res大小加一
}
// 按序输出res即可
for (int i = 0; i < cur; i++)
printf("%c", res[i]);
return 0;
}
7-9 字符串替换 (15 分)
本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:
原字母 | 对应字母 |
---|---|
A | Z |
B | Y |
C | X |
D | W |
… | … |
X | C |
Y | B |
Z | A |
输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出替换完成后的字符串。
解:
用一个26大小数组表示字母表,比如 alp[1] 就代表 ‘B’ ,然后如果是大小英文字母,就把他对应的位置 i 变成 25 - i 就行了,对应位置上就是他要变成的大小字母。
int main()
{
char alp[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 最后一位是 '\0'
char ch;
while ((ch = getchar()) != '\n')
{
if (ch >= 'A' && ch <= 'Z')
printf("%c", alp[25 - (ch - 'A')]);
else
printf("%c", ch);
}
return 0;
}
7-10 字符转换 (15 分)
本题要求提取一个字符串中的所有数字字符('0'……'9'),将其转换为一个整数输出。
输入格式:
输入在一行中给出一个不超过80个字符且以回车结束的字符串。
输出格式:
在一行中输出转换后的整数。题目保证输出不超过长整型范围。
输入样例:
free82jeep5
输出样例:
825
int main()
{
int sum = 0;
char ch;
while ((ch = getchar()) != '\n')
if(ch >= '0' && ch <= '9')
sum = sum * 10 + (ch - '0');
printf("%d\n", sum);
return 0;
}
7-11 字符串循环左移 (20 分)
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
输出样例:
llo World!He
读入字符串,然后先输出后半部分,在输出前半部分就行了。
int main()
{
char str[101], ch;
int cur = 0, N;
while ((str[cur++] = getchar()) != '\n');
--cur; // 最后的 '\n' 被读进来,要扔掉
scanf("%d", &N);
N %= cur;
// 先输出后边的,然后输出前边的
for (int i = N; i < cur; i++) printf("%c", str[i]);
for (int i = 0; i < N; i++) printf("%c", str[i]);
return 0;
}
7-12 Q进制转换成T进制 (20 分)
给定一个整数Q(2<=Q<=10),一个非空字符串,以及另一个整数T(2<=T<=10), 编程要求过滤掉字符串中所有非Q进制数对应的字符组成一个新的字符串,该字符串无正负号,将该字符串表示的Q进制数转换为T进制数的字符串输出。
输入格式:
第一行输入一个整数Q, 代表Q进制(2<=Q<=10)
第二行输入以回车结束的一行非空字符串。
第三行输入一个整数T, 代表要转换成T进制
输出格式:
输出转换后的T进制数字符串。
输入样例:
10
15
2
输出样例:
1111
解:
这道题两个进制都是 2 到 10 之间所以难度不大,如果有16进制这种的,就会麻烦一些了。
int main()
{
int Q, T, sum = 0;
scanf("%d", &Q);
getchar(); // 要读掉回车
char ch;
while ((ch = getchar()) != '\n')
if (ch >= '0' && ch <= ('0' + Q - 1)) // 其他字符都过滤掉,2进制可取值为0和1,没有2
sum = sum * Q + (ch - '0'); // sum为Q进制转为10进制
if (sum == 0)
{
printf("0\n");
return 0;
}
scanf("%d", &T);
if (T == 10) // 转成十进制的话直接输出就行
{
printf("%d\n", sum);
return 0;
}
// 下面是10进制数sum转为T进制
int cur = 0, a[100000];
while (sum != 0)
{
a[cur++] = sum % T;
sum /= T;
}
for (int i = cur - 1; i >= 0; i--)
printf("%d", a[i]);
return 0;
}