Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
pretorian писал(а):
в Студио 2006 С++ эта прога тутже с ошибкой закрывается. В борланде выдают вот такой странный результат (причем ещё с писком динамика)
Код:
#include <iostream> using namespace std;
struct device { char name[20]; int year; int cost; device *next; };
device* first = NULL; #define MAX_COUNT 5
int addnew(char* N, int Y, int C) { device* lev = new device; strncpy(lev->name,N,19); lev->name[19]=0; lev->year = Y; lev->cost = C; int count=1; if(first == NULL){ first = lev; // добавляем первый элемент first->next = first; // ссылается на себя return 0; }else{ device* t=first; for(;t->next!=first;t=t->next,count++); // ищем последний элемент lev->next = first; // цепляем новый элемент за начало t->next = lev; // добавляем if(count == MAX_COUNT){ // если в очереди уже было максимальное // число записей, то первую удаляем lev->next = first->next; delete first; first = lev->next; } } return count; } void print() { if(first == NULL){ cout<<"empty"<<endl; return; } device* now = first; cout<<"-------------------------\n"; do{ cout<<now->name<<" " ; cout<<now->cost<<" "; cout<<now->year<<endl; now = now->next; }while(now != first); } void del_list(){ if(first==NULL)return; device* mas[MAX_COUNT]; // массив указателей :) device* now = first; int c = 0; do{ // заполняем массив mas[c++] = now; now = now->next; }while(now != first); for(int i=0;i<c;i++) delete mas[i]; // и массово удаляем } int main() { addnew("nomer1",1998,20043); addnew("nomer2",2008,20043433); addnew("nomer3",1988,200000); addnew("nomer4",1977,20000); addnew("nomer5",1984,200); addnew("nomer6",1991,5150); addnew("nomer7",1991,5150);
print(); del_list(); system("pause"); return 0; }
Вот немного переделал. Попробуй разберись сначала с этим. Удаление списка, правда, чтобы много не думать, сделал попроще.
Member
Статус: Не в сети Регистрация: 30.01.2006 Откуда: Минск
pretorian Проблема заключается в том, что в начале список пуст. А твои функции рассчитаны на работу со списком, в котором
есть уже как минимум один элемент first. Соответственно код немного нужно изменить, чтобы учесть случай пустого списка.
достаточно в коде просто изменить:
device* first; на device* first=NULL;
т.к. иначе он будет ссылаться у тебя непонятно куда.
и добавить в addnew в начале
Добавлено спустя 17 минут, 16 секунд Также проверку на пустый список надо будет вставить и в функцию удаления элемента.
В принципе можешь полностью перейти на вариант mein, только мне в нем не нравиться ограничение на MAX_COUNT.
LiS95 в такого типа прогах отличие действительно только в том, что вместо cout нужно использовать printf и вместо cin scanf. И еще- если компилятор Borland, int i объявляй только в первом цикле, в остальных просто i.
Member
Статус: Не в сети Регистрация: 31.08.2005 Откуда: Мир
Спасибо всем большое )
Работает, но только почемуто 2 раза выводит первый и оин разщ 2й элемент, а 3й не выводит...
я подправил и теперь выводит токо 1й и второй...щас подумаю ещё, может исправлю..
Вот так теперь добавление новго происходит:
int main() { addnew("nomer1",1998,20043); addnew("nomer2",2008,20043433); addnew("nomer3",1988,200000); print();
return 0; }
а в результате токо 2 эл-та:
----------------
20043
nomer1
1998
----------------
20043433
nomer2
2008
Press any key to continue
Скорей всего это недочет в выводе...где цикл while (now->next!=first)
я пробовал делать с постусловием, но всё равно также, а если заменить на
for (int i=0;i<3;i++) ..
то работает.
Просто не хватает ещё одной итерации...
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Есть код
const int size=data.size();
float massiv[size][size];
, где data - вектор. Нужно создать двумерный массив такого же размера, код выдает ошибку Expected constant expresion. Вроде же все правильно!
Member
Статус: Не в сети Регистрация: 31.08.2005 Откуда: Мир
kexman писал(а):
Есть код const int size=data.size(); float massiv[size][size]; , где data - вектор. Нужно создать двумерный массив такого же размера, код выдает ошибку Expected constant expresion. Вроде же все правильно!
Скорей всего это:
const int size=data.size();
не константа. попробуй убери const.
Да и массив лучше делать динамический.
Member
Статус: Не в сети Регистрация: 30.01.2006 Откуда: Минск
kexman, ты пытаешься создать статический массив с заранее неизвестными границами. Это невозможно.
Поэтому тебе и пишет ошибку. Здесь придется создавать массив динамически.
Код:
int size=data.size(); float **matrix; matrix=(float **) malloc(size*sizeof(float*)); for (int i=0;i<size;i++) matrix[i]=(float *) malloc(size*sizeof(float));
Хотя я предпочитаю в таких случаях создавать одномерный, и ориентироваться по смещению-мне как-то удобнее.
Код:
int size=data.size(); float *matrix=(float*) malloc(size*size*sizeof(float));
Добавлено спустя 2 минуты, 42 секунды const можно оставить. На работу проги это никак не повлияет. Только менять это значение потом нельзя будет.
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Где можно нарыть про вычисление обратной матрицы? Нашел немного сам, но блин не очень.... Добавлено спустя 1 минуту, 18 секунд или может есть какие-то готовые функции, библиотеки?
Member
Статус: Не в сети Регистрация: 30.01.2006 Откуда: Минск
kexman насчет динамического массива- pretorian неплохо написал.
Насчет литературы- я изучал С по Шилдту, по-моему доступно и понятно написано. С++ уже читал значительно позже по книге Страуструпа, но в ней ИМХО без значительных предварительных знаний синтаксиса и базовых концепций ООП разобраться нереально, во всяком случае придется при чтении листать книгу назад-вперед.
Насчет обратной матрицы- тебе нужен сам принцип вычисления или решение в С++?
Готовые функции у кого-то конечно есть, только в стандартной библиотеке я таких не видел.
Алгоритма вычисления мне известно два: первый- через построение матрицы миноров, второй- путем добавления к исходной матрице единичной и преобразования исходной матрицы так, что на месте исходной матрицы получится единичная. Тогда на месте единичной окажется обратная исходной.
Вот упрощенная реализация второго способа:
Код:
#include <iostream.h> void main() { int size; cout<<"Inter size of matrix:"; cin>>size; double **matrix=new double*[size]; for (int i=0;i<size;i++) matrix[i]=new double[2*size]; cout<<"Enter matrix:\n"; for (i=0;i<size;i++) for (int j=0;j<size;j++) { cin>>matrix[i][j]; if (i==j) matrix[i][j+size]=1; else matrix[i][j+size]=0; } double coef; for (i=0;i<size-1;i++) for (j=i+1;j<size;j++) { coef=matrix[j][i]/matrix[i][i]; for (int k=i+1;k<2*size;k++) matrix[j][k]=matrix[j][k]-coef*matrix[i][k]; } for (i=size-1;i>0;i--) for (j=i-1;j>=0;j--) { coef=matrix[j][i]/matrix[i][i]; for (int k=size;k<2*size;k++) matrix[j][k]=matrix[j][k]-coef*matrix[i][k]; } for (i=0;i<size;i++) if (matrix[i][i]!=1) for (j=size;j<2*size;j++) matrix[i][j]/=matrix[i][i]; cout<<"Inverse matrix:\n"; for (i=0;i<size;i++) { for (j=size;j<2*size;j++) { cout.width(10); cout<<matrix[i][j]; } cout<<"\n"; } }
Здесь ещё нужно добавить проверку на равность определителя матрицы 0-тогда обратная матрица не существует, а также возможен случай
при вычислении coef, что элемент matrix[i][i] будет равен 0- тогда там надо переставлять строки.
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Alex12 Спасибо большое!! Только где еще можно про это математически почитать? Не охота просто тупо взять и вставить непонятный код..
Добавлено спустя 55 минут, 42 секунды
Alex12 писал(а):
а также возможен случай при вычислении coef, что элемент matrix[i][i] будет равен 0- тогда там надо переставлять строки.
У меня как раз такой случай, как надо переставлять строки? Добавлено спустя 2 часа, 47 минут, 6 секунд Переставил строки в исходной матрицы, все получилось и сошлось с ответом. Интересно все-таки, где ты такой хороший алгоритм надыбал, везде, где я не искал сложные и навороченные, с большим количеством этапов. А у тебя всего 3 цикла))
Member
Статус: Не в сети Регистрация: 30.01.2006 Откуда: Минск
kexman, эти методы рассказывают в курсе высшей математики, потом на численных методах разбирают компьютерную реализацию. Насчет алгоритма- прочитал твой пост, вспомнил численные методы и написал . Может ты находил какие-нибудь навороченные способы, работающие быстрее. Здесь вроде всё просто, наворотов нигде не должно быть.
Member
Статус: Не в сети Регистрация: 31.08.2005 Откуда: Мир
Alex12 А вот в моей кольцевой очередь должно быть два указателся: начало и конец...
получается что сначала надо first=last, а потом добавляя новый, как бы сдвигать last ?
Member
Статус: Не в сети Регистрация: 14.03.2004 Откуда: Москва
pretorian По идее да(код смотреть лень)
Прочитав я это, не очень понимаю мешанину С/С++ стилей
Для матриц проще и красивей сделать через template, а потом сказать человеку, что использовать так и так (например просто Matrix), а уж когда доучится до того, чтоб понять код - разберётся.
_________________ ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо
Member
Статус: Не в сети Регистрация: 09.10.2006 Откуда: 59'39N 30'36E
народ, что за баг с компилятором - грит не может найти iostream/iostream.h (указываю и то и др. в опции-директории). уже указывал так C:\C\INCLUDE\ все равно не пашет. че делать? у меня какой-то 3.1 совмещенный с 3.0. независимо от того, что мне ответят, выложите плз ссылку на компилятор Borland C++ 3.1 , в гугле не нашел ниче нормального
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения