我刚刚完成了哈佛 CS50P 在线课程,我的第一个项目是尝试开发一个程序来计算多项式函数的 y 值。我知道我的代码可能很糟糕
我刚刚完成了在线哈佛 CS50P 课程,我的第一个项目是尝试开发一个程序来计算多项式函数的 y 值。我知道我的代码可能优化得很糟糕,而且有一个库已经可以完成我正在做的事情,但这不是我真正的重点。我正在尝试做一些无论如何都能奏效的事情。
import math
equation = input("Equation: ").strip().lower().replace(" ", "")
value = input("Value of x: ")
chars = []
exponents = []
mults = []
sums = []
subs = []
divs = []
sqrts = []
result = 0
for char in equation:
if char == "x":
char = char.replace("x", value)
chars.append(char)
else:
chars.append(char)
for op in range(len(chars)):
if chars[op] == "^":
exponents.append(1)
elif chars[op] == "*":
mults.append(op)
elif chars[op] == "+":
sums.append(op)
elif chars[op] == "-":
subs.append(op)
elif chars[op] == "/":
divs.append(op)
elif chars[op] == "v":
sqrts.append(op)
for exponent in range(len(exponents)):
expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])
chars[exponents[exponent] - 1] = expResult
chars.remove(chars[exponents[exponent]])
chars.remove(chars[exponents[exponent]])
exponents.remove(1)
result += float(expResult)
for sqrt in range(len(sqrts)):
sqrtResult = int(chars[sqrts[sqrt] - 1]) * math.sqrt(int(chars[sqrts[sqrt] + 1]))
chars[sqrts[sqrt] - 1] = sqrtResult
chars.remove(chars[sqrts[sqrt]])
chars.remove(chars[sqrts[sqrt]])
result += float(sqrtResult)
for mult in range(len(mults)):
multResult = int(chars[mults[mult] - 1]) * int(chars[mults[mult] + 1])
chars[mults[mult] - 1] = multResult
chars.remove(chars[mults[mult]])
chars.remove(chars[mults[mult]])
result += float(multResult)
for div in range(len(divs)):
divResult = int(chars[mults[mult] - 1]) * int(chars[mults[mult] + 1])
chars[divs[div] - 1] = divResult
chars.remove(chars[divs[div]])
chars.remove(chars[divs[div]])
result += float(divResult)
print(result)
print(chars)
print(exponents)
我仍在开发它的第一步。但是,每当我输入一个包含多个操作的函数时,我都会得到 IndexError: list index out of range
.
例如:
Equation: x^3^3
Value of x: 2
Traceback (most recent call last):
File "/Users/vinisiqueira/graphingCalc/graphingCalc.py", line 38, in <module>
expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])
~~~~~~~~~^^^^^^^^^^
IndexError: list index out of range
当我将 for 循环改为仅迭代一次时,我得到:
Equation: 2^3^2
Value of x: 2
8.0
[8, '^', '2']
[1]
所以这意味着,对于第一次操作,它是有效的,但是当再次执行完全相同的操作时,它会失败。
如果这段代码不清楚的话,我深感抱歉,但如果有任何帮助我将不胜感激。
谢谢
您在尝试对对象进行编码以进行存储时遇到错误,可能是在使用 JSON 编码时。错误消息“将对象转换为可编码对象失败”通常发生在您尝试序列化没有相应 JSON 表示的对象时。在您的代码片段中,您尝试将 listAktifitas
包含类型对象的 listActivities
到存储中。要解决此错误,您需要确保其中的所有对象 listAktifitas
都是可编码的。
要修复此错误,您需要确保 PengunjungModel
还具有 toJson() 方法,以将其转换为可 JSON 编码的格式。以下是您可以修改 toJson()
中的方法 listActivities
以正确编码的 dataAktifitas
.
像这样 listActivities
更新你的 toJson()
类
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['namaAktifitas'] = namaAktifitas;
data['statusAktifitas'] = statusAktifitas;
data['countActivity'] = countActivity;
data['thumbnail'] = thumbnail;
data['dataAktifitas'] = dataAktifitas != null
? dataAktifitas!.map((pengunjung) => pengunjung.toJson()).toList()
: null; // Check if dataAktifitas is null to avoid runtime error
return data;
}
确保 PengunjungModel
还 toJson()
实施了适当的方法。
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['title'] = this.title;
data['harga_terendah'] = this.harga_terendah;
data['harga_tertinggi'] = this.harga_tertinggi;
data['deskripsi'] = this.deskripsi;
data['jam_buka'] = this.jam_buka;
data['jam_tutup'] = this.jam_tutup;
data['alamat'] = this.alamat;
data['fasilitas'] = this.fasilitas;
data['lat'] = this.lat.toString();
data['lng'] = this.lng.toString();
if (this.list_foto != null) {
data['foto'] = this.list_foto!.map((v) => v.toJson()).toList();
}
if (this.kategoriPengunjung != null) {
data['kategori_layanan_pengunjung'] = this.kategoriPengunjung!.toJson();
}
return data;
}
修改该 pushObjectWisata
函数如下:
Future<void> pushObjectWisata(int selectedIndex, String selectedObjectId) async{
PengunjungModel? dataObjectWisata = listObjectWisata.firstWhereOrNull(
(element) => element.id == selectedObjectId,
);
if (dataObjectWisata != null) {
// Check if the dataAktifitas list is initialized
if (listAktifitas[selectedIndex].dataAktifitas == null) {
listAktifitas[selectedIndex].dataAktifitas = [];
}
// Add the dataObjectWisata to the dataAktifitas list
listAktifitas[selectedIndex].dataAktifitas!.add(dataObjectWisata);
// Convert listAktifitas to a JSON string
String jsonListAktifitas = jsonEncode(
listAktifitas.map((aktivitas) => aktivitas.toJson()).toList(),
);
// Save the JSON string to storage
await saveListAktifitas(jsonListAktifitas);
} else {
print('PengunjungModel with id $selectedObjectId not found.');
}
}
检查所有类的定义。确保其所有属性都是原始类型(如 String、int、double、bool)、列表或映射,或者 toJson()
如果它们是自定义类,则它们实现一个方法。确保您有一个名为 Foto 的类, toJson()
向其添加该方法。