Lab10-字符串和数组初步(2019.12.03)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值