1

Тема: Робота з структурою С++

Доброго дня! Підкажіть як зробити так, щоб можна було вводити дані(на початок/в кінець) і видаляти записи з структури декілька разів... ніяк це не получається *WALL*  *WALL*  *WALL* 

#include<locale.h>
#include<stdio.h>
#include<conio.h>
#include<fstream>
#include <memory.h> 
#include<iostream>
#include<string.h>
#include<windows.h>
#define r 100
#define STUD struct Zodiak
#define SSTUD sizeof(struct Zodiak)
struct Zodiak
{
    char lastname[15];
    char firstname[15];
    int date[3];
    char znak[10];
    char stat[8];
    char adresa[30];
};
Zodiak rt[r];

//Function;
void print(int i);
void fprint(int i,FILE *fo);
void fscan(int i,FILE *fo);
void print1(int i);

int main(void){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    FILE *fo;
    int i,j,start=0,end=0,basic=0,count=0,tmp;
    char str[15];
    setlocale(0,"");
    char eoj;
    for(eoj=0;!eoj;)
    {
    printf("1 – Створити БД 'New Base' і додати записи\n"); 
    printf("2 – Відкрити існуючу БД\n"); 
    printf("3 – Добавити записи(початок, кінець) \n");     
    printf("4 – Показати все\n");     
    printf("5 – Видалення\n");   
    printf("6 – Сортування по даті народження\n");
    printf("7– Жінки водолії\n");
    printf("8– Список знаків зодіаку стихії Земля(Telez,Diva,Kozerig)\n");
    printf("9– Список адрес, де проживають чоловіки народжені у травні\n");
    printf("0 – Вихiд\n");     
        int choose;
    printf("Введiть >  ");     
    scanf("%d",&choose);
    switch(choose) { 
    case 1:system("cls");
          printf("Скiльки записiв ви бажаєте добавити?->");
          scanf("%d",&basic);
          for(i=0;i<basic;i++)
        {
            print(i);system("cls");
        }
         fo=fopen("Database.txt","w");
         for(i=0;i<basic;i++){
             fprint(i,fo);
            }
            fclose(fo);
            count=basic+start+end;
          break;
      case 2:system("cls");
          number1:printf("Скільки записів ви хочете використати?->");
          scanf("%d",&basic);
        fo=fopen("Base.txt","r");
        for(i=0;i<basic;i++)
        { fscan(i,fo); }
        fclose(fo);
        fo=fopen("Database.txt","w");
        for(i=0;i<basic;i++)
        {fprint(i,fo);}
        fclose(fo);
        if(basic>27){printf("\nПомилка! У базі даних тільки 27 записів.\n");
        goto number1;}
        else {printf("\nЗчитано %d записів\n",basic); count=basic+start+end;}
        system("pause");
        system("cls");
          break;
      case 3:system("cls");
          for(;;)
            {
                printf("\n1.Початок \n2.Кiнець\n0.Exit\n");
                int c;
                scanf("%d",&c);
                switch (c)
                {
                case 1:
            printf("Скiльки записiв ви бажаєте добавити?->");
            scanf("%d",&start);
            fo=fopen("Add.txt","w");
            for(i=0;i<start;i++){
                print(i);
                fprint(i,fo);}
            fclose(fo);
            fo=fopen("Database.txt","r");
            for(i=0;i<basic+end;i++)
    {
        fscan(i,fo);
            }
            fclose(fo);
            fo=fopen("Add.txt","a");
            for(i=0;i<basic+end;i++){
                fprint(i,fo);
                }
        fclose(fo);
        count=basic+start+end;
        remove("Database.txt"); rename("Add.txt","Database.txt");
        system("cls");
        break;
        case 2:
        printf("Скiльки записiв ви бажаєте добавити?->");
        scanf("%d",&end);
            for(int i=0;i<end;i++)
            {
                print(i);
            }
            fo=fopen("Database.txt","a");
            for(i=0;i<end;i++){
                fprint(i,fo);
    }
            fclose(fo);
            count=basic+start+end;
            break;
                default:printf("!ooooooooog!");
                break;
                }
        if(c==0) break;
    }system("cls");
        break;
      case 4:
        fo=fopen("Database.txt","r");
        for(i=0;i<count;i++)
        {
            fscan(i,fo);
        }
            fclose(fo);
        for(i=0;i<count;i++)
        {
            print1(i);
    }
        fo=fopen("Rezultat.txt","a");
        fprintf(fo,"\nВсі записи\n");
        for(i=0;i<count;i++)
            {
                fprint(i,fo);
            }
            fclose(fo);
            system("pause");
            system("cls");
          break;
      case 5:printf("Введiть прiзвище потрiбної людини: "); scanf("%s",&str);
        fo=fopen("Database.txt","r");
        for(i=0;i<count;i++)
    {
        fscan(i,fo);
        if(_stricmp(str,rt[i].lastname)>0||_stricmp(str,rt[i].lastname)<0){
                print1(i);}
        }
            fclose(fo);
        fo=fopen("Delete.txt","w");
        for(i=0;i<count;i++){
        if(_stricmp(str,rt[i].lastname)>0||_stricmp(str,rt[i].lastname)<0){
            fprint(i,fo);
        }
        }
        count=count-1;
        fclose(fo);
        remove("Database.txt"); rename("Delete.txt","Database.txt");
        fo=fopen("Rezultat.txt","a");
        fprintf(fo,"\nЗаписи після видалення\n");
        for(i=0;i<count;i++){
        if(_stricmp(str,rt[i].lastname)>0||_stricmp(str,rt[i].lastname)<0){
            fprint(i,fo);
        }}
        fclose(fo);
        system("pause");
        system("cls");
        break;
      case 6:system("cls");
          fo=fopen("Database.txt","r");
            for(i=0;i<count;i++)
    {
        fscan(i,fo);
        }
            fclose(fo);
        for(tmp=0;tmp<count-1;tmp++)
            for(i=0;i<count-1-tmp;i++)
        {
                if(rt[i].date[2]<rt[i+1].date[2])
                {
                    rt[count]=rt[i];
                    rt[i]=rt[i+1];
                    rt[i+1]=rt[count];
                }
                if(rt[i].date[2]==rt[i+1].date[2])
                {if(rt[i].date[1]<rt[i+1].date[1])
                {
                    rt[count]=rt[i];
                    rt[i]=rt[i+1];
                    rt[i+1]=rt[count];
                }
                if(rt[i].date[1]==rt[i+1].date[1])
                    if(rt[i].date[0]<rt[i+1].date[0]){
                        rt[count]=rt[i];
                        rt[i]=rt[i+1];
                        rt[i+1]=rt[count];}
                }
                }
            printf("\nСортування завершено успішно!\n");
            fo=fopen("Rezultat.txt","a");
            fprintf(fo,"\nЗаписи після сортування\n");
            for(i=0;i<count;i++)
            {
                fprint(i,fo);
            }
            fclose(fo);
            printf("\nЗаписи після сортування\n");
            for(int i=0;i<count;i++)
        { print1(i);}
            system("pause");
            system("cls");
          break;
      case 7:system("cls");
          fo=fopen("Database.txt","r");
            for(i=0;i<count;i++)
            {
                fscan(i,fo);
            }
            fclose(fo);
            printf("\nЖінки Водолії\n");
            for(int i=0;i<count;i++)
            {
                if((_stricmp("Водолій",rt[i].znak)==0)&&(_stricmp("Ж",rt[i].stat)==0)){
                    print1(i);}
            }
            fo=fopen("Rezultat.txt","a");
            fprintf(fo,"\nЖінки-водолії\n");
            for(int i=0;i<count;i++)
            {
            if((_stricmp("Водолій",rt[i].znak)==0)&&(_stricmp("Ж",rt[i].stat)==0)){
                fprint(i,fo);
            }}
            fclose(fo);
            system("pause");
            system("cls");
          break;
      case 8:system("cls");
          fo=fopen("Database.txt","r");
            for(i=0;i<count;i++)
    {
        fscan(i,fo);
        }
            fclose(fo);
            printf("\nЗнаки зодіаку стихії Земля\n");
        for(int i=0;i<count;i++){
        if((_stricmp("Козеріг",rt[i].znak)==0)||(_stricmp("Телець",rt[i].znak)==0)||(_stricmp("Діва",rt[i].znak)==0)){
            print1(i);}
        }
        fo=fopen("Rezultat.txt","a");
        fprintf(fo,"\nЗнаки зодіаку стихії Земля\n");
            for(int i=0;i<count;i++)
            {
            if((_stricmp("Козеріг",rt[i].znak)==0)||(_stricmp("Телець",rt[i].znak)==0)||(_stricmp("Діва",rt[i].znak)==0)){
                fprint(i,fo);
            }}
            fclose(fo);
            system("pause");
            system("cls");
          break;
      case 9:system("cls");
          fo=fopen("Database.txt","r");
            for(i=0;i<count;i++)
    {
        fscan(i,fo);
        }
        fclose(fo); 
        printf("\nЧоловіки, народжені у травні\n");
        for(int i=0;i<count;i++){
        if((_stricmp("Ч",rt[i].stat)==0)&&(rt[i].date[1]==5)){
        printf("|%10s |",rt[i].lastname);
        printf("%10s |",rt[i].firstname);
        printf("%10s |\n",rt[i].adresa);}
        }
        fo=fopen("Rezultat.txt","a");
        fprintf(fo,"\nЧоловіки, народжені у травні\n");
        for(int i=0;i<count;i++){
        if((_stricmp("Ч",rt[i].stat)==0)&&(rt[i].date[1]==5)){
            fprint(i,fo);
            }}
            fclose(fo);
            system("pause");
            system("cls");
          break;
default: printf("\nПомилка!! Зробіть правильний вибір(1-9)\n"); 
                 break; 
    }
    if (choose) {       
        getch();}
    if(choose==0)break;
}
return 0; }

void print(int i)
{
    printf("Прiзвище: "); scanf("%s",rt[i].lastname);
    printf("Iм`я: ");scanf("%s",rt[i].firstname); 
    door:printf("Введiть дату народження(ДД ММ РРРР): ");
    for(int j=0;j<3;j++){
    scanf("%d",&(rt[i].date[j]));}
    if((rt[i].date[0]>31)||(rt[i].date[0]<1)||(rt[i].date[1]>12)||(rt[i].date[1]<1)||(rt[i].date[2]>2016)||(rt[i].date[2]<1945)){
    printf("Некоректно введена дата!!!\n");
    goto door;}
    printf("Знак зодiаку: "); scanf("%s",rt[i].znak);
    printf("Стать(Ч,Ж): "); scanf("%s",rt[i].stat);
    printf("Адреса: "); scanf("%s",rt[i].adresa);
}

void fprint(int i,FILE *fo)
{
    fprintf(fo,"%s ",rt[i].lastname);
    fprintf(fo,"%s ",rt[i].firstname);
    for(int j=0;j<3;j++){
    fprintf(fo,"%d ",rt[i].date[j]);}
    fprintf(fo,"%s ",rt[i].znak);
    fprintf(fo,"%s ",rt[i].stat);
    fprintf(fo,"%s \n",rt[i].adresa);
}

void fscan(int i,FILE *fo)
{
    fscanf(fo,"%s ",rt[i].lastname);
    fscanf(fo,"%s ",rt[i].firstname); 
    for(int j=0;j<3;j++){
    fscanf(fo,"%d ",&(rt[i].date[j]));}
    fscanf(fo,"%s ",rt[i].znak);
    fscanf(fo,"%s ",rt[i].stat);
    fscanf(fo,"%s ",rt[i].adresa);
}

void print1(int i)
{
    printf("|%10s |",rt[i].lastname);
    printf("%10s |",rt[i].firstname);
    for(int j=0;j<3;j++){
    printf("%1d   ",rt[i].date[j]);}
    printf("|%9s |",rt[i].znak);
    printf("%6s |",rt[i].stat);
    printf("%10s |\n",rt[i].adresa);
}

2

Re: Робота з структурою С++

Для початку - причепуріть код. Повидаляйте те, що ви не використовуйте, поставте нормальні відступи (як ви отаке

    for(int j=0;j<3;j++){
    scanf("%d",&(rt[i].date[j]));}
    if((rt[i].date[0]>31)||(rt[i].date[0]<1)||(rt[i].date[1]>12)||(rt[i].date[1]<1)||(rt[i].date[2]>2016)||(rt[i].date[2]<1945)){
    printf("Некоректно введена дата!!!\n");

взагалі читаєте? Це спеціально, щоб складніше було, типу секс в гамаку?), замініть goto на структурний код. Можливо, об'єднайте кілька printf/fprintf, що йде поспіль, в один вираз, дайте ідентифікаторам людські імена (переважно нормально, але що таке r?).
А що саме "не получається"? Можете конкретніше розписати, що виходить із цим кодом? Бо код зараз читати важко, і без ваших підказок шукати в ньому проблеми зовсім нецікаво.

3 Востаннє редагувалося sn7770666k (06.11.2016 12:56:23)

Re: Робота з структурою С++

Дивіться, коли все роблю по-порядку все працює, але коли я хочу повторно добавити записи, ось фрагмент

 case 3:system("cls");
          for(;;)
            {
                printf("\n1.Початок \n2.Кiнець\n0.Exit\n");
                int c;
                scanf("%d",&c);
                switch (c)
                {
                case 1:
            printf("Скiльки записiв ви бажаєте добавити?->");
            scanf("%d",&start);
            fo=fopen("Add.txt","w");
            for(i=0;i<start;i++){
                print(i);
                fprint(i,fo);}
            fclose(fo);
            fo=fopen("Database.txt","r");
            for(i=0;i<basic+end;i++)
    {
        fscan(i,fo);
            }
            fclose(fo);
            fo=fopen("Add.txt","a");
            for(i=0;i<basic+end;i++){
                fprint(i,fo);
                }
        fclose(fo);
        count=basic+start+end;
        remove("Database.txt"); rename("Add.txt","Database.txt");
        system("cls");
        break;
        case 2:
        printf("Скiльки записiв ви бажаєте добавити?->");
        scanf("%d",&end);
            for(int i=0;i<end;i++)
            {
                print(i);
            }
            fo=fopen("Database.txt","a");
            for(i=0;i<end;i++){
                fprint(i,fo);
    }
            fclose(fo);
            count=basic+start+end;
            break;
                default:printf("!ooooooooog!");
                break;
                }
        if(c==0) break;
    }system("cls");
        break;

або видалити запис

 case 5:printf("Введiть прiзвище потрiбної людини: "); scanf("%s",&str);
        fo=fopen("Database.txt","r");
        for(i=0;i<count;i++)
    {
        fscan(i,fo);
        if(_stricmp(str,rt[i].lastname)>0||_stricmp(str,rt[i].lastname)<0){
                print1(i);}
        }
            fclose(fo);
        fo=fopen("Delete.txt","w");
        for(i=0;i<count;i++){
        if(_stricmp(str,rt[i].lastname)>0||_stricmp(str,rt[i].lastname)<0){
            fprint(i,fo);
        }
        }
        count=count-1;
        fclose(fo);
        remove("Database.txt"); rename("Delete.txt","Database.txt");
        fo=fopen("Rezultat.txt","a");
        fprintf(fo,"\nЗаписи після видалення\n");
        for(i=0;i<count;i++){
        if(_stricmp(str,rt[i].lastname)>0||_stricmp(str,rt[i].lastname)<0){
            fprint(i,fo);
        }}
        fclose(fo);
        system("pause");
        system("cls");
        break;

виконується з помилками.... я розумію що потрібно міняти значення змінних count, start,end i basic, просто не получається це зробити...

4

Re: Робота з структурою С++

Пане, прочитайте ПОВНІСТЮ, що я написав і зробіть це. Ви безглуздо витрачаєте і свій, і мій час.

5

Re: Робота з структурою С++

Я вибачаюсь звичайно, але ви можете елементарно пояснити, або кинути фрагмент коду, що мені зробити щоб видалити запис із файлу декілька разів?

6

Re: Робота з структурою С++

Ні. Бо я не збираюся витрачати свій час на читання поганого коду, якщо його автор не вважає за потрібне його привести у придатний для читання вигляд.

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