| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 705 人关注过本帖
标题:用getchar读取字符,回车后没有反应
只看楼主 加入收藏
SLmask
Rank: 2
等 级:论坛游民
帖 子:14
专家分:27
注 册:2012-10-18
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:7 
用getchar读取字符,回车后没有反应
调试时在这句出问题:while(((concept[j]=getchar()) != '\0' && 'P' || 'U' || 'I') || getchar() != '=');
是UVAOJ上面的537题,原题:
Description
物理老师提问,根据 P = IU 这个公式计算并回答。
提问会告诉你公式中的任意两个元素的值,求出第三个元素的值。
因此,提问语句中含有两个 DataField,DataField的格式如下:
DataField ::= Concept '=' RealNumber [Prefix] Unit
Concept   ::= 'P' | 'U' | 'I'
Prefix    ::= 'm' | 'k' | 'M'
Unit      ::= 'W' | 'V' | 'A'
其中,Prefix可为 m (milli) 、k (kilo) 或 M (Mega) 。

并且题目的输入保证如下三点:
“=”在提问语句里,只出现在DataField中。
DataField中不出现多余空格。
题目保证三个元素中有且只有给出两个元素的值。

输入例子为:
3
If the voltage is U=200V and the current is I=4.5A, which power is generated?
A light-bulb yields P=100W and the voltage is U=220V. Compute the current, please.
bla bla bla lightning strike I=2A bla bla bla P=2.5MW bla bla voltage?

输出例子:
Problem #1
P=900.00W

Problem #2
I=0.45A

Problem #3
U=1250000.00V

我写的源程序为
#include<stdio.h>
int main(void)
{
    int k,i,j;
    char concept[2],prefix[2],answer1[3],t1;
    double data[2],answer2,t2;

    scanf("%d",&k);
    getchar();
    for(i = 0;i < k;i ++)
    {
        for(j = 0;j < 2;j ++)
        {
            while(((concept[j]=getchar()) != '\0' && 'P' || 'U' || 'I') || getchar() != '=');
            scanf("%d",&data[j]);
            if((prefix[j]=getchar()) == 'V' || 'A' || 'W')
                prefix[j] = 0;

            switch(prefix[j])
            {
                case 'm':data[j] = data[j]/1000;break;
                case 'M':data[j] = data[j]*1000000;break;
                case 'k':data[j] = data[j]*1000;break;
            }
        }
        if(concept[1] == 'P')
        {
            t1 = concept[1];
            concept[1] = concept[0];
            concept[0] = t1;
            t2 = data[1];
            data[1] = data[0];
            data[0] = t2;
        }
        answer1[0] = 238-concept[0]-concept[1];
        answer1[1] = '=';
        switch(answer1[0])
        {
            case 'P':answer2 = data[0]*data[1];answer1[2] = 'W';break;
            case 'U':answer2 = data[0]/data[1];answer1[2] = 'V';break;
            case 'I':answer2 = data[0]/data[1];answer1[2] = 'A';break;
        }
        printf("Problem #%d\n",i+1);
        printf("%c%c%lf%c\n\n",answer1[0],answer1[1],answer2,answer1[2]);
        while(getchar() != '\n');
    }
    return 0;
}

不需要重新写一个新的,就是想知道我自己写的这里出了什么问题,
不过,当然了,如果有一个用C语言重新写的我看看也行。
搜索更多相关主题的帖子: 元素 
2013-01-01 15:19
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:2 
while()循环后面带分号  基本都是死循环

DO IT YOURSELF !
2013-01-01 15:25
SLmask
Rank: 2
等 级:论坛游民
帖 子:14
专家分:27
注 册:2012-10-18
收藏
得分:0 
回复 2楼 wp231957
但是实例输入里面应该有符合我的判断条件可以跳出循环的啊
2013-01-01 17:22
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
  while()后面应该带逗号吗

DO IT YOURSELF !
2013-01-01 17:38
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:2 
回复 楼主 SLmask
while(((concept[j]=getchar()) != '\0' && 'P' || 'U' || 'I') || getchar() != '=');

瞎了我的钛合金眼


[fly]存在即是合理[/fly]
2013-01-01 18:03
古丁高手
Rank: 1
来 自:地狱
等 级:新手上路
帖 子:56
专家分:8
注 册:2012-8-8
收藏
得分:2 
呵呵正常现象!

不要管我是谁,我也不管你是谁!
just kiss myass!
2013-01-02 07:53
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:2 
while(((concept[j]=getchar()) != '\0' && 'P' || 'U' || 'I') || getchar() != '=');

&& 'p'就写个字符'p'编译器不知道你想干嘛...
getchar()你用了两遍它会连续从缓冲区中提取两遍而不是继续用原来提取的字符,
concept[j]储存了它,可以用它来完成比较

I have not failed completely
2013-01-02 10:09
tollerson
Rank: 1
等 级:新手上路
帖 子:12
专家分:9
注 册:2012-12-31
收藏
得分:2 
getchar()多调用一次,就会顺着上次留下的地方继续读。你设个变量储存getchar(),然后再对这个变量进行判断。
2013-01-02 17:56
快速回复:用getchar读取字符,回车后没有反应
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018672 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved