![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Tribunal |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
Здравствуйте.
Мне нужно написать программу , которая будет уравнивать химическую реакцию. Соответственно нужно прийти к СЛАУ, по которой и находить коэффициенты реакции. В этом и состоит сейчас моя проблема.Написанный мною код в C++Builder 6 выдаёт ошибку о типе integer. Вот собственно код.Надеюсь на какие-то идеи и вашу помощь. На форме Edit'ы для введения элементов веществ и их индексов с расчетом на 3 вещества в левой части и 4- в правой.А так же-StringGrid для выведения полученной матрицы.
{
char *element[10][2];
int index[10][7];
//==x1==//
int x=0;
int i=0;
AnsiString a;
a=Edit1->Text;
*element[i]=Edit1->Text.c_str();
index[i][x]=StrToInt(Edit2->Text);
a=Edit3->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=StrToInt(Edit4->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit4->Text);
};
}
a=Edit5->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{
index[j][x]=StrToInt(Edit6->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit6->Text);
};
}
//==x1==//
//==x2==//
x++;
a=Edit7->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=StrToInt(Edit8->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit8->Text);
};
}
a=Edit9->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{
index[j][x]=StrToInt(Edit10->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit10->Text);
};
}
a=Edit11->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=StrToInt(Edit12->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit12->Text);
};
}
//==x2==//
//==x3==//
x++;
a=Edit15->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=StrToInt(Edit16->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit16->Text);
};
}
a=Edit17->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{
index[j][x]=StrToInt(Edit18->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit18->Text);
};
}
a=Edit19->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=StrToInt(Edit20->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit20->Text);
};
}
//==x3==//
//==x4==//
x++;
a=Edit22->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit23->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit23->Text);
};
}
a=Edit24->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{
index[j][x]=-StrToInt(Edit25->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit25->Text);
};
}
a=Edit26->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit27->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit27->Text);
};
}
//==x4==//
//==x5==//
x++;
a=Edit28->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit29->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit29->Text);
};
}
a=Edit30->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{
index[j][x]=-StrToInt(Edit31->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit31->Text);
};
}
a=Edit32->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit33->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit33->Text);
};
}
//==x5==//
//==x6==//
x++;
a=Edit34->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit35->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit35->Text);
};
}
a=Edit36->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{
index[j][x]=-StrToInt(Edit37->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit37->Text);
};
}
a=Edit38->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit39->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit39->Text);
};
}
//==x6==//
//==x7==//
x++;
a=Edit40->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit41->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit41->Text);
};
}
a=Edit42->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{
index[j][x]=-StrToInt(Edit43->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit43->Text);
};
}
a=Edit44->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit45->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit45->Text);
};
}
//==x7==//
for (int i=0;i<10;i++)
{ for (int j=0;j<7;j++)
{ StringGrid1->Cells[j][i]=IntToStr(index[i][j]);
}
}
}
Сообщение отредактировано: Tribunal - 4.11.2007 11:08 -------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Написанный мною код в C++Builder 6 выдаёт ошибку о типе integer Можно уточнить, где именно он выдает ошибку? Строку в коде показать желательно... Кстати, ошибка этапа компиляции, или уже выполнения?Потому как отследить что-то в программе, которая требует 45 Edit-ов просто нереально (от значения каждого из них может все кардинально измениться...) |
Tribunal |
![]()
Сообщение
#3
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
строку указать не могу.
ошибка выдаётся,когда я нажимаю кнопку выполнения программы,то есть сам код компилируется без ошибок. я думала,что дело в незаполненных полях..в принципе,так оно и есть... но теперь,даже если заполнять все поля, всё равно вылазиет ошибка с указанием ее кода(код длинный ![]() прикрепляю файлы программы... ![]() Сообщение отредактировано: Tribunal - 4.11.2007 16:18 -------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Пример входных данных тогда уже тоже приведи... (лучше всего, введи данные, и сними скриншот, чтоб было видно о чем говорим).
|
Tribunal |
![]()
Сообщение
#5
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
вот пример входных данных
![]() при этом выдаёт ошибку к строке 96 Код index[i][x]=StrToInt(Edit12->Text); %) -------------------- irreparabilium felix olivio rerum
|
Tribunal |
![]()
Сообщение
#6
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
а...и подскажите,пожалуйста..
мне нужно найти коэффициенты к каждому веществу,т.е. нужно решить СЛАУ с правым нулевым столцом.. как лучшеэто сделать? ![]() -------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
|
Tribunal |
![]()
Сообщение
#8
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
я сделала вот так(запоминание текущего размера массива элементов,т.е номер строки в двумерном массиве индексов),только выдаёт ошибку всё равно на 31 Edit'e (при тех же входных данных)...
![]() for (int j=0;j<n;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=-StrToInt(Edit4->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=-StrToInt(Edit4->Text);
n=i;
};
}
-------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата я сделала вот так Это должно было что-то изменить? Ты что, теперь уверена, что при обращении по какому-то индексу ты не вылетаешь за пределы массива? |
Tribunal |
![]()
Сообщение
#10
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
в описании массивов делать цифры больше тоже не помогает.тогда что?подскажите,пожалуйста...
-------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
У тебя немного неверна структура программы... Я не говорю о том, что можно все то, что ты написала в первом посте (с использованием FindComponent, например) уложить в 10 строк... Проблема в другом. Смотри:
Берем вот этот фрагмент: Цитата a=Edit3->Text;
for (int j=0;j<10;j++)
{ if (a.c_str()==*element[j])
{ index[j][x]=StrToInt(Edit4->Text);
}
else
{ i++;
*element[i]=a.c_str();
index[i][x]=StrToInt(Edit4->Text);
};
}
Код, который я процитировал, этого не делает... Вот так (насколько я понимаю задачу) будет правильно: a=Edit3->Text;
done = 0;
for (int j=0;j<10;j++)
if (a.c_str()==*element[j]) {
index[j][x]=StrToInt(Edit4->Text);
done = 1;
}
if(!done) { // Только если не нашли ничего в element
*element[++i]=a.c_str();
index[i][x]=StrToInt(Edit4->Text);
};
|
Tribunal |
![]()
Сообщение
#12
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
спасибо..
правда как-то странно всё это сейчас происходит..но я над этим работаю...)) а что за FindComponent в 10 строк? ![]() и кстати не подскажете алгоритм приведения матрицы к диагональному виду..?) -------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
а что за FindComponent в 10 строк? ![]() Смотри, во что превратилась твоя процедура: void __fastcall TForm1::Button1Click(TObject *Sender)
{
const int size = 21;
int numbers[size] = {
1, 3, 5, 7, 9, 11, 15, 17, 19,
22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44
};
AnsiString element[size];
int index[size][7] = {0};
int curr_line = 0;
for(int i = 0; i < size; ++i) {
TEdit *LetterEdit = (TEdit *)(Form1->FindComponent("Edit"+IntToStr(numbers[i])));
TEdit *IndexEdit = (TEdit *)(Form1->FindComponent("Edit"+IntToStr(numbers[i] + 1)));
AnsiString a = LetterEdit->Text;
bool found = false;
for(int j = 0; j < curr_line; ++j) {
if(element[j] == a) {
index[j][i / 3] = ((i > 8) ? -1 : 1) * StrToInt(IndexEdit->Text);
found = true; break;
}
}
if(!found) {
element[curr_line] = a;
index[curr_line++][i / 3] = ((i > 8) ? -1 : 1) * StrToInt(IndexEdit->Text);
}
}
for(int i = 0; i < curr_line; ++i) {
for(int j = 0; j < 7; j++) {
StringGrid1->Cells[j][i] = IntToStr(index[i][j]);
}
}
}
![]() |
Tribunal |
![]()
Сообщение
#14
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
ааа ужас какой
![]() классно!работает)) спасибо ![]() извинитеза наглость,вы мне так уже очень помогли, но всё-таки как лучше решить получившуюся СЛАУ. есть смысл приводить к диагональному виду? Сообщение отредактировано: Tribunal - 8.11.2007 2:21 -------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Я бы попробовал метод Холецкого: Решение систем (это в FAQ-е реализация на Паскале, перенести на С++ не должно быть проблемой)
Ну, или что-нибудь отсюда: AlgLib: Решение систем линейных уравнений |
Tribunal |
![]()
Сообщение
#16
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
вот переделала код(метод Холецкого) под свою задачу.ругается на деление "/"...
посоветуйте, пожалуйста, что-нибудь?) может что-то еще нужно исправить? посмотрите,пожалуйста... Код int N=curr_line; int t,max,p,s; int b[21]={0}; int x[21]; for (int i=0;i<N;i++) { index[i][N]=b[i];} for (int i=0;i<N;i++) { int max=0; for (int j=0;j<N;j++) { if (max<abs(index[i][j])) { max=abs(index[i][j]); p=j; } } if (p!=i) { for (int j=0;j<N+1;j++) { index[N][j]=index[i][j];} for (int j=0;j<N+1;j++) { index[i][j]=index[p][j]; } for (int j=0;j<N+1;j++) { index[p][j]=index[N][j];} }; } for (int j=0;j<N+1;j++) { index[0][j]=index[0][j]/index[0,0];} for (int m=0;m<N;m++) { for (int i=0;i<N;i++) { s=0; for (int k=0;k<m;k++) { s=s+index[i][k]*index[k][m]; index[i][m]=index[i][m]-s; }; for (int j=m+2;j<N+1;j++) { s=0; for (int k=0;k<m;k++) { s=s+index[m][k]*index[k][j];}; index[m][j]=(index[m][j]-s)/index[m][m]; }; }; x[N-1]=index[N-1][N]; for (int i=N-2;i>=0;i--) { s=0; for (int k=i+1;k>N;k++) { s=s+index[i][k]*x[k];} x[i]=index[i][N]-s; } } и еще вопрос небольшой. может знаете как из формы1 проекта в билдере вызывать форму 2, то етсь делать ее видимой... объявление ее типа не помогает...не пойму как это сделать.. ![]() -------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
Цитата ругается на деление "/"... Естественно... Ты хочешь int поделить на указатель? ![]() Вот так: for (int j=0;j<N+1;j++)
{ index[0][j]=index[0][j]/index[0][0];} // <--- внимательнее с индексами, это ДВУмерный массив
|
Tribunal |
![]()
Сообщение
#18
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
хмм странно теперь ругается на деление на ноль
в этой же строке, хотя в этом элементе массива совсем не ноль( у меня теперь такие входные данные: ![]() -------------------- irreparabilium felix olivio rerum
|
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
|
Tribunal |
![]()
Сообщение
#20
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
эээ...и что делать?
![]() -------------------- irreparabilium felix olivio rerum
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 1:48 |