鱼C论坛

 找回密码
 立即注册
查看: 8044|回复: 13

C++如何判断输入了几个参数?

[复制链接]
发表于 2016-8-3 16:28:57 | 显示全部楼层 |阅读模式

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

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

x
搜狗截图20160803162153.jpg
这个是小甲鱼老师视频中留的作业。
重载函数我已经写了出来,但是我如何判断用户输入了几个参数呢?

我想完成的是如下的步骤:
用户输入n个数 (1≤n≤3)
switch(用户输入的个数)
{
    case 1:  cal(a);
    case 2:  cal(a, b);
    case 3:  cal(a, b, c);
} 
输出结果


重载函数如下:
int cal(int a)
{
        int sum;
        sum = a*a;
        return sum;
}

int cal(int a, int b)
{
        int sum;
        sum = a * b;
        return sum;
}

int cal(int a, int b, int c)
{
        int sum;
        sum = a + b + c;
        return sum;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-3 18:29:13 | 显示全部楼层
用 gets() 把参数存到一个数组里,相邻两个参数你可以用空格隔开,再判断个数,最后switch。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-3 19:14:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-3 20:33:17 | 显示全部楼层
本帖最后由 Krant5 于 2016-8-4 12:50 编辑

我昨天也没想到什么好办法,只能用gets()读入字符串然后再判断转换成数字了。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

int cal(int i)
{
    return i*i;
}
int cal(int i, int j)
{
    return i*j;
}
int cal(int i, int j, int k)
{
    return i+j+k;
}
int main()
{
    char buf[20];
    char tmp[10];
    cout<<"please input n numbers (1<=n<=3):\n";
    gets(buf);
    char *p=buf;
    int nCount=0;
    int a[3];
    while(nCount<=3)
    {

        while(*p==' ')
        {p++;}
        char *q=tmp;
        while(*p!=' '&& *p!='\0')
        {
            *q++=*p++;
        }
        *q='\0';
        a[nCount]=atoi(tmp);
        cout<<"a[i]="<<a[nCount]<<endl;
        nCount++;
        if(*p=='\0')
        {
            break;
        }
    }
    switch(nCount)
    {
        case 1:
            cout<<cal(a[0]);
            break;
        case 2:
            cout<<cal(a[0],a[1]);
            break;
        case 3:
            cout<<cal(a[0],a[1],a[2]);
            break;
        default:
            cout<<"error\n";
    }

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

使用道具 举报

 楼主| 发表于 2016-8-3 21:57:16 | 显示全部楼层
Krant5 发表于 2016-8-3 20:33
你想的好奇怪哦 ,应该是三个函数都定义之后,你调用函数的时候传入几个参数就会自动判断的

兄弟你没完全懂我的意思呀,输入的数是由用户来给的,所以需要判断呀,如果向你说的已经知道要计算什么数了,当然简单了。

最终要完成的效果应该是这样的,有什么办法么?
搜狗截图20160803215404.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-3 22:26:47 | 显示全部楼层
疾风。意破天晴 发表于 2016-8-3 18:29
用 gets() 把参数存到一个数组里,相邻两个参数你可以用空格隔开,再判断个数,最后switch。

可是gets()的话是一次读取一行字符,包括空格
我查了一下get()这个函数貌似是符合要求的但是怎么用呀?
直接这样写会报错
int a[3];
cin.get(a, 3);

还有就是cin我觉得应该就可以,他不是遇到空格就会停么,所以写了如下程序
int i = 0;
while ( std::cin >> a[i] && i<3 )
{
        i++;
}
我想的是要么读完3个数,要么cin读到结尾直接跳出来,可是这样写也是会报错的。。。

还有一个问题就是我如何判断数组里面存入数的个数呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-4 08:48:34 | 显示全部楼层
shuofxz 发表于 2016-8-3 22:26
可是gets()的话是一次读取一行字符,包括空格
我查了一下get()这个函数貌似是符合要求的但是怎么用呀?
...

这个满足要求吗??
当用户输入时由用户决定是否结束
using namespace std;
int cale(int a)
{
    cout<<a;
    return a;
}
int cale (int a, int b)
{
    cout<<a+b;
    return a+b;
}
int cale (int a,int b,int c)
{
    cout<< a+b+c;
    return a+b+c;
}
int main()
{
    int i=0,a[3];
    while(i<3&&cin>>a[i])i++;
    switch(i)
    {
        case(1):cale(a[0]);
                break;
        case(2):cale(a[0],a[1]);
                break;
        case(3):cale(a[0],a[1],a[2]);
                break;
        default:break;
    }

    return 0;

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

使用道具 举报

发表于 2016-8-4 08:49:12 | 显示全部楼层
shuofxz 发表于 2016-8-3 22:26
可是gets()的话是一次读取一行字符,包括空格
我查了一下get()这个函数貌似是符合要求的但是怎么用呀?
...


还有那个cin.get()是用于字符串的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-4 09:11:23 | 显示全部楼层
小剑剑 发表于 2016-8-4 08:48
这个满足要求吗??
当用户输入时由用户决定是否结束

这样确实是可以~

但我对cin还是有点疑惑
① 我输入三个数的时候,最后一定要敲回车才能结束,为什么敲空格不行?
② 为什么ctrl+z 可以结束cin?
③ 有没有什么读取字符串的方法是中间有空格就继续读取,遇到回车就结束的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-4 09:16:36 | 显示全部楼层
gets()不会过滤空格,以回车为结尾,这是一个c语言函数,必须包含头文件<stdio.h>,,将字符串数字转化为整型数字用int atoi(const char *nptr);函数。这样的话就可以用空格判断参数个数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-4 09:20:46 | 显示全部楼层
本帖最后由 小剑剑 于 2016-8-4 09:22 编辑
shuofxz 发表于 2016-8-4 09:11
这样确实是可以~

但我对cin还是有点疑惑


1不敲空格字符就没有输入,c的话可以用getch,但c++我也才刚刚开始学,不太清楚
2ctrl+z时cin>>a,读取失败cin>>a返回false,需重置才可以继续输入
3可以用getline(char*,int)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-4 15:34:57 | 显示全部楼层
疾风。意破天晴 发表于 2016-8-4 09:16
gets()不会过滤空格,以回车为结尾,这是一个c语言函数,必须包含头文件,,将字符串数字转化为整型数字用i ...

你的意思是:先用gets()读一整个字符串进来,然后用个循环去监测里面的空格,对字符串进行分片,然后在用atoi() 把字符转换为数字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-4 15:35:31 | 显示全部楼层
小剑剑 发表于 2016-8-4 09:20
1不敲空格字符就没有输入,c的话可以用getch,但c++我也才刚刚开始学,不太清楚
2ctrl+z时cin>>a,读取 ...

哦哦,明白了,谢谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-10 10:43:02 | 显示全部楼层
#include <iostream>

void Input(double x);
void Input(double x,double y);
void Input(double x,double y,double z);

int main()
{
        double input[3];
        int i=0;

        std::cout<<"请输入1~3个参数:(以空格区别每一个字符,回车结束)";
        while(std::cin.peek()!='\n'&&i<3)
        {
                std::cin>>input[i];
                i++;
        }

        switch (i)
        {
        case 1:
                Input(input[0]);break;
        case 2:
                Input(input[0],input[1]);break;
        case 3:
                Input(input[0],input[1],input[2]);break;
        }
        std::cout<<"请输入任意字符结束!"<<std::endl;
        //std::cin.get();                //去掉回车
        std::cin.ignore(100,'\n');
        std::cin.get();
        return 0;
}

void Input(double x)
{
        std::cout<<x<<"的平方是:"<<x*x<<std::endl;
}

void Input(double x,double y)
{
        std::cout<<x<<'x'<<y<<'='<<x*y<<std::endl;
}

void Input(double x,double y,double z)
{
        std::cout<<x<<'+'<<y<<'+'<<z<<'='<<x+y+z<<std::endl;
}结合前面几节课的知识和大家的知识完美解决 哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-4 23:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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