11TEN 发表于 2019-3-2 11:00:55

新手求助

问题是装睡问题,寒假没打代码,现在忘了,出了问题不知道怎么回事
7-3 装睡 (10 分)

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。
输入格式:

输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。
输出格式:

按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。
输入样例:

4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71

输出样例:

Tom
Zoe



        #include<stdio.h>
        int main()
        {
                int h,m,i,n;
                char name;
                scanf("%d",&n);
                for(i=0;i<n;i++)
                {
                        scanf("%s %d %d",&name,&h,&m);
                        if(h<15||h>20||m<50||m>70)
                        printf("%s",name);
                }
                return 0;
        }

上面一份是我打的横线部分是问题所在,我不知道给char数组赋值还需要&吗,因为下面这个
#include<cstdio>
using namespace std;
int main(){
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
                char name;
                int b,p;
                scanf("%s %d %d",name,&b,&p);
                if(b<15||b>20||p<50||p>70)
                printf("%s\n",name);
        }
        return 0;
}
他的横线部分甚至没有下标,到底该怎么用啊。

11TEN 发表于 2019-3-2 11:05:44


      #include<stdio.h>
      int main()
      {
                int h,m,i,n;
                char name;
                scanf("%d",&n);
                for(i=0;i<n;i++)
                {
                        scanf("%s %d %d",&name,&h,&m);
                        if(h<15||h>20||m<50||m>70)
                        printf("%s",name);
                }
                return 0;
      }
上面的代码我的被吞了,还有就是最后printf里面如果我的name不加&就没办法运行完整是为什么

jackz007 发表于 2019-3-2 11:24:08

本帖最后由 jackz007 于 2019-3-2 11:26 编辑

    name[] 的用法有误,已经修改,楼主可以参考下面的代码:
#include <stdio.h>

int main()
{
      int h , m , i , n                                                      ;
      char name                                                          ;
      scanf("%d" , & n)                                                      ;
      for(i = 0 ; i < n ; i ++) {
                scanf("%s %d %d" ,name , & h , & m)                        ; // name 本身就是 & name
                if(h < 15 || h > 20 || m < 50 || m > 70) printf("%s\n" , name) ;
      }
}

11TEN 发表于 2019-3-2 11:31:29

jackz007 发表于 2019-3-2 11:24
name[] 的用法有误,已经修改,楼主可以参考下面的代码:

您好,首先谢谢您的回复,我还有一点问题就是char数组的话每次都是name位置,不是每个位置只能存放一个字符吗

11TEN 发表于 2019-3-2 11:46:13

jackz007 发表于 2019-3-2 11:24
name[] 的用法有误,已经修改,楼主可以参考下面的代码:

大佬,我还有一个问题就是printf中
if(h < 15 || h > 20 || m < 50 || m > 70) printf("%s\n" , name) ;
那这里面的name相当于&name应该指向的是哪里啊,不应该直接用name的吗

jackz007 发表于 2019-3-2 11:46:50

      你的理解没错,name[] 确实是每个位置只能容纳 1 个字符,但是,scanf("%s" , name) 是从键盘连续读取由多个字符构成的一个字符串,直到遇到回车才能结束,name 就是用于存放这个字符串的内存地址。

11TEN 发表于 2019-3-2 11:51:44

jackz007 发表于 2019-3-2 11:46
你的理解没错,name[] 确实是每个位置只能容纳 1 个字符,但是,scanf("%s" , name) 是从键盘连续读 ...

好的好的,谢谢您,我听懂了。

jackz007 发表于 2019-3-2 11:53:42

本帖最后由 jackz007 于 2019-3-2 11:54 编辑

11TEN 发表于 2019-3-2 11:46
大佬,我还有一个问题就是printf中
if(h < 15 || h > 20 || m < 50 || m > 70) printf("%s\n" , name) ...

    name 是一个地址,name 只是字符串 name 中的第一个字符,二者性质不一样。

    printf("%s\n" , name)

    要求的是字符串地址,不是一个字符,如果逐个输出字符应该这样写代码:
    i = 0                                 ;
    while(name) printf("%c" , name) ;
    printf("\n")
   
页: [1]
查看完整版本: 新手求助