#c #arrays #multidimensional-array
#c #массивы #многомерный массив
Вопрос:
Я использовал ‘пузырьковую сортировку’ для моей программы на C , но она вводит случайные значения ‘0’ в массив в дробно-жадной программе
int sorteaza()
{
int aux,schimb,i;
do
{
schimb=0;
for (i=0;i<=n; i)
if (G[i][3]<G[i 1][3])
{
swap(G[i], G[i 1]);
}
}
while (schimb);
}
Это весь мой код:
#include<iostream>
using namespace std;
int n; // Numarul de elemente
float G[100][3]; // Obiecte detalii masa profit potenta
int masa = 0;
int read_data()
{
cout << "Greutatea Rucsac" << endl;
cin >> masa;
cout << "Obiecte: " << endl;
cin >> n;
for(int i = 1; i<=n;i )
{
for(int j = 1; j<=2;j )
{
cin >> G[i][j];
if(G[i][1] != 0 amp;amp; G[i][2] != 0)
{
G[i][3] = G[i][2] / G[i][1];
}
}
}
}
// 2 500
// 4 500
int sorteaza()
{
int aux,schimb,i;
do
{
schimb=0;
for (i=0;i<=n; i)
if (G[i][3]<G[i 1][3])
{
swap(G[i], G[i 1]);
}
}
while (schimb);
}
int verify()
{
for(int i = 1; i<=n;i )
{
for(int j = 1; j<=3;j )
{
cout << G[i][j];
cout << endl;
//G[i][3] = G[i][1] / G[i][2];
}
}
}
int greedy()
{
float profit = 0;
int i = 1;
int aux;
while(i<=n amp;amp; masa>=0)
{
//cout << "G[i][1]: " << G[i][1] << endl;
if(masa>=G[i][1]) {
//cout << "Am ajuns aici";
profit=profit G[i][2];
masa=masa-G[i][1];
}
else {
//cout << "Am ajuns dincolo";
aux= (masa*100)/G[i][1];
profit = profit (aux * G[i][2])/100;
break;
}
i ;
}
cout << profit;
}
int main()
{
read_data();
sorteaza();
verify();
// greedy();
}
Комментарии:
1. Вы выполняли отладку, чтобы выяснить, что происходит?
2. Если
G[i]
это массив из трех элементов, то какой уG[i]
него верхний индекс?3. Отладка бесполезна?! Это никогда не окажется на футболке.
4. Кроме того, вы уверены, что это
i 1
будет допустимый индексG
самого себя? И я не вижу, чтобы вы инициализировалиG[0]
. Подводя итог, более внимательно посмотрите на все индексы вашего массива.5. xkcd.com/163
Ответ №1:
Научитесь индексировать все свои массивы с нуля.
float G[100][3];
Допустимые индексы от 0 до 99 и от 0 до 2. Итак, этот код должен быть
for (int i = 0; i < n; i )
{
for (int j = 0; j < 2; j )
{
cin >> G[i][j];
}
if (G[i][0] != 0 amp;amp; G[i][1] != 0)
{
G[i][2] = G[i][1] / G[i][0];
}
}
и этот код должен быть
if (G[i][2] < G[i 1][2])
{
swap(G[i], G[i 1]);
}
Все ваши массивы начинаются с нуля. Я уверен, что вам это говорили, но вы должны начать применять это на практике.
В общем, напишите свои циклы for следующим образом
for (int i = 0; i < N; i)
Это правильный цикл для массива такого размера N
.
Ответ №2:
Вероятно, вам нужно <n
вместо ≤n
(вот откуда берется неинициализированное значение, т.е. 0). И вы пропускаете один цикл в сортировке пузырьков. Прямо сейчас вы помещаете только самый маленький элемент в конец списка.
Также понятия не имею, что вы делаете с этим schimb
и условием while.
Кроме того, вы определяете G как, float[100][3]
поэтому вы не можете использовать G[i][3]
, только G[i][2]
.
int sorteaza()
{
int i,j;
for (i=0; i<n; i )
{
for (j=i 1; j<n; j )
{
if (G[i][2] < G[j][2])
{
swap(G[i], G[j]);
}
}
}
}