Seřazení pole řetězců dle abecedy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Seřazení pole řetězců dle abecedy – C / C++ – Fórum – Programujte.comSeřazení pole řetězců dle abecedy – C / C++ – Fórum – Programujte.com

 

marpit0
Stálý člen
15. 5. 2010   #1
-
0
-

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

Nahlásit jako SPAM
IP: 94.113.182.–
MarPit
liborb
~ Redaktor
+18
Guru
15. 5. 2010   #2
-
0
-

Asi hledáš strcmp.

Nahlásit jako SPAM
IP: 195.189.143.–
marpit0
Stálý člen
15. 5. 2010   #3
-
0
-

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;
}
}
}

Nahlásit jako SPAM
IP: 94.113.182.–
MarPit
marpit0
Stálý člen
15. 5. 2010   #4
-
0
-

.

Nahlásit jako SPAM
IP: 94.113.182.–
MarPit
KIIV
~ Moderátor
+43
God of flame
15. 5. 2010   #5
-
0
-

to si budes muset naprogramovat sam..
tim spis pokud by to melo zvladat i cestinu (nebo dokonce ceskou normu)

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
marpit0
Stálý člen
15. 5. 2010   #6
-
0
-

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.

Nahlásit jako SPAM
IP: 94.113.182.–
MarPit
KIIV
~ Moderátor
+43
God of flame
15. 5. 2010   #7
-
0
-

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

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr
~ Anonymní uživatel
746 příspěvků
15. 5. 2010   #8
-
0
-

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.

Nahlásit jako SPAM
IP: 78.80.225.–
Petr
~ Anonymní uživatel
746 příspěvků
15. 5. 2010   #9
-
0
-

Samozřejmě pokud to má být čistě v C, budete to muset udělat výše uvedeným postupem.

Nahlásit jako SPAM
IP: 78.80.225.–
zdenda
~ Anonymní uživatel
257 příspěvků
16. 5. 2010   #10
-
0
-

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.

Nahlásit jako SPAM
IP: 213.211.51.–
marpit0
Stálý člen
16. 5. 2010   #11
-
0
-

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();
}

Nahlásit jako SPAM
IP: 94.113.182.–
MarPit
ondra.holub+1
Stálý člen
16. 5. 2010   #12
-
0
-

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;
}

Nahlásit jako SPAM
IP: 85.207.23.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 139 hostů

Podobná vlákna

Razeni dle abecedy — založil Slupphy

Seřazení dle datumu — založil dawe

Inicializace pole retezcu — založil Dusan R.

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý