Vytvářím jako školní práci databázový systém, který má za úkol zobrazit záznamy podle ID a podle Příjmení. Nikde však nemůžu najít, jak utřídit pole řetězců. Existuje na to v C nějaká funkce? Díky
Fórum › C / C++
Seřazení pole řetězců dle abecedy
To liborb : Takže to bude vypadat nějak takto?
for(int i=0;i<poc;i++) //serazeni
{
if(z[i].stav == 0 && z[i + 1].stav == 1)
{
if ( strcmp(z[i].prijmeni, z[i + 1].prijmeni) < 0)
{
TZAZNAM p;
p = z[i];
z[i] = z[i + 1];
z[i + 1] = p;
}
}
}
Už jsem myslel, že toto jede, ale nic
void R_Jmeno()
{
int i , j;
for(i = 0; i < poc; i++)
{
for(j = poc - 1; j >= i; j--)
{
if(z[i].stav == 1 && z[i + 1].stav == 1) //zaznamy se posunuji pouze tehdy, je li před nimi volné místo, prázdné záznamy se již nepřesouvaji
{
if ( strcmp(z[i].jmeno, z[i + 1].jmeno) == 1) //porovnavani dvou sousednich hodnot, klasicky bublinkovy algoritmus
{
TZAZNAM p;
p = z[i];
z[i] = z[i + 1];
z[i + 1] = p;
}
}
}
}
Vypis();
}
Jak si to mam naprogramovat? České znaky neřeším.
jak asi.. budes prochazet retezce znak po znaku dokud nenarazis na rozdil nebo jeden z nich neskonci
kdyz narazis na jinej znak tak skoncis a vratis hodnotu bud mensi nebo vetsi
kdyz narazis na konec retezce tak u toho, ktery skoncil prvni vratis jako ze je mensi
kdyz narazis na konec u obou najednou tak vratis ze sou stejne
zadna veda to neni
Proč ty jména neuložíte do proměnné typu string? Mezi typem string pak lze použít takové ty zobáky "menší, větší" a pak už vám bude stačit nějaký třídící algoritmus. Pokud záznamu nebude moc, vystačíte si s nějakým Bubble Sortem, jinak doporučuji třeba QuickSort.
Je pozdě a už mi to moc nemyslí, ale řekl bych, že to máš správně, až na to testování stavu.
if(z[i].stav == 1 && z[i + 1].stav == 1)
Když budeš mít stavy třeba 1,0,1,0,0,1,0, tak nic nezpracuješ. Buď tam budeš muset dodělat vyhledání následujícího aktivního záznamu, se kterým budeš srovnávat (a dost možná právě o to v tom úkolu jde), nebo jednodušeji předtím udělat kompakt a neaktivní záznamy vyházet.
To zdenda : Testování stavu je správné, programově to mám řešeno tak, že když odstraním záznam, ostatní záznamy se posunou na jeho místo a nový záznam se ukládá na první volné místo.
Jinak jsem to vyresil zatim takto (trochu jsem upravil vyse uvedeny zdrojak) a zda se, že to funguje, ale až zpracování více dat mi dá jistotu.
void R_Prijmeni()
{
int i = 0;
int j = 0;
TZAZNAM pom; //pomocná proměnna
while (i < poc) //klasicky bublinkovy algoritmus
{
j = i;
if(z[j].stav==1 && z[j + 1].stav == 1) //radime jen to, co obsahuje data, minimalne musi byt dva zaznamy, pokud nejsou, neni co radit a jde se na vypis
{
while(j >= 0 && strcmp(z[j].prijmeni, z[j + 1].prijmeni) == 1) //razeni dle prijmeni
{
pom = z[j];
z[j] = z[j+1];
z[j + 1] = pom;
j--;
}
if(strcmp(z[j].prijmeni, z[j + 1].prijmeni) == 0 && strcmp(z[j].jmeno, z[j + 1].jmeno) == 1) //jsou li stejne příjmení, provedeme roztřídění dle jmena
{
pom = z[j];
z[j] = z[j+1];
z[j + 1] = pom;
}
}
i++;
}
Vypis();
}
Mazání je řešeno takto (pokud tam je nějaká hloupost, budu rád, když mě na ni upozorníte)
void Smazat()
{
int id, i = 0, j;
bool k = false;
printf("\nZadej ID prvku, ktery bude smazan: ");
scanf("%d", &id);
while (i < poc) //procházení pole
{
if( z[i].ID == id && z[i].stav == 1) //nalezení ID a kontrola, zda je tu opravdu zaznam
{
z[i].stav = 0; //označení záznamu, že může být přepsán
j = i;
k = true;
while (j < poc) //přesun záznamů za smazanou položkou vpřed
{
if (z[j].stav == 0 && z[j + 1].stav == 1) //položky se přesouvají, je-li před nimi volné místo a obsahují li záznam
{
z[j] = z[j + 1]; //přesun položky vpřed
z[j + 1].stav = 0; //nastavení položky pro zápis
}
j++;
}
printf("\nPolozka byla odstranena.\n");
break; //nema smysl dale hledat ID, cyklus tedy ukoncime
}
i++;
}
if (k == true)
{
for (int i = 0; i < poc; i++) //oprava ID u polozek s vyssim ID, než měla odstraněna položka
{
if(z[i].stav == 1 && z[i].ID > id) //pokud je v položce záznam a ID je větší než ID smazané položky, provede se oprava
z[i].ID = z[i].ID - 1; //snížení ID za smazanou položku
}
}
if (k == false)
printf("\nSpatne ID.\n");
system("pause");
getchar();
Menu();
}
Naš si psát quicksort, když už ho napsal někdo jiný:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Clovek
{
const char* jmeno;
const char* prijmeni;
};
struct Clovek Lidi[] =
{
{ "Karel", "Lopuch" },
{ "Alois", "Abecedni" },
{ "Franta", "Jetel" }
};
int PorovnejLidi(const void* c1, const void* c2)
{
const struct Clovek* cl1 = (const struct Clovek*)c1;
const struct Clovek* cl2 = (const struct Clovek*)c2;
return strcmp(cl1->prijmeni, cl2->prijmeni);
}
void Vypis()
{
size_t i;
for (i = 0; i < sizeof(Lidi) / sizeof(Lidi[0]); ++i)
{
printf("%s %s\n", Lidi[i].jmeno, Lidi[i].prijmeni);
}
printf("\n");
}
int main()
{
Vypis();
qsort(Lidi, sizeof(Lidi) / sizeof(Lidi[0]), sizeof(struct Clovek), PorovnejLidi);
Vypis();
return 0;
}
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Razeni dle abecedy — založil Slupphy
Seřazení dle datumu — založil dawe
Inicializace pole retezcu — založil Dusan R.
Pole řetězců se samo přepisuje — založil Dutch77
Sežazení pole dle výskytu slova — založil cosh-boy
Moderátoři diskuze