Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2011, 06:55   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Сортировка строк зависимых от.

Доброго времени суток ребят. Помогите пожалуйста с решением одной задачки. Вообщем необходимо сделать сортировку строк, но сортировать в зависимости от продолжительности передачи (TV) по возрастанию.
Немного устал - не сплю вторую сутку, даже не могу додумать элементарное.
Я думал пустить строку и продолжительность передачи в объектную матрицу, и пузырьком сортировать числа и в процессе сортировки слова тупо переставлять за сортирующимися числами. Но для этого нужно переделывать все, на что у меня реально нема времени, таких задач еще на шее куча. Типа так я думал:
Цитата:
Habra Babra Shvabra
60 30 120
Цитата:
Babra Habra Shvabra
30 60 120
Поэтому отсортировать уже на том что имеется. Буду благодарен любому совету.



Код:
#include <Windows.h>
#include <stdio.h>
#include <conio.h>

struct TV 
{	
 char *TelecastName; 
 char nRecords;
 char *TelecastStart; 
 int *TelecastDuration;	

 TV::TV();
 TV::~TV();

 void Input();
 void Output();
 void Search();
 void Sort();
};

TV ObjAccess; 
TV ObjArrTN[0xFF]; // 255 byte
TV ObjArrTS[0xFF]; // 255 byte

// Constructor implicit
TV::TV() {};
// Destructor implicit
TV::~TV() {};

void TV::Input() {
 char _lpBuffer[0xFF], __lpBuffer[0xFF]; 
 this->TelecastDuration = (int*)malloc(this->nRecords * sizeof(int));

 for (int i = 0; i < this->nRecords; i++) {
  printf(" Telecast / Begin / Duration\n", i + 1); 
  printf("\n[%d]\n", i + 1);
  scanf("%s", &_lpBuffer); scanf("%s", &__lpBuffer); scanf("%d", &this->TelecastDuration[i]);
		
  ObjArrTN[i].TelecastName = (char*)malloc(strlen(_lpBuffer) + 1 * sizeof(char)); 
  strcpy(ObjArrTN[i].TelecastName, _lpBuffer);
  ObjArrTS[i].TelecastStart = (char*)malloc(strlen(__lpBuffer) + 1 * sizeof(char));
  strcpy(ObjArrTS[i].TelecastStart, __lpBuffer);
  printf("\n");
 } 
};

void TV::Output() {
 for (int i = 0; i < this->nRecords; i++) {
  printf(" Telecast / Begin / Duration -> [ %s ] [ %s ] [ %3d ]\n", ObjArrTN[i].TelecastName, ObjArrTS[i].TelecastStart, this->TelecastDuration[i]); 
 } 
};

void TV::Search() {
 char lpBuffer[0xFF]; 
 bool Flag;

 printf(" Search telecast: "); scanf("%s", &lpBuffer);
	
 for (int i = 0; i < this->nRecords; i++) {
  if (strcmp(ObjArrTN[i].TelecastName, lpBuffer) == 0) {
   printf(" \nTelecast / Begin / Duration -> [ %s ] [ %s ] [ %d ]\n", ObjArrTN[i].TelecastName, ObjArrTS[i].TelecastStart, this->TelecastDuration[i]); 
   Flag = true; 
   break;
  }
  else {
   Flag = false;
  }
 }

 if (Flag == false) {
  printf("\n  #This telecast don't exist"); return;
 }
};

void TV::Sort() {
 char cTemp[0xFF]; int iTemp;
 for (int i = 0; i < this->nRecords; i++) {
  for (int j = 0; j < this->nRecords - i - 1; j++) {
   if (this->TelecastDuration[j] > this->TelecastDuration[j + 1]) {
    iTemp = this->TelecastDuration[j]; 
    this->TelecastDuration[j] = this->TelecastDuration[j + 1]; 
    this->TelecastDuration[j + 1] = iTemp;
    strcpy(cTemp, ObjArrTN[j].TelecastName);
    strcpy(ObjArrTN[j].TelecastName, ObjArrTN[j + 1].TelecastName);
    strcpy(ObjArrTN[j + 1].TelecastName, cTemp); 
   } 
  }
 }
};

int main() 
{
 printf("# Number of records: "); scanf("%d", &ObjAccess.nRecords); printf("\n");
	
 ObjAccess.Input();
 printf("\n");
 ObjAccess.Output();
 printf("\n");
 ObjAccess.Search(); 
 printf("\n");	
 ObjAccess.Sort();

 free(ObjAccess.TelecastName);
 free(ObjAccess.TelecastStart);
 free(ObjAccess.TelecastDuration);
 _getch();
 return 0;
}

Последний раз редактировалось coNsept; 08.05.2011 в 08:16.
coNsept вне форума Ответить с цитированием
Старый 08.05.2011, 08:08   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Простите, надумал сам. Пытался облопошить себя всякими матрицами но все оказалось куда проще. Вот если кому пригодиться.

Код:
void TV::Sort() {
 char cTemp[0xFF]; int iTemp;
 for (int i = 0; i < this->nRecords; i++) {
  for (int j = 0; j < this->nRecords - i - 1; j++) {
   if (this->TelecastDuration[j] > this->TelecastDuration[j + 1]) {
    iTemp = this->TelecastDuration[j]; 
    this->TelecastDuration[j] = this->TelecastDuration[j + 1]; 
    this->TelecastDuration[j + 1] = iTemp;
    strcpy(cTemp, ObjArrTN[j].TelecastName);
    strcpy(ObjArrTN[j].TelecastName, ObjArrTN[j + 1].TelecastName);
    strcpy(ObjArrTN[j + 1].TelecastName, cTemp); 
   } 
  }
 }
};
А вообще если что, буду очень рад любой критики по коду, по логике кода. Каждая ваша критика, послужит мне хорошим советом.

Последний раз редактировалось coNsept; 08.05.2011 в 08:15.
coNsept вне форума Ответить с цитированием
Старый 08.05.2011, 12:38   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

coNsept

буду очень рад любой критики по коду

лехко.

основная проблема - использование "программирования в стиле Fortran"
из за чего код становится не интуитивным, страшным, перегруженный всяким отстоем и потенциально ненадёжным.

вариант решения в стиле C++

Код:
struct TV
{
   std::string name;
   size_t length;        // длина передачи допустим в минутах
};

struct greater : public std::binary_function<TV, TV, bool>
{
    bool operator()(const TV& v1, const TV& v2) const
    {
         return v2.length < v1.length;
    }
};

std::vector<TV> tv;

заполнение tv

std::sort(tv.begin(), tv.end(), greater());
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение 4 зависимых таблиц santekalex Microsoft Office Access 6 26.01.2011 13:42
Pascal. Поиск линейно зависимых строк матрицы. Error 200: Division by zero, хотя нулей в матрице нет Paul-SFL Помощь студентам 8 27.11.2010 21:52
Формат зависимых ячеек Lvenok1987 Microsoft Office Excel 3 07.04.2010 15:48
Сортировка строк FormAlDeGid Microsoft Office Excel 1 18.11.2009 14:43
Сортировка строк Anarki Общие вопросы C/C++ 2 19.09.2009 20:06