Struct +函数代码中断

struct + functions code breaks

本文关键字:中断 代码 函数 Struct      更新时间:2023-10-16

代码有问题,我找不到它。我被要求编写一个money结构体,并使用函数对其进行操作。但是代码对任何函数都不起作用。我试着数数构造器数组,它很好地显示了任何遗漏的信息请留言,我会尽快回复。

Money.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指针数组。

Money** arr = new Money*[x]

然后你需要在你的循环中添加一行,使每个Money *指向一个Money结构体:

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

最后,因为"arr"现在是指向Money指针的指针,你可以直接把它传递给你的函数,所以调用它们就像:

printMoney(arr, x);