首页 新闻 会员 周边

怎样在一个数组中输入一个小数

0
悬赏园豆:20 [已解决问题] 解决于 2019-11-05 14:46

我想问一下,用联合类型,可以使一个数组中既可以输入数字又可以输入字符,这样可以实现输入小数吧。那在输入的形式上,数字输入要用scanf函数,而字符输入要用getchar函数,那在输入之前,我们又不知道是输入的数字还是字符,这样,我们怎样做呢?而且在输出的时候,如果是整型的话则用%d 而字符型则用%c ,那在用printf函数时,又该怎样做呢?

有点疑惑,希望大佬解释下。拜托啦。

shmily涂的主页 shmily涂 | 初学一级 | 园豆:4
提问于:2019-11-02 15:37
< >
分享
最佳答案
0

直接用%f就可以实现浮点数输入啊, 如果数太长了, scanf不能正确读取的话, 你也没办法用这些数值类型来保存你要读取的数的,就直接一个一个字符读取进来就行了.
数字不一定要用scanf, 字符输入不一定要getchar. 不知道输入会是什么一律按字符(串)读.
联合体你访问什么类型的成员它就是什么类型的变量. 而且根本没必要用

收获园豆:20
jakio6 | 小虾三级 |园豆:1318 | 2019-11-02 18:57

题目第二问要用数组,如果是个小数的话,就一定有小数点呀,在数组里面怎么表示??

shmily涂 | 园豆:4 (初学一级) | 2019-11-02 19:58

@shmily涂: 读进来的是什么, 就保存成什么啊, 就当个字符串就行了, 上限都60了, long long int都存不下了, 只能当字符串了, 一个一个字符数就行了, 从前面往后面, 空白字符 丢掉, 符号丢掉, 开头的0丢掉, 然后数, 到碰到小数点.

jakio6 | 园豆:1318 (小虾三级) | 2019-11-02 20:17

@jakio6: 输入小数直接用字符数组就可以了,这我懂了。那对于求有效位:怎样做呢?

shmily涂 | 园豆:4 (初学一级) | 2019-11-03 09:38

@jakio6:
int is_choose(char *a)
{
int i,n,x,y;

for (i = 0; *a != '.';a++)
{
    if (a[0] == 0)
    {
        y = 0;
        goto tip;
    
    }
    else if(a[0] != 0)
    {
        y = 1;
        goto tip;
    }


    if (*a == 0)
    {   
        for (n = a - &a[0]; n >= 0;n--)
        {
        
            
            if (a[n] == 0)
                x = 0;
            else 
            {
                x = 1;
                break;
            }
        }

        if (x == 1)
            i++;

    }
        
    if (*a != 0)
        i++;
    tip:
        i = 0;


}

return i + y;

}

shmily涂 | 园豆:4 (初学一级) | 2019-11-03 09:38

@jakio6: 为什么怎么输入都是1

shmily涂 | 园豆:4 (初学一级) | 2019-11-03 09:40

@shmily涂: 你要做什么, 你这返回i+y, 每次改了y就给i置零, 还有, 了解ascii码表先

jakio6 | 园豆:1318 (小虾三级) | 2019-11-03 10:30

@shmily涂:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int ch;
    int zeros = 1;
    int flag = 1;
    int spaces = 1;
    int cnt = 0;
    while((ch = fgetc(stdin)) != EOF) {
        if(spaces && ch == ' ') {
            continue;
        }
        if(flag && (ch == '-' || ch == '+')) {
            flag = 0;
            spaces = 0;
            continue;
        }
        if(zeros && ch == '0') {
            flag = 0;
            spaces = 0;
            continue;
        }
        zeros = 0;
        if( ch >= '0' && ch <= '9') {
            cnt++;
        } else {
            break;
        }
    }
    printf("cnt = %d\n", cnt);
    return 0;
}
jakio6 | 园豆:1318 (小虾三级) | 2019-11-03 10:41

@jakio6: # include<stdio.h>

include<string.h>

define M 40

int main()
{
char a[M];
int i,n;

printf("请输入一个数字:");
gets(a);
n = 0;

for (i = 0;a[i] != '.';i++)
{
    n++;

}





printf("该数的有效位为:%d",n+p);



return 0;

}

想问一下,就是如果输入的数字中第一位,第二位含有0,这样也会被算进去,那怎样除掉这种情况呢?

shmily涂 | 园豆:4 (初学一级) | 2019-11-03 22:21

@shmily涂: 我贴了一份代码呀

jakio6 | 园豆:1318 (小虾三级) | 2019-11-03 23:44
其他回答(1)
0

图片看不清我写个大概的好了

import re
int_text = input('输入你的数字')
if '.' in int_text:
    int_text=int_text.split('.')[0]
b = re.search('[1-9]\d*',int_text)
print(len(b[0])) if b else print(0)
小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-11-02 16:13

include<stdio.h>

define M 60

int main()
{
union a{
int i;
char d;

}

union a a[M];

printf("请将一个数字一个个的输入,如果有小数点直接用小数点输入\a");

for (;;)
{
    i = 0;
    printf("请输入一个数字或小数点:");
    scanf("%d",&a[i]);
    if (getchar() = '.')
        a[i] = getchar();
    

}

printf("该数为:");



return 0;

}

支持(0) 反对(0) shmily涂 | 园豆:4 (初学一级) | 2019-11-02 19:57

我现在学的是C语言,不太懂你写的,C语言还没学完。

支持(0) 反对(0) shmily涂 | 园豆:4 (初学一级) | 2019-11-02 19:57

@shmily涂: 那我就当你不会正则了给你讲下思路,
一.先变成字符串
二.如果里面.'按.进行进行切分取第一个
三.如果没点不做处理
四.获取当前字段长度
五.遍历字符串,如果是0接着遍历且获取遍历次数+1如果不是0.返回遍历次数.如果变量结束还是0,返回遍历次数
六.上面获取的长度减去下面遍历的次数

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-11-02 22:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册