1

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

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

    case 5: fm=fopen("All.txt","r");
        for(i=0;i<r+m+k;i++)
    {
        fscanf(fm,"%s ",rt[i].lastname);
        fscanf(fm,"%s ",rt[i].firstname); 
        for(j=0;j<3;j++){
        fscanf(fm,"%d ",&(rt[i].date[j]));
        }
        fscanf(fm,"%s ",rt[i].znak);
        fscanf(fm,"%s ",rt[i].stat);
        fscanf(fm,"%s ",rt[i].adresa);
        }

        for(i=0;i<r+m+k;i++)
        {
            for(j=0;j<3;j++)
            {
                if(rt[i].date[2]>rt[i+1].date[2])
                {
                    rt[4]=rt[i];
                    rt[i]=rt[i+1];
                    rt[i+1]=rt[4];
                }
                if(rt[i].date[2]==rt[i+1].date[2])
                {if(rt[i].date[1]>rt[i+1].date[1])
                {
                    rt[4]=rt[i];
                    rt[i]=rt[i+1];
                    rt[i+1]=rt[4];
                }
                if(rt[i].date[1]==rt[i+1].date[1])
                {
                    if(rt[i].date[0]>rt[i+1].date[0]){
                        rt[4]=rt[i];
                        rt[i]=rt[i+1];
                        rt[i+1]=rt[4];}
                }
                }
            }
        }
            for(i=0;i<r+m+k;i++)
        {
        printf("%s ",rt[i].lastname);
        printf("%s ",rt[i].firstname);
        for(j=0;j<3;j++){
            printf("%d ",rt[i].date[j]);
        }
        printf("%s ",rt[i].znak);
        printf("%s ",rt[i].stat);
        printf("%s\n",rt[i].adresa);
    }
        fclose(fm);
          break;

Ось ціла програма...

#include<locale.h>
#include<stdio.h>
#include<conio.h>
#include<fstream>
#include <memory.h> 
#include<iostream>
#include<string.h>
#define r 2
#define STUD struct Zodiak
#define SSTUD sizeof(struct Zodiak)
struct Zodiak
{
    char lastname[10];
    char firstname[10];
    int date[3];
    char znak[10];
    char stat[8];
    char adresa[30];
};
Zodiak rt[r];
void del_item(int);
int n=0,d;
int main(void){
    FILE *fo, *fm, *fp;
    int i,j,m,k,count,tmp,tmp1,tmp2;
    char str[10];
    setlocale(0,"");
    for(;;)
    {
    printf("1 – Створити файл і добавити в нього записи\n");   
    printf("11 – Переглянути початкові записи\n");
    printf("2 – Добавити(початок, кінець) \n");     
    printf("3 – Показати все\n");     
    printf("4 – Видалення\n");   
    printf("12 – Показати вмiст пiсля видалення\n");
    printf("5 – Сортування по даті народження\n");
    printf("6– Жінки водолії\n");
    printf("7– Список знаків зодіаку стихії Земля(Telez,Diva,Kozerig)\n");
    printf("8– Список адрес, де проживають чоловіки народжені у травні\n");
    printf("0 – Вихiд\n");     
        int choose;
    printf("Введiть >  ");     
    scanf("%d",&choose);
    switch(choose) { 
      case 1:fo=fopen("One.txt","w");
            for(i=0;i<r;i++)
            {
                printf("Введiть прiзвище"); scanf("%s",rt[i].lastname);
                printf("Ведiть iм`я");scanf("%s",rt[i].firstname); 
                printf("Введiть дату народження ");
                for(j=0;j<3;j++){
                    scanf("%d",&(rt[i].date[j]));
                }
                printf("Знак зодіаку"); scanf("%s",rt[i].znak);
                printf("Стать"); scanf("%s",rt[i].stat);
                printf("Введiть адресу"); scanf("%s",rt[i].adresa);
            }
            for(i=0;i<r;i++){
            fprintf(fo,"%s ",rt[i].lastname);
            fprintf(fo,"%s ",rt[i].firstname);
            for(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 ",rt[i].adresa);
    }
            fclose(fo);
          break;
    case 11:
        fo=fopen("One.txt","r");
        for(i=0;i<r;i++)
            {
                fscanf(fo,"%s ",rt[i].lastname);
                fscanf(fo,"%s ",rt[i].firstname); 
                for(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);
            }
        for(i=0;i<r;i++)
        {
        printf("%s ",rt[i].lastname);
        printf("%s ",rt[i].firstname);
        for(j=0;j<3;j++){
            printf("%d ",rt[i].date[j]);
        }
        printf("%s ",rt[i].znak);
        printf("%s ",rt[i].stat);
        printf("%s\n",rt[i].adresa);
    }
        fclose(fo);
          break;
    case 2:
        for(;;)
            {
                printf("\n1.Початок \n2.Кiнець\n");
                int c;
                scanf("%d",&c);
                switch (c)
                {
                case 1:
                    fm=fopen("All.txt","w");
            printf("Скiльки записiв ви бажаєте добавити?->");
            scanf("%d",&m);
            for(i=0;i<m;i++){
            printf("Введiть прiзвище"); scanf("%s",rt[i].lastname);
                printf("Ведiть iм`я");scanf("%s",rt[i].firstname); 
                printf("Введiть дату народження ");
                for(j=0;j<3;j++){
                    scanf("%d",&(rt[i].date[j]));
                }
                printf("Знак зодіаку"); scanf("%s",rt[i].znak);
                printf("Стать"); scanf("%s",rt[i].stat);
                printf("Введiть адресу"); scanf("%s",rt[i].adresa);
            }
            for(i=0;i<m;i++){
            fprintf(fm,"%s ",rt[i].lastname);
            fprintf(fm,"%s ",rt[i].firstname);
            for(j=0;j<3;j++){
                fprintf(fm,"%d ",rt[i].date[j]);}
            fprintf(fm,"%s ",rt[i].znak);
            fprintf(fm,"%s ",rt[i].stat);
            fprintf(fm,"%s ",rt[i].adresa);
    }
            fo=fopen("One.txt","r");
            for(i=0;i<r;i++)
    {
        fscanf(fo,"%s ",rt[i].lastname);
                fscanf(fo,"%s ",rt[i].firstname); 
                for(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);
            }
            for(i=0;i<r;i++){
            fprintf(fm,"%s ",rt[i].lastname);
            fprintf(fm,"%s ",rt[i].firstname);
            for(j=0;j<3;j++){
                fprintf(fm,"%d ",rt[i].date[j]);}
            fprintf(fm,"%s ",rt[i].znak);
            fprintf(fm,"%s ",rt[i].stat);
            fprintf(fm,"%s ",rt[i].adresa);
                }
            fclose(fo);fclose(fm);
            break;
                case 2:
fm=fopen("All.txt","a");
printf("Скiльки записiв ви бажаєте добавити?->");
            scanf("%d",&k);
            for(int i=0;i<k;i++)
            {printf("Введiть прiзвище"); scanf("%s",rt[i].lastname);
                printf("Ведiть iм`я");scanf("%s",rt[i].firstname); 
                printf("Введiть дату народження ");
                for(j=0;j<3;j++){
                    scanf("%d",&(rt[i].date[j]));
                }
                printf("Знак зодіаку"); scanf("%s",rt[i].znak);
                printf("Стать"); scanf("%s",rt[i].stat);
                printf("Введiть адресу"); scanf("%s",rt[i].adresa);
            }
            for(i=0;i<k;i++){
            fprintf(fm,"%s ",rt[i].lastname);
            fprintf(fm,"%s ",rt[i].firstname);
            for(j=0;j<3;j++){
                fprintf(fm,"%d ",rt[i].date[j]);}
            fprintf(fm,"%s ",rt[i].znak);
            fprintf(fm,"%s ",rt[i].stat);
            fprintf(fm,"%s ",rt[i].adresa);
    }
            break;
                default:printf("Other error\n");
                    break;
                }
                printf("\n...press any key...\n");
        if(c==0) break;
    }
            fclose(fm);
            count=r+m+k;
        break;
      case 3:fm=fopen("All.txt","r");
        for(i=0;i<r+m+k;i++)
    {
        fscanf(fm,"%s ",rt[i].lastname);
                fscanf(fm,"%s ",rt[i].firstname); 
                for(j=0;j<3;j++){
                    fscanf(fm,"%d ",&(rt[i].date[j]));
                }
                fscanf(fm,"%s ",rt[i].znak);
                fscanf(fm,"%s ",rt[i].stat);
                fscanf(fm,"%s ",rt[i].adresa);
            }
        for(i=0;i<r+m+k;i++)
        {
        printf("%s ",rt[i].lastname);
        printf("%s ",rt[i].firstname);
        for(j=0;j<3;j++){
            printf("%d ",rt[i].date[j]);
        }
        printf("%s ",rt[i].znak);
        printf("%s ",rt[i].stat);
        printf("%s\n",rt[i].adresa);
    }
        fclose(fm);
          break;
    case 4:fm=fopen("All.txt","r");
        printf("Введiть прiзвище потрiбної людини: "); scanf("%s",&str);
        for(i=0;i<r+m+k;i++)
    {
        fscanf(fm,"%s ",rt[i].lastname);
                fscanf(fm,"%s ",rt[i].firstname); 
                for(j=0;j<3;j++){
                    fscanf(fm,"%d ",&(rt[i].date[j]));
                }
                fscanf(fm,"%s ",rt[i].znak);
                fscanf(fm,"%s ",rt[i].stat);
                fscanf(fm,"%s ",rt[i].adresa);
        }
        fp=fopen("Finish.txt","w");
        for(i=0;i<r+m+k;i++){
            if(_stricmp(str,rt[i].lastname)>0||_stricmp(str,rt[i].lastname)<0){
                    fprintf(fp,"%s ",rt[i].lastname);
                    fprintf(fp,"%s ",rt[i].firstname);
            for(j=0;j<3;j++){
                fprintf(fp,"%d ",rt[i].date[j]);}
            fprintf(fp,"%s ",rt[i].znak);
            fprintf(fp,"%s ",rt[i].stat);
            fprintf(fp,"%s ",rt[i].adresa);
                }
                }
        fclose(fm); fclose(fp);
          break;
    case 12:fp=fopen("Finish.txt","r");
        for(i=0;i<r+m+k-1;i++)
    {
        fscanf(fp,"%s ",rt[i].lastname);
                fscanf(fp,"%s ",rt[i].firstname); 
                for(j=0;j<3;j++){
                    fscanf(fp,"%d ",&(rt[i].date[j]));
                }
                fscanf(fp,"%s ",rt[i].znak);
                fscanf(fp,"%s ",rt[i].stat);
                fscanf(fp,"%s ",rt[i].adresa);
            }
        for(i=0;i<r+m+k-1;i++)
        {
        printf("%s ",rt[i].lastname);
        printf("%s ",rt[i].firstname);
        for(j=0;j<3;j++){
            printf("%d ",rt[i].date[j]);
        }
        printf("%s ",rt[i].znak);
        printf("%s ",rt[i].stat);
        printf("%s\n",rt[i].adresa);
    }
        fclose(fp);
        break;
    case 5: fm=fopen("All.txt","r");
        for(i=0;i<r+m+k;i++)
    {
        fscanf(fm,"%s ",rt[i].lastname);
        fscanf(fm,"%s ",rt[i].firstname); 
        for(j=0;j<3;j++){
        fscanf(fm,"%d ",&(rt[i].date[j]));
        }
        fscanf(fm,"%s ",rt[i].znak);
        fscanf(fm,"%s ",rt[i].stat);
        fscanf(fm,"%s ",rt[i].adresa);
        }

        for(i=0;i<r+m+k;i++)
        {
            for(j=0;j<3;j++)
            {
                if(rt[i].date[2]>rt[i+1].date[2])
                {
                    rt[4]=rt[i];
                    rt[i]=rt[i+1];
                    rt[i+1]=rt[4];
                }
                if(rt[i].date[2]==rt[i+1].date[2])
                {if(rt[i].date[1]>rt[i+1].date[1])
                {
                    rt[4]=rt[i];
                    rt[i]=rt[i+1];
                    rt[i+1]=rt[4];
                }
                if(rt[i].date[1]==rt[i+1].date[1])
                {
                    if(rt[i].date[0]>rt[i+1].date[0]){
                        rt[4]=rt[i];
                        rt[i]=rt[i+1];
                        rt[i+1]=rt[4];}
                }
                }
            }
        }
            for(i=0;i<r+m+k;i++)
        {
        printf("%s ",rt[i].lastname);
        printf("%s ",rt[i].firstname);
        for(j=0;j<3;j++){
            printf("%d ",rt[i].date[j]);
        }
        printf("%s ",rt[i].znak);
        printf("%s ",rt[i].stat);
        printf("%s\n",rt[i].adresa);
    }
        fclose(fm);
          break;
    case 6:fm=fopen("All.txt","r");
        for(i=0;i<r+m+k;i++)
    {
        fscanf(fm,"%s ",rt[i].lastname);
        fscanf(fm,"%s ",rt[i].firstname); 
        for(j=0;j<3;j++){
        fscanf(fm,"%d ",&(rt[i].date[j]));
        }
        fscanf(fm,"%s ",rt[i].znak);
        fscanf(fm,"%s ",rt[i].stat);
        fscanf(fm,"%s ",rt[i].adresa);
        if((_stricmp("Vodoliy",rt[i].znak)==0)&&(_stricmp("Woman",rt[i].stat)==0)){
        printf("%s ",rt[i].lastname);
        printf("%s ",rt[i].firstname);
        for(j=0;j<3;j++){
            printf("%d ",rt[i].date[j]);
        }
        printf("%s ",rt[i].znak);
        printf("%s ",rt[i].stat);
        printf("%s\n",rt[i].adresa);}
        }
        fclose(fm);
          break;
    case 7:fm=fopen("All.txt","r");
        for(i=0;i<r+m+k;i++)
    {
        fscanf(fm,"%s ",rt[i].lastname);
        fscanf(fm,"%s ",rt[i].firstname); 
        for(j=0;j<3;j++){
        fscanf(fm,"%d ",&(rt[i].date[j]));
        }
        fscanf(fm,"%s ",rt[i].znak);
        fscanf(fm,"%s ",rt[i].stat);
        fscanf(fm,"%s ",rt[i].adresa);
        if((_stricmp("Kozerig",rt[i].znak)==0)||(_stricmp("Telez",rt[i].znak)==0)||(_stricmp("Diva",rt[i].znak)==0)){
        printf("%s ",rt[i].lastname);
        printf("%s ",rt[i].firstname);
        for(j=0;j<3;j++){
            printf("%d ",rt[i].date[j]);
        }
        printf("%s ",rt[i].znak);
        printf("%s ",rt[i].stat);
        printf("%s\n",rt[i].adresa);}
        }
        fclose(fm);
          break;
    case 8:fm=fopen("All.txt","r");
        for(i=0;i<r+m+k;i++)
    {
        fscanf(fm,"%s ",rt[i].lastname);
        fscanf(fm,"%s ",rt[i].firstname); 
        for(j=0;j<3;j++){
        fscanf(fm,"%d ",&(rt[i].date[j]));
        }
        fscanf(fm,"%s ",rt[i].znak);
        fscanf(fm,"%s ",rt[i].stat);
        fscanf(fm,"%s ",rt[i].adresa);
        }
        for(i=0;i<r+m+k;i++)
        if((_stricmp("Man",rt[i].stat)==0)&&(rt[i].date[1]==5)){
        printf("%s ",rt[i].lastname);
        printf("%s ",rt[i].firstname);
        printf("%s\n",rt[i].adresa);
        }
        fclose(fm);
          break;
default: printf("Неправильна операція\n"); 
                 break; 
    }
    printf("\n...press any key...\n");
        if(choose==0) break;
    }
    _getch();
return 0; }

2

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

Цей код страшний, ви в курсі?
Ну добре, що поки що бачу з фатальних проблем:

#define r 2
...
Zodiak rt[r];
...
rt[4]=rt[i];

rt[4] не існує, ви пишете кудись не туди.

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

3 Востаннє редагувалося sn7770666k (19.10.2016 17:56:06)

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

це я просто пробував...як це правильно записати?
тут я просто сортував з доданими на початок і кінець записами...відповідно 1 на початок і 1 кінець.... а ще 2 записані у початковому файлі...
короче там не 4 а так в мене rt[r+m+k],

4

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

Пане, ще раз кажу: у вас в масиві 2 елементи. Ви намагаєтеся при цьому писати в 4-й, r+m+k-й, ще якийсь елемент - яка різниця, якщо в масиві тільки 2 елементи, 0-й і 1-й?
А страшний код не дозволяє нормально в ньому шукати. Хоча б по фігурних дужках вирівняйте, це мінімум. 90% роботи програміста - не писати код, а читати його. Відповідно, якщо в коді важко розібратися - то ви самі собі робите гірше. Моя вам порада - створіть функцію
bool greater(Zodiak a, Zodiak b) для порівняння структур, і
void swap(Zodiak *a, Zodiak *b) для обміну їх місцями. Код стане значно зрозумілішим. А ще - для читання, виведення цих Zodiak... і почитайте про бульбашкове сортування. Якщо ви ніколи не писали алгоритмів сортування - напишіть програму для сортування звичайних чисел, а вже потім переходьте на структури.

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

5 Востаннє редагувалося sn7770666k (19.10.2016 18:59:18)

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

ви можете допомогти написати функцію для сортування?
функції для читання\виведення я напишу сам..



ВСІМ ДЯКУЮ!!! ВЖЕ ЗРОБИВ САМ!

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