Lab10-字符串和数组初步
文章目录
1. 包含元音的单词【中等】
(选择)输入一个英文单词(只包含大写字母和小写字母),如果这个英文单词包含元音字母(a,e,i,o,u)可以为大写,就输出‘yes’,否则就输出‘no’。
样例输入1:
HELLO
样例输出1:
yes
样例输入2:
Why
样例输出2:
no
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[50];
gets(str);
int i;
int flag = 0;
for(i=0; i<strlen(str); i++){
if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u'
||str[i]=='A'||str[i]=='E'||str[i]=='I'||str[i]=='O'||str[i]=='U'){
printf("yes");
flag = 1;
break;
}
}
if(flag==0){
printf("no");
}
return 0;
}
2. 字符串的循环右移【中等】
(多维数组、字符串、指针)
84. 在一行中输入2个字符串S1和S2,判断S1是否为S2循环右移的结果。
【输入】
以1个空格分隔的2个字符串S1和S2,
字符串本身不含空格,长度均不超过80,
【输出】
判断结果,详见样例输出
【样例输入1】
waterbottle erbottlewat
【样例输出1】
“waterbottle” is a rotation of “erbottlewat”
【样例输入2】
water erbottlewat
【样例输出2】
“water” is NOT a rotation of “erbottlewat”
#include <stdio.h>
#include <stdlib.h>
int main()
{
char s1[1000],s2[1000],s3[1000];
scanf("%s %s",s1,s2);
strcpy(s3,s2);
int flag = 0;
if(strlen(s1) == strlen(s2)){
int length = strlen(s2);
for(int i=1; i<=length; i++){
if(strcmp(s1,s2) == 0){
flag = 1;
}
int temp = s2[length-1];
for(int j=length-1; j>=0; j--){
s2[j] = s2[j-1];
}
s2[0] = temp;
}
}
if(flag){
printf("\"%s\" is a rotation of \"%s\"",s1,s3);
}
else{
printf("\"%s\" is NOT a rotation of \"%s\"",s1,s3);
}
return 0;
}
3. 16进制转10进制【中等】
(多维数组、字符串、指针)
85. 定义一个函数hex2int,
将一个字符串表示的16进制数转换成一个10进制数。
写出main函数测试hex2int
int hex2int(char s[]);
/* PreCondition:
s is a string consisting of 0~9,A-F or a-f
with at most 8 characters
PostCondition:
return a decimal number equivalent to s
Examples: “100”=>256 ; “a”=> 10 ; “0”=> 0
*/
【输入】
一个16进制字符串,只包含0~9,A-F或a-f,不超过8个字符。
【输出】
对应的十进制整数。
【样例输入1】
100
【样例输出1】
256
【样例输入2】
a
【样例输出2】
10
#include <stdio.h>
#include <stdlib.h>
long long hex2int(char s[]);
int main()
{
char str[9];
scanf("%s",str);
printf("%lld",hex2int(str));
return 0;
}
long long hex2int(char str[])
{
long long total=0;
for(int i=0; i<strlen(str); i++){
int n = strlen(str)-(i+1);
if(str[i]<='F' && str[i]>='A'){
total += (str[i]-'A'+10) * pow((float)16,(float)n);
}
else if(str[i]<='f' && str[i]>='a'){
total += (str[i]-'a'+10) * pow((float)16,(float)n);
}
else{
total += (str[i]-'0') * pow((float)16,(float)n);
}
}
return total;
}
4. 最长单词【中等】
86.定义函数LongestWord找出一个字符串中最左边的最长单词。
单词之间用一个空格或多个空格分隔。
该函数不允许修改str字符串
//********** Specification of LongestWord **********
void LongestWord(const char str[], char result[]);
/* PreCondition:
str is a string with length no more than 80
PostCondition:
find the first longest word in str,
and put it in result.
changing str is not allowed
*/
【输入】
一个字符串,不超过80个字符。
【输出】
该字符串中最长单词。如果有多个,则输出最左边的。。【行末必须输出换行!!!】
【样例输入1】
aaa a aaaa aa
【样例输出1】
aaaa
【样例输入2】
a b
【样例输出2】
a
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char s[81],temp[81];
memset(temp, 0, sizeof(temp));
gets(s);
int max=0;
char *p=NULL, *q=NULL, *r=NULL;
p=s;
while(*p!='\0'){
if((*p>='a' && *p<='z') || (*p>='A' && *p<='Z')){
q = p;
while((*p>='a' && *p<='z') || (*p>='A' && *p<='Z')){
p++;
}
r = p;
}
int length = r-q;
if(max<length){
max = length;
strncpy(temp, q, max);
}
p++;
}
printf("%s\n",temp);
return 0;
}
5. 判断回文【中等】
(多维数组、字符串、指针)
87. 判断字符串(可能有空格,长度不超过80,
由用户从键盘输入)是否回文,
满足回文的字符串特点是,
从左向右读取的字符序列正好与从右向左的字符序列相等。
e.g: madam 是回文 而 This is an apple 不是回文
【输入】
一个字符串,不超过80个字符。
【输出】
如果输入字符串为回文字符串,则输出True, 否则输出False
【样例输入1】
madam
【样例输出1】
True
【样例输入2】
This is an apple
【样例输出2】
False
#include <stdio.h>
#include <stdlib.h>
int main()
{
char s[81];
gets(s);
int len = strlen(s), flag=0;
char *p,*q;
p = s;
q = s+len-1;
int i=0;
while(*p != '\0'){
if(*p == *q){
i++;
}
else{
flag = 0;
}
p++;
q--;
}
if(i == len){
flag = 1;
}
if(flag==1){
printf("True");
}
else{
printf("False");
}
return 0;
}
6. 花布条的裁剪【中等】
(字符串,数组)
现有一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入格式:包含多组数据,每组数据输入两个用空格隔开的字符串A和B,字符串A表示花布条,字符串B表示小饰条。字符串只包含字母和数字,长度均不超过1000个字符。如果遇见字符’#’,表示输入结束。
输出格式:对应每组数据输出能从花布条中剪出的最多小饰条个数,如果一块都没有就输出0。
样例输入:
abcde a3
aaaaaa aa
样例输出:
0
3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char A[1001],B[1001];
int i=0,j=0,sum=0;
int len1, len2;
while(1){
scanf("%s",A);
if(strcmp(A, "#")==0) break;
/*strcmp(a, b)这是一个字符串比较函数,
如果a的字符串内容与b的字符串内容相同的话,strcmp == 0*/
scanf("%s",B);
i = j = sum = 0;
len1 = strlen(A);
len2 = strlen(B);
/*while(i<len1 && j<len2){
if(A[i] = B[j]){
i++;
j++;
}
else{
i = i-j+1;
j = 0;
}
if(j==len2-1){不能单判断,如果符合的话就加了两遍不对
sum++;
i++;
j=0;
}
}*/
while(i<len1 && j<len2){
if(j==len2-1 && A[i] == B[j]){//特判最后一个特殊情况
sum++;
i++;
j=0;
continue;
/*continue语句的作用是跳过本次循环体中余下尚未执行的语句,
立即进行下一次的循环条件判定,可以理解为仅结束本次循环。*/
}
if(A[i] == B[j]){
i++;
j++;
}
else{
i = i-j+1;
j = 0;
}
}
printf("%d\n",sum);
}
return 0;
}
7.数位和【中等】
“数位和”是指:把一个整数的各位累加后的结果。
例如正整数 123456 的数位和是 1+2+3+4+5+6=21。
现在,请你帮忙计算一个整数 n 在 r 进制下的数位和,并用相应的进制输出结果。
【Input】
第 1 行:整数 T(1≤T≤10) 为问题数。
第 2 行:第一个问题的数据。包含两个正整数 n(1≤n≤2147483647) 和 r(2≤n≤16)。
第 3 ∽ T+1 行:后面问题的数据,格式与第一个问题相同。
【Output】
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后在一行中输出用 r 进制表示的十进制正整数 n 转换成 r 进制后的数位和。
【Examples】
【Input】
2
123456 10
123456 2
【Output】
case #0:
21
case #1:
110
【Note】
当r进制大于10时,用大写字母A-F表示大于10的数字。
例如:十进制数29转换为16进制为 1D,此时数位和为14,则正确的输出应为:E
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int t,total,order=0,num,jinzhi;
int i,j;
scanf("%d",&t);
for(i=0; i<t; i++){
total = 0;
scanf("%d %d",&num,&jinzhi);
while(num!=0){
total += num%jinzhi;
num /= jinzhi;
}
j = 0;
int arr[500] = {0};
while(total!=0){
arr[j] = total%jinzhi;
total /=jinzhi;
j++;
}
printf("case #%d:\n",order);
for(j=j-1; j>=0; j--){
if(arr[j]<10)
printf("%d",arr[j]);
else
printf("%c",arr[j]-10+'A');
}
printf("\n");
order++;
}
return 0;
}