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


Автор: baleGos 9.3.2005, 00:06
мне нужно добавить сортировку по фамилии(по алфавиту) и исправить баг в функции void clear.

вот текст программы
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>

struct man
{
char FIO[50];
char namber[10];
char FAK[10];
char GROOP[10];
};

man *D;
int n=0,sz=10;

void extend()
{
if (n!=sz) return;
sz=sz*2;
man *q=new man[sz];
for(int i=0;i<sz/2;i++) q=D;
delete D;
D=q;
}


void add()
{
extend();
char c[100];
printf("\n Enter F.I.O.: ");
scanf("%s",D[n].FIO);
gets©;
printf(" Enter number of the test book: ");
scanf("%s",D[n].namber);
gets©;
printf(" Enter the name of faculty: ");
scanf("%s",D[n].FAK);
gets©;
printf(" Enter the name of group: ");
scanf("%s",D[n].GROOP);
gets©;
n++;
}

int get_num()
{
int m;
do
{
printf("\nEnter number of a line "); scanf("%d",&m);
}
while (m<1 || m>n);
return m-1;
printf("\n");
}

void show()
{
printf("\nN\tF.I.O.\t\t\tN test book\tFaculty\t\tGroup\n");
printf("------------------------------------------------------------\n");
for(int i=0;i<n;i++)
{
printf("%-3d %-20s",i+1,D.FIO);
printf("\t%s",D.namber);
printf("\t\t%s",D.FAK);
printf("\t\t%s",D.GROOP);
printf("\n");
if((i+1)%20==0) getch();
}
printf("\n");
}

void save(char f[])
{
printf("\n");
FILE *fd=fopen(f,"w");
fprintf(fd,"%d\n",n);
for (int i=0;i<n;i++)
{
fprintf(fd,"%s\n",D.FIO);
fprintf(fd,"%s\n",D.namber);
fprintf(fd,"%s\n",D.FAK);
fprintf(fd,"%s\n",D.GROOP);
}
fclose(fd);
}

void load(char f[])
{
printf("\n");
FILE *fd=fopen(f,"r");
if (fd==NULL) return;
int m;
fscanf(fd,"%d",&m);
for (;m!=0;m--,n++)
{
extend();
fscanf(fd,"%s",D[n].FIO);
fscanf(fd,"%s\n",D[n].namber);
fscanf(fd,"%s\n",D[n].FAK);
fscanf(fd,"%s\n",D[n].GROOP);
}
fclose(fd);
}
/*
void clear(man *p, int n)
{
int i;
for(i=0;i<n;p++,i++)
{
p->FIO[0]='\0';
p->namber[0]='\0';
p->FAK[0]='\0';
p->GROOP[0]='\0';
}
}
*/

void main()
{
int k,i;
D=new man[sz];
while(1)
{
printf("ESC-exit 1-add 2-show 3-save 4-load 5-delete line 6-sort");
printf("\n\nwhat to do: ");
switch(getch())
{
case '1': printf("\n");add(); break;
case '2': printf("\n");show(); break;
case '3': printf("\n");save("labs.txt"); break;
case '4': printf("\n");load("labs.txt"); break;
case '5': printf("\n");
if (n==0) break;
k=get_num();
for(i=k;i<n-1;i++) D=D[i+1];
n--;
break;
// case 'c': clear(D,50);break;

case 27: printf("\n\n\n\n\t\t");return;
}
printf("\n");
}
}

М
 
Используйте теги [cоde=cpp][/code],  пожалуйста.

Автор: Atos 9.3.2005, 07:01
smile
Код
p++

Такое прокатило бы, если p- указатель на массив(хотя, имхо, всё равно извратный способ...) Но p- указатель на структуру!!
Бедный компилятор! Попробуй представить себя на его месте: ведь в процессе работы функции ты потаешься получить доступ к её полям, указывая не на саму структуру, а на какое-то место памяти внутри неё

Автор: Chaos A.D. 9.3.2005, 13:39
Какой кашмар!!! Блин, когда я решил тебе помочь, то только минут пять расставлял отступы в твоем коде согласно моим представлениям о его читаемости. Может можно на С++ переписать? Будет раз в пять понятнее. Особенно, если со стандартными контейнерами из STL. Ну да ладно. Чесно говоря, я сидел минут тридцать, чтобы разобраться, что же все-таки делается в программе. Странный стиль у тебя. Начиная с выбора имен для переменных, и заканчивая злоупотреблением глобальными переменными. Но это моё личное и оччень скромное мнение. Вот, адаптировал с горем пополам QuickSort под твои нужды:

Код

void myqsort( man *base, long n )
{
    int i = 0, j = n;
    man middle = base[n>>1];

    while ( i <= j )
    {
        while ( strcmp(base[i].FIO, middle.FIO) < 0 ) i++;
        while ( strcmp(base[j].FIO, middle.FIO) > 0 ) j--;

        if ( i <= j )
        {
            man tmp;
            memcpy( &tmp,     &base[i], sizeof(man) );
            memcpy( &base[i], &base[j], sizeof(man) );
            memcpy( &base[j], &tmp,     sizeof(man) );
            i++; j--;
        }
    };
    

    if ( j > 0 ) myqsort(base, j );
    if ( n > i ) myqsort(base+i, n-i);
};

Тут base - начало массива, который требуется отсортировать, n - его размер. Т.е. вызываешь так : myqsort( D, n-1 ), и все элементы сортируются. По крайней мере, на моем наборе данных (около 8 man-ов) это сработало.

Может быть функция бажная. Я не могу за нее ручаться. Если бы я захотел уверенности в ее работе, я бы все переписал в соответствии с моими представлениями о хорошем коде с самого начала (без обид, ладно?).

Далее, с clear у тебя вообще все так запутано. Чего ты от нее ожидаешь? Если она тебе нужна для того, чтобы очищать все и вся, то вызывай ее как clear(D,n); Только после того, как ты все очищаешь, непомешало бы глобальную переменную n изменить.

Код

void clear(man *p, int n)
{
    int i;
    for(i=0;i<n;p++,i++)
    {
        p->FIO[0]='\0';
        p->namber[0]='\0';
        p->FAK[0]='\0';
        p->GROOP[0]='\0';
    }
    ::n = 0;
}


Еще один минус - у тебя память из под этих очищенных данных так и будет занята. Но если уж браться за улучшение удаления элементов, то тут опять же руки чешутся все переписать.

И еще - в функции save у тебя
...
for (int i=0;i<n;i++)
{
fprintf(fd,"%s\n",D.FIO);
...
};

Должно быть не D.FIO а D[i].FIO. То же касается и всех остальных полей структуры D. То же самое и в show.

Автор: Ptica 9.3.2005, 14:09
Код

void extend() 

  if (n!=sz) return;

  sz=sz*2;
  man *q=new man[sz];
  
  for(int i=0;i<sz/2;i++) q=D;

  delete D;
  D=q;
}

IMHO здесь что-то не так. Вот здесь вот:
Цитата

for(int i=0;i<sz/2;i++) q=D;

Однако без компилятора я сходу не соображу, как лучше это исправить...

Автор: baleGos 9.3.2005, 15:43
Спасибо Chaos A.D. за сортировочку, а то у меня голова уже вечером не варила.
Цитата

И еще - в функции save у тебя
...
for (int i=0;i<n;i++)
{
fprintf(fd,"%s\n",D.FIO);
...
};

Должно быть не D.FIO а D[i].FIO. То же касается и всех остальных полей структуры D. То же самое и в show.

Я все проверял, и было D[i].***. незнаю почему так отправилось.

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