Anonymní profil miska – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil miska – Programujte.comAnonymní profil miska – Programujte.com

 

Příspěvky odeslané z IP adresy 85.132.142.–

Michaela
C / C++ › Binární strom
27. 3. 2011   #140388

Ahoj, potřebovala bych poradit s kouskem kódu. Nevím, jak na to. Jedná se o část, kde se mají smazat uzly binárního stromu.. Je u toho napsáno //úkol... Ještě bych chtěla, kdyby mi někdo zkontroloval, zda jsem správně udělala smazání celého stromu. Moc děkuji.



//ADT binární strom
//Podle prednasek implementujte ADT binární strom, který bude bude poskytovat následující metody
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>


//pomocna struktura pro definici prvku ukladaneho do stromu
typedef struct tDatatag
{
int Key;
}tData;


typedef struct tUzelStromutag
{
tData data; //ukladana data
struct tUzelStromutag* ukLevy; //ukazatel na leveho nasledovnika
struct tUzelStromutag* ukPravy; //ukazatel na praveho nasledovnika
}tUzelStromu;

typedef tUzelStromu* tUkUzel; //tUzelStromu* tUkUzel;

//pomocna funkce pro vypis dat
void writedata(tData* d)
{
printf("(%d)", d->Key);
}

//vlo?í do stromu nový uzel s daty d. Pokud uz ve stromu existuje strom se stejnými daty, neudilá nic
void BSTInsert(tUkUzel* RootPtr, tData* d)
{
if( (*RootPtr) != NULL )
{
if( d->Key < (*RootPtr)->data.Key )
BSTInsert(&(*RootPtr)->ukLevy, d);
else if( d->Key > (*RootPtr)->data.Key )
BSTInsert(&(*RootPtr)->ukPravy, d);
else
(*RootPtr)->data.Key = d->Key;
}
else
{
(*RootPtr) = (tUkUzel)malloc(sizeof(tUzelStromu)); //vytvooení nového uzlu
(*RootPtr)->ukLevy = NULL; //a jeho naplniní správnými hodnotami}
(*RootPtr)->ukPravy = NULL;
(*RootPtr)->data.Key = d->Key;
}
}

//vyhledá uzel, jeho? data jsou shodná jako parametr d
tUkUzel BSTSearch(tUkUzel RootPtr, tData* d)
{
if( RootPtr != NULL )
{
if( d->Key < RootPtr->data.Key )
return BSTSearch(RootPtr->ukLevy, d);
else if( d->Key > RootPtr->data.Key )
return BSTSearch(RootPtr->ukPravy, d);
else
return RootPtr;
}
else
return NULL;
}

//projde strom pruchodem preorder a vytiskne v?echny jeho uzly
void BSTPreorder(tUkUzel uzel)
{
if( uzel != NULL )
{
writedata(&uzel->data);
BSTPreorder( uzel->ukLevy );
BSTPreorder( uzel->ukPravy );
}
}

//projde strom pruchodem inorder a vytiskne v?echny jeho uzly
void BSTInorder(tUkUzel uzel)
{
if( uzel != NULL )
{
BSTInorder( uzel->ukLevy );
writedata(&uzel->data);
BSTInorder( uzel->ukPravy );
}
}

//projde strom pruchodem postorder a vytiskne v?echny jeho uzly
void BSTPostorder(tUkUzel uzel)
{
if( uzel != NULL )
{
BSTPostorder( uzel->ukLevy );
BSTPostorder( uzel->ukPravy );
writedata(&uzel->data);
}
}

//korektni ze stromu sma?e uzel, jeho? data jsou stejné jako parametr d
void BSTDelete(tUkUzel RootPtr, tData* d)
{
//ukol
}

//sma?e celý strom
void BSTDeleteTree(tUkUzel RootPtr)
{
if (RootPtr != NULL)
{
BSTDeleteTree(RootPtr->ukLevy);
BSTDeleteTree(RootPtr->ukPravy);
RootPtr = NULL;
}
}

int main()
{
tUkUzel strom = NULL;
tData data;
int i;

srand( (unsigned)time( NULL ) );

printf("\nVkladam nahodne cislo: ");
for(i=0; i<5; i++)
{
data.Key = rand()%50;
BSTInsert(&strom, &data);
printf("%d ", data.Key);
}
data.Key = 25;
BSTInsert(&strom, &data);
printf("%d ", data.Key);
for(i=0; i<5; i++)
{
data.Key = rand()%50;
BSTInsert(&strom, &data);
printf("%d ", data.Key);
}

printf("\nVypis stromu metodou inorder:\n");
BSTInorder(strom);

printf("\nVypis stromu metodou preorder:\n");
BSTPreorder(strom);

printf("\nVypis stromu metodou postorder:\n");
BSTPostorder(strom);

data.Key = 25;
BSTDelete(strom, &data);
printf("\nVypis stromu metodou inorder po smazani prvku %d:\n", data.Key);
BSTInorder(strom);

BSTDeleteTree(strom);
printf("\nVypis stromu metodou inorder po smazani vsech prvku:\n");
BSTInorder(strom);

printf("\nLibovolnou klavesou ukoncete program.");
getch();
return 0;
}

Anonymní uživatel
C / C++ › Slovni fotbal
4. 1. 2011   #137496

Jojo, vytvořila jsem si databázi například s pěti slovy.. na zkoušku.. slova jsou dána pod sebou, tedy každé slovo na novém řádku.. přes jaký cyklus bys to dělal? For nebo Do?

fotbal
C / C++ › Slovni fotbal
3. 1. 2011   #137462

Ahoj,

potřebovala bych pomoct s jedním programem. Dělám slovní fotbal, který už mám vytvořený. Teď chci dodělat, aby se ta zadaná slova kontrolovala z databáze, kterou jsem si vytvořila z pár slov. Tedy, program musí zkontrolovat, zda zadané slovo uživatelem je v databázi. Pokud tam není, pak to hodí hlášku a musí uživatel zadat nové slovo. Jen vůbec nevím, jak to udělat.

#include <stdio.h> 

#include <string.h>

int main(void)
{
char slovo_1[20], slovo_2[20];
char p1, p2, end;
int i, error = 0;
FILE *f;

printf("SLOVNI FOTBAL\n");
printf("Zadej pismeno, jimz bude hra zacinat: "); scanf("%c", &p2);
f = fopen("slova.txt","r");

do
{
printf("Hrac 1: Zadej slovo: ");
scanf("%s", slovo_1);

if (p2 != slovo_1[0])
{
printf("Slovo nezacina znakem '%c'\n", p2);
printf("Vitezem se stava hrac 2.\n");
error++;

printf("Pokracuj stiskem klavesy... ");
scanf("%i", &end);
return 1;
}

p1 = slovo_1[strlen(slovo_1) - 1];
printf("Hrac 2: Zadej slovo: ");
scanf("%s", slovo_2);

if (p1 != slovo_2[0])
{
printf("Slovo nezacina znakem '%c'\n", p1);
printf("Vitezem je hrac 1.\n");
error++;
printf("Pokracuj stiskem klavesy a ENTERem... ");
scanf("%i", &end);
return 1;
}

p2 = slovo_2[strlen(slovo_2) - 1];
} while (error <= 0);
fclose(f);

return 0;
}

edor
C / C++ › problem s mezerama
15. 12. 2010   #136947

Oprava, ještě ochrana proti tomu, aby nemohl zadat číslice:

char * jmeno; 

printf("Zadej jmeno ");
while (scanf("%s",jmeno) != 0)
{
printf ("Zadej pismeno");
while (getchar()!='\n');
}
printf("tvoje jmeno je %s", jmeno);
return 0;

edor
C / C++ › problem s mezerama
15. 12. 2010   #136946

Mělo by to být takto:

char * jmeno; 

printf("Zadej jmeno ");
scanf("%s",jmeno);
printf("tvoje jmeno je %s", jmeno);

edor
C / C++ › Převod mezi soustavami
15. 12. 2010   #136945

děkuji... no já myslela, že musí být pro každou tu soustavu jedna promenna

edor
C / C++ › Převod mezi soustavami
15. 12. 2010   #136920

Ahoj,

potřeboval bych pomoct s jedním programem, který mi dělá starosti. Zadání je: Vytvořte program, který převede číslo, zadané v libovolné soustavě (dvojkové až dvacítkové) na číslo v jiné soustavě.

Program se nejdříve zeptá na soustavu (nebo spíše základ soustavy, tj. číslo mezi 2-20), ve které bude číslo zadáno, pak vyzve k zadání tohoto čísla, zeptá se na základ soustavy, do které chcete číslo převést a nakonec vytiskne výsledek.

No vím, že k tomu mám použít f-ci strtol, která mi to převede...

No nejdříve to zkouším z dvojkové do desítkové, abych to vůbec pochopila... Následovně vypadá můj "začáteční" kód. Jenže při spuštění mi to hodí chybu, nevím, jak přesně tam definovat dvoj_s, aby mi to bralo číslo zadané z klávesnice... Tedy chci-li zadat číslo 001, tak potřebuji, aby to vypsalo 1.

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv)
{
char * dvoj_s, *sest_s, *osm_s, *dvan_s, *des_s, *dvac_s;
int cislo;
printf ("V jake soustave budete zadavat cislo? Napiste cislo od 2 do 20.\n");
scanf ("%d", &cislo);

if (cislo == 2)
{
int n;
printf("Zadejte cislo ve dvojkove soustave: ");
scanf ("%s", dvoj_s);
n = strtol (dvoj_s, 0, 10);
printf ("%s", k);
}

return 0;
}

miska
C / C++ › Dynamické násobení matic
15. 11. 2010   #135907

Děkuji, funguje to sice jen pro čtvercové matice, ale aspoň jsi mi ukázal, jak na to :) Teď jen musím dojít na to, aby to fungovalo pro všechny typy matic :-)

miska
C / C++ › Dynamické násobení matic
15. 11. 2010   #135905

No mám v tom fakt větší guláš :-D Takže jak mám k, k tomu udělám ještě vnitřní cyklus q... To chápu, ale bohužel nechápu, jak to mám zapsat, aby se to tam dělilo apod., jak píšeš.

Když mám nulovat to pole3, tak stačí napsat před cyklus: pole3 = NULL; ?

miska
C / C++ › Dynamické násobení matic
12. 11. 2010   #135811

Aha, děkuji, ale stejně když to tam přidám, tak mi to bohužel nenásobí :( nevím, kde je chyba, sedím nad tím dnes už tři hodiny a vůbec mě nic nenapadá :( Vypisuje mi to spíše jakoby ty adresy a ne vynásobená náhodná čísla

miska
C / C++ › Dynamické násobení matic
11. 11. 2010   #135797

Ahojky, prosím vás, potřebovala bych poradit s programem. Snažím se vytvořit dynamické násobení matic, respektive násobení matic přes ukazatele. Něco jsem vytvořila... matice se vypisují do jednorozměrného pole, bohužel je někde chyba, protože se mi nechce vypsat výsledná matice. Prosím, potřebovala bych poradit :(

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv)
{
int radek_a, sloupec_a_radek_b, sloupec_b;
printf ("Zadejte pocet radku matice A: ");
scanf ("%d", &radek_a);
printf ("Zadejte pocet sloupcu matice A, radku matice B: ");
scanf ("%d", &sloupec_a_radek_b);
printf ("Zadejte pocet sloupcu matice B: ");
scanf ("%d", &sloupec_b);

int i, j;

int n;
n = radek_a * sloupec_a_radek_b;
int *pole1 = malloc (n * sizeof(*pole1));
int *a = NULL;
a = pole1;

printf ("Matice A je: \n");
for(i = 0; i < n; i++)
{
*a = rand() % 10;
a++;
printf ("%d ", *(pole1+i));
}

int m;
m = sloupec_a_radek_b*sloupec_b ;
int *pole2 = malloc (n * sizeof(*pole2));
int *b = NULL;
b = pole2;

printf ("\nMatice B je: \n");
for(j = 0; j < m; j++)
{
*b = rand() % 10;
b++;
printf ("%d ", *(pole2+j));
}

int o,k;
o = radek_a*sloupec_b ;
int *pole3 = malloc (o * sizeof(*pole3));
int *c = NULL;
c = pole3;

printf ("\nMatice C je: \n");
for (k = 0; k < o; k++)
{
*c += (*a++) * (*b+sloupec_b);
c++;
printf ("%d ", *(pole3+k));
}

free(pole1);
free(pole2);
free(pole3);
return 0;
}

 

 

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