如何确定函数的大小未知或为零,并且main中缺少函数调用

时间:2019-05-07 10:28:01

标签: c++

我正在尝试解决此问题,但是我无法弄清楚如何消除错误。我看过的其他使用数组和函数的代码看起来相同并且可以工作,但是由于某些原因我的代码无法工作。这些是我得到的错误:

Error E2121 Q1.cpp 27: Function call missing ) in function main()
Error E2449 Q1.cpp 32: Size of 'fifty' is unknown or zero
Error E2356 Q1.cpp 32: Type mismatch in redeclaration of 'fifty(int)'
Error E2344 Q1.cpp 10: Earlier declaration of 'fifty(int)'
Error E2063 Q1.cpp 32: Illegal initialization
Error E2293 Q1.cpp 32: ) expected
Error E2141 Q1.cpp 71: Declaration syntax error
#include <math.h>
#include <stdio.h>
#include <iostream>

void fifty(int money);
void twenty(int money);
void ten(int money);
void five(int money);


int main()
{
    int money[5]; /*this contians all info about change and the money that you want change for*/

    printf("Enter cash amount: ");

    scanf("%d", &money[1]);

    fifty(money[5]); /*Passing the array to each module*/

    twenty(money[5]);

    ten(money[5]);
    five(money[5]);
    /*The next two lines should print out how many of each denomination is needed*/
    printf("Change to be given: \n");
    printf("50 = %d, 20 = %d, 10 = %d, 5 = %d" money[1], money[2], money[3], money[4]);
    return(0);
}

void fifty(int money, int 5)
{
    /*This is getting the whole array from main() and modifying the values of each index*/
    if (money[0] > 50) {
        money[0] = money[0] - 50;
        money[1]++;
    }

    return;
}

void twenty(int money, int 5)
{

    if (money[0] > 20) {
        money[0] = money[0] - 20;
        money[2]++;
    }
    return;
}

void ten(int money, int 5)
{

    if (money[0] > 10) {
        money[0] = money[0] - 10;
        money[3]++;
    }
    return;
}

void five(int money, int 5)
{

    if (money[0] > 5) {
        money[0] = money[0] - 5;
        money[4]++;
    }
    return;
}

2 个答案:

答案 0 :(得分:3)

主要

中缺少逗号

 printf("50 = %d, 20 = %d, 10 = %d, 5 = %d" money[1], money[2], money[3], money[4]);

必须

printf("50 = %d, 20 = %d, 10 = %d, 5 = %d", money[1], money[2], money[3], money[4]);

void fifty(int money, int 5)

您不能用数字命名参数,您期望什么?

void 函数末尾的return;也没用

main 中,您没有初始化money[0],但是所有其他函数都测试了它的值,该行为未定义。可能你想做

scanf("%d", &money[0]);

我还建议您检查通过 scanf 输入的值,并检查返回1。请注意,您使用的是C ++,因此也可以使用 istream运算符>>

在另一个功能中,您增加了 money 中的条目,但这些条目未初始化,可能是您想要的:

int money[5] = {0}; 

将5个元素初始化为0

并且由于您需要在另一个函数中访问数组中的多个元素,因此不必给出特定的元素,而是给出所有数组,例如:

fifty(money[5]);

必须

fifty(money);

与其他通话相同

请注意,您假设每个值只有0或1倍,例如

void fifty(int money)
{
    /*This is getting the whole array from main() and modifying the values of each index*/
    if (money[0] > 50) {
        money[0] = money[0] - 50;
        money[1]++;
    }
}

如果货币为100,则必须将money[1]设置为2而不是1:

void fifty(int money[])
{
    /*This is getting the whole array from main() and modifying the values of each index*/
    money[1] = money[0]/50;
    money[0] %= 50;
}

并为每个值对所有函数产生相似的定义,这是没有用的,您只能定义一个函数来获取值和要设置的索引,例如:

void count(int money[], int value, int index)
{
    money[index] = money[0]/value;
    money[0] %= value;
}

而不是打电话

fifty(money);
twenty(money);
ten(money);
five(money);

你可以做

count(money, 50, 1);
count(money, 20, 2);
count(money, 10, 3);
count(money, 5, 4);

或使用其他任何方式,例如循环

请注意,您未指定值1的数量,这很奇怪


考虑到我的言论的提案:

#include <stdio.h>

void count(int money[], int index, int value);

int main()
{
  int money[5]; // useless to initialize it because I just assign entries

  printf("Enter cash amount: ");

  if (scanf("%d", &money[0]) != 1) {
    puts("invalid input, abort");
    return -1;
  }

  count(money, 50, 1);
  count(money, 20, 2);
  count(money, 10, 3);
  count(money, 5, 4);

  /*The next two lines should print out how many of each denomination is needed*/
  printf("Change to be given: \n");
  printf("50 = %d, 20 = %d, 10 = %d, 5 = %d\n", money[1], money[2], money[3], money[4]);
  return(0);
}

void count(int money[], int value, int index)
{
  money[index] = money[0]/value;
  money[0] %= value;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Werror e.cc
pi@raspberrypi:/tmp $ ./a.out
Enter cash amount: 275
Change to be given: 
50 = 5, 20 = 1, 10 = 0, 5 = 1
pi@raspberrypi:/tmp $ 

并使用 iostream 而不是 stdio

#include <iostream>

void count(int money[], int index, int value);

int main()
{
  int money[5]; // useless to initialize it because I just assign entries

  std::cout << "Enter cash amount: ";

  if (! (std::cin >> money[0])) {
    std::cout << "invalid input, abort" << std::endl;
    return -1;
  }

  count(money, 50, 1);
  count(money, 20, 2);
  count(money, 10, 3);
  count(money, 5, 4);

  std::cout << "Change to be given: \n"
    << "50 = " << money[1]
      << ", 20 = " << money[2]
    << ", 10 = " << money[3]
      << ", 5 = " << money[4] << std::endl;

  return(0);
}

void count(int money[], int value, int index)
{
  money[index] = money[0]/value;
  money[0] %= value;
}

最后是一个在数组中指示值的版本,只允许更改一行代码即可更改帐单列表:

#include <iostream>

void count(int money[], int value, int index);

int main()
{
  const int value[] = { 50, 20, 10, 5, 1 }; // list of biils
  int money[sizeof(value)/sizeof(value[0]) + 1];

  std::cout << "Enter cash amount: ";

  if (! (std::cin >> money[0])) {
    std::cout << "invalid input, abort" << std::endl;
    return -1;
  }

  for (size_t i = 0; i != sizeof(value)/sizeof(value[0]); ++i)
    count(money, value[i], i+1);

  std::cout << "Change to be given: \n";

  for (size_t i = 0; i != sizeof(value)/sizeof(value[0]); ++i) {
    if (i != 0)
      std::cout << ", ";
    std::cout << value[i] << " = " << money[i+1];
  }
  std::cout << std::endl;

  return(0);
}

void count(int money[], int value, int index)
{
  money[index] = money[0]/value;
  money[0] %= value;
}

编译和执行:

pi@raspberrypi:/tmp $ ./a.out
Enter cash amount: 276
Change to be given: 
50 = 5, 20 = 1, 10 = 0, 5 = 1, 1 = 1

现在 count 仅在代码中的一个位置被调用,因此可以移动它的主体以替换其调用来删除它:

#include <iostream>

int main()
{
  const int value[] = { 50, 20, 10, 5, 1 }; // list of bills
  int money[sizeof(value)/sizeof(value[0]) + 1];

  std::cout << "Enter cash amount: ";

  if (! (std::cin >> money[0])) {
    std::cout << "invalid input, abort" << std::endl;
    return -1;
  }

  for (size_t i = 0; i != sizeof(value)/sizeof(value[0]); ++i){
    money[i + 1] = money[0]/value[i];
    money[0] %= value[i];
  }

  std::cout << "Change to be given: \n";

  for (size_t i = 0; i != sizeof(value)/sizeof(value[0]); ++i) {
    if (i != 0)
      std::cout << ", ";
    std::cout << value[i] << " = " << money[i+1];
  }
  std::cout << std::endl;

  return(0);
}

例如,如果我还要考虑100的账单,我只需要用const int value[] = { 50, 20, 10, 5, 1 };替换const int value[] = { 100, 50, 20, 10, 5, 1 };,而不必在代码中进行其他更改。这样做对于代码的可维护性非常重要。

答案 1 :(得分:1)

哦,亲爱的。这有很多错误。

#include <math.h>
#include <stdio.h>
#include <iostream>

void fifty(int money);

这声明了一个采用单个整数的函数。实际上,您需要传递五个整数的数组。不幸的是,您不能简单地声明一个函数,该函数采用正好由五个整数组成的数组,而只是声明它为一个指向整数的指针:

void fifty(int* money);
void twenty(int* money);
void ten(int* money);
void five(int* money);


int main()
{
    /*this contians all info about change and the money that you want change for*/
    int money[5];

Typo(应该是“ contains”),并且您已经定义了一个数组,但是尚未初始化它-因此它将包含不确定的值。您需要对其进行初始化,使其包含零(我进一步进行的某些更改实际上意味着您不需要对其进行初始化-因为我设置了变量而不是递增):

    int money[5] = {};
    printf("Enter cash amount: ");

    scanf("%d", &money[1]);

这会将值存储在money[1]中。您实际上想要money[0]-所以:

    scanf("%d", &money[0]);

    fifty(money[5]); /*Passing the array to each module*/

不传递数组,而是传递偏移量为5的单个元素-不存在。仅有的条目是money[0]money[1]money[2]money[3]money[4]

    fifty(money); // Pass the whole array to each function
    twenty(money);
    ten(money);
    five(money);
    /*The next two lines should print out how many of each denomination is needed*/
    printf("Change to be given: \n");
    printf("50 = %d, 20 = %d, 10 = %d, 5 = %d" money[1], money[2], money[3], money[4]);

您需要在字符串后加一个逗号:

    printf("50 = %d, 20 = %d, 10 = %d, 5 = %d", money[1], money[2], money[3], money[4]);
    return(0);
}

void fifty(int money, int 5)

这不是您声明一个将数组作为参数的函数的方式:

void fifty(int* money)
{
    //This is getting the whole array from main() and modifying the values of each index
    if (money[0] > 50) {
        money[0] = money[0] - 50;
        money[1]++;
    }
    return;

是的。这样就可以工作(一旦我们将数组初始化为零),但是如果我在提示符下输入440会发生什么情况-这只会输出一张50美元的钞票-我要八个!

相反,您需要将money[1]增加money[0]/50(甚至更好,只需将其设置为该值),然后将money[0]设置为余数。很好的效果是您然后不需要if(因为除法向下取整)。

您也不需要退货-但您可以随意退还。

void fifty(int* money)
{
   money[1] = money[0]/50;
   money[0] = money[0]%50;  // Must do this second.
    return;
}

void twenty(int *money)
{

    if (money[0] > 20) {
        money[0] = money[0] - 20;
        money[2]++;
    }
    return;
}

等一下!我们之前已经看过这段代码!除了它上次使用偏移量1和50的量。功能的时间。这有点讨厌,因为对两种类型都使用int意味着以错误的方式获取参数实在太容易了。正确的解决方案是使money成为struct,并使用指向成员变量的指针来实现“偏移量”-但我怀疑目前这有点麻烦。

void change(int* money, int bill, int offset)
{
   money[offset] = money[0]/bill;
   money[0] = money[0]%bill;  // Must be second.
}

void fifty(int* money)
{
   change(money, 1, 50);
}

void twenty(int* money)
{
   change(money, 2, 20);
}

void ten(int* money)
{
   change(money, 3, 10);
}

void five(int* money)
{
   change(money, 4, 5);
}

最后,以 just 为例,以错误的方式获取change的参数是多么容易,上面的代码正是我键入的方式-我只是做了那。固定这些参数留给读者练习。