鱼C论坛

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

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

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

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

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

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

我想完成的是如下的步骤:
  1. 用户输入n个数 (1≤n≤3)
  2. switch(用户输入的个数)
  3. {
  4.     case 1:  cal(a);
  5.     case 2:  cal(a, b);
  6.     case 3:  cal(a, b, c);
  7. }
  8. 输出结果
复制代码



重载函数如下:
  1. int cal(int a)
  2. {
  3.         int sum;
  4.         sum = a*a;
  5.         return sum;
  6. }

  7. int cal(int a, int b)
  8. {
  9.         int sum;
  10.         sum = a * b;
  11.         return sum;
  12. }

  13. int cal(int a, int b, int c)
  14. {
  15.         int sum;
  16.         sum = a + b + c;
  17.         return sum;
  18. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-3 18:29:13 | 显示全部楼层
用 gets() 把参数存到一个数组里,相邻两个参数你可以用空格隔开,再判断个数,最后switch。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-3 19:14:07 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  5. int cal(int i)
  6. {
  7.     return i*i;
  8. }
  9. int cal(int i, int j)
  10. {
  11.     return i*j;
  12. }
  13. int cal(int i, int j, int k)
  14. {
  15.     return i+j+k;
  16. }
  17. int main()
  18. {
  19.     char buf[20];
  20.     char tmp[10];
  21.     cout<<"please input n numbers (1<=n<=3):\n";
  22.     gets(buf);
  23.     char *p=buf;
  24.     int nCount=0;
  25.     int a[3];
  26.     while(nCount<=3)
  27.     {

  28.         while(*p==' ')
  29.         {p++;}
  30.         char *q=tmp;
  31.         while(*p!=' '&& *p!='\0')
  32.         {
  33.             *q++=*p++;
  34.         }
  35.         *q='\0';
  36.         a[nCount]=atoi(tmp);
  37.         cout<<"a[i]="<<a[nCount]<<endl;
  38.         nCount++;
  39.         if(*p=='\0')
  40.         {
  41.             break;
  42.         }
  43.     }
  44.     switch(nCount)
  45.     {
  46.         case 1:
  47.             cout<<cal(a[0]);
  48.             break;
  49.         case 2:
  50.             cout<<cal(a[0],a[1]);
  51.             break;
  52.         case 3:
  53.             cout<<cal(a[0],a[1],a[2]);
  54.             break;
  55.         default:
  56.             cout<<"error\n";
  57.     }

  58.     return 0;
  59. }
复制代码
804.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

最终要完成的效果应该是这样的,有什么办法么?
搜狗截图20160803215404.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


还有就是cin我觉得应该就可以,他不是遇到空格就会停么,所以写了如下程序
  1. int i = 0;
  2. while ( std::cin >> a[i] && i<3 )
  3. {
  4.         i++;
  5. }
复制代码

我想的是要么读完3个数,要么cin读到结尾直接跳出来,可是这样写也是会报错的。。。

还有一个问题就是我如何判断数组里面存入数的个数呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个满足要求吗??
当用户输入时由用户决定是否结束
  1. using namespace std;
  2. int cale(int a)
  3. {
  4.     cout<<a;
  5.     return a;
  6. }
  7. int cale (int a, int b)
  8. {
  9.     cout<<a+b;
  10.     return a+b;
  11. }
  12. int cale (int a,int b,int c)
  13. {
  14.     cout<< a+b+c;
  15.     return a+b+c;
  16. }
  17. int main()
  18. {
  19.     int i=0,a[3];
  20.     while(i<3&&cin>>a[i])i++;
  21.     switch(i)
  22.     {
  23.         case(1):cale(a[0]);
  24.                 break;
  25.         case(2):cale(a[0],a[1]);
  26.                 break;
  27.         case(3):cale(a[0],a[1],a[2]);
  28.                 break;
  29.         default:break;
  30.     }

  31.     return 0;

  32. }
复制代码
捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


还有那个cin.get()是用于字符串的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这样确实是可以~

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

使用道具 举报

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

使用道具 举报

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

你的意思是:先用gets()读一整个字符串进来,然后用个循环去监测里面的空格,对字符串进行分片,然后在用atoi() 把字符转换为数字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦哦,明白了,谢谢~
小甲鱼最新课程 -> https://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;
}结合前面几节课的知识和大家的知识完美解决 哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 03:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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