41

Re: допоможіть з редагуванням

Здається що все повинно робити але не робе(

void per()
{
FILE *f,*fs;
int kol=1,i=0,k;
struct tovari s;
struct tovari t;
 f=fopen("tov.dat","r+b");
k=sizeof(tov);
fs=fopen("t.dat","a+b");
while(!feof(f))
{ s=tov; fwrite(&s,sizeof(s),1,fs);
fread(&tov,k,1,f);
}

 rewind(f);
 rewind(fs);
while(!feof(f))
{    fseek(fs,kol*sizeof(s),SEEK_SET);
     fread(&s,sizeof(s),1,fs);
     kol++;
  if(strcmp(tov.nazv,s.nazv)>0)
  { t=tov;
    tov=s;
    s=t;
  }
     fseek(f,i*k,SEEK_SET);
     fwrite(&tov,k,1,f);
     i++;
     fread(&tov,k,1,f);
}
fclose(fs);
remove("t.dat");
fclose(f);
pr_t();
}

42

Re: допоможіть з редагуванням

Давайте для початку просто "пригладимо" ваш код:

void per()
{
  FILE *f  = fopen( "tov.dat", "r+b" ),
        *fs = fopen( "t.dat",    "a+b" );
  int kol=1, i=0;//краще все ж писати sizeof(struct tovari) всюди, бо потім ще шукати, чим то k є...
  struct tovari s;

  while(!feof(f))
  {
    fwrite(&tov, sizeof(struct tovari), 1, fs);
    fread (&tov, sizeof(struct tovari), 1, f);
  }
  rewind(f);
  rewind(fs);

  while(!feof(f))
  {
    //переходимо на 1-й елемент fs, не 0-й, а 1-й - так і треба?
    fseek(fs, kol++*sizeof(struct tovari), SEEK_SET);
    fread(&s, sizeof(struct tovari), 1, fs);
    if(strcmp(tov.nazv,s.nazv)>0)
      tov=s;//значення s нам більше не знадобиться, нащо ми його зберігаємо?
    fseek(f, i++*sizeof(struct tovari), SEEK_SET);
    fwrite(&tov, sizeof(struct tovari), 1, f);
    fread( &tov, sizeof(struct tovari), 1, f);
  }
  fclose(fs);
  remove("t.dat");
  fclose(f);
  pr_t();
}

Ніби все почистив.
Тепер по алгоритму. Що ви робите, взагалі? Спочатку повністю копіюєте один файл в інший, потім робите один прохід по новому файлу і розставляєте його елементи по старому, якщо я правильно зрозумів, в трохи впорядкованішому порядку... якщо нічого не наплутали. Я телепатор все ще не полагодив, тому виконати цей код не можу. Але сортування немає. Ви взагалі хоч один алгоритм сортування знаєте?

43 Востаннє редагувалося valera220396 (13.11.2013 21:47:26)

Re: допоможіть з редагуванням

бульбашковий,вставками,обмінами. я вже 4ий день не знаю що таке нормальний сон...
Намагався зробити бульбашковим але я просто ще ні разу не робив у без масивній структурі
я щось не збагну вам треба весь текст програми?

Post's attachments

1.CPP 5.56 kb, 393 downloads since 2013-11-13 

44

Re: допоможіть з редагуванням

здається я знайшов помилку, і ця помилка може бути зв`язана з компілятором або несумісністю...
у змінну tov з самого початку занесена остання змінна якій ми присваюємо першу змінну на скріншоті усе видно...

Post's attachments

Безымянный.png 31.14 kb, 252 downloads since 2013-11-14 

45 Востаннє редагувалося koala (14.11.2013 09:34:01)

Re: допоможіть з редагуванням

По програмі в цілому:
- C і C++ - сумісні (в один бік), але різні мови. Або користуйтеся фунціями C (stdio.h) або C++ (iostream і fstream). Якщо користуватися обома бібліотеками одночасно - буде плутанина і купа витраченого часу, забудете про нормальний сон.
- код треба вирівнювати. Невирівняний код погано читається, знову ж таки, більше часу іде на читання.
- не користуйтеся глобальними змінними, це зло.
- стежте за зайвими бібліотеками в include. У мене компілюється без ctype, math, stdlib (єдине, для чого він використовується - це system("CLS"), але це ж clrscr через *0пy.

46

Re: допоможіть з редагуванням

От я чогось не розумію. Як, на вашу думку, бульбашковий алгоритм для масивів виглядає?

47 Востаннє редагувалося koala (14.11.2013 10:36:34)

Re: допоможіть з редагуванням

Ось вам ваша бульбашка. Неоптимально, зате все очевидно:

struct tovari readTov(FILE *f, long int pos)
{
  struct tovari t;
  fseek(f, pos*sizeof(struct tovari), SEEK_SET);
  fread(&t, sizeof(struct tovari), 1, f);   
  return t;
}

void writeTov(FILE *f, long int pos, struct tovari t)
{
  fseek(f, pos*sizeof(struct tovari), SEEK_SET);
  fwrite(&t, sizeof(struct tovari), 1, f);     
}

long int fileSize(FILE *f, unsigned int elementSize)
{
  long int pos=ftell(f);
  fseek(f,0,SEEK_END);
  long int size=ftell(f)/elementSize;
  fseek(f,pos,SEEK_SET);
  return size;
}

void per()
{
  FILE *f  = fopen( "tov.dat", "r+b" );
  int count=fileSize(f, sizeof(struct tovari));
  for(int i=0;i<count-1;i++)
    for(int j=0;j<count-i;j++)
    {
      struct tovari current = readTov(f, j  ),
                    next    = readTov(f, j+1);
      if(strcmp(current.nazv,next.nazv)>0)
      {
        writeTov(f, j,  next   );
        writeTov(f, j+1,current);
      }
    }
}

Звісно, всі функції можна внести в основний код - але тоді він буде трохи... гм... захаращеним. А так чудово видно, що це саме бульбашкове сортування.

Подякували: valera2203961

48 Востаннє редагувалося valera220396 (14.11.2013 13:48:09)

Re: допоможіть з редагуванням

я навіть не знаю що й мовити, дякую,а бульбашка для масиву якось так виглядає:

m:
         for(i=0;i<=kol-2;i++)
         if(strcmp(x[i].fio,x[i+1].fio)>0)
         { y=x[i];
           x[i]=x[i+1];
           x[i+1]=y;
           goto m;
          }

так мене навчили в мойому коледжу, я б навіть не подумав, немає слів, дякую...

49

Re: допоможіть з редагуванням

В бульбашці (як і в будь-якому іншому сортуванні) має бути 2 цикли. Так що вам у коледжі збрехали.

50

Re: допоможіть з редагуванням

В даному випадку щось не зрозуміле.
Проте можна і одним циклом обійтись. Причому є модифікації бульбашки, які сортують саме з використанням одного циклу.

51

Re: допоможіть з редагуванням

Звісно, будь-який набір вкладених циклів може бути преставлений у вигляді одного циклу... але нащо? Там за логікою має бути зовнішній цикл (вибір "бульбашки") і внутрішній ("спливання бульбашки"). А те, що їх можна звести до одного - це просто вправа на кмітливість, але код виходить страшніший.