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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> (на C) удаление записи в структуре 
:(
    Опции темы
Lolll
Дата 12.12.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поскажите пожалуйста, как надо подправить........ у меня программа, которая выводит таблицу из  n записей (у меня типа student). Программа предусматривает реактирование полей, в том числе удаление строки в таблице,  но когда  я удалаю запись с номером 25 например, удаляется последняя, даже если их 15. Как это можно исправить? это у меня в функции pravkavsego(student *group, int *n) 
Код
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define N 50

struct student
{
  char FIO[20];
  int num;
  int exam[4];
};

void zapolnenie(student *group, int *n)
{
  int i,j;
  char m[2];
  clrscr();
  printf("Skolko zapisey dobavit?\n");
  scanf("%d",n);
  for (i=0;i<*n;i++)
  {
    strcpy(group[i].FIO,"Petrov");
    itoa(i+1,m,10);
    strcat(group[i].FIO,m);
    group[i].num=rand()%100+1;
    for (j=0;j<4;j++)
      group[i].exam[j]=rand()%3+3;
  }
}

void vyvod(student *group, int n)
{
  int i,j;
  clrscr();
  printf("Tablica\n"
     "---------------------------------------\n"
     "| N |        FIO        | Gr  | Exams |\n"
     "----|---------------------------------|\n");
  for (i=0;i<n;i++)
  {
    printf("|%-3d| %-18s| %-3d |", i+1, group[i].FIO,group[i].num);
    for (j=0;j<4;j++)
    printf("%1d|",group[i].exam[j]);
    printf("\n---------------------------------------\n");
 }
  getch();
}

void pravka(student *group, int i)
{
  int j,v;
    clrscr();
    printf("Chto redaktirovat?\n"
       "1. FIO\n"
       "2. Gruppa\n"
       "3. Exams\n"
       "4. Nazad\n"
       );
    scanf("%d",&v);
    switch(v)
    {
      case 1:
      clrscr();
      printf("Vvedite FIO:\n");
      scanf("%s",group[i].FIO);
      break;

      case 2:
      clrscr();
      printf("Vvedite gruppu:\n");
      scanf("%d",&group[i].num);
      break;
      case 3:
      clrscr();
      printf("Vyberite examin\n");
      scanf("%d",&v);
      switch(v)
      {
        case 1:
           printf("Vvedite rezultat examena:\n");
           scanf("%d",&j);
           group[i].exam[v-1]=j;
        break;
        case 2:
           printf("Vvedite rezultat examena:\n");
           scanf("%d",&j);
           group[i].exam[v-1]=j;
        break;
        case 3:
           printf("Vvedite rezultat examena:\n");
           scanf("%d",&j);
           group[i].exam[v-1]=j;
        break;
        case 4:
           printf("Vvedite rezultat examena:\n");
           scanf("%d",&j);
           group[i].exam[v-1]=j;
        break;
      }
      break;
    }
}


void pravkavsego(student *group, int *n) {
  int v,i,j;
    clrscr();
    printf("Menu\n"
       "1. Dobavka\n"
       "2. Redaktirovanie\n"
       "3. Udalenie\n"
       "4. Vyhod\n"
       );
    scanf("%d",&v);
    switch(v)
    {
      case 1:
      clrscr();
      (*n)++;
      i=*n-1;
      group[*n-1].FIO[0]='\0';

      printf("Vvedite FIO:\n");
      scanf("%s",group[i].FIO);

      printf("Vvedite gruppu:\n");
      scanf("%d",&group[i].num);

      printf("Vvedite exameni\n");
      printf("Vvedite rezultat examena1:\n");
      scanf("%d",&group[i].exam[0]);

      printf("Vvedite rezultat examena2:\n");
      scanf("%d",&group[i].exam[1]);

      printf("Vvedite rezultat examena3:\n");
      scanf("%d",&group[i].exam[2]);

      printf("Vvedite rezultat examena4:\n");
      scanf("%d",&group[i].exam[3]);
      break;

      case 2:
      clrscr();
      printf("Kakoy element redaktirovat?\n");
      scanf("%d",&j);
      pravka(group,j-1);
      break;
     case 3:
      clrscr();
      printf("Kakoy element udalit?\n");
      scanf("%d",&j);
      for (i=j-1;i<*n-1;i++)
        group[i]=group[i+1];
      (*n)--;
      break
    }
}

void stipendia(student *group,int n)
{
  int b3,b4,b5,h,i,j,stipendia=0;
  clrscr();
     printf("Tablica\n"
     "---------------------------------------------\n"
     "| N |        FIO        | Gr  | Exams |dohod|\n"
     "----|---------------------------------------|\n");
  for (i=0;i<n;i++)
  {
    printf("|%-3d| %-18s| %-3d |", i+1, group[i].FIO,group[i].num);
    for (j=0;j<4;j++)
    printf("%1d|",group[i].exam[j]);
    for (h=0,b3=0,b4=0,b5=0;h<4;h++)
    {
      if (group[i].exam[h]==3) b3++;
      if (group[i].exam[h]==4) b4++;
      if (group[i].exam[h]==5) b5++;
    }
    if (b3>0)
        stipendia=0;
    else
        if (b4>b5)
        stipendia=25;
        else
        if (b4==0)
            stipendia=100;
        else
            if (b5>b4)
             stipendia=50;
    printf("%5d|",stipendia);
    printf("\n---------------------------------------------\n");
  }
  getch();
}

void sohranenie(student *group, int n)
{
  FILE *f;
  int i,j;
  f=fopen("D:\struct.txt","w");
  if(f!=NULL)
  {
    fprintf(f,"%d\n",n);
    i=0;
    while (i<n)
    {
      fprintf(f,"%s\n%3d",group[i].FIO,group[i].num);
      for(j=0;j<4;j++)
       fprintf(f,"%5d",group[i].exam[j]);
      fprintf(f,"\n");
      i++;
    }
    fclose(f);
  }
  else
  {
     printf("Zapis v fail nevozmozhna");
     getch();
  }
}

void zagruzka(student *group, int *n)
{
  FILE *f;
  int i=0,j,dl;
  f=fopen("D:\struct.txt","r");
  if(f!=NULL)
  {
    fscanf(f,"%d\n",n);
    while (i<*n)
    {
      fgets(group[i].FIO,19,f);
      dl=strlen(group[i].FIO);
      if (group[i].FIO[dl-1]=='\n')
      group[i].FIO[dl-1]='\0';
      fscanf(f,"%3d",&group[i].num);
      for (j=0;j<5;j++)
    fscanf(f,"%5d",&group[i].exam[j]);
      i++;
    }
  }
  else {
    printf("Oshibka!");
    getch(); }
}

void main()
{
  student group[N];
  int v,n=0;
  do {
    clrscr();
    printf("Menu\n"
       "1. Zapolnenie\n"
       "2. Vyvod tablicy\n"
       "3. Stipendia uvelichivaetsya\n"
       "4. Redactor\n"
       "5. Sohranit v fail\n"
       "6. Zagruzit iz faila\n"
       "7. Vyhod\n"
       );
    scanf("%d",&v);
    switch(v)
    {
      case 1:
      zapolnenie(group,&n);
      break;

      case 2:
      vyvod(group,n);
      break;

      case 3:
      stipendia(group,n);
      break;

      case 4:
      pravkavsego(group,&n);
      break;

      case 5:
      sohranenie(group,n);
      break;

      case 6:
      zagruzka(group,&n);
      break;
    }
  }
  while (v!=7);
}



PM MAIL   Вверх
A5uKa
Дата 12.12.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



Цитата

pravkavsego(student *group, int *n) 
  smile 

Лучше бы вы использовали английский язык

это... ?
Код

      for (i=j-1;i<*n-1;i++)
        group[i]=group[i+1];
      (*n)--;

Цитата

удаляется последняя, даже если их 15

значит условие в for не работает. Используйте пошаговую отладку и поставьте скобки для *n-1 для приличия...
PM   Вверх
Lolll
Дата 13.12.2009, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну а как его можно ещё записать? Не могу придумать((
PM MAIL   Вверх
Dov
Дата 13.12.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Lolll @  12.12.2009,  17:24 Найти цитируемый пост)
 но когда  я удалаю запись с номером 25 например, удаляется последняя, даже если их 15. 

она не удаляется, по-моему, а, просто, не выводится на экран, из-за того, что ты уменьшаешь счётчик даже тогда, когда удаление не происходит. 
Код
 
    for (i=j-1;i<*n-1;i++)
        group[i]=group[i+1];
    (*n)--;

Смотри внимательно. Цикл не сработает, а счётчик, всё-равно,  уменьшится, по-этому последняя строка таблицы не выведется... хотя в файле эта строка должна остаться. 

Я так думаю....    smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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