Sortowanie stringow w C- Problem

0

No więc napisalem programik sortujący napisy i według mojego myślenia powinien on działać, ale tak nie jest.
Tzn program sie kompiluje, zero błędów, ale jest błąd podczas wykonywania.
Wygląda on tak:

#include <ctype.h>
#include <stdio.h>
#include <string.h>

void main (void)
{
int i;
char *pom;
char tab[5][20];
char *pnapis[5];

printf("-----------< Program sortujacy lancuchy znakowe >-----------\n\n");

strcpy(tab[0],"Malinowski");
strcpy(tab[1],"Kowalski");
strcpy(tab[2],"Nowak");
strcpy(tab[3],"Walczak");
strcpy(tab[4],"Kaminski");

for (i=0; i<5; i++)
{
pnapis[i] = &tab[i][0];
}

printf ("%s\n",tab[0]);
printf ("%s\n",tab[1]);
printf ("%s\n",tab[2]);
printf ("%s\n",tab[3]);
printf ("%s\n",tab[4]);

for (i=0; i<5; i++)
{
if (strcmp(pnapis[i+1],pnapis[i])<0)
{
pom=pnapis[i];
pnapis[i]=pnapis[i+1];
pnapis[i+1]=pom;

	}

}

printf("Lancuchy posortowane:\n\n");

for (i=0; i<5; i++)
printf("%s\n",tab[i] );

printf ("\n");

}

I jesli sie da to prosze nie pisac odpowiedzi ze latwiej by bylo jakby byl ten progs napisany inaczej, ale raczej pokazcie mi gdzie jest blad w moim programie.
Wiem ze jest on napisany dosyc prymitywine ale dopiero sie ucze.
Z gory dzieki za odpowiedzi

0

Błąd nr 1- sortujesz stringi z tablicy "pnapis" a wypisujesz jako posortowane stringi z tablicy "tab"( której nie sortowałeś !! ) - należy zmienić nazwę wypisywanej tablicy (w ostatniej pętli "for") z "tab" na "pnapis"

Błąd nr 2 - jedna pętla "for" przy sortowaniu nie wystarczy ponieważ zamieniasz elementy leżące obok siebie. Np.:zamienisz element nr 2 z nr 3 ale potem już nie sprawdzasz czy ten zamieniny(nr 3) jest wiekszy od elementu nr 1 (bo w pętli licznik się zwiększa). Należy zastosować dwie pętle (pętla w pętli) !!
Wystarczy że dopiszesz linijkę for(int ii=0; ii<5; ii++)(bez średnika na końcu) nad pętlą która sortuje elementy !!

Popraw te 2 błędy i.... sortuj :/
Pozdrawiam !!! :>

0

Oki ale to nic nie daje, program nadal się dobrze kompiluje ale jak go uruchamiam to dochodzi do momentu zaznaczonego <w tym="tym" miejscu="miejscu" sie="sie" wywala="wywala">(w kodzie)
i wyskakuje okienko ze wystapily problemy z aplikacja i zostanie ona zamknieta.

#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

void main (void)
{
int i,j;
char *pom;
char tab[5][20];
char *pnapis[5];

printf("-----------< Program sortujacy lancuchy znakowe >-----------\n\n");

strcpy(tab[0],"Malinowski");
strcpy(tab[1],"Kowalski");
strcpy(tab[2],"Nowak");
strcpy(tab[3],"Walczak");
strcpy(tab[4],"Kaminski");

for (i=0; i<5; i++)
{
pnapis[i] = &tab[i][0];
}

printf ("%s\n",tab[0]);
printf ("%s\n",tab[1]);
printf ("%s\n",tab[2]);
printf ("%s\n",tab[3]);
printf ("%s\n",tab[4]);

// <tu sie="sie" wywala="wywala">

for (j=0; j<5; j++)
{
for (i=0; i<5; i++)
{
if (strcmp(pnapis[i+1],pnapis[i])<0)
{
pom=pnapis[i];
pnapis[i]=pnapis[i+1];
pnapis[i+1]=pom;

	}

}

}

printf("Lancuchy posortowane:\n\n");

for (i=0; i<5; i++)
printf("%s\n",*pnapis[i] );

printf ("\n");

}

0

Teraz jest wszystko ok :/
Popełniłeś tylko mały błąd w przedostatniej linijce !!! Zamiast przesłać wskaźnik do stringu "pnapis" przesłałeś wartość pierwszego elementu "*pnapis" !!!
Wystarczy, że skasujesz tę gwiazdkę( printf("%s\n",pnapis[i] );) !!
:> ...... :>

0

Ja jednak napisze... zrob to inaczej :) rozumiem, ze nauczyciele mogą wymagac bezsensownych dzialan, otwierania drzwi juz dawno otwartych, ale c i c++ jako spadkobierca ma juz w standardzie funkcje sortujaca:

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

int _sort(const void *a,const void *b){
   return strcmp((char*)a,(char*)b);
}

main(){
  char tab[5][20];
  strcpy(tab[0],"Malinowski");
  strcpy(tab[1],"Kowalski");
  strcpy(tab[2],"Nowak");
  strcpy(tab[3],"Walczak");
  strcpy(tab[4],"Kaminski");
  qsort(tab,5,20,_sort);
  for(int i=0;i<5;i++)printf("%s\n",tab[i]);
  return 0;
}
0

Oki M@riusz zrobilem jak napisales ale nadal jest to samo, tzn. dobrze sie kompiluje ale wywala sie podczas wykonywania programu.
Skoro wszystko jest dobrze to moze ktoś spróbuje uruchomic ten program u siebie, i napisze czy u niego działa.
Flabra dla ciebie tez dzięki, pewnie przyda mi sie ten progs napisany przez ciebie, ale na razie chciałbym wiedziec jaki błąd popełniłem w moim programie.

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