Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Сортировка по алфавиту


Автор: gfz 27.12.2005, 01:03
Код
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define DL_FIO 22
#define DL_MAUTO 10
#define DL_NOM 7
#define STRMAX 200
  struct AUTO
   {
    char fio [DL_FIO];
    char mauto [DL_MAUTO];
    char gosnom [DL_NOM+2];
   };
  struct EL_MAS
   {
    char fio [DL_FIO];
    char gosnom [DL_NOM+2];
   };
void sort (struct EL_MAS ms [],int n);

void AutoFIO (FILE *f);

void AutoKOL (FILE *f);

int main ()
{
 FILE *f;
 char r;
 clrscr ();
 f=fopen ("auto.txt", "r");
 if (f==NULL)
  {
   puts ("fail ne najden\n");
   getch ();
   clrscr ();
   return 1;
  }
 do
  {
   puts("Press any key for use Menu");
   getch();
   clrscr();
   puts ("\n=============================");
   puts ("\n Vyberite punkt menyu");
   puts ("\n 1. Familii vladelcev po marke avto");
   puts ("\n 2. Kolichestvo avto kazhdoj marki");
   puts ("\n 3. Exit");
   puts ("\n=============================\n");
   r=getche ();

   switch (r)
    {
     case '1':clrscr(); AutoFIO (f);rewind(f); break;
     case '2': AutoKOL (f);rewind(f); break;
     case '3': break;
     default: puts ("\n Nado vvodit' nomer ot 1 do 3"); break;
    }
  }
 while (r!='3');
 fclose (f);
 return 0;
}
void AutoKOL(FILE *f)
 {
   struct  AUTO tz;
   int tab[31];int i;
   char mmauto[31][DL_MAUTO];
   memset(tab, 0, sizeof(tab));
   memset(mmauto, ' ', sizeof(mmauto));
   while(fgets((char *)&tz, sizeof(struct AUTO), f))
    {
     tz.mauto[DL_MAUTO-1]='\0';
     for(i = 0; i < 31; ++i)
     if(strcmp(mmauto[i], tz.mauto) == 0)
      {
       tab[i]++;
       break;
      }
     else if(mmauto[i][0] == ' ')
      {
       strcpy(mmauto[i], tz.mauto);
       tab[i] = 1;
       break;
      }
    }
    printf("avto kolichestvo\n==================================\n");
    for( i = 0; i < 31; ++i) {
    if(tab[i] == 0)
    break;
    printf("%s  %d\n", mmauto[i], tab[i]);
 }
    getch();
    clrscr();
}

void AutoFIO (FILE *f)
 {
  int k;
  struct EL_MAS ms [STRMAX];
  int n;
  int i;
  char b[DL_MAUTO];
  struct AUTO tz;
  puts ("vvedite marku avto");
  scanf("%s",b);
  n=0;
  while (n<STRMAX && fgets((char *)&tz, sizeof (tz), f)!=NULL)
   {
    tz.mauto [DL_MAUTO-1]='\0';
    tz.fio [DL_FIO-1]='\0';for(k=0;(tz.mauto[k]!='\0') && k<DL_MAUTO-1;k++)
    if(tz.mauto[k]==' ')
    tz.mauto[k]='\0';
    if (strcmp(tz.mauto,b)==0)
     {
      strcpy (ms[n].gosnom, tz.gosnom);
      strcpy (ms[n].fio, tz.fio);
      n++;
     }
   }
  if (n==0)
   {
    puts ("net avto dannoj marki");
    getch ();
    clrscr ();
    return ;
   }
  else
   {
    sort (ms, n);
    puts ("\n Spisok vladelcev:");
    for (i=0; i<n; i++)
     {
      printf ("\n %d. %s %s", i+1, ms[i].fio, ms[i].gosnom);
      if ((i+1)%22==0)
       {
    puts ("dlya prodolzheniyz nazhmite lyubuyu klavishu");
    getch ();
    clrscr ();
       }
     }
   }
 }

void sort (struct EL_MAS ms [],int n)
 {
  int k, i=0;
  struct EL_MAS s;
  for (k=n-1; k>=1; k--)
  if (strcmp (ms[i].fio, ms[i+1].fio)>0)
   {
    s=ms[i];
    ms[i]=ms[i+1];
    ms[i+1]=s;
   }
 }

Я уже писал эту программу. Но сейчас другой вопрос. Самая концовка:
Код

void sort (struct EL_MAS ms [],int n)
 {
  int k, i=0;
  struct EL_MAS s;
  for (k=n-1; k>=1; k--)
  if (strcmp (ms[i].fio, ms[i+1].fio)>0)
   {
    s=ms[i];
    ms[i]=ms[i+1];
    ms[i+1]=s;
   }
 }

Задача: По введенной марке автомобиля вывести Фамилии (в алфавитном порядке) и госномера машин данной марки. В файле все фамилии по алфавиту. Но если переставить 2 фамилии местами, то вывод по алфавиту не происходит, т.е. массив не сортируется. Помогите решить. Скачать файл (auto.txt), в котором занесены фамилии владельцев, марки автомобилей и гос. номера можно тут http://webfile.ru/692750
З.Ы. Файл отсортирован по алфавиту, поменяйте местами 2 строки. Заранее спасибо.

Автор: _hunter 27.12.2005, 11:36
значит береш дебагер в руки и смотриш что происходит на каждой строке твоей sort() и на выходе из нее

Автор: Chaos A.D. 27.12.2005, 11:48
Или как вариант полегче, пишешь функтор для сравнения, и юзаешь std::sort.

Автор: adonin 27.12.2005, 11:55
Вы пытаетесь реализовать сортировку по методу "Пузырька". При реализации данного алгоритма нужно писать 2 вложенных цикла (n раз пробежать по массиву). У Вас в коде только 1 цикл (Вы пробегаете по массиву 1 раз).
Код будет выглядеть так:
Код

void sort (struct EL_MAS ms [],int n)
 {
  int k, i=0;
  struct EL_MAS s;
  for (j=0; j<n; j++)
    for (k=n-1; k>=1; k--)
    if (strcmp (ms[i].fio, ms[i+1].fio)>0)
     {
      s=ms[i];
      ms[i]=ms[i+1];
      ms[i+1]=s;
     }
 }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)