繁体   English   中英

结构 + 函数代码中断

[英]struct + functions code breaks

代码有问题,我找不到。 我被要求编写一个货币结构并使用函数来操作它。 但该代码不适用于任何功能。 我尝试了 structers 数组,结果很好,对于任何缺少的信息,请发表评论,我会尽快回复。

钱.txt

2

12 20

13 40

 #include <iostream> #include <fstream> using namespace std; struct Money { //declaring structure int dollars; int cents; }; Money addMoney(Money *p[], int n) { //adds money data Money cash{ 0,0 }; int i; for (int j = 0; j < n; j++) { cash.dollars = cash.dollars + p[j]->dollars; cash.cents = cash.cents + p[j]->cents; } if (cash.cents >= 100) //100cents = 1 dollar { i = (cash.cents) / 100; cash.dollars = cash.dollars + i; i = (cash.cents) % 100; cash.cents = i; } return cash; } void printMoney(Money *p[], int n) { //printing money data for (int i = 0; i < n; i++) { cout << "Dollars: " << p[i]->dollars << endl; cout << "Cents: " << p[i]->cents << endl; } } Money maxMoney(Money *p[], int n) { Money cash; cash.dollars = p[0]->dollars; cash.cents = p[0]->cents; for (int i = 0; i < n; i++) { if ((p[i]->dollars)>=(cash.dollars)) if ((p[i]->cents)>(cash.cents)) { cash.dollars = p[i]->dollars; cash.cents = p[i]->cents; } } return cash; } void main() { Money cash; ifstream mycin("money.txt"); if (mycin.fail()) cout << "Enable to open file"; int x; mycin >> x; Money *arr = new Money[x]; for (int i = 0; i < x; i++) { mycin >> arr[i].dollars; mycin >> arr[i].cents; } cout << "The values in money.txt are: "; printMoney(&arr, x); cash = addMoney(&arr, x); cout << "These values added are :"; cout << cash.dollars << " Dollars and " << cash.cents << " cents" << endl; cash = maxMoney(&arr, x); cout << "Maximum value is :"; cout << cash.dollars << " Dollars and " << cash.cents << " cents" << endl; }

这些函数似乎接受指向Money 的指针数组,但您正试图将它们与 Money 数组一起使用。

我建议您使用指向更简单类型(如int )的指针数组,直到您对这个概念感到满意,然后再尝试使用 Money。

这听起来很像家庭作业,所以我不会发布完整的解决方案,但我会解释似乎是误解的内容并给你一些指示。

首先,您将数据结构声明为 Money 结构数组,例如,包含 Money 结构的一系列连续内存块,主程序中的“arr”指向第一个。

但是,在程序的其余部分(函数)中,您似乎希望使用的数据结构是 Money指针数组。 看到不同? 它们不一样,这不会按原样工作。 你必须保持一致。

要么你正在处理一个结构数组,在这种情况下,你将一个简单的 Money* 有效地传递给你的函数无处不在(并且你用 . 而不是 -> 取消引用)

或者您正在处理一个指针数组,在这种情况下,您可以有效地传递一个指向 (Money 指针) 的指针,然后像您所做的那样使用 -> 取消引用。 但是,当您在主程序中读取它们时,您还必须单独分配每个 Money 结构。 也就是说,为指针数组分配内存不会自动为指针数组中的每个 Money 指针引用分配内存,因此您需要为正在读取的每个条目执行此操作。

因此,正如您现在应该意识到的那样,有多种方法可以修复您的程序。

根据您后来的评论,鉴于函数签名需要保持原样,我建议您使用 Money 指针数组。

Money** arr = new Money*[x]

然后你需要在阅读过程中在循环中添加一行,以实际使每个 Money * 指向一个 Money 结构:

for (int i = 0; i < x; i++)
{
    arr[i] = new Money
    ...

最后,因为“arr”现在是指向 Money 的指针,您可以直接将其传递给您的函数,因此调用它们只是例如:

printMoney(arr, x);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM