2021计算导论第十二次练习题目

6-1 实验9_5_反向打印字符串 (100 分)

设计递归函数将字符串str中的内容反向打印出来。

此题要求递归求解,且不允许使用全局变量,否则没有分。

函数接口定义:

void reversePrint(char str[]) ;

其中 str 是用户传入的参数, 为指定字符串。函数没有返回值。

裁判测试程序样例:

#include<stdio.h>

//将字符串str中的内容反向打印的函数 
void reversePrint(char str[]) ;

int main()
{
    char    s[100] ;

    scanf( "%s" , s );    
    reversePrint(s) ;
    printf("\n") ;

    return 0;
}

/* 请在这里填写答案 */

输入样例:

ABCdefg

输出样例:

gfedCBA
void reversePrint(char str[])
{
    if(str[0]=='\0')
    {
        return;
    }
    else
    {
        reversePrint(&str[1]);
        printf("%c",str[0]);
        //逐步向后截取子字符串,直到截没为止,这个操作的实现方法就是“&str[1]”。注意不可丢掉取地址符,因为“str[1]”是数组中的一个元素而非整个数组。
    }
}

6-2 实验9_6_单词字符统计 (100 分)

请设计一个函数,参数为一个单词(字符串),假设max是单词中出现次数最多的字母的出现次数,min是单词中出现次数最少的字母的出现次数,如果max-min是一个质数,则返回则max-min,否则返回-1。

注意:判断一个整数是否为质数的函数不需要实现,要求直接调用下边的函数来判断

int        isPrime( int n ) ;

该函数判断一个整数是否是质数,是则返回1,否则返回0。

测试程序输入:

只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。

测试程序输出:

如果输入单词的max-min是一个质数,输出max-min的值,否则输出-1。

函数接口定义:

int        getResult( char word[] ) ;

其中 word 是用户传入的参数,为待处理单词。函数须按要求返回max-min或-1。

裁判测试程序样例:


#include<stdio.h>

#define        MAXLEN        110

int        isPrime( int n ) ;//判断一个整数是否是质数,是则返回1,否则返回0 
int        getResult( char word[] ) ;

int main()
{
    char    word[MAXLEN] ;

    scanf( "%s" , word ) ;            
    printf( "%d\n" , getResult( word ) );

    return 0;
}

/* 请在这里填写答案 */

输入样例:

banana

输出样例:

2
int getResult( char word[] )
{
    int i,max,min,result,change,flag=1;
    int STO[100]={};
    for(i=0;word[i]!='\0';i++)
    {
        change=word[i]-97;
        STO[change]++;
    }
    for(max=0,i=0;i<26;i++)
    {
        if(STO[i]>max)
        {
            max=STO[i];
            if(flag==1)
               {
                   min=STO[i];
                   flag=0;
               }
        }
        if(STO[i]<min&&STO[i]>0)
        {
            min=STO[i];
        }
    }
    result=max-min;
    if(isPrime(result)==1)
        return result;
    else
        return -1;
}
//20220123主要优化:使用三目运算符,改变min的判断机制,使代码更简洁
int getResult( char word[] )
{
    int i,max,min=100,result,change,flag=1;
    int STO[100]={};
    for(i=0;word[i]!='\0';i++)
    {
        change=word[i]-97;
        STO[change]++;
    }
    for(max=0,i=0;i<26;i++)
    {
        if(STO[i]>max)
        {
            max=STO[i];
        }
        if(STO[i]<min&&STO[i]>0)
        {
            min=STO[i];
        }
    }
    return isPrime(max-min)==1?max-min:-1;
}

6-3 实验9_7_设计函数int getVowel(char str[],char vowel[]); (100 分)

设计函数int getVowel(char str[],char vowel[]),将只包含小写字母的字符串str中的元音字母“a”“e”“i”“o”“u”复制到字符数组vowel,并返回字符串vowel的长度。

函数接口定义:

函数原型如下:
int getVowel(char str[],char vowel[]);

其中 str 和 vowel 都是用户传入的参数。 str 为原始字符串; vowel 为元音字母字符串。函数的返回值为 vowel 的长度。

裁判测试程序样例:

函数被调用进行测试的例子如下:
#include <stdio.h>
#include<stdio.h>

//将只包含小写字母的字符串str中的元音字母复制到字符数组vowel,并返回元音字符的个数。
int getVowel(char str[],char vowel[]);

int main()
{
    char    vowel[101] , str[101];//每个数组都至少要101个字节 
    int        len ;

    scanf("%s",str);    //读入字符串 
    len = getVowel(str,vowel);    //复制 
    if ( len > 0 ) printf("%d %s\n", len , vowel);    //输出复制后结果 
    else printf("%d\n", len);//仅输出长度 

    return 0;    
}

/* 请在这里填写答案 */

输入样例:

abcdefghiijklmn

输出样例:

4 aeii
int getVowel(char str[],char vowel[])
{
    int i,t=0,sum=0;//此处必须赋初值
    for(i=0,t=0;str[i]!='\0';i++)
    {
        if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u')
        {
            vowel[t]=str[i];
            t++;
            sum++;
        }
    }
    vowel[t]='\0';
    return sum;
}

6-4 实验10_1_英超一 (100 分)

英格兰足球超级联赛(Premier League),通常简称“英超”,是英格兰足球总会属下的最高等级职业足球联赛。

英超联赛采取主客场双循环赛制比赛,每支队伍与各球队对赛两次,主客各一次。由1995/96赛季开始参赛球队由22队减至20队,每支球队共进行38场赛事,主场和客场比赛各有19场。每场胜方可得3分,平局各得1分,负方得0分,按各队于联赛所得的积分排列。

现请你写一个函数来计算某支球队的当前的积分。

输入:

只有一行,为一个字符串。该字符串包含不多于40个字符,每个字符代表该队一轮比赛的结果。字符串中只包含W(代表该队某轮取胜)、D(代表该队某轮和对手打平)和L(代表该队某轮失利)三种字符。

输出:

只有一个整数,为根据输入数据,计算出的该队当前的积分。

函数接口定义:

int        getScore(char * s) ;

其中 s 为用户传入的参数,为指向某队当前的全部赛果的指针。函数须返该队当前积分。

裁判测试程序样例:

#include <stdio.h>

#define        MAX        48

int        getScore(char * s) ;

int main()
{
    char    input[MAX] ;
    int        score ;

    scanf("%s",input);
    score = getScore(input) ;
    printf("%d\n",score) ;

    return 0;
}

/* 请在这里填写答案 */

输入样例:

WDWWWWWWWWWWWWWWWWWWDWLWWDWWWWWLWWWDWW

输出样例:

100
int getScore(char * s)
{
    int score,i;
    for(score=0,i=0;s[i]!='\0';i++)//错误点:将s[i]只写成了i
    {
        if(s[i]=='W')
        {
            score+=3;
        }
        else if(s[i]=='D')
        {
            score++;
        }
    }
    return score;
}

7-1 实验9_1_括号匹配 (100 分)

任意给定一个字符串,字符串中包含除了空白符、换行符之外的任意字符。你的任务是检测字符串中的圆括号是否配对,即“(”与“)”是否配对。如字符串“((a+b)* (c+d))”中是配对的,而“((a+b)*) c+d))”则不配对。

输入格式:

一个长度不超过100的非空字符串,该字符串中不会出现空格、换行符。

输出格式:

匹配及不匹配见样例。

输入样例一:

((a+b)*(c+d))

输出样例一:

parentheses match!

输入样例二:

((a+b)*)c+d))

输出样例二:

parentheses do not match!
#include<stdio.h>
int main()
{
    int flag,i,left,right;
    char STR[110];
    scanf("%s",STR);
    for(flag=1,i=0;STR[i]!='\0'&&flag==1;i++)
    {
        if(STR[i]=='(')
        {
            left++;
        }
        else if(STR[i]==')')
        {
            right++;
        }
        if(left<right)
        {
            flag=0;
        }
    }
    if(flag==1)
        printf("parentheses match!\n");
    else
    {
        printf("parentheses do not match!\n");
    }
}
//20220123
#include <stdio.h>
int main(){
    int num=0;
    char str[101];
    scanf("%s",str);
    for (int i = 0; str[i]!='\0'&&num >= 0 ; ++i) {
        if (str[i]=='(')
            num++;
        else if (str[i]==')')
            num--;
    }
    if (num==0)
        printf("parentheses match!\n");
    else printf("parentheses do not match!\n");
}

7-2 实验9_2_身份证号码最后一位 (100 分)

身份证编码规则如下:根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。

顺序码(身份证第十五位到十七位)是县级公安机关所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:005的就是个男性,而且和他同年月日生的男性至少有两个,他们的后四位是001*和003*。分配顺序码中“999、998、997、996”四个顺序号分别为男女性百岁以上老人专用的特定编号。 校验码(身份证最后一位)是根据前面十七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。

从1999年10月1日起,全国实行公民身份证号码制度,居民身份证编号由原15位升至18位。前6位为地址码;第七位至14位为出生日期码,此码由6位数改为8位数,其中年份用4位数表示;第15位至17位为顺序码,取消了顺序码中对百岁老人使用的特定编号;第十八位为校验码,主要是为了校验计算机输入公民身份证号码的前17位数字是否正确,其取值范围是0至10,当值等于10时,用罗马数字符X表示。

计算方法

1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

2、将这17位数字和系数相乘的结果相加。

3、用加出来和除以11,看余数是多少?

4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X...)

5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字X。

例如:某男性的身份证号码为【53010219200508011X】, 我们看看这个身份证是不是符合计算规则的身份证。

首先我们得出前17位的乘积和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,然后用189除以11得出的结果是189÷11=17余下2,187÷11=17,还剩下2不能被除尽,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。

现在请你写一段程序来判断一个身份证号码的最后一位是否与上述规则相符。

输入格式:

第一行一个整数T(0<T<100),表示有T行测试数据。后边是T行每行是一个18位的身份证号码(测试数据前17位保证符合身份证号码的要求,罗马数字X就是大写的英文字母X)。

输出格式:

T行,与输入的T行测试数据相对应,如果该行测试数据最后一位符合所述算法则输出right,否则输出wrong。

输入样例:

2
34052419800101001X
310105199412049278

输出样例:

right
wrong
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int T,i,j,result,com;
    char last;
    scanf("%d",&T);
    char IDs[110][18];
    int COE[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//系数
    for(i=0;i<T;i++)
    {
        scanf("%s",IDs[i]);
    }
    for(i=0;i<T;i++)
    {
        result=0;
        for(j=0;j<17;j++)
        {
            result+=(IDs[i][j]-'0')*COE[j];//字符转int方法,不转换在使用ascii码计算
        }//字符串转int方法:atio(str);
        com=result%11;


        switch(com)
        {
            case 0:last='1';break;
            case 1:last='0';break;
            case 2:last='X';break;
            case 3:last='9';break;
            case 4:last='8';break;
            case 5:last='7';break;
            case 6:last='6';break;
            case 7:last='5';break;
            case 8:last='4';break;
            case 9:last='3';break;
            case 10:last='2';break;
        }
        if(last==IDs[i][17])
        {
            printf("right\n");
        }
        else
            printf("wrong\n");
    }

}
//20220124
//需要两个数列一一对应?设计两个并列的数组,用for循环的变量i来实现一一对应
//ascii码转int的新方法?直接强制类型转换
#include <stdio.h>
int main(){
    int T;
    int xishu[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char yanzhengma[11]={'1','0','X','9','8','7','6','5','4','3','2'};
    char ID[18];
    scanf("%d",&T);
    for (int i = 0,sum=0; i < T; ++i) {
        scanf("%s",ID);
        for (int j = 0; j < 17; ++j) {
            sum+=(int)(ID[j]-'0')*xishu[j];
        }
        if (ID[17]==yanzhengma[(char)(sum%11)])
            printf("right\n");
        else printf("wrong\n");
    }
}

7-3 实验9_3_字母统计 (100 分)

任意给定一个字符串,字符串中包含除了空白符、换行符之外的的任意字符。你的任务是统计出现在该字符串中的各字母(即“A—Z”,“a—z”)的个数(区分大小写)。

输入格式:

一个长度不超过100的非空字符串。字符串中不会出现空白符、换行符。

输出格式:

字符串中出现的字母的统计信息,每个字母的统计信息占一行,按照字母的ASCII码的顺序输出。

输入样例:

AAAsdf&^%DF879as

输出样例:

注意单词“time”不论单复数,一律输出复数形式“times”

The character A has presented 3 times.
The character D has presented 1 times.
The character F has presented 1 times.
The character a has presented 1 times.
The character d has presented 1 times.
The character f has presented 1 times.
The character s has presented 2 times.
#include<stdio.h>
int main()
{
    int i,num,j;
    char A[100];
    int CAP[26];
    int LOW[26];
    scanf("%s",A);
    for(j=0;j<26;j++){
        CAP[j]=0;
        LOW[j]=0;
    }
    for(i=0;;i++)//这里不能写成i!=='\0',因为i是个int,字符们在参与运算时实际用的是其ascii码,而\0的ascii码就等于0,故恒为假了!
    {
        if(A[i]>='A'&&A[i]<='Z')
        {
            num=A[i]-65;
            CAP[num]++;
        }
        else if(A[i]>='a'&&A[i]<='z')
        {
            num=A[i]-97;
            LOW[num]++;
        }
        if(A[i]=='\0')break;
    }
    for(i=0;i<26;i++)
    {
        if(CAP[i]!=0)
        {
            printf("The character %c has presented %d times.\n",(char)(i+65),CAP[i]);
            //此处的i不需要先加1再加65
        }
    }
    for(i=0;i<26;i++)
    {
        if(LOW[i]!=0)
        {
            printf("The character %c has presented %d times.\n",(char)(i+97),LOW[i]);
        }
    }
}

7-4 实验9_4_句子输出 (100 分)

请按要求输出字符串。

输入格式:

第一行为一个整数n(0<n<=10),表示将要输入的字符串的个数。后边n行,每行一个字符串(长度不超过30,且不包含空格),第n+2行为n个用空格分隔的整数,这n个整数为0到n-1,代表输出字符串的顺序。如果第一个数字为1,则代表第1(从0开始计数)个输入的字符串第1(从1开始计数)个输出。第二数字为0,则代表则代表第0(从0开始计数)个输入的字符串第2(从1开始计数)个输出。后边依此类推。

输出格式:

共n行,每行一个字符串,输出顺序为输入中最后一行指定的顺序。。

输入样例:

3
world
Hello
!
1 0 2

输出样例:

Hello
world
!
#include<stdio.h>
int main()
{
    int i,n;
    scanf("%d",&n);
    char ELE[n][1000];
    for(i=0;i<n;i++)
    {
        scanf("%s",ELE[i]);
    }
    int SEA[n];
    for(i=0;i<n;i++)
    {
        scanf("%d",&SEA[i]);//数组中的一个元素是int,给int赋值要&
    }
    for(i=0;i<n;i++)
    {
        printf("%s\n",ELE[SEA[i]]);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值