如何编写一个程序,使用用户输入和测试文件结束功能

时间:2010-07-29 21:41:12

标签: c++

我正在编写一个程序,它接收字母并将其转换为电话号码。我刚开始用c ++开始,并不熟悉我在网上看到的大部分例子都涉及这些概念的类或成员。我有开关盒部分工作但无法正确结束文件部分。我复制了下面的代码:


  //Explanation of Program
  //This program converts inputted characters into numbers based on the telephone digit scheme    
  //**************************************Program begins here******************************************************************
  #include <iostream>         //Includes library file for input / output functionality
  using namespace std;

  int main()
  {
    //Declaration of variables
    char cCharacter = 0;  // User inputed character
    char cNumber = 0;  // Converted numbers from inputed characters

    //Beginning of main program
    cout << "This program converts inputted characters into numbers based on the telephone digit scheme";  //Explanation of program
    while ( cCharacter != EOF)
    {
      cout << endl <<"Please hit '<ctrl> z' to exit, or enter a word on character at a time: ";
      cin >> cCharacter;
      cCharacter = toupper (cCharacter);

      if (cCharacter == EOF)
      {
        break;
      }

      switch (cCharacter)
      {
        case 'A':
        case 'B':
        case 'C':
          cNumber = '2';   
        break;

        case 'D':
        case 'E':
        case 'F':
          cNumber = '3';
        break;

        case 'G':
        case 'H':
        case 'I':
          cNumber = '4';
        break;

        case 'J':
        case 'K':
        case 'L':
          cNumber = '5';
        break;

        case 'M':
        case 'N':
        case 'O':
          cNumber = '6';
        break;

        case 'P':
        case 'Q':
        case 'R':
        case 'S':
          cNumber = '7';
        break;

        case 'T':
        case 'U':
        case 'V':
          cNumber = '8';
        break;

        case 'W':
        case 'X':
        case 'Y':
        case 'Z':
          cNumber = '9';
        break;
      }

      cout << "The number associated with the letter "<< cCharacter <<" is: "<<cNumber <<endl;
    }
    return 0;
  }

另外,我想知道是否有一种方法(可能使用数组)来存储每个数字,然后按顺序打印每个数字。不过,我不认为我的数组必须是可变长度的。

4 个答案:

答案 0 :(得分:0)

我会改变一些事情,但作为一个介绍CS程序,它并不太糟糕。一些事情:

  1. 每当EOF发生时,您的cout将尝试显示该EOF并且可能无法正常工作。你应该在while循环检查cCharacter!= EOF之后至少对cout进行if检查以防止这种情况。

  2. 您没有默认情况。如果发生了您不期望的输入,则cout将显示其初始化0或该号码的上一个条目。

  3. 要存储每个数字并在sequnce中打印,最简单的方法是使用std :: vector。暂时不会教这些,所以不要太担心。你可以用一个大阵列做不安全的事情,但这不是你所推测的好方法。

  4. 您也可以使用数组表来替换您的switch语句,但这可能会比您的类更进一步。

  5. 我确定cin有一个getChar方法。这样可以抓取每个角色的类型,使用起来比使用直的cin更干净。

  6. 我希望这对你有所帮助。如果没有关于程序如何失败的进一步信息,我只能对上面列表中的错误进行有根据的猜测。

答案 1 :(得分:0)

通过点击输入设备上的特定控制序列,可以使标准输入提取“文件结束”。这是特定于操作系统的:

在Unix / Linux(以及Mac OS-X)上 CTRL-d

在Windows上 Ctrl-Z(我想)。

虽然EOF字符EOF是来自C文件流的宿醉,但最好测试一下流本身以查看它是否已到达文件末尾。

 while (!cin.good()) {/* Stream still readable ie not EOF */}

幸运的是;如果在布尔上下文中使用流,它会自动将自身转换为可转换为bool的对象,如果流仍然可用,则值为true;如果字符串已进入错误状态(如EOF),则将其转换为false。

 while (cin) { /* Stream converted to a bool that is true if stream is still readable*/ }

这里的问题是,在您尝试读取文件末尾之后才会实际设置EOF。所以这里的测试是在你阅读之前完成的。现在当你尝试阅读它可能会失败,所以从技术上讲,你需要在阅读之后再进行一次测试:

while(cin)
{
    char x;
    cin >> x;
    if (cin)  { /* The read worked */ }
}

但是运营商的结果&gt;&gt;返回对流的引用,以便我们可以一次完成所有操作:

char x;
while(cin>> x)   // read a character into x and return cin.
                 // cin then used as the test to see if the stream is OK
{
    /* cin is OK so the read into x must have worked. */
}

答案 2 :(得分:0)

感谢您的回复和帮助。我正在为可能遇到同样问题的其他人发布我的最终解决方案,并且会遇到此页面。如果我的研究是正确的,eof()是stdio.h头文件的宏(或成员函数),并且是C编程的保留。我的最终代码如下,以及评论中发布的测试用例:

//程序说明 //该程序根据电话号码方案将输入的字符转换为数字

//**************************************Program begins here*********************
#include <iostream>        //Includes library file for input / output functionality
using namespace std;

int main()
{
    //Declaration of variables
    char cCharacter = 0;        // User inputed character
    char cNumber    = 0;        // Converted numbers from inputed characters

    //Beginning of main program
    cout << "This program converts inputted characters into numbers based on the telephone digit scheme";  //Explanation of program

      while (!cin.eof())            // While condition runs unless 'eof' key is hit
    {  
    cout << endl <<"Please hit '<ctrl> z' to exit, or enter a word on character at a time: ";
    cin >> cCharacter;      //User inputs a character value
    cCharacter = toupper (cCharacter);  // Converts lowercase values to uppercase

     //Switch case function to select numbers from characters inputted
    switch (cCharacter)                                                                               
    {
        case 'A':
        case 'B':
        case 'C': 
                        cNumber = '2';  // Letters A, B, or C converted to Number 2
        break;

        case 'D':
        case 'E':
        case 'F':
            cNumber = '3';  // Letters D, E, or F converted to Number 3
        break;

        case 'G':
        case 'H':
        case 'I':
            cNumber = '4';  // Letters G, H, or I converted to Number 4
        break;

        case 'J':
        case 'K':
        case 'L':
            cNumber = '5';  // Letters J, K, or L converted to Number 5
        break;

        case 'M':
        case 'N':
        case 'O':
            cNumber = '6';  // Letters M, N, or O converted to Number 6
        break;

        case 'P':
        case 'Q':
        case 'R':
        case 'S':
            cNumber = '7';  // Letters P, Q, R, or S converted to Number 7
        break;

        case 'T':
        case 'U':
        case 'V':
            cNumber = '8';  // Letters T, U, or V converted to Number 8
        break;

        case 'W':
        case 'X':
        case 'Y':
        case 'Z':
            cNumber = '9';  // Letters W, X, Y, or Z converted to Number 9
        break;

        // defualt adds newline
        default:
            cout <<endl;
        break;

    }
    //Output of character inputted and number associated with it
    cout << "The number associated with the letter "<<cCharacter <<" is: "<<cNumber <<endl;
}//End while loop
return 0;       //indicates program success 
} //End Main () function
/* Testing of variables

    Test 1 - TOAST ******************************************************************************************

    This program converts inputted characters into numbers based on the telephone di
    git scheme
    Please hit '<ctrl> z' to exit, or enter a word on character at a time: t
    The number associated with the letter T is: 8

    Please hit '<ctrl> z' to exit, or enter a word on character at a time: o
    The number associated with the letter O is: 6

    Please hit '<ctrl> z' to exit, or enter a word on character at a time: a
    The number associated with the letter A is: 2

    Please hit '<ctrl> z' to exit, or enter a word on character at a time: s
    The number associated with the letter S is: 7

    Please hit '<ctrl> z' to exit, or enter a word on character at a time: t
    The number associated with the letter T is: 8

    Please hit '<ctrl> z' to exit, or enter a word on character at a time: ^Z
    The number associated with the letter T is: 8
    Press any key to continue . . .

    TOAST
    86278

除了我的解决方案之外我唯一想做的就是将数字和字符放入一个数组(或者两个数组)并按顺序显示它们,但这超出了我的问题的范围并且在战斗之后无论是这个问题还是我本章的另一个实验室,我都很高兴让他们正常工作并上交。

再次感谢大家的投入和考虑。

答案 3 :(得分:-1)

问题是你期待一个神奇的“EOF”角色而你却不会得到它。结束程序的角色需要是用户可以实际输入的内容。 “x”和“0”具有潜力,空白字符串也是如此(从技术上讲,在这种情况下,您将测试换行符,即'\ n')。

那就是说,我注意到你的代码有些奇怪......

首先,你为什么一次要求输入一个字符?我希望电话号码“翻译员”能够以“信件形式”收取整个电话号码并将其转换为我可以拨打的数字号码;否则,只要看一张桌子,或者就此而言,电话本身就是我无法做到的。你的导师说你必须这样做吗?

你的循环是多余的;它的条件告诉它只在cCharacter不等于EOF的情况下运行,但是当你在循环中使用if时它也是EOF。其中只有一个是必要的。一种流行的方法是在循环之前和结尾处获取第一个字符,但您也可以保留if-break部分并将while条件更改为1.

为什么cNumber是char?不可否认,它对程序的执行没有任何实际影响,但提供的类型是有原因的;代码更清晰,更容易维护,作为一般规则,如果它在语义上是正确的(意味着,在这种情况下,你使用char表示字符,int表示整数)。这个程序没什么意义,但这是一个很好的习惯。

至于将数字存储在数组中,是的,这是非常可能的。您可以使用calloc()函数动态定义给定长度的数组,也可以使用向量。但是,两者都可能超出你班级的当前范围。