Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 17 из 87<  1 ... 14  15  16  17  18  19  20 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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 в начале
Код:
if (first==NULL) {
  first=new device;
  strcpy(first->name ,N);
  first->year =Y;
  first->cost =C;
  first->next=first;
}

а в print
Цитата:
Код:
   if(first == NULL){
       cout<<"empty"<<endl;
       return;
   }


Добавлено спустя 17 минут, 16 секунд
Также проверку на пустый список надо будет вставить и в функцию удаления элемента.
В принципе можешь полностью перейти на вариант mein, только мне в нем не нравиться ограничение на MAX_COUNT.
LiS95 в такого типа прогах отличие действительно только в том, что вместо cout нужно использовать printf и вместо cin scanf. И еще- если компилятор Borland, int i объявляй только в первом цикле, в остальных просто i.


 

Member
Статус: Не в сети
Регистрация: 31.08.2005
Откуда: Мир
Спасибо всем большое )

Работает, но только почемуто 2 раза выводит первый и оин разщ 2й элемент, а 3й не выводит...
я подправил и теперь выводит токо 1й и второй...щас подумаю ещё, может исправлю..
Вот так теперь добавление новго происходит:
Код:
int addnew(char N[20], int Y, int C) {

   if (first==NULL) {
  first=new device;
  strcpy(first->name ,N);
  first->year =Y;
  first->cost =C;
  first->next=first;
}
   else {
 device* now=first;
while (now->next!=first) now=now->next;
now->next=new device;
now=now->next;
//now->name =N;
strcpy(now->name ,N);
now->year =Y;
now->cost =C;

now->next=first; }
return 0;
}


и вывод:
Код:
void print() {
   device* now=first;
   if(first == NULL){
       cout<<"empty"<<endl;
       return;
   }
   while (now->next!=first) {
      cout<<"----------------\n";
      cout<<now->cost<<"\n";
      cout<<now->name<<"\n" ;
      cout<<now->year<<"\n";
      now=now->next;
   }
}


Сама прога:
Код:
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
Откуда: Уфа
Как конвертировать строку типа CString в тип float?
Добавлено спустя 58 минут, 8 секунд
float f=atof((LPCTSTR)cstr);
нашел, но долго искал)


 

Member
Статус: Не в сети
Регистрация: 30.01.2006
Откуда: Минск
pretorian, цикл с постусловием должен иметь условие while (now!=first);- тогда будет работать.


 

Member
Статус: Не в сети
Регистрация: 31.08.2005
Откуда: Мир
Супер! работает ) спасиба.

_________________
Loading...


 

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
Откуда: Уфа
Alex12
Спасибо!! ЗАработало, только я в упор не могу понять этот код:
Код:
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));

Где можно прочесть про это?


 

Member
Статус: Не в сети
Регистрация: 31.08.2005
Откуда: Мир
Alex12,
Напиши ему лучше через new, понятней будет.


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
pretorian
Так чтоли:
Код:
float (*matrix)[size]= new float[size][size];
?


 

Member
Статус: Не в сети
Регистрация: 31.08.2005
Откуда: Мир
kexman писал(а):
pretorian
Так чтоли:
Код:
float (*matrix)[size]= new float[size][size];
?


float **matrix;
matrix=new float * [size];
for (int i=0;i<size;i++)
matrix[i]=new float[size]

вот так вроде.
(Сначала объявляем массив указателей, а потом каждому укахателю указываем на массив ) типа того..


 

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 , в гугле не нашел ниче нормального


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 17 из 87<  1 ... 14  15  16  17  18  19  20 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan