SDUT 名单真相

来源:互联网 发布:linux如何开启ping 编辑:程序博客网 时间:2024/04/27 18:54

Problem Description

马上就要考试了,小银变的非常的紧张(平时不好好的听课),昨天小银得到了一个成绩单,但是小银在打印的时候将名单上人的顺序倒置了,所以小银想知道真正的顺序。
成绩单的每一行包括:姓名 城市 成绩。姓名和城市保证全是小写字母(不超过15个字符),成绩不大于100.
Input

多组输入,每组的第一行输入一个n(1 <= n <= 1000).表示名单上人的数量,接下来n行每行包括人的姓名 城市 成绩。
Output

输出名单的真正的顺序。
Example Input

3
xiaotong ningbo 100
xiaoyin zhejiang 100
xiaojin jiangxi 100
Example Output

xiaojin jiangxi 100
xiaoyin zhejiang 100
xiaotong ningbo 100
Hint

Author

绝尘

#include <stdio.h>struct node{    char na[16];    char ho[16];    int sc;}st[1000];int main(){    int n,i;    while(~scanf("%d",&n))    {        for(i=0;i<n;i++)        {            scanf("%s %s %d",st[i].na,st[i].ho,&st[i].sc);        }        for(i=n-1;i>=0;i--)        {            printf("%s %s %d\n",st[i].na,st[i].ho,st[i].sc);        }    }    return 0;}

注意
while(~scanf()):

可以经常在ACM代码中看到 while(~scanf("%d",&n)){ } 这样的代码,意思是在读到输入结尾时循环也结束。
一般在读到输入流结尾时,scanf返回的是EOF。
EOF是在头文件stdio.h中定义的常量,一般为-1。
-1 的原码是10000001,反码是1111110,补码是11111111。复习一下,正数的原码、反码、补码都是一样的;负数的原码是符号位为1,反码是(对原码)符号位不变、其余位取反,补码是(对原码)符号位不变、其余位取反、末位加1.
~EOF则是对EOF进行按位取反操作,则为00000000。所以while条件不满足,循环结束。

资料来源
关于while循环中的~scanf()

原创粉丝点击