Counting Vowel程序中不允许使用不完整类型

时间:2016-07-22 00:10:56

标签: c++

#include "stdafx.h"
#include <iostream>
#include <string>

int isVowel(char &a, int &counter);
bool enterAnotherOne();
void  outputResult(int &counter);
bool goAgain();


using namespace std;

 int main() {
     int counter = 0;
      char a;

      do
      {
          do
          {
              void enter(a);
              int isVowel(counter);
              void outputResult();

          } while (enterAnotherOne());

      } while (goAgain());



    return 0;
}// Function main()
// ===================


 void enter() {
     char a;
     cout << "Enter a letter. ";
     cin >> a;

 }


 }// Function Letter()
//  ===========================


 int isVowel(char &a, int &counter) {
     counter = 0;

     if (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' || a == 'y')
     {
         counter++;
     }   

     return counter;
 }// isVowel()
//  ============== 

 bool enterAnotherOne() {
     char a;

     cout << "Would you like to enter another letter? ";
     cin >> a; 

     if (a == 'y')
     {
         return true;
     }
     else
     {
         return false;
     }
 }




 void outputResult(int &counter) {
     cout << "The number of vowels that you entered are " << counter << endl;

 }// outputResult()
//  ===================

 bool goAgain() {
     char a;

     cout << "Would you like to go again? ";
     cin >> a;

     if (a == 'y')
     {
         return true;
     }
     else
     {
         return false;
     }
 }

嘿伙计们,我正在制作一个程序来计算输入随机字母时输入的元音数量。我遇到的问题是,这一行:

void enter(a);

它说不允许不完整的类型,我无法弄清楚它有什么问题。

3 个答案:

答案 0 :(得分:1)

void enter(a); 

很可能被编译器视为

  1. 声明enter作为void类型的变量并将a传递到void构造函数,而void不是完整类型,因为你不能无效。 void没什么。
  2. 函数enter的声明,它返回void,期望通过值传递类型a的参数。 a将是不完整的类型。
  3. 我认为第一种解释更有可能。

    无论如何,你可能想打电话

    enter(a); 
    

    但这不起作用,因为enter函数不接受任何参数。我们暂时看看enter

    void enter() {
        char a;
        cout << "Enter a letter. ";
        cin >> a;
    }
    

    遗憾的是,这项功能并不多。它从用户那里读取一个字符并立即将其丢弃。我们可能想要使用那个角色,所以

    char enter() {
        char a;
        cout << "Enter a letter. ";
        cin >> a;
        return a;
    }
    

    现在我们得到一个返回给调用者的字符的副本。这意味着

    enter(a); 
    

    看起来应该更像

    a = enter(); 
    

    你有类似的问题

    int isVowel(counter);
    void outputResult();
    

    正好在enter的电话下方。

    不幸的是enter main不可见,因为它是在声明main后声明的。我建议将函数声明移到文件中的main以上。您可以像对其他函数一样转发声明enter,但为什么要这么麻烦?前向声明意味着如果函数发生更改,您可能有两个位置来更改代码。

    我建议您提取编程教科书并阅读前几章以更好地掌握功能。如果您是自学并且没有教科书,或者您的教科书很糟糕,The Definitive C++ Book Guide and List可能对您有用。

    旁注:这里不仅有人跑来跑去。

答案 1 :(得分:0)

这有一些问题。

首先,您似乎没有对enter函数进行原型化(您不会将其与代码顶部附近的其余函数一起声明)。

其次,我认为你试图使用do循环中的代码来调用这些函数,但是由于你在引用函数之前放置了一个类型,所以它并不清楚。如果你试图打电话给他们,你不应该事先提及任何类型,所以void enter(a);应该变成enter(a);(不是真的,因为“a”,更多关于下一点)。

第三,假设您试图在该位代码中调用函数,如上所述,您传入的参数与函数的定义方式不一致。例如,enter在您创建的函数中不需要参数,但是当您尝试在do循环中调用它时,您尝试传入一个变量“a”,它不是我做好了准备。检查该块中的其他函数调用,您会发现它与这些函数不一致。

第四,并且建立了最后一点,我相信你错误地将“a”变量传递给enter,因为你在函数内引用它但是它永远不会传入

不要因此而气馁!继续学习和繁荣!

答案 2 :(得分:0)

您的代码存在很多问题,我在代码中添加了一些有意义的评论来帮助您。这听起来很刺耳,但我必须匆忙,所以我不想成为。这将完全编译和运行,就像我认为你喜欢的那样。

#include "stdafx.h"
#include <iostream>
#include <string>

void enter(char&); /*You forget to put the function prototype here.*/
void isVowel(char &, int &); /*Since you are passing by reference, and NOT using the return value, you don't need have have it return int.*/
bool enterAnotherOne();
void outputResult(int &);
bool goAgain();


using namespace std;

int main() {
    int counter = 0;
    char a;

    do
    {
        do
        {
            enter(a); //you don't need to declare the function type when calling a function :(
            isVowel(a, counter); /*You didn't properly pass the argument here*/
            outputResult(counter); //This needs an argument.

        } while (enterAnotherOne());

        //Did you want to reset the counter? if so, do it here.
        counter = 0;
    } while (goAgain());

    return 0;
}// END OF Function main() /*Make sure you clarify it is the END OF function main().*/
// ===================


void enter(char &letter) { /*This requires an argument to be useful.*/
    cout << "Enter a letter. ";
    cin >> letter;
}
// END OF Function Letter() also, you had an extra bracket, which means this wouldn't compile.
//  ===========================

void isVowel(char &a, int &num) {
    //counter = 0; //if your're coing to pass counter as a argument, why doe this?
    //counter = 0 resets counter back to 0.

    if (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' || a == 'y')
    {
        num++;
    }
}// END OF isVowel()
//  ==============

bool enterAnotherOne() {
    char choice; //give meaningful variable names!

    cout << "Would you like to enter another letter? ";
    cin >> choice;

    if (choice == 'y')
    {
        return true;
    }
    else
    {
        return false;
    }
}//If you're going ot comment END OF on every function, might as well do it here.

void outputResult(int &num) {
    cout << "The number of vowels that you entered are " << num << endl;
}// END OF outputResult()
//  ===================

bool goAgain() {
    char choice;

    cout << "Would you like to go again? ";
    cin >> choice;

    if (choice == 'y')
    {
        return true;
    }
    else
    {
        return false;
    }
}//where's END OF for this function?