ylg娱乐官网蓝桥杯 基础试题 VIP试题 报时入手

我们需要自动转成整型,意思就是说,读出来的和我们输入的一样,但是,我们不能直接用int转换,原因呢,我们无法确定读的每个单元格的值都是数字

缓冲区:

问题描述
  给定当前的时间,请用英文的读法将它读出来。
  时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“three
o’clock”。
  如果m不为0,则将时读出来,然后将分读出来,如5:30读作“five
thirty”。
  时和分的读法使用的是英文数字的读法,其中0~20读作:
  0:zero, 1: one, 2:two, 3:three, 4:four, 5:five, 6:six, 7:seven,
8:eight, 9:nine, 10:ten, 11:eleven, 12:twelve, 13:thirteen, 14:fourteen,
15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen, 19:nineteen,
20:twenty。
  30读作thirty,40读作forty,50读作fifty。
  对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirty
one”。
  按上面的规则21:54读作“twenty one fifty four”,9:07读作“nine
seven”,0:15读作“zero fifteen”。
输入格式
  输入包含两个非负整数h和m,表示时间的时和分。非零的数字前没有前导0。h小于24,m小于60。
输出格式
  输出时间时刻的英文。
样例输入
0 15
样例输出
zero fifteen

 

举例:

ylg娱乐官网 1

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string m[60];
    m[0]="zero";
    m[1]="one";
    m[2]="two";
    m[3]="three";
    m[4]="four";
    m[5]="five";
    m[6]="six";
    m[7]="seven";
    m[8]="eight";
    m[9]="nine";
    m[10]="ten";
    m[11]="eleven";
    m[12]="twelve";
    m[13]="thirteen";
    m[14]="fourteen";
    m[15]="fifteen";
    m[16]="sixteen";
    m[17]="seventeen";
    m[18]="eighteen";
    m[19]="ninrteen";
    m[20]="twenty";
    m[30]="thirty";
    m[40]="forty";
    m[50]="fifty";
    int h,p;
    while(cin>>h>>p)
    {

    if(h<=20&&p==0)
    {
        cout<<m[h]<<" o'clock"<<endl;
        break;
    }
    if(h<=20&&p<=20)
    {
        cout<<m[h]<<" "<<m[p]<<endl;
        break;
    }
    if(h<=20&&p>20)
    {
        if(p%10==0)
            cout<<m[h]<<" "<<m[p]<<endl;
        else
            cout<<m[h]<<" "<<m[(p/10)*10]<<" "<<m[p%10]<<endl;
        break;
    }
    if(h>20&&p==0)
    {
        cout<<m[(h/10)*10]<<' '<<m[h%10]<<" o'clock"<<endl;
        break;
    }
    if(h>20&&p<=20)
    {
        cout<<m[(h/10)*10]<<" "<<m[h%10]<<" "<<m[p]<<endl;
        break;
    }
    if(h>20&&p>20)
    {
        if(h%10==0)
            cout<<m[(h/10)*10]<<" "<<m[h%10]<<" "<<m[(p/10)*10]<<endl;
        else
            cout<<m[(h/10)*10]<<" "<<m[h%10]<<" "<<m[(p/10)*10]<<" "<<m[p%10]<<endl;
        break;
    }
}

    system("pause");
    return 0;
}```

我们用python;xlrd读Excel内容时,本来只是输入的整数字,经常读出来的是float类型

scanf的运行原理

  1. scanf如果发现输入缓冲区中没有东西,就启动录入
  2. scanf发现输入缓冲区中有n,那么他就会去输入缓冲区取值
  3. 如果发现是自己的菜就会取走放到自己盘子里
  4. 如果不是自己的菜,就会自己回去了

ylg娱乐官网 2

   ylg娱乐官网 3

    

//检查输入格式是否正确

#include <stdio.h>

int main() {

int num=0;//初始化清零

printf(“请输入一个数字:”);

while (!scanf(“%d”,&num))
{

scanf(“%*[^n]”);

scanf(“%*c”);

printf(“输入格式错误!n请输入一个数字:”);

}

printf(“输入正确!num=%dn”,num);

return 0;

}

  ylg娱乐官网 4

  每次使用scanf函数读数据后都需要清理输入缓冲区!

    

 

输入缓冲区

  键盘—》键盘缓冲区—》输入缓冲区—》程序

  我们在键盘上输入的任何东西,会先进入输入缓冲区区域,然后程序从输入缓冲区里把数据一个一个读出来。

输入缓冲区的管理方式:

  先进入的数字会被先读出来(输入缓冲区里把前面的数字读走了,才能读后面的数字)

  1. scanf就是从输入缓冲区里拿数字,如果输入缓冲区的内容和scanf指定的格式类型不一样,它就不动,不会把输入缓冲区里的任何内容转移走。
  2. 所以你用scanf读一个%d,输入缓冲区输入一个[a 10],用scanf读取一个整数的时候,它读出来的a发现不是一个整数,它又把这个a放回去了。下回再读,还是读的这个a。a始终堵在缓冲区内,后面的数据10读不到。
  3. 为了解决这个问题,我们在每次读取一个数据后,把输入缓冲区里的数据全清理掉,我不管里面有什么,我这次读完了过后也不管这次是读到还是没读到,反正我这次读完了过后把输入缓冲区全部清理掉,这样的话我保证你下一次读的时候是一个新的开始。
  4. 每次读完一个数据后,把输入缓冲区里的数据全部清理掉,保证下一次再读的时候一定是一个新的开始,这样就不会因为前一次的错误导致后一次出问题。【清理输入缓冲区的目的:前面的输入出错了,保证不会影响后面的输入】

  每次读完一个数据后清理输入缓冲区,保证前面的输入出错了,不会影响后面的输入

    scanf(“%*[^n]”);

    scanf(“%*c”);

  输入缓冲区有这样的一个特点:只有当其中的数据读走的时候,才会清除这个数据。

  scanf和缓冲区中的数据类型不一致的时候,便无法读走数据,可能会导致死循环。

解决上面问题的办法:

  scanf(“%*[^n]”);//*忽略读到的内容,[^n]任何非n的字符;将n之前的所有字符读走

  scanf(“%*c”);//从缓冲区读取一个字符忽略掉

  补充:scanf调用失败(主要原因:类型不匹配)返回垃圾值。

char
ch;

//下面两行可以完全请空缓冲区中的一行内容

scanf(“%*[^n]”);//先将换行符之前的所有内容都清掉

scanf(“%c”, &ch);//再将n从输入缓冲区读走

发表评论

电子邮件地址不会被公开。 必填项已用*标注