Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про сортировку и использование дат 
V
    Опции темы
Exister
Дата 9.4.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.12.2006

Репутация: нет
Всего: нет



Чтоб не создавать 2 темы задам оба вопроса тут:
1)есть однонаправленная списковая структура с 3 полями
Код

struct EL{int key;
              struct sklad dan; 
              struct EL *next;
             };


нужно упорядочить ее по dan.tovar т.е. по названию получается
написал вот такой код, компилятор ошибок не выдает,но при запусе этой ф-ции прога вылетает, пишет память не может быть "read". Кто видит ошибку? 
Код

void Base::sortByName_kg(){int kk=1;
                           sklad tmp;
                           int tmpp; 
                           while(kk){kk=0;
                                     for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)
                                       {if(strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar)<0)
                                          {tmp=ref_kg->dan;
                                           tmpp=ref_kg->key;
                                           ref_kg->dan=ref_kg->next->dan;
                                           ref_kg->key=ref_kg->next->key;
                                           ref_kg->next->dan=tmp;
                                           ref_kg->next->key=tmpp;
                                           kk=1;
                                           } 
                                       }   
                                    }
                           saveToFile_kg(); return;    
                          }

2)Нужно проверять не истек ли срок годности товара т.е. для товара вводятся дата поступления и срок годности и сравнить эт с сегодняшней датой. Как это сделать?
Буду очень благодарен за помощь, а то сдача курсовой на носу, а я с этим застопорился.
PM MAIL   Вверх
JAnty
  Дата 9.4.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Цитата(Exister @  9.4.2007,  13:58 Найти цитируемый пост)
for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)


Есть подозрения на бесконечность цикла, next меняут значение???
И потом:

Код

int kk=0;
while(kk){kk=0;
     /*eсли условие верно то*/ kk=1;    
};// вывод: цикл опять безконечен.

Ищи ошибку сообщениями:
int _tmp_;
 printf("%d",_tmp_);
тоесть:

Код

void Base::sortByName_kg(){int kk=1, _tmp_; 
                           sklad tmp;
                           int tmpp; 
                           while(kk){kk=0;
                                     for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)
                                       {if(strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar)<0)
                                          {tmp=ref_kg->dan;
                                           tmpp=ref_kg->key;
                                           ref_kg->dan=ref_kg->next->dan;
                                           ref_kg->key=ref_kg->next->key;
                                           ref_kg->next->dan=tmp;
                                           ref_kg->next->key=tmpp;
                                           kk=1;
                                           }// end if; 
                                     printf("%d",_tmp_++);
                                       }// next ref_kg;    
                                    }//end while;
        saveToFile_kg(); return;    
}



Это сообщение отредактировал(а) JAnty - 9.4.2007, 14:36


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
The Thing
Дата 9.4.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: нет
Всего: 3



Сравнивай текущую дату с указанной датой

Код

//0  F > L
//1  F < L
//2  F = L
function SravnData(Fd, Fm, Fy, Ld, Lm, Ly:Integer): Integer;
begin
  if Fy > Ly then begin
      SravnData := 0;
  end
  else if Fy < Ly then begin
    SravnData := 1;
  end
  else if Fy = Ly then begin
    if Fm > Lm then begin
        SravnData := 0;
    end
    else if Fm < Lm then begin
      SravnData := 1;
    end
    else if Fm = Lm then begin
      if Fd > Ld then begin
          SravnData := 0;
      end
      else if Fd < Ld then begin
        SravnData := 1;
      end
      else if Fd = Ld then begin
        SravnData := 2;
      end;
    end;
  end;
end;




Это сообщение отредактировал(а) The Thing - 9.4.2007, 14:47


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Vyacheslav
Дата 9.4.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Где гарантия что в 
Код

if(strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar

ref_kg->next  не равно NULL;



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
The Thing
Дата 9.4.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: нет
Всего: 3



Переписал на Си... но не проверял. Потыкай ее.. помоему я уже находил в ней какую-то ошибку в последних двух условиях...
Код

//0  F > L
//1  F < L
//2  F = L
int SravnData(int Fd, int Fm, int Fy, int Ld, int Lm, int Ly)
{
  if(Fy > Ly) SravnData = 0;
  else if(Fy < Ly) SravnData = 1;
  else if(Fy = Ly)
  {
     if(Fm > Lm) SravnData = 0;
     else if(Fm < Lm) SravnData = 1;
     else if(Fm == Lm){
       if(Fd > Ld) SravnData = 0;
       else if(Fd < Ld) SravnData = 1;
       else if(Fd == Ld) SravnData = 2;
     }
  }
}


Добавлено через 4 минуты и 19 секунд
На счет первого вопроса: у тебя как-то неаккуратно написан код (на мой взгляд..) - разбираться даже не хочется. Лучше всего возьми базу из 2-4 элементов и проверь в режиме отладки. Сам все найдешь...

Добавлено через 7 минут и 32 секунды
Цитата(Vyacheslav @ 9.4.2007,  14:48)
Где гарантия что в 
Код

if(strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar

ref_kg->next  не равно NULL;

Нет, а она и не нужна...
неужели не может быть строки нулевой длины?
если вторая часть отлична от нулуля, то выдаст != 0 smile


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Exister
Дата 9.4.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.12.2006

Репутация: нет
Всего: нет



добавил сообщения, выходит что
Код

for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)

выполняется 1 раз т.е. после первого выполнения IF сразу вылетает.
PM MAIL   Вверх
Vyacheslav
Дата 9.4.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(The Thing @  9.4.2007,  14:53 Найти цитируемый пост)
Нет, а она и не нужна...
неужели не может быть строки нулевой длины?
если вторая часть отлична от нулуля, то выдаст != 0  

Ээ. Вы поняли, что Вы написали? При входе в цикл мы знаем что ref_kg не равно NULL
Но никто не гаранитирует, что ref_kg - последний в списке и  ref_kg->next == NULL. А мы пытаемся получить ref_kg->next->dan.tovar. То есть NULL->dan.tovar. Что при такой попытке мы получим smile ?




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Exister
Дата 9.4.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.12.2006

Репутация: нет
Всего: нет



The Thing, большое спасибо за подсказку с датами, все отлично работает.
Осталось только упорядочить. Кто-нибудь может с этим помочь? 
PM MAIL   Вверх
Arks
Дата 10.4.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



1) Что такое ref_kg - лучше бы её локальной сделать. Иначе можешь где-нибудь испортить и потом долго думать из-за чего так странно прога себя ведет.
2) Проверь правильно ли строится список
3) if(ref_kg->next && strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar)<0)
   либо
    if(ref_kg!=NULL)
       for(ref_kg=head_kg; ref_kg->next!=NULL; ref_kg=ref_kg->next)
PM MAIL ICQ Skype MSN   Вверх
The Thing
Дата 10.4.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: нет
Всего: 3



Цитата(Vyacheslav @ 9.4.2007,  17:22)
Цитата(The Thing @  9.4.2007,  14:53 Найти цитируемый пост)
Нет, а она и не нужна...
неужели не может быть строки нулевой длины?
если вторая часть отлична от нулуля, то выдаст != 0  

Ээ. Вы поняли, что Вы написали? При входе в цикл мы знаем что ref_kg не равно NULL
Но никто не гаранитирует, что ref_kg - последний в списке и  ref_kg->next == NULL. А мы пытаемся получить ref_kg->next->dan.tovar. То есть NULL->dan.tovar. Что при такой попытке мы получим smile ?

А, в этом смысле.. Да. Я полностью солидарен. Я думал имелось ввиду про strcmp, где вместо строки будет послан NULL. (плохо посмотрел код)
Извиняюсь

Добавлено через 4 минуты и 7 секунд
кстати, скорее всего именно в этом и есть ошибка!

возможно следует исправить строку
Код

for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)


на что-нибудь вроде этого:
Код

...
if(head_kg->next){ //если больше одного в списке
   for(ref_kg=head_kg; ref_kg->next!=NULL; ref_kg=ref_kg->next)
   ...
}


возможно не совсем корректно.. сильно не вдавался в смысл написанного, но идея думаю понятна


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Exister
Дата 10.4.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.12.2006

Репутация: нет
Всего: нет



Всем спасибо за помощь, все сделал, все работает!
PM MAIL   Вверх
Arks
Дата 10.4.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Пометь вопрос как решённый. smile 
PM MAIL ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.