鱼C论坛

 找回密码
 立即注册
查看: 2392|回复: 7

[已解决]新手求助

[复制链接]
发表于 2019-3-2 11:00:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题是装睡问题,寒假没打代码,现在忘了,出了问题不知道怎么回事
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[10];
                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[4];
                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;
}
他的横线部分甚至没有下标,到底该怎么用啊。
最佳答案
2019-3-2 11:24:08
本帖最后由 jackz007 于 2019-3-2 11:26 编辑

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

  2. int main()
  3. {
  4.         int h , m , i , n                                                      ;
  5.         char name[10]                                                          ;
  6.         scanf("%d" , & n)                                                      ;
  7.         for(i = 0 ; i < n ; i ++) {
  8.                 scanf("%s %d %d" ,  name , & h , & m)                          ; // name 本身就是 & name[0]
  9.                 if(h < 15 || h > 20 || m < 50 || m > 70) printf("%s\n" , name) ;
  10.         }
  11. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-2 11:05:44 | 显示全部楼层

        #include<stdio.h>
        int main()
        {
                int h,m,i,n;
                char name[10];
                scanf("%d",&n);
                for(i=0;i<n;i++)
                {
                        scanf("%s %d %d",&name[i],&h,&m);
                        if(h<15||h>20||m<50||m>70)
                        printf("%s",name[i]);
                }
                return 0;
        }
上面的代码我的[i]被吞了,还有就是最后printf里面如果我的name[i]不加&就没办法运行完整是为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-2 11:24:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-3-2 11:26 编辑

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

  2. int main()
  3. {
  4.         int h , m , i , n                                                      ;
  5.         char name[10]                                                          ;
  6.         scanf("%d" , & n)                                                      ;
  7.         for(i = 0 ; i < n ; i ++) {
  8.                 scanf("%s %d %d" ,  name , & h , & m)                          ; // name 本身就是 & name[0]
  9.                 if(h < 15 || h > 20 || m < 50 || m > 70) printf("%s\n" , name) ;
  10.         }
  11. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

您好,首先谢谢您的回复,我还有一点问题就是char数组的话每次都是name[0]位置,不是每个位置只能存放一个字符吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[0]应该指向的是哪里啊,不应该直接用name[0]的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-2 11:46:50 | 显示全部楼层
      你的理解没错,name[] 确实是每个位置只能容纳 1 个字符,但是,scanf("%s" , name) 是从键盘连续读取由多个字符构成的一个字符串,直到遇到回车才能结束,name 就是用于存放这个字符串的内存地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的好的,谢谢您,我听懂了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0] 只是字符串 name 中的第一个字符,二者性质不一样。

    printf("%s\n" , name)

    要求的是字符串地址,不是一个字符,如果逐个输出字符应该这样写代码:
  1.     i = 0                                 ;
  2.     while(name[i]) printf("%c" , name[i]) ;
  3.     printf("\n")
复制代码

   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-28 16:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表