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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нужна помощь в созднии программки, текст прилагается 
:(
    Опции темы
baleGos
Дата 9.3.2005, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



мне нужно добавить сортировку по фамилии(по алфавиту) и исправить баг в функции 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],  пожалуйста.


Это сообщение отредактировал(а) chipset - 9.3.2005, 02:35
PM MAIL   Вверх
Atos
Дата 9.3.2005, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



smile
Код
p++

Такое прокатило бы, если p- указатель на массив(хотя, имхо, всё равно извратный способ...) Но p- указатель на структуру!!
Бедный компилятор! Попробуй представить себя на его месте: ведь в процессе работы функции ты потаешься получить доступ к её полям, указывая не на саму структуру, а на какое-то место памяти внутри неё
PM MAIL   Вверх
Chaos A.D.
Дата 9.3.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Какой кашмар!!! Блин, когда я решил тебе помочь, то только минут пять расставлял отступы в твоем коде согласно моим представлениям о его читаемости. Может можно на С++ переписать? Будет раз в пять понятнее. Особенно, если со стандартными контейнерами из 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.

Это сообщение отредактировал(а) Chaos A.D. - 9.3.2005, 13:55
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
Ptica
Дата 9.3.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

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;

Однако без компилятора я сходу не соображу, как лучше это исправить...
PM MAIL   Вверх
baleGos
Дата 9.3.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо 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].***. незнаю почему так отправилось.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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