我对C编程很陌生。我真的不明白为什么printf会给出未定义的行为输出。我试着反复检查每一个命令,我不认为我目前的知识有错。我的密码怎么了?
struct Barang
{
int Kode;
int Jumlah;
int HargaSatuan;
float Total;
char Nama[20];
}Brg[10];
int i,j,harga=0,banyak;
float rata=0;
printf("Berapa banyak barang? : ");
scanf("%d",&banyak);
for (i=0;i<banyak;i++)
{
printf("\nBarang Ke-%d\n",i+1);
printf("Masukkan Kode : ");
scanf("%d",&Brg[i].Kode);
fflush(stdin);
printf("Masukkan Nama Barang : ");
fgets(Brg[i].Nama,20,stdin);
strtok(Brg[i].Nama, "\n" );
printf("Masukkan Harga Satuan : ");
scanf("%d",&Brg[i].HargaSatuan);
printf("Ada Berapa Jumlah? : ");
scanf("%d",&Brg[i].Jumlah);
harga+=Brg[i].HargaSatuan;
}
for (i=0;i<banyak;i++)
{
printf("\nBarang Ke-%d\n",i+1);
printf("Kode : %d\n",Brg[i].Kode);
printf("Nama Barang : %s\n",Brg[i].Nama);
printf("Harga Satuan : %d\n",Brg[i].HargaSatuan);
printf("Jumlah : %d\n",Brg[i].Jumlah);
}
j=i;
Brg[i].Total=(float)(Brg[i].HargaSatuan*Brg[i].Jumlah);
rata=(float)Brg[i].Total/j;
printf("\nTotal Harga Semua Barang : %.2f\n",Brg[i].Total);
printf("Rata-Rata Harga Barang : %.2f\n",rata);如果我运行它
Berapa banyak barang? : 2
Barang Ke-1
Masukkan Kode : 20
Masukkan Nama Barang : Tes A
Masukkan Harga Satuan : 20
Ada Berapa Jumlah? : 1
Barang Ke-2
Masukkan Kode : 10
Masukkan Nama Barang : Tes B
Masukkan Harga Satuan : 30
Ada Berapa Jumlah? : 2
Barang Ke-1
Kode : 20
Nama Barang : Tes A
Harga Satuan : 20
Jumlah : 1
Barang Ke-2
Kode : 10
Nama Barang : Tes B
Harga Satuan : 30
Jumlah : 2
Total Harga Semua Barang : 2093416448.00
Rata-Rata Harga Barang : 1046708224.00
Process returned 0 (0x0) execution time : 21.303 s
Press any key to continue.它给了我非常错误的输出和意想不到的结果。正确的输出应该如下所示:
Berapa banyak barang? : 2
Barang Ke-1
Masukkan Kode : 20
Masukkan Nama Barang : Tes A
Masukkan Harga Satuan : 20
Ada Berapa Jumlah? : 1
Barang Ke-2
Masukkan Kode : 10
Masukkan Nama Barang : Tes B
Masukkan Harga Satuan : 30
Ada Berapa Jumlah? : 2
Barang Ke-1
Kode : 20
Nama Barang : Tes A
Harga Satuan : 20
Jumlah : 1
Barang Ke-2
Kode : 10
Nama Barang : Tes B
Harga Satuan : 30
Jumlah : 2
Total Harga Semua Barang : 70
Rata-Rata Harga Barang : 23.3
Process returned 0 (0x0) execution time : 21.303 s
Press any key to continue.我该怎么解决这个问题?谢谢。
发布于 2022-03-09 17:07:21
当你做的时候
Brg[i].Total=(float)(Brg[i].HargaSatuan*Brg[i].Jumlah);
rata=(float)Brg[i].Total/j;您在循环之外,这意味着i将是一个超出初始化数据范围的索引。
对于数组中有两个条目的输入,有效的索引将是0和1。循环后的i值将是2。
您需要在循环中修改一个单独的total变量。
发布于 2022-03-09 17:29:27
循环中有一个错误:
for (i=0;i<banyak;i++)
{
printf("\nBarang Ke-%d\n",i+1);
printf("Kode : %d\n",Brg[i].Kode);
printf("Nama Barang : %s\n",Brg[i].Nama);
printf("Harga Satuan : %d\n",Brg[i].HargaSatuan);
printf("Jumlah : %d\n",Brg[i].Jumlah);
}
j=i;
Brg[i].Total=(float)(Brg[i].HargaSatuan*Brg[i].Jumlah);
rata=(float)Brg[i].Total/j;
printf("\nTotal Harga Semua Barang : %.2f\n",Brg[i].Total);当循环完成后,i = banyak,但是Brg[i]的值只为i定义,直到banyak - 1。我想你的意思是:
float total = 0;
for (i = 0; i < banyak; i++) {
printf("\nBarang Ke-%d\n",i+1);
printf("Kode : %d\n",Brg[i].Kode);
printf("Nama Barang : %s\n",Brg[i].Nama);
printf("Harga Satuan : %d\n",Brg[i].HargaSatuan);
printf("Jumlah : %d\n",Brg[i].Jumlah);
Brg[i].Total = (float)(Brg[i].HargaSatuan * Brg[i].Jumlah);
total += Brg[i].total;
}
rata = total / banyak;
printf("\nTotal Harga Semua Barang : %.2f\n",total);https://stackoverflow.com/questions/71413227
复制相似问题