【问题标题】:Passing variable through switch statement with functions通过带有函数的switch语句传递变量
【发布时间】:2015-07-11 03:45:13
【问题描述】:

我正在尝试学习如何使用函数通过菜单传递变量。问题是,从来没有人教过如何这样做。您可以想象,我将在第一个菜单功能中输入的任何变量,以便在我的案例/其他功能中正常使用,例如

  if (count==0)
  {
    low = number;

    high = number;

    count++;

    sum = number;
  }
  else
  {
    if (number < low)
      number = low;

    if (number > high)
      high = number;

    count ++;

    sum += number;
  }

不会通过函数 2,因为任何更了解 C 的人都会意识到。它也不会在 int main 中工作。如何定义用户输入的数字、最高、最低等?到其他功能?这是我到目前为止所拥有的,循环和菜单工作正常。

#include<stdlib.h>
#include<stdio.h>

int menuChoice()
{
  int choice;

  printf("1.Enter a number\n");
  printf("2.Display Highest Number Entered\n");
  printf("3.Display Lowest Number entered\n");
  printf("4.Display Average of Numbers Entered\n");
  printf("5.Quit\n");

  printf("Enter your choice:   ");
  scanf("%i", &choice);

  return choice;
}

int function1()
{
  int number;

  printf("Enter a number:\n");
  scanf("%i", &number);

  return number;
}

int function2()
{

}

int function3()
{

}

int function4()
{

}

int main()
{
  int quit = 0;
  while (quit != 1)
  {
    int menu;

    menu = menuChoice();
    switch (menu)
    {
    case 1:
      function1();
      break;
    case 2:
      function2();
      break;
    case 3:
      function3();
      break;
    case 4:
      function4();
      break;
    case 5:
      quit = 1;
      break;
    default:
      printf("Please enter 1 through 5\n");

    }
  }
  return 0;
}

【问题讨论】:

  • 菜单的显示应该在一个循环中,然后当 scanf() 返回一个值时,1) 检查 scanf() 的返回值,而不是参数,是(在这种情况下) 1. 否则,getchar() 直到 EOF 或 '\n' 被读取重新显示菜单。 2) 成功 scanf() 后,检查读取的值是否在 1...5 范围内。如果不在范围内,则循环再次显示菜单(可能在显示错误消息之后。
  • 应该有一个'break;' switch 语句中默认 case 结尾的语句

标签: c function menu switch-statement


【解决方案1】:

让我们看看可以改进此代码的一些方法。

  1. 命名函数 - 应为函数提供清晰、描述性的名称,以便不熟悉程序的人轻松理解它们的作用。 function1function2 之类的名称无法实现这一点。

  2. 使用适当的数据结构 - 听起来您正在尝试跟踪用户输入的所有数字,但您目前没有任何方法可以做到这一点。最好的方法是使用数组,它是一个保存其他值的容器。要跟踪到目前为止的数字,让我们创建两个变量 - 一个存储数字的数组和一个跟踪的整数输入了多少个数字。现在,让我们让用户输入最多 100 个数字。我们通过在程序顶部写入int arr[100];int numCount = 0; 来做到这一点。快速旁注 - 这称为 全局变量 - 通常这不是一个好主意,但我们暂时不用担心。

  3. 将代码分离到适当的函数中 - 您在 function1 中做得很好。它很好地执行了它的任务,即从用户那里获取一个数字并返回它。现在让我们使用这个数字。在case 1之后,我们写

    arr[numCount] = function1(); numCount += 1;

    这会将数组中第一个未使用的条目设置为输入的数字,然后增加我们拥有的元素数量的计数器。

  4. 不要执行不必要的计算 - 让我们考虑如何实现最高和最低功能。一种方法是在每次调用函数时遍历整个数组并跟踪我们看到的最高数字。这会起作用,但我们最终会重复很多工作。如果每次我们得到一个新数字,我们都会更新我们看到的当前最高和最低数字怎么办?

  5. 使用循环扫描数组 - 为了计算平均值,我们将使用 for 循环。如果您不理解,请查阅相关文档。

我认为您可以了解如何将这种想法扩展到计算输入值的平均值。这是我修改后的内容 - http://pastie.org/10285795

【讨论】:

  • 谢谢!我确实有两个问题。 1. 你是如何声明变量 new number 的?只是通过在 void 函数中定义它? 2. 能否详细介绍一下INT_MAX?我以前没见过用过的。我知道如果我设置最低 = 0 而不是使用 INT MAX,它总是说最低数字为零。
  • newNum 是一个参数,它是您在调用它时传入括号中的函数的东西。它只存在于函数体中。我建议您找到有关 C 函数的教程来解释这一点。
  • INT_MAX 是整数可以在您的计算机上取的最大值的快捷方式。想想为什么将最低设置为 0 不起作用。您想首先将其初始化为一个非常大的数字,然后将任何未来值与之进行比较。
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 2012-09-17
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多