bupt2024大一上计导状态机练习

7-1 整数格式

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

给定一个字符串,请分析该字符串格式,检查它是否符合10进制整数的表示格式。

特别提醒:
1、字符串如果有前导0,如0123,则该字符串不符合整数格式;
2、+0,-0是不符合整数格式的,但+1和-1都是符合的;
3、科学记数法是不符合的。

输入格式:

第一行为一个整数t(0<t<=10),代表测试用例组数。后边t行字符串(每个字符串长度都不超过30,且不包含空格和制表符tab),每行代表一个待检测字符串。

输出格式:

共t行,依次对应输入的测试用例,如果符合则输出yes,否则输出no。

输入样例:

8
1
-1
200
999
-999
0123
+0
-0

输出样例:

yes
yes
yes
yes
yes
no
no
no

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include<stdio.h>
#include<string.h>
int check(char*s){
    if(s[0]=='+'&&s[1]=='0'){
        return 0;
    }
    if(s[0]=='-'&&s[1]=='0'){
        return 0;
    }
    if(s[0]=='0'&&s[1]!='\0'){
       return 0;
    }
    if(s[0]=='+'&&s[1]=='\0'){
        return 0;
    }
    if(s[0]=='-'&&s[1]=='\0'){
        return 0;
    }
    int len = strlen(s);
    int i=0;
    if(s[0]=='+'||s[0]=='-'){
        i++;
    }
    for(;i<len;i++){
        if(s[i]<'0'||s[i]>'9'){
            return 0;
        }
    }
    return 1;
}
int main(){
    int t=0;
    scanf("%d",&t);
    char s[31];
    for(int i=0;i<t;i++){
        scanf("%s",s);
        if(check(s)){
            printf("yes\n");
        }else{
            printf("no\n");
        }
    }
    return 0;
}

7-2 过滤注释

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

C语言的注释分为两种,第一种:在一行源代码中“//”后的内容为注释内容。第二种:“/*”与“*/”之间的内容为注释内容。第三种(其实是第二种的特例):程序中只出现了“/*”,没有“*/”与之对应,那么将“/*”后的全部内容都要过滤掉。注意,只要是注释内容,那么注释内容中的字符应该全部忽略,即不起任何的作用。例如“/*”与“*/”之间如果再有“//”,那么“//”不应起作用;如果“//”后同行内再有“/*”,那么“/*”也不应起作用。你的任务是将一段源代码中所有注释过滤掉。在本过滤注释系统中,你可以忽略源文件中双引号导致“//”、“/*”、“*/”失去作用的情况,即只要“//”、“/*”、“*/”不是注释内容,在任何情况下都起作用。

输入格式:

若干行,为一段待处理的C语言源代码。测试用例保证该段代码的最后一个字符为‘$’,且输入中只包含这一个‘$’。该字符为输入结束标志,不是源代码中的内容。

输出格式:

若干行,为去除注释的C代码。

输入样例:

/*
        @Author: BUPT
        @Date: 2010 8 26
*/
#include<stdio.h>
int main()
{
        int a = 10 , b = 2 , c ;
        c = a / b ; //I just want to test '/'
        printf("I love programming C.\n") ; //"printf" is a useful function /*
        printf("I hope you love it too!\n") ;
        /*
        //C is not always hard , if you love it , it will not treat you rough.
        */
        return 0 ;
}
$

输出样例:


#include<stdio.h>
int main()
{
        int a = 10 , b = 2 , c ;
        c = a / b ; 
        printf("I love programming C.\n") ; 
        printf("I hope you love it too!\n") ;
        
        return 0 ;
}

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include <stdio.h>

int main(){
    char c;
    int state;
    while((c = getchar())!='$')
    {
        switch (state)
        {
            case 0:
                if(c=='/')
                {
                    state = 1;
                }
                else
                {
                    putchar(c);
                }
                break;
            case 1:
                if(c=='/')
                {
                    state = 2;
                }
                else if(c=='*')
                {
                    state = 3;
                }
                else
                {
                    putchar('/'); putchar(c);
                    state = 0;
                }
                break;
            case 2:
                if(c=='\n')
                {
                    state = 0; 
                    putchar('\n');
                }
                break;
            case 3:
                if(c=='*')
                {
                    state = 4;
                }
                break;
            case 4:
                if(c=='/')
                {
                    state = 0;
                }
                else if(c=='*')
                {
                    state = 4;
                }
                else
                {
                    state = 3;
                }
                break;
        }
    }
}

7-3 抓老鼠啊~亏了还是赚了?

分数 20

全屏浏览

切换布局

作者 周强

单位 青岛大学

某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X)。捕鼠夹可重复利用,不计成本,奶酪每块3元。

聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥:

  • 若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期。在不高兴期间,不派出老鼠。不高兴期结束之后,派出老鼠。
  • 若有捕鼠夹(T),这只老鼠被引诱吃掉奶酪并被打死(Dead),老鼠们会有长达两天(也就是第二和第三天)的伤心期。在伤心期间,不派出老鼠。伤心期结束之后,派出老鼠。在这种情况下,抓到1只老鼠可获得奖励10元,但同时也耗费了一块奶酪。注意,如果某一天放置了捕鼠夹但老鼠没有出现,则没有耗费奶酪。
  • 若有奶酪(C),老鼠吃了奶酪会很开心(Happy!),会有长达两天(第二和第三天)的兴奋期。在兴奋期间,即使叠加了不高兴或者伤心,也必定派出老鼠。在这种情况下,没抓到老鼠,而且耗费了一块奶酪。注意,如果某一天放置了奶酪但老鼠没有出现,则奶酪可以下次再用,没有耗费。

现在给你连续几天的操作序列,且已知第一天肯定会派出老鼠,请判断老鼠每天的状态,并计算盈利。

输入格式:

输入在一行中给出连续的由CTX组成的不超过70个字符的字符串,以$结束。字符串中每个字符表示这一天的操作( 即X:什么都不放;T:放捕鼠夹;C:放奶酪)。题目保证至少有一天的操作输入。

输出格式:

要求在第一行输出连续的字符串,与输入相对应,给出老鼠的状态:

  • ! 表示派出老鼠吃到奶酪
  • D 表示派出老鼠被打死
  • U 表示派出老鼠无所获
  • - 表示没有派出老鼠

第二行则应输出一个整数表示盈利。(如果有亏损,则是负数)

输入样例1:

TXXXXC$

输出样例1:

D--U-! 
4

输入样例2:

CTTCCX$

输出样例2:

!DD--U 
11

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

# include <stdio.h>

int main(){
    char ch;
    int unhappy, sad, happy;
    unhappy = 0;
    sad = 0;
    happy = 0;
    int res = 0;

    while((ch = getchar()) != '$'){
        if(happy >0){
            happy--;
            if(sad > 0){
                sad--;
            }
            if(unhappy > 0){
                unhappy--;
            }
        }else if(sad > 0){
            sad--;
            putchar('-');
            continue;
        }else if(unhappy > 0){
            unhappy--;
            putchar('-');
            continue;
        }

        if(ch=='X'){
           putchar('U');
           unhappy = 1;
        }
        else if(ch == 'T'){
            putchar('D');
            sad =2;
            res += 7;
        }
        else if(ch == 'C'){
            putchar('!');
            happy = 2;
            res -=3;
        }
    }
    printf("\n%d\n",res);

    return 0;
}

7-4 龟兔赛跑

分数 20

全屏浏览

切换布局

作者 陈建海

单位 浙江大学

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离(平局输出乌龟或兔子跑完的距离均可)。

输入样例:

242

输出样例:

@_@ 726

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include <stdio.h>

int main()
{
    int t;
    scanf("%d", &t);

    int ra = 0, tu = 0;
    int rest = 0;

    long long int s = 0;
    int i =1;

    for(;i<=t;i++){
        tu +=3;
        if(rest==0){
            ra+=9;
        }else if(rest!=0){
            rest--;
        }
        if(i%10==0&&rest==0){
            if(ra>tu){
                rest+=30;
            }
        }
    }
    if(ra>=tu){
        s = ra;
        if(ra>tu){
            printf("^_^ ");
        }else{
            printf("-_- ");
        }
    }else{
        s = tu;
        printf("@_@ ");
    }
    printf("%lld\n", s);


    return 0;
}

7-5 刷题与Z老师的头发

分数 10

全屏浏览

切换布局

作者 周强

单位 青岛大学

在Pintia上,每天Z老师出题、小盆友们刷题。Z老师的头发遵从以下规律:

1、每天生长出60根头发;

2、每出一道题,减少20根头发;

3、每天结束时统计累积做题情况:

(1)若出的题全部被做出来,则Z老师产生“没题焦虑”,减少30根头发;

(2)若小盆友做出来的题少于50%,则Z老师产生“学生不用功焦虑”,减少70根头发。

现给定连续N天的出题、刷题情况,请计算Z老师头发的变化情况。

输入格式:

第一行输入一个正整数N (N<20);

接下来N行,每行输入两个非负整数,分别是一天的出题数量q和刷题(做出来)数量s,以空格间隔。

题目输入保证出题总数量不超过N*10,并且每天的刷题量不会使累积刷题数量超过累积出题数量。

输出格式:

若Z老师头发增加K根,则输出+K;若Z老师头发减少K根,则输出-K;若没有变化,则输出--

输入样例1:

3
5 3
5 1
5 11

输出样例1:

-220

输入样例2:

3
3 2
3 2
3 2

输出样例2:

--

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);

    int hair = 0;

    int q, s;
    int Q=0, S=0;

    for(int i = 0; i<n; i++){
        scanf("%d %d", &q, &s);
        hair+=60;
        hair -= q*20;
        Q += q;
        S += s;
        if(2*S<Q){
            hair -=70;
        }else if(S == Q){
            hair -= 30;
        }

    }
    if(hair>0){
        printf("+%d", hair);
    }
    else if(hair<0){
        printf("%d", hair);
    }else{
        printf("--");
    }

    return 0;
}

7-6 英语老师小助手

分数 20

全屏浏览

切换布局

作者 陈越原创 季江民修改

单位 浙江大学

英语老师要求学生按照如下规则写一串字母:

规则1、如果写了某个大写字母,下一个就必须写同个字母的小写,或者写字母表中前一个字母的大写;

规则2、如果写了某个小写字母,下一个就必须写同个字母的大写,或者写字母表中下一个字母的小写。

例如 zZzZYXWwxyYX 就是一个合法的字母串;而 wVUuvUTsR 就是非法的。

现在面对全班学生交上来的作业,老师请你写个程序自动批改。

输入格式:

每行给出一位学生的作业,即仅由英文字母组成的非空字母串,长度大于2。

输出格式:

对每位学生的作业,如果正确就在一行中输出 Y,否则输出 N。

输入样例1:

zZzZYXWwxyYX

输出样例1:

Y

输入样例2:

wVUuvUTsR

输出样例2:

N

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include <stdio.h>
#include <ctype.h>

int main()
{
    char ch[10000];
    scanf("%s", &ch);

    int i = 0, j = 1;
    int state ;

    while (ch[j] != '\0')
    {
        if(ch[i]>64 && ch[i]<91){
            if(ch[j]==tolower(ch[i])){
                state = 1;
            }else if(ch[j]==(ch[i]-1)){
                state = 1;
            }else{
                state = 0;
            }
            }else if(ch[i]>96 && ch[i]<123){
            if(ch[j]==toupper(ch[i])){
                state = 1;
            }else if(ch[j]==(ch[i]+1)){
                state = 1;
            }else{
                state = 0;
            }
            }
            i++;
            j++;
        
    }
    if(state == 1){
        printf("Y");
    }else{
        printf("N");
    }

    return 0;
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值