1.查找指定字符
输入格式:
输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
输出格式:
如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
输入样例1:
m programming
输出样例1:
index = 7
输入样例2:
a 1234
输出样例2:
Not Found
#include <stdio.h>
int main()
{char ch, a[81];int i = 0, index = 0, flag = 0;scanf("%c\n", &ch);//问题1:这里为什么要加\nwhile ((a[i] = getchar()) != '\n'){i++;}a[i] = '\0';for (i = 0; a[i] != '\0'; i++){if (a[i] == ch){index = i;flag = 1;}}if (flag){printf("index = %d\n", index);}else{printf("Not Found\n");}return 0;
}
问题1的解答 :
scanf("%c", &ch);
这行代码会读取一个字符,但是它不会读取换行符 \n
。因此,如果输入的字符后面直接跟着换行符,getchar()
将会读取换行符而不是用户想要输入的字符串。
2.字符串逆序
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:
在一行中输出逆序后的字符串。
输入样例:
Hello World!
输出样例:
!dlroW olleH
#include <stdio.h>
#include <string.h>
int main()
{char arr[80];int i = 0;while ((arr[i] = getchar()) != '\n'){i++;}arr[i] = '\0';int s = strlen(arr);for (i = s-1; i >= 0; i--){printf("%c", arr[i]);}return 0;
}
注意strlen计算的是\0之前的数组长度,i=s时已经超过了数组的范围,硬要讲的话arr[s]对应的应该是\0,但不是我们想要的,故应该是s-1 。
3.打印杨辉三角
本题要求按照规定格式打印前N行杨辉三角。
输入格式:
输入在一行中给出N(1≤N≤10)。
输出格式:
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。
输入样例:
6
输出样例:
11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1
#include <stdio.h>
int main()
{int i, j,k, a[10][10], n;scanf("%d", &n);for (i = 0; i < n; i++){//赋值为1;for (j = 0; j <= i; j++){a[i][j] = 1;}}for (i = 2; i < n; i++){for (j = 1; j < i; j++){a[i][j] = a[i - 1][j - 1] + a[i - 1][j];}}for (i = 0; i < n; i++){//打印空格for (k = 0; k < n - 1 - I; k++){printf(" ");}//打印三角形for (j = 0; j <= i; j++){printf("%4d", a[i][j]);}printf("\n");}return 0;
}
思路:
第一步:设一个全为1的数组
第二步:从第i = 2,j = 1开始a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
j<i ---> 结束
第三步:6*6的矩阵的下半部分j<=i,加上空格
比如n = 6
i 空格
0 5 --->n - 1 - i -----数空格要减去3个,因为输出形式是%4d,在a[i][j]<10有三个空格在前7
1 4
2 3
3 2
4 1
5 0
第四步:打印三角形
4.判断回文字符串
输入一个字符串,判断该字符串是否为回文。回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的。
输入格式:
输入在一行中给出一个不超过
80
个字符长度的、以回车结束的非空字符串。输出格式:
输出在第1行中输出字符串。如果它是回文字符串,在第2行中输出
Yes
,否则输出No
。输入样例1:
level
输出样例1:
level Yes
输入样例2:
1 + 2 = 2 + 1 =
输出样例2:
1 + 2 = 2 + 1 = No
如果不相等就退出循环,---》left<=right--不是回文(循环中止)
left>right--(循环正常结束,没有中间跳出循环)---是回文
#include <stdio.h>
int main()
{char a[10];int i = 0, left, right;while ((a[i] = getchar()) != '\n'){i++;}a[i] = '\0';left = 0, right = i - 1;while (left <= right){if (a[left] != a[right]){break;}left++, right--;}for (i = 0; a[i] != '\0'; i++){putchar(a[i]);}printf("\n");if (left <= right)printf("No");elseprintf("Yes");return 0;
}
5.凯撒密码
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
输入样例1:
Hello Hangzhou 2
输出样例1:
Jgnnq Jcpibjqw
输入样例2:
a=x+y -1
输出样例2:
z=w+x
思路:offset>0
A-Z a[i]=(a[i]-'A'+offset)%26+'A'---向后偏移
offset<0 a[i] = (a[i] - 'A' + offset+26) % 26 + 'A' ---向前偏移
#include <stdio.h>
int main()
{char a[80];int i, offset;i = 0;while ((a[i] = getchar()) != '\n'){i++;}a[i] = '\0';scanf("%d", &offset);offset %= 26;for (i = 0; a[i] != '\0'; i++){if (a[i] >= 'a' && a[i] <= 'z'){if (offset >= 0)putchar((a[i] - 'a' + offset) % 26 + 'a');elseputchar((a[i] - 'a' + offset + 26) % 26 + 'a');}else if (a[i] >= 'A' && a[i] <= 'Z'){if (offset >= 0)putchar(a[i] = (a[i] - 'A' + offset) % 26 + 'A');elseputchar(a[i] = (a[i] - 'A' + offset + 26) % 26 + 'A');}else{putchar(a[i]);}}return 0;
}
6.字符串转换成十进制整数
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
#include <stdio.h>
int main()
{int i = 0, j, k, k1, flag = 1,num;char a[80], b[80];//输入while ((a[i] = getchar()) != '#'){i++;}a[i] = '\0';//找出‘-’的下标kfor (i = 0; a[i] != '\0'; i++){if (a[i] == '-'){k = i;break;}}//找出第一个十六进制数的下标k1for (i = 0; a[i] != '\0'; i++){if ((a[i] >= 'a' && a[i] <= 'f') || (a[i] >= 'A' && a[i] <= 'F') || (a[i] >= '0' && a[i] <= '9')){k1 = i;break;}}//比较k1,kif (k < k1){flag = 0;}//存放十六进制i = 0, j = 0;while (a[i] != '\0'){if ((a[i] >= 'a' && a[i] <= 'f') || (a[i] >= 'A' && a[i] <= 'F') || (a[i] >= '0' && a[i] <= '9')){b[j] = a[i];j++;}i++;}b[j] = '\0';num = 0;//转换for (j = 0; b[j] != '\0'; j++){if (b[j] >= '0' && b[j] <= '9')num = num * 16 + b[j] - '0';else if (b[j] >= 'A' && b[j] <= 'F')num = num * 16 + b[j] - 'A' + 10;else if (b[j] >= 'a' && b[j] <= 'f')num = num * 16 + b[j] - 'a' + 10;}//若为负数if (flag == 0)num = -num;//打印printf("%d\n", num);return 0;
}
思路都在//里,比较清晰了
7.统计大写辅音字母
英文辅音字母是除
A
、E
、I
、O
、U
以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出字符串中大写辅音字母的个数。
输入样例:
HELLO World!
输出样例:
4
#include <stdio.h>
int main()
{char a[80];int i = 0, count = 0;//输入while ((a[i]=getchar())!='\n'){i++;}a[i] = '\0';for (i = 0; a[i] != '\0'; i++){if (a[i] >= 'A' && a[i] <= 'Z'){if (a[i] != 'A' && a[i] != 'E' && a[i] != 'I' && a[i] != 'O' && a[i] != 'U')count++;}}printf("%d\n", count);return 0;
}
8.字符串替换
本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:
原字母 对应字母 A Z B Y C X D W … … X C Y B Z A 输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出替换完成后的字符串。
输入样例:
Only the 11 CAPItaL LeTtERS are replaced.
输出样例:
Lnly the 11 XZKRtaO OeGtVIH are replaced.
#include <stdio.h>
int main()
{char a[80];int i = 0;//输入while ((a[i] = getchar()) != '\n'){i++;}a[i] = '\0';//在大写字母中进行转换for (i = 0; a[i] != '\0'; i++){if (a[i] >= 'A' && a[i] <= 'Z'){putchar('Z' - (a[i] - 'A'));}elseputchar(a[i]);}return 0;
}
如何理解式子 'Z'-(a[i]-'A')?
---先看a[i]-'A' 求出偏移量
例如a[i]=='B',偏移量==1,'Z'-1='Y'
把26字母看成一个圆圈