Flaga polska, złe wyświetlanie wyników

0

Witam, mam do poprawienia program odnośnie zadania: http://s20.postimg.org/bsrclkvu5/scr_56.png (rozszerzone do trzech ocen).
Problem polega na tym, że przy niektórych danych wyświetlany wynik jest niepoprawny. W informacji zwrotnej dostałem wiadomość: "Zły punkt podziału." Proszę o pomoc w rozwiązaniu problemu, który zapewne jest jakiś trywialny, lecz nie mogę go dostrzec. Pozdrawiam

#include <stdio.h>
#include <stdlib.h>

int main()
{
    struct student
    {
        int nr;
        int ocena1;
        int ocena2;
        int ocena3;
    };
    int n,i;
    printf("Ilosc studentow: ");
    scanf("%d",&n);
    struct student a[n];
    for(i=0;i<n;i++)
    {
        printf("Numer indeksu studenta: ");
        scanf("%d",&a[i].nr);
        printf("Pierwsza ocene: ");
        scanf("%d",&a[i].ocena1);
        printf("Druga ocene: ");
        scanf("%d",&a[i].ocena2);
        printf("Trzecia ocene: ");
        scanf("%d",&a[i].ocena3);
    }

    int p=n-1, l=0,x=0;
    struct student t;
    while (p>l)
    {
        while (a[l].ocena1 >2 && a[l].ocena2 >2 && a[l].ocena3 >2 && l<p)
        {
            l=l+1;
            x=x+1;
        }
        while ((a[p].ocena1 < 3 || a[p].ocena2 < 3 || a[p].ocena3 < 3) && l<p)
        {
            p=p-1;
        }
        if (p>l)
        {
            t=a[l];
            a[l]=a[p];
            a[p]=t;
            l=l+1;
            p=p-1;
        }
    }
    printf("\nZdali egzamin:\n\n");
    for(i=0;i<=x;i++)
    {
        printf("Nr indeksu_%d\n",a[i].nr);
    }

    printf("\nNie zdali egzaminu:\n\n");
    for(i=x+1;i<n;i++)
    {
        printf("Nr indeksu_%d\n",a[i].nr);
    }
    return 0;
}

Tutaj przykład, że wyświetla źle: http://s20.postimg.org/9cpj7qdrh/scr_57.png

0

Jak powywalasz zbędne zmienne i zrobisz resztę po ludzku to będzie działać:

#include <stdio.h>
#include <stdlib.h>
 
struct student { unsigned nr,ocena[3]; };

int ok(struct student *s)
  {
   return ((s->ocena[0]>2)&&(s->ocena[1]>2)&&(s->ocena[2]>2));
  }

int main()
  {
   unsigned count,i,lf,rt;
   struct student *tb,tmp;
   printf("Ilosc studentow: ");
   scanf("%u",&count);
   tb=(struct student *)malloc(count*sizeof(struct student));
   for(i=0;i<count;++i)
     {
      printf("\nNumer indeksu studenta: ");
      scanf("%u",&tb[i].nr);
      printf("\nTrzy oceny: ");
      scanf(" %u %u %u",&tb[i].ocena[0],&tb[i].ocena[1],&tb[i].ocena[2]);
     }
   for(lf=0,rt=count-1;lf<=rt;)
     {
      if(ok(tb+lf)) ++lf;
      else if(!ok(tb+rt)) --rt;
      else
        {
         tmp=tb[lf];
         tb[lf++]=tb[rt];
         tb[rt--]=tmp;
        }
     }
   printf("Zdali egzamin:\n");
   for(i=0;i<lf;++i) printf("Nr indeksu %u\n",tb[i].nr);
   printf("\nNie zdali egzaminu:\n");
   for(i=lf;i<count;++i) printf("Nr indeksu %u\n",tb[i].nr);
   free(tb);
   return 0;
  }

http://ideone.com/WDtXl9

0

Po ludzku, nie po ludzku, dalej nie działa tak jak powinno. W sumie tak samo źle wyświetla jak i u mnie: http://s20.postimg.org/tpu5psiel/scr_65.png

1

To dokładasz jeszcze znak = w warunku i po sprawie:
http://ideone.com/Tkz12I

1 użytkowników online, w tym zalogowanych: 0, gości: 1