Nepomohl by mi nekdo – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nepomohl by mi nekdo – C / C++ – Fórum – Programujte.comNepomohl by mi nekdo – C / C++ – Fórum – Programujte.com

 

Honza0
Newbie
23. 4. 2007   #1
-
0
-

Mame ukol,napsat v C implementaci zjednodušené funkce sprintf dle manuálu,ktery prikladam dole.Je to v anglictine,a vubec tomu nechapu,nemohl by se na to nekdo prosim vas podivat.Vubec tomu nerozumim

Deklarace a popis chování
int Sprintf(char *str, const char *format, ...);

DESCRIPTION
The function produces output according to a format as described below and writes it to the character string str.

The function writes the output under the control of a format string that specifies how subsequent arguments are converted for output.

Return value
Upon successful return, the function return the number of characters printed (not including the trailing ’\0’ used to end output to strings). If an output error is encountered, a negative value is returned.

Format of the format string
The format string is a character string, beginning and ending in its initial shift state, if any. The format string is composed of zero or more directives: ordinary characters (not %), which are copied unchanged to the output stream; and conversion specifications, each of which results in fetching zero or more subsequent arguments. Each conversion specification is introduced by the character %, and ends with a conversion specifier. In between there may be an optional length modifier.

The arguments must correspond properly (after type promotion) with the conversion specifier. By default, the arguments are used in the order given, where each conversion specifier asks for the next argument (and it is an error if insufficiently many arguments are given).

The length modifier
Here, ‘integer conversion’ stands for d, i, o, u, x, or X conversion.

hh

A following integer conversion corresponds to a signed char or unsigned char argument.

h

A following integer conversion corresponds to a short int or unsigned short int argument.

l

(ell) A following integer conversion corresponds to a long int or unsigned long int argument.

The conversion specifier
A character that specifies the type of conversion to be applied. The conversion specifiers and their meanings are:

d,i

The int argument is converted to signed decimal notation.

o,u,x,X

The unsigned int argument is converted to unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal (x and X) notation. The letters abcdef are used for x conversions; the letters ABCDEF are used for X conversions.

c

The int argument is converted to an unsigned char, and the resulting character is written.

s

The const char* argument is expected to be a pointer to an array of character type (pointer to a string). Characters from the array are written up to (but not including) a terminating NUL character.

p

The void * pointer argument is printed in hexadecimal (as if by 0x%x or 0x%lx).

%

A ‘%’ is written. No argument is converted. The complete conversion specification is ‘%%’.

Nahlásit jako SPAM
IP: ...–
Peter D.0
Expert
23. 4. 2007   #2
-
0
-

ťažka uloha kde to chodiš na školu ? :)

ide o funkciu, ktora prvý parameter (textove pole) naplní nejakým textom, druhý parameter je ten text, ale môže obsahovať aj tzv. format identifiers. popísane ich máš, ďalej je to premenlivý počet parametrov podľa počtu tych identifikátorov. F-cia ma vrátiť počet vypísaných znakov
čomu konkrétnejšie nerozumieš ?

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Honza0
Newbie
24. 4. 2007   #3
-
0
-

mephi:Chodím do zlína.No víš ja tomu nerozumím jak to mám napsat,nejsem v programovaní vubec zběhlý takže nevím.A k temu je to ještě taková uloha.

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
26. 4. 2007   #4
-
0
-

Vážně prosim vás nikdo neví jak to naprogramovat,ja tuhle ulohu nikdy neudělám.

Nahlásit jako SPAM
IP: ...–
midin
~ Anonymní uživatel
320 příspěvků
26. 4. 2007   #5
-
0
-

Čemu konkrétně nerozumíš? Přeložil sis zadání?

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
27. 4. 2007   #6
-
0
-

Neni to cele, venku je krasne a ja jsem docela liny takze nevim, jestli se mi bude chtit to dodelavat. Ale aspon na nakopnuti, treba ti to Midin, nebo nekdo jiny dodela nebo uplne prepracuje.



#include <iostream>
#include <streambuf>
#include <cstdarg>

using namespace std;

typedef enum
{ eNone = 0x00,
efShort = 0x02,
efLong = 0x04,
efChar = 0x08,
eInt = 0x10,
eString = 0x20,
eUnsInt = 0x40,
eChar = 0x80,

} eState;

char * GetState(char *pch, int* s)
{ *s = eNone; // vychozi stav
if(*pch == 'l'){ *s = efLong; pch ++;}
if(*pch == 'h'){ *s = efShort; pch++;}
if(*s == efShort && *pch == 'h'){ *s = efChar; pch++;}

switch(*pch)
{
case 'i':
case 'd': *s |= eInt;
pch ++;
break;
case 's': *s |= eString; // mozna tady muze byt jen *s = eString, ale netusim k cemu jsou ty modifikatory hh, h, a l
pch ++;
break;
case 'u': *s |= eUnsInt;
pch ++;
break;
case 'c': *s |= eChar;
pch ++;
break;
};
return pch;
}

int Sprintf(char *str, const char *format, ...)
{ va_list l;
va_start(l, format);
char * pch = (char*)format;
for (;*pch;)
{ if(*pch == '%')
{ int len = 0;
int s;
while(isdigit(*++pch)) len = len * 10 + *pch - '0'; // ziska delku
if(!(pch = GetState(pch, &s))) break;
if(s & eString)
{ char *p1 = va_arg(l,char*), *p2;
for(p2=p1;*p2; ++p2, ++str)
{ if(len && (p2-p1) >= len) break;
*str = *p2;
}
}
else if(s & eChar)
{ *str++ = va_arg(l, int); // zde se nejak musi zakomponovat pouziti hh
}
//else if(s & eInt) atd...
if(s == eNone ) *str++ = *pch++;
}
else
*str++ = *pch++;
}
*str = '\0';
va_end(l);
return pch - format;
}


int main(int argc, char** argv[])
{
char buf[512];
cout << Sprintf(buf, "V buf bude zkacene slovo Pepiku na 2 pismena: %2s\ntake na dalsi radku jeden znak %c\na uplne dole si vytikneme nejaka ta procenta treba 50%%.\n", "Pepiku", 'z') << endl;
cout << buf << endl;
cin.get();
return 0;
}

Nahlásit jako SPAM
IP: ...–
midin
~ Anonymní uživatel
320 příspěvků
27. 4. 2007   #7
-
0
-

To Jura: Není to kompletní? Jak to tak pročítám, tak tam zřejmě nic nechybí :)

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
27. 4. 2007   #8
-
0
-

To midin:
Ale chybi - nejsou tam vubec resene cisla, prevody(octa, hexa) a koneckoncu i modifikatory(hh, h, l)

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
27. 4. 2007   #9
-
0
-

No už sem si to přeložil,ale stejně mi to nic neříka:-(.To je ono?.Tak moc dík i za to co si napsal,snad to někdo dodělá do konce,byl bych mu dost vděčnej.

Nahlásit jako SPAM
IP: ...–
Peter D.0
Expert
28. 4. 2007   #10
-
0
-

najdi si funkciu v stdio.h a kopiruj :)
myslim že ti to asi aj tak nikto neuzna, keď nebudeš kódu rozumieť.

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Honza0
Newbie
29. 4. 2007   #11
-
0
-

To mephi:to nechapu jak mysliš.Víš on se na nic neptá,to se jen odevdává.

Nahlásit jako SPAM
IP: ...–
Peter D.0
Expert
29. 4. 2007   #12
-
0
-

nejak som to nenašiel asi to bude v nejakej libke alebo čo

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Honza0
Newbie
29. 4. 2007   #13
-
0
-

To mephi:no ja ted nevim co tim myslíš

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
30. 4. 2007   #14
-
0
-

polopaticky:

mephi si myslel ze v *.h nebo *.lib (*.a) najde zdrojak toho co potrebujete a ten byste si zkopiroval, v *.h to logicky neni
Vam vsak radim nereste blbosti a koukejte si to dodelat, jako na jednu stranu s ukolama pomahaj radi vsichni ale vy vyslovne to chcete po nekom cely dodelat! Na druhou stranu bude jedine dobre, kdyz bude mit CR mene "odborniku" v IT

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
Honza0
Newbie
2. 5. 2007   #15
-
0
-

To zacatecnik:snazim se to nejak dodelat ale stejne,na nic neprijdu,je to dost tezka uloha,nejtezci co sme dostali.ASpon ze je to posledni.Vickrat se tim nemusim zabyvat

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
5. 5. 2007   #16
-
0
-

To Jura:nemohl by si prosimte kdyz si s tim uz zacal ten program dokoncit,moc by me to pomohla.Jak sem se na to dival tak to dohromady nedam.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
6. 5. 2007   #17
-
0
-

To jecmenk:
Nemam moc casu, takze jsem to tak naplacal. Ovsem ma to docela podstanou chybu - neresi zaporna cisla(je potreba upravit funkci pro prevod).



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

typedef enum
{ eNone = 0x00,
efShort = 0x02,
efLong = 0x04,
efChar = 0x08,
eInt = 0x10,
eString = 0x20,
eUnsInt = 0x40,
eChar = 0x80,
eOctal = 0x200,
eHexa = 0x400,
eBigHexa = 0x800,
ePointer = 0x1000
}eStates;

char * GetState(char *pch, int* s)
{ *s = eNone; // vychozi stav
if(*pch == 'l'){ *s = efLong; pch ++;}
if(*pch == 'h'){ *s = efShort; pch++;}
if(*s == efShort && *pch == 'h'){ *s = efChar; pch++;}
switch(*pch)
{
case 'i':
case 'd': *s |= eInt;
pch ++;
break;
case 's': *s = eString;
pch ++;
break;
case 'u': *s |= eUnsInt;
pch ++;
break;
case 'c': *s |= eChar;
pch ++;
break;
case 'o': *s |= eOctal;
pch++;
break;
case 'x': *s |= eHexa;
pch++;
break;
case 'X': *s |= eBigHexa;
pch++;
break;
case 'p': *s = ePointer;
pch++;
break;
};
return pch;
}

void Change(char *out, long num, int base, int up)// neresi zaporna cisla
{ if(base <2 || base > 32) return;
char buf[128];
int i, t;
for(i=0; num;num /= base)
{ t = num % base;
if(t > 9) { t = t%10; buf[i++] = (up)?'A'+t:'a'+t;}
else buf[i++] = t + '0';
}
for(;i > 0;) *out++ = buf[--i];
*out = '\0';
}

int Sprintf(char *str, const char *format, ...)
{ va_list l;
va_start(l, format);
char * pch = (char*)format;
char* start = str;
int i;
for (;*pch;)
{ if(*pch == '%')
{ int len = 0;
int s;
while(isdigit(*++pch)) len = len * 10 + *pch - '0';
if(!(pch = GetState(pch, &s))) break;
if(s == eString)
{ char *p1 = va_arg(l,char*), *p2;
for(p2=p1;*p2; ++p2, ++str)
{ if(len && (p2-p1) >= len) break;
*str = *p2;
}
}
else if(s == ePointer)
{ *str++ ='0';*str++ = 'x';
void *p = va_arg(l, void*);
char temp[128];
Change(temp,(long)p,16, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s & eChar)
{ if(s & efChar) *str++ = (unsigned char)va_arg(l, int);//??
else *str++ = (char)va_arg(l, int);
}
else if(s & eInt)
{ long num = va_arg(l, long);
if(s & efShort) num = (short int)num; // oreze rozsah
if(!(s & efLong)) num = (int)num;
char temp[128];
Change(temp, num, 10, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s & eUnsInt)
{ unsigned long num = va_arg(l, unsigned long);//??
if(s & efShort) num = (unsigned short)num;
if(s & efLong) num =(unsigned int)num;
char temp[128];
Change(temp, num, 10, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s & eOctal)
{ long num = va_arg(l, long);
if(s & efShort) num = (short)num;
if(!(s & efLong)) num = (int)num;
char temp[128];
Change(temp, num, 8, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s & eHexa || s & eBigHexa)
{ long num = va_arg(l, long);
if(s & efShort) num = (short)num;
if(!(s & efLong)) num = (int)num;
char temp[128];
Change(temp, num, 16, s & eBigHexa);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s == eNone) *str++ = *pch++;
}
else
*str++ = *pch++;
}
*str = '\0';
va_end(l);
return str - start;
}

int main()
{ char buf[512];
int len = Sprintf(buf, "%d+%i=%ld", 1, 4, 1+4);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "20%% ze 100 je %d", 100/5);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v osmickove soustave je %o", 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Znak %c nebo %hhc.", 165, 165);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Adresa buf je %p.", buf);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1. dva znaky ze slova %s jsou %2s\n", "Pepiku", "Pepiku");
printf("%sVytisknuto %d znaku.\n", buf, len);
return 0;
}

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
6. 5. 2007   #18
-
0
-

To Jura:a to se dela prosimte jak.Jinak sem to poustel v dev c,a pise mi to ze
`va_list' undeclared (first use this function)
`va_start' undeclared (first use this function)
`isdigit' undeclared (first use this function)
`va_arg' undeclared (first use this function)
`va_end' undeclared (first use this function)
kdyz to pise ze to neni deklarovani tak se to musi nejak deklarovat nejakou funcki ne.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
6. 5. 2007   #19
-
0
-

To jecmenk:
Musis tam pridat potrebne hlavickove soubory. Pokud jsi vzal cely ten zdrojovy kod, tak se docela divim, ze nezna ty deklarace. Kazdopadne isdigit najdes v ctype.h a va_** v hl. souboru stdarg.h. Nad upravou fce Change se mi momentalne nechce uvazovat, ale zkus nad tim trochu popremyslet mozna te neco napadne.

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
6. 5. 2007   #20
-
0
-

To Jura:Tak uz sem to upravil v dev c,se to uz prelozi i spusti.Ted uz jen udelat toto



neresi zaporna cisla(je potreba upravit funkci pro prevod.

zkousel sem nad tim ppremyslet ale nic me nenapadlo,pomuzes mi ten program doklepnout do konce,diky moc

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
6. 5. 2007   #21
-
0
-

tak tohle je vazne presprilis, myslim ze prilis zkousite jeho treplivost! to je preci tak neslusny chtit to po nem cely dodelat, kdybyste aspon vzal to co mate a odtahnul na jiny forum a doskemrat to tam, ale tohle ? !!! dit on tomu venoval hodiny, mozna i desitku a vy po (22-13)hodinach rikate takovou blbost ze jste premyslel a nic vas nenapadlo, kdyz na programovani nemam nelezu tam ! stejne jako ja nemam na matiku tak nepolezu na matfyz
v tomhle smeru je lepsi ze ma CR mene IT "odborniku"

sorry musel sem to rict za Juru protoze ma urcite dobry srdce a sam by to nerekl ;-)

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
myth
~ Anonymní uživatel
55 příspěvků
7. 5. 2007   #22
-
0
-

ale vazne Jura kolko ti to zobralo?

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
7. 5. 2007   #23
-
0
-

To zacatecnik:Ja za to prece nemuzu ze tomu nechapu i presto ze se na to podivam,nemam na to bunky.Vsak ja na programatora nejsem,jsem na jinym oboru,pres pocitace,mam jen tohle programu v prvnim roku,je to jen okrajove,sem si to musel vzit,nic jinyho tam na vyber nebylo,kdybych si mohl vybrat tak si to nevemu,me jde hlavne matika a tak ,tohle proste ne

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
7. 5. 2007   #24
-
0
-

To myth:
Popravde receno sam ani moc nevim, zase tak slozita ta uloha neni(projit text a zajimava mista nahradit). Ale vice, jak 2-3 hodiny bych tomu nevenoval. Nepsal sem to najednou, vzdy po nejakych chvilich(30 min.) - podle toho ten kod taky tak vypada:-).
To jecmenk:
Sorry, ale jak uz jsem psal vyse, casu nemam nazbyt. Za nedlouho mam maturu a nikdo se na me na zkousky nenauci...

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
7. 5. 2007   #25
-
0
-

To Jura:Chapu,takze rikas ze v tym programu jen chybi ten prevod,nic vic.Asi se zkusim obratit na nekoho jinyho,kdo by byl ochotny to pro mue udelat,protoze ja sam to neudelam

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
7. 5. 2007   #26
-
0
-

To jecmenk:
Jednak toto a druhak jsem moc dobre nepobral modifikator hh. Mozna nekoho napadne, jak to ma slouzit. Sice jsem to tam zakoponoval, ale jisty si tim opravdu nejsem.

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
8. 5. 2007   #27
-
0
-

To Jura:Dobre,takze jen to.
Tak sem se to snazil pochopit ale stejne nica dkyz to nechau,tak to nemuzu anisam dodela.Prosim tim nekoho moc,kdo by se na to podival a pomohl by mi stim,nenasel by se tu nekdo takovy.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
8. 5. 2007   #28
-
0
-

To jecmenk:
Kdy mas termin odevzdani?

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
9. 5. 2007   #29
-
0
-

To jecmenk:
Mno, mel bych se naucit cist. Myslim, ze ted uz je to kompletni, ale prop jistotu to jeste over.



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

enum
{ eNone = 0x00,
efShort = 0x02,
efLong = 0x04,
efChar = 0x08,
eInt = 0x10,
eString = 0x20,
efUnsDec = 0x40,
eChar = 0x80,
eOctal = 0x200,
eHexa = 0x400,
eBigHexa = 0x800,
ePointer = 0x1000
};

char * GetState(char *pch, int* s)
{ *s = eNone; // vychozi stav
if(*pch == 'l'){ *s = efLong; pch ++;}
if(*pch == 'h'){ *s = efShort; pch++;}
if(*s == efShort && *pch == 'h'){ *s = efChar; pch++;}
switch(*pch)
{
case 'i':
case 'd': *s |= eInt;
pch ++;
break;
case 's': *s = eString;
pch ++;
break;
case 'u': *s |= efUnsDec;
pch ++;
break;
case 'c': *s = eChar;
pch ++;
break;
case 'o': *s |= eOctal;
pch++;
break;
case 'x': *s |= eHexa;
pch++;
break;
case 'X': *s |= eBigHexa;
pch++;
break;
case 'p': *s = ePointer;
pch++;
break;
};
return pch;
}

void Change(char *out,unsigned long num, int base, int up)
{ if(base <2 || base > 32) return;
char buf[128];
int i, t;
for(i=0; num > 0;num /= base, ++i)
{ t = num % base;
if(t > 9) { t %= 10; buf[i] = (up)?'A'+t:'a'+t;}
else buf[i] = t + '0';
}
for(;i > 0;) *out++ = buf[--i];
*out = '\0';
}


int Sprintf(char *str, const char *format, ...)
{ va_list l;
va_start(l, format);
char * pch = (char*)format;
char* start = str;
char temp[128];
int i;
for (;*pch;)
{ if(*pch == '%')
{ int len = 0;
int s;
while(isdigit(*++pch)) len = len * 10 + *pch - '0';
if(!(pch = GetState(pch, &s))) break;
if(s == eNone) *str++ = *pch++;
else if(s == eString)
{ char *p1 = va_arg(l,char*), *p2;
for(p2=p1;*p2; ++p2, ++str)
{ if(len && (p2-p1) >= len) break;
*str = *p2;
}
}
else if(s == ePointer)//The void * pointer argument is printed in hexadecimal (as if by 0x%x or 0x%lx).
{ *str++ ='0';*str++ = 'x';
void *p = va_arg(l, void*);
Change(temp,(long)p,16, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s == eChar) // The int argument is converted to an unsigned char, and the resulting character is written.
{ *str++ = (unsigned char)va_arg(l, int);

}
else {
long num = va_arg(l, long);
if(s & efShort) num = (s & efUnsDec)?(unsigned short)num:(short)num;
else if(s & efChar) num = (s & efUnsDec)?(unsigned char)num:(char)num;

if((s & eInt)) //The int argument is converted to signed decimal notation.
{ num = (int)num;
Change(temp, abs(num), 10, 0);
if(num < 0) *str++ = '-';

}
else if(s & eOctal)
{ num = (unsigned int)num;
Change(temp, num, 8, 0);

}
else if((s & eHexa)||(s & eBigHexa))
{ num = (unsigned int)num;
Change(temp, num, 16, s & eBigHexa);

}
else
{ Change(temp, (s & efUnsDec)?num:abs(num), 10, 0);
if(num < 0 && !(s & efUnsDec)) *str++ = '-';

}
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}

}
else
*str++ = *pch++;
}
*str = '\0';
va_end(l);
return str - start;
}

int main(int argc, char** argv[])
{ char buf[512];
int len = Sprintf(buf, "%d-%i=%d", -1, 4, -1-4);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "20%% ze 100 je %d", 100/5);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "-1000 v osmickove soustave je %o", -1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Znak %c nebo %hhc.", 165, 165);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Adresa buf je %p.", buf);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1. dva znaky ze slova %s jsou %2s\n", "Pepiku", "Pepiku");
printf("%sVytisknuto %d znaku.\n", buf, len);
getchar();
return 0;
}

Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
9. 5. 2007   #30
-
0
-

Diky moc,za ten program,v dev se mi to rozjelo v pohode,bez problemu,doplnil sem jeste hlavicky jak minule a funguje to,Ale ted jsem zjistil ze krom knihoven stdlib.h,stdio.h,string.h muze byt jen povoleny stdarg.h,takze ctype.h tam nemuzu dat,kdyz to napisu.Dale nam jeste rikal taky brzo ze to ma byt reseno portabilním způsobem coz nevim co znamena a dle standardu jazyka C.

Nahlásit jako SPAM
IP: ...–
Peter D.0
Expert
9. 5. 2007   #31
-
0
-

jura klobuk dole. :)

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
survik1
~ Moderátor
0
Posthunter
9. 5. 2007   #32
-
0
-

Jánevím, ale když něco neumím, nenechám si to dělat od nikoho jinýho. Jen si nechat poradit funkci, parametry si najdu na netu. Takhle dostaneš jedničku a co z toho. Až budete mít tohle v testu, budeš v prdeli. Lepší je mít trojku a tvůj učitel bude vědět, že líp to nezvládneš, než dostat jedničku a pak tvího profesora nasrat. Tož můj dojem

Nahlásit jako SPAM
IP: ...–
Život je jen hra, která se nedá vyhrát.
Jura
~ Anonymní uživatel
637 příspěvků
9. 5. 2007   #33
-
0
-

To jecmenk:
ctype.h je tam jen kvuli fce isdigit ->
#include <ctype.h> nahrad zapisem:



int isdigit(int c) {return c >='0' && c <='9';}

Portabilita : musi byt zajisteno, ze program lze snadno prenest na jine platformy(Win, *unix a spousta dalsich podminek), tzn. pokusit se co nejvice pouzivat fce, typy, atd.. definovane standardem jazyka C. Tohle se snazim dodrzet vzdy(pokud to jde), takze zde by problem byt nemusel. Kazdopadne, pokud mas moznost program zkompilovat treba na Linuxu, tak to udelej a over funkcnost kodu.

To survik1:
Ackoliv se to muze zdat zvlastni s tvym nazorem, jako autor kodu, souhlasim. Pokud se ptas proc jsem to napsal za nej, tak na to existuje jedina odpoved: problem me zaujal. Samozrejme muzes tvrdit, ze jsem si to mel nechat pro sebe. Ale druha stranka veci je ta, ze to nekdo muze pouzit jako inspiraci(od toho tu fora jsou). Dale take netvrdim, ze je to napsano dobre(profik by urcite vymyslel neco mnohem lepsiho). Nicmene tohle vsechno, jak jsi napsal sam, stejne jecmenkovi nepomuze pokud si jej ucitel proklepne...


Nahlásit jako SPAM
IP: ...–
Honza0
Newbie
9. 5. 2007   #34
-
0
-

Aha tak to jo,ja myslel ze to znamena,ze to ma byt nejak jinak napsany.Sem to ukazoval jednymu ucitelovi,tem n mi rikal ze postup je dobrej,ale ze se tam pouziva dost prvku C++,melo by to byt proste jen v C.Tak ja nevim,najit si nekde na internetu treba cim to zamenit,co je prvek C++ a nejak to udelat aby to vse bylo v C.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
10. 5. 2007   #35
-
0
-

To jecmenk:

Prvku z C++? Ani jedna radka kodu neni napsana v C++, cele jsem to psal v cistem C. Mozna se mu akorat nelibi ty inline kometare,tak je nahrad klasickymi cekovskymi komentari. Nicmene norma C99 myslim dovoluje psat inline komentare komentare.


6.4.9 Comments
1 Except within a character constant, a string literal, or a comment, the characters /*
introduce a comment. The contents of such a comment are examined only to identify
multibyte characters and to find the characters */ that terminate it.69)

2 Except within a character constant, a string literal, or a comment, the characters //
introduce a comment that includes all multibyte characters up to, but not including, the
next new-line character
. The contents of such a comment are examined only to identify
multibyte characters and to find the terminating new-line character.
3 EXAMPLE
"a//b" // four-character string literal
#include "//e" // undefined behavior
// */ // comment, not syntax error
f = g/**//h; // equivalent tof = g / h;
//\
i(); // part of a two-line comment
/\
/ j(); // part of a two-line comment
#define glue(x,y) x##y
glue(/,/) k(); // syntax error, not comment
/*//*/ l(); // equivalent to l();
m = n//**/o
+ p; // equivalent tom = n + p;

69)Thus, /* ... */ comments do not nest.

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
11. 5. 2007   #36
-
0
-

Teda tenhle topic sleduju uz od minulýho tejdne a docela zajímavý :) ... Jura sis s tim dal práci koukám, docela dobrej kousek kódu. Tak tě nebudu už zatěžovat zbytečnejma otázkama, jen se chci zeptat wo co go ... Myslím podstatu zadání. "Zjednodušená implementace funkce sprintf" je na co ? To je jako napsání jiné funkce, která dělá přesně to samý jako sprintf ?

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
11. 5. 2007   #37
-
0
-

vollf82 píše:
To je jako napsání jiné funkce, která dělá přesně to samý jako sprintf ?


Jj, tak nejak, ale o mnohem horsi.

"Zjednodušená implementace funkce sprintf" je na co ?


Za normalnich okolnosti je zkratka....na hovno. Ale vzhledem k tomu, ze je to domaci ukol, tak se tomu ani tak moc nedivim(existui i horsi zadani).

Nahlásit jako SPAM
IP: ...–
tomas
~ Anonymní uživatel
560 příspěvků
11. 5. 2007   #38
-
0
-

Jura:ahoj mi mame taky stejnej priklad do skoly,pouzil jsem tvuj kod.Posilam to pres automat,kde se odesila jen vlastni funkce bez includ a int main,v tom automate u ucitela se to k ty vlastni funkci samo doplni ten zbytek.Kdyz to tam poslu tak to pise ze to nelze prelozit a vypise se to s timhle protokolem o chybach :



Protokol
auto_check
test.c: In function 'GetState':
test.c:23: error: syntax error before '/' token
cc1: warnings being treated as errors
test.c:24: warning: control reaches end of non-void function
test.c: At top level:
test.c:25: error: syntax error before 'if'
test.c:54: warning: ISO C does not allow extra ';' outside of a function
test.c: In function 'Change':
test.c:60: warning: ISO C90 forbids mixed declarations and code
test.c: In function 'Sprintf':
test.c:75: warning: ISO C90 forbids mixed declarations and code
test.c:83: warning: implicit declaration of function 'isdigit'
test.c:93: error: syntax error before '/' token
test.c:93:98: error: invalid suffix "x" on integer constant
test.c:93:106: error: invalid suffix "x" on integer constant
test.c:95: warning: ISO C90 forbids mixed declarations and code
test.c:97: warning: implicit declaration of function 'strlen'
test.c:97: warning: incompatible implicit declaration of built-in function 'strlen'
test.c:99: error: 's' undeclared (first use in this function)
test.c:99: error: (Each undeclared identifier is reported only once
test.c:99: error: for each function it appears in.)
test.c:99: error: syntax error before '/' token
test.c:105: error: 'num' undeclared (first use in this function)
test.c:108: error: syntax error before '/' token
test.c:110: warning: implicit declaration of function 'abs'
test.c:76: warning: unused variable 'start'
test.c:113: warning: control reaches end of non-void function
test.c: At top level:
test.c:114: error: syntax error before 'else'
test.c:116: error: syntax error before numeric constant
test.c:116: warning: type defaults to 'int' in declaration of 'Change'
test.c:116: error: conflicting types for 'Change'
test.c:59: error: previous definition of 'Change' was here
test.c:116: warning: data definition has no type or storage class
test.c:121: error: syntax error before numeric constant
test.c:121: warning: type defaults to 'int' in declaration of 'Change'
test.c:121: error: conflicting types for 'Change'
test.c:59: error: previous definition of 'Change' was here
test.c:121: warning: data definition has no type or storage class
test.c:136: warning: type defaults to 'int' in declaration of 'str'
test.c:136: warning: data definition has no type or storage class
test.c:137: warning: type defaults to 'int' in declaration of '__builtin_va_end' test.c:137: warning: parameter names (without types) in function declaration test.c:137: warning: conflicting types for built-in function '__builtin_va_end' test.c:137: warning: data definition has no type or storage class test.c:138: error: syntax error before 'return' test.c:142: warning: second argument of 'main' should be 'char **' test.c: In function 'main': test.c:144: warning: implicit declaration of function 'printf' test.c:144: warning: incompatible implicit declaration of built-in function 'printf' test.c:159: warning: implicit declaration of function 'getchar' test.c:160: warning: implicit declaration of function 'system' test.c: At top level: test.c:188: warning: second argument of 'main' should be 'char **' test.c:188: error: redefinition of 'main' test.c:142: error: previous definition of 'main' was here test.c: In function 'main': test.c:188: error: number of arguments doesn't match prototype test.c:142: error: prototype declaration --- gcc-4.0 --- ! Chyba test.c: In function `GetState': test.c:23: parse error before `/' cc1: warnings being treated as errors test.c:24: warning: control reaches end of non-void function test.c: At top level: test.c:25: parse error before `if' test.c:54: warning: ANSI C does not allow extra `;' outside of a function test.c: In function `Change': test.c:60: parse error before `char' test.c:62: `i' undeclared (first use in this function) test.c:62: (Each undeclared identifier is reported only once test.c:62: for each function it appears in.) test.c:63: `t' undeclared (first use in this function) test.c:64: `buf' undeclared (first use in this function) test.c:62: warning: value computed is not used test.c: In function `Sprintf': test.c:75: parse error before `char' test.c:79: `pch' undeclared (first use in this function) test.c:83: warning: implicit declaration of function `isdigit' test.c:93: parse error before `/' test.c:93: numeric constant with no digits test.c:93: numeric constant with no digits test.c:95: parse error before `void' test.c:96: `temp' undeclared (first use in this function) test.c:96: `p' undeclared (first use in this function) test.c:97: `i' undeclared (first use in this function) test.c:99: `s' undeclared (first use in this function) test.c:99: parse error before `/' test.c:105: `num' undeclared (first use in this function) test.c:108: parse error before `/' test.c:113: warning: control reaches end of non-void function test.c: At top level: test.c:114: parse error before `else' test.c:116: parse error before `8' test.c:116: warning: type defaults to `int' in declaration of `Change' test.c:116: conflicting types for `Change' test.c:59: previous declaration of `Change' test.c:116: ANSI C forbids data definition with no type or storage class test.c:121: parse error before `16' test.c:121: warning: type defaults to `int' in declaration of `Change' test.c:121: ANSI C forbids data definition with no type or storage class test.c:136: warning: type defaults to `int' in declaration of `str' test.c:136: ANSI C forbids data definition with no type or storage class test.c:137: parse error before `void' test.c:142: warning: second argument of `main' should be `char **' test.c: In function `main': test.c:144: warning: implicit declaration of function `printf' test.c:159: warning: implicit declaration of function `getchar' test.c:160: warning: implicit declaration of function `system' In file included from test.c:167: /usr/include/stdio.h: At top level: /usr/include/stdio.h:327: warning: type mismatch with previous implicit declaration test.c:144: warning: previous implicit declaration of `printf' test.c:188: warning: second argument of `main' should be `char **' test.c:188: redefinition of `main' test.c:142: `main' previously defined here test.c: In function `main': test.c:188: number of arguments doesn't match prototype test.c:142: prototype declaration --- gcc-2.95 --- ! Chyba

Nevis co s tim,bo popride jak to upravit

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
11. 5. 2007   #39
-
0
-

To tomas:
Vzhledem k tomu, že o tom automatu v podstatě nic nevím, tak se mi těžko bude radit. Sice jsem už o tomhle automatu v jiných diskuzích něco četl a je docela možné, že potřebuje všechno mit deklarované lokálně - čili žádné pomocné fce(nevím to jasně, v zadání to blíže specifikováno nebylo). Jediné co mě z toho výpisu chyb napadá: zkus smazat veškeré komentáře, dále veškeré _deklarace_ proměnných dej před cyklus for(;*pch;) a doplň fci isdigit(příklad je o pár postů výše). A v případě, že máš v zadání zakázáno používat další pomocné fce, tak si to předělej sám do jedné, obrovské a nepřehledné funkce.

Nahlásit jako SPAM
IP: ...–
tomas
~ Anonymní uživatel
560 příspěvků
12. 5. 2007   #40
-
0
-

To Jura_:Mas pravdu tak nejak to pracuje,zda se me ze ucitel rikal ze to ma byt lokalne.Komentare sem smazal, fci isdigit sem taky doplnil akorat nechapu jak myslis-dále veškeré _deklarace_ proměnných dej před cyklus for(;*pch;) a pak-všechno mit deklarované lokálně - čili žádné pomocné fce .Zadani mam stejny v tom problem nevidim.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
12. 5. 2007   #41
-
0
-

To tomas:
Jak jsem už jednou napsal - pokud učitel vyžaduje použití jen lokálních deklarací, budeš muset předělat veškeré pomocné datové typy(enum) a funkce, tak aby byly součástí funkce Sprintf. A protože C není Pascal, vznikne ti z toho jedna obrovská a nepehledná funkce. Takovou prasečinu dělat nebudu. A tim veškeré _deklarace_ proměnných dej před cyklus for(;*pch;) jsem myslel presunutí deklarcí(int len; int s; long num...), které se necházejí v těle cyklu, před ten cyklus. Toť vše.
Už mě to přestává bavit, takže s tímto topicem končím.

Nahlásit jako SPAM
IP: ...–
tomas
~ Anonymní uživatel
560 příspěvků
13. 5. 2007   #42
-
0
-

No to mas pravdu,kdyz se to vsechno naseka do funkce sprintf,tak to bude jak rikas velka neprehledna funkce,to se ani cloveku nechce delat,uz to tak bylo i s jednim prikaldem s kterym jsem delal.Chjo to neudelam.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
13. 5. 2007   #43
-
0
-

To tomas:
Pokud jsi už něco naprogramoval, tak by neměl být problém nahradit volání funkcí jejich kódem. Když si budeš říkat, že to neuděláš, tak ti zaručeně nepůjde a daleko takhle nedojdeš. Takže zkus bojovat a uvidíš, že se to poddá - stačí trochu popřemýšlet nad tím kódem.

Nahlásit jako SPAM
IP: ...–
tomas
~ Anonymní uživatel
560 příspěvků
15. 5. 2007   #44
-
0
-

No neco jo,ale to byly daleko lehci ukoly.Tohle je fakt masakr.No zkusim co se da,ale nevypada to nadejne,ale nadeje umira posledni.

Nahlásit jako SPAM
IP: ...–
JitkaV6
~ Anonymní uživatel
19 příspěvků
19. 5. 2007   #45
-
0
-

To Jura:ahojky tak sem ten program z builderu co si mi poslal vyladila tak ze mi to hazi jen chybu u radku



{ n = (s & efUnsDec)?num:abs(num);

pry ze je to vnorena funkce a ta se musi rozepsat nevis jak na to prosimte a pak jeste jedna a to
'NULL' undeclared (first use in this function)
uz mi na to psal Maaartin neco,ale tak to podle me nema byt

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
19. 5. 2007   #46
-
0
-

NULL nahradte 0, tot vse. Nebo jestli muzete pouzit makra tak piste pod hlavickove soubory:

#define NULL 0


ohledne
n = (s & efUnsDec)?num:abs(num);

by melo stacit (pisu z hlavy nevyzkouseno)


if(s & efUnsDec)
n = num;
else
n = abs(num);


ad builder: nic si z toho nedelejte, holt tamni kapacity trosku vypenili i ja sem cumel co ze to tam pisou, normalne se takhle nechovaj, tak ne ze na ten server zanevrete ;-)

zatial

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
JitkaV6
~ Anonymní uživatel
19 příspěvků
19. 5. 2007   #47
-
0
-

to zacatecnik:Ahojky dekuju ti,stacilo jen dat tam nulu a uz to automatem proslo,ale jak si mi napsal,to rozepsani toho abs tak to nepomohlo porad to vypisuje 104: warning: implicit declaration of function 'abs'
To vis ze ne,me to taky prekvapilo,no asi se jim nelibilo,jak su blba a porad se vyptavam a zahlcuju forum svymi prispevky

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
19. 5. 2007   #48
-
0
-

pokud tomu dobre rozumim je treba prepsat makro abs protoze nemuze byt volano (je v math.h tusim a to neni povoleno)
tak sem se zamyslel a napadlo me tohle:

#include <stdio.h>

//#include <math.h>


int main (void)
{
int cislo = -850;
printf("cislo=%d\n", cislo);
if(cislo<0)
cislo-=2*cislo;
printf("cislo=%d\n", cislo);

return 0;
};


takze onen Vas kod by mozna prosel uz takhle:
if(s & efUnsDec)

n = num;
else{
if(num < 0)
num-=2*num;

n = num;
}


nebo mozna takto:
if(!(s & efUnsDec))

if(num < 0)
num-=2*num;

n = num;




jeste ad builder: neni to otravovani hlouposti- ucenej z nebe nespad, kolikrat uz sem videl tyhle dva mistry odpovidat stokrat na ten samej zacatecnickej dotaz a nikdy nic nerekli, zavidel sem jim jejich trpelivost to ja bych uz rval a co hledani ?? !!
mno a ted tohle...proste rupli nervy :)


zatial

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
Jura_0
Stálý člen
19. 5. 2007   #49
-
0
-

To zacatecnik:

cislo-=2*cislo;

Nějak jsem nepobral to násobení dvěma. K čemu to je dobré?
Když už to chces násobit, tak snad -1,aby jsi nezměnil hodnotu čísla.
Nicméně vůbec nemusíš používat násobení, stačí použí operátor minus.



n = (s & efUnsDec)?num : ( num < 0) ? - num : num;

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
19. 5. 2007   #50
-
0
-

to Jura:
mno mas tam ukazku kde ten vzorec pouzivam a i pri zamysleni je bezchybny
i kdyz to minuslze taky pouzit, ale zapis:

n = (s & efUnsDec)?num : ( num <  0) ? - num : num;

?: je neprijatelny kvuli onomu automatu.

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
Jura_0
Stálý člen
19. 5. 2007   #51
-
0
-

To zacatecnik:
Ale já pořád nechápu proč to násobíš -2?
Budu mít číslo -6, pak podle tebe dostanu 12, jenže :



| -6 | = 6 a ne 12

Jednoduše platí:


|a| = a , kde a > 0
|a| = -a, kde a < 0


Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
19. 5. 2007   #52
-
0
-

moc nechapu co ty nechapes, nenasobi se to -2 ale odecita se dvojnasobna hodnota cisla

cili cislo = -850
cislo -=2*cislo;
lze prepsat:
cislo = cislo - (2*cislo);
takze
-850 = (-850) - (2*-850)
-- udela plus a my dostavame +850

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
Jura_0
Stálý člen
19. 5. 2007   #53
-
0
-

Kua, asi už na ten monitor nevidím. Sorry, já tam celou dobu viděl -2, už mám dost. Jinak by mě docela zajímalo, kda jsi zjistil, že nefunguje ternární operátor?
Tedy v případě, že prošlo:



if(s & efShort) num = (s & efUnsDec)?(unsigned short)num:(short)num;
//atd..

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
19. 5. 2007   #54
-
0
-

netusim, hadam dle dle odpovedi jitky

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
JitkaV6
~ Anonymní uživatel
19 příspěvků
19. 5. 2007   #55
-
0
-

Ahojky tak jsem to pozmenila na



if(!(s & efUnsDec))
if(num < 0)
num-=2*num;
n = num;

a uz mi to proslo,dekuju vam kluci,ale asi je nekde chybka,nikde to nic nic nevypisuje kde jen toto


--- gcc-4.0 prelozeno ---
--- gcc-2.95 prelozeno ---

--- protokol "./test.2.bin" ---

50: "-83178272, -83178272, 4211789024, 037302546340, 0x" (58: "-83178272, -83178272, 4211789024, 037302546340, 0xfb0acce0")
130: "-32, 224, -13088, 52448, -83178272, 4211789024, -83178272, 4211789024 32, 32, 13088, 13088, 83178272, 83178272, 83178272, 83178272" (130: "-32, 224, -13088, 52448, -83178272, 4211789024, -83178272, 4211789024 32, 32, 13088, 13088, 83178272, 83178272, 83178272, 83178272")
28: "@, "Chrchly Chrchly", 64, 0x" (36: "@, "Chrchly Chrchly", 64, 0xbf82e904")

! Chyba: 1
---
--- protokol "./test.1.bin" ---

50: "-83178272, -83178272, 4211789024, 037302546340, 0x" (58: "-83178272, -83178272, 4211789024, 037302546340, 0xfb0acce0")
130: "-32, 224, -13088, 52448, -83178272, 4211789024, -83178272, 4211789024 32, 32, 13088, 13088, 83178272, 83178272, 83178272, 83178272" (130: "-32, 224, -13088, 52448, -83178272, 4211789024, -83178272, 4211789024 32, 32, 13088, 13088, 83178272, 83178272, 83178272, 83178272")
28: "@, "Chrchly Chrchly", 64, 0x" (36: "@, "Chrchly Chrchly", 64, 0xbfa90b58")

! Chyba: 1
---


to by me zajimalo co to jako znamena,se asi pudu zeptat ucitela,nebo nekoho kdo to uz poslat ,jestli se jim to taky objevovalo

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
19. 5. 2007   #56
-
0
-

No jeste teda kdyz sem se divala co to vypisuju kdyz to maji spraven ostatni tak jim to vypisuje tohle



--- gcc-4.0 prelozeno ---
--- gcc-2.95 prelozeno ---


--- protokol "./test.1.bin" ---

58: "-87279040, -87279040, 4207688256, 037263035100, 0xfacc3a40" (58: "-87279040, -87279040, 4207688256, 037263035100, 0xfacc3a40")
130: "64, 64, 14912, 14912, -87279040, 4207688256, -87279040, 4207688256 -64, 192, -14912, 50624, 87279040, 87279040, 87279040, 87279040" (130: "64, 64, 14912, 14912, -87279040, 4207688256, -87279040, 4207688256 -64, 192, -14912, 50624, 87279040, 87279040, 87279040, 87279040")
36: "`, "Chrchly Chrchly", 96, 0xbfc80638" (36: "`, "Chrchly Chrchly", 96, 0xbfc80638")
---

--- protokol "./test.2.bin" ---

58: "-87279040, -87279040, 4207688256, 037263035100, 0xfacc3a40" (58: "-87279040, -87279040, 4207688256, 037263035100, 0xfacc3a40")
130: "64, 64, 14912, 14912, -87279040, 4207688256, -87279040, 4207688256 -64, 192, -14912, 50624, 87279040, 87279040, 87279040, 87279040" (130: "64, 64, 14912, 14912, -87279040, 4207688256, -87279040, 4207688256 -64, 192, -14912, 50624, 87279040, 87279040, 87279040, 87279040")
36: "`, "Chrchly Chrchly", 96, 0xbff40104" (36: "`, "Chrchly Chrchly", 96, 0xbff40104")
---

jestli je neco blbe zadanyho

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
19. 5. 2007   #57
-
0
-

To jitkaV6:
Tohle je blbost:



if(!(s & efUnsDec))
if(num < 0)
num-=2*num;
n = num;

Takže já bych to přepsal asi nějak takhle.


if(s & efUnsDec)
n = num;
else{
if(num < 0)
n = -num;
else
n = num;
}

Ale nechce se mi věřit, že to nevezme ternární operátor:


n = (s & efUnsDec)?num : ( num < 0) ? -num : num;

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
20. 5. 2007   #58
-
0
-

Takze ten ternarni operator taky proslo,jak i to co si mi napsal predtim,ale stejen to porad hazi to viz.nahore,to nechapu

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
20. 5. 2007   #59
-
0
-

budes muset za ucitelem a promluvit si proc to ten automat nebere, my uz ti pomuzeme asi tezko. Ale mozna az to s ucitelem budete probirat se ukaze ze nejsi autorka kodu, kdyz ti polozi nakou otazku, tak si zkus ten zdrojak poradne nastudovat

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
jitkaV6
~ Anonymní uživatel
19 příspěvků
21. 5. 2007   #60
-
0
-

Tak jsem to zjistila,ten program se prelozi,ale je chybny algortitmus.To se asi musi cely prekopat,kldyz je blbej algoritmus nebo ne

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
21. 5. 2007   #61
-
0
-

To jitkaV6:
Mno, vždy není potřeba překopávat celý algoritmus. Já to psal jednak podle zadání, ale taky jsem to _hlavně_ porovnával s funkcí sprintf, která je definována ve standardu. Možná by taky bylo vhodné napsat, v čem se to liší od ostatních řešení(uveď, jak by měl vypadat správný výstup pro jednotlivé možnosti).

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
23. 5. 2007   #62
-
0
-

To Jura_:
A nevis teda jak by to melo vypadat.

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
23. 5. 2007   #63
-
0
-

ne to se musis zeptat ucitele. capni laptop a ukaz mu ze tve reseni funguje a on bude muset uznat ze je chyba v automatu nebo ti ukaze jak to prekopat

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
jitkaV6
~ Anonymní uživatel
19 příspěvků
23. 5. 2007   #64
-
0
-

Tak jsem za nim dneska byla a ukazala mu to.Nerekl jak to mam spravit,jem mi rekl at se snazim dal doladit tak aby to proslo.No neni ten ucitel blbej:(.A kdzy mu rikam jak na to ze je to funkcni,tak mi na to rekne ze si mam pomoct sama,bo se nekoho zeptat,ze at se potrapim.

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
23. 5. 2007   #65
-
0
-

no tak to je peknej nerad ! sicak jeden, takovejch lidi se s tim trapi a von to pak ani nevezme.
Obavam se ze mas posledni nadeji: najit nekoho kdo to podle Jurova (nebo cele) prepise, tak aby to system vzal. Dorpedu vsak rikam ze si nemyslim ze nekoho takoveho najdes. Je to fakt pech po takovymhle snazeni dostat 4ku nebo myslis ze ti da neco za snahu ?

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
jitkaV6
~ Anonymní uživatel
19 příspěvků
23. 5. 2007   #66
-
0
-

To je:(,me to tak stve,ani nevis jaka tolik lidi mi pomohlo.No to nevim jako,vazne ne,u neho nikdo nikdy nevi.POdivej mz poslal kamarad svuj kod co mu to proslo,je to tenhle:



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

int Sprintf(char *str, const char *format, ...)
{
int index_str, index_format, delka, emergency, integer;
unsigned int unsigned_integer, unsigned_kopie;
char* buffer;
char big[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char small[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};


#define CONVERSION(soustava)\
for(index_str++, unsigned_kopie=unsigned_integer; (unsigned_kopie/=(soustava)); index_str++);\
for(delka = 1, unsigned_kopie=unsigned_integer; unsigned_kopie>0; unsigned_kopie/=(soustava)){\
if(format[index_format]=='X') str[index_str-(delka++)] = big[unsigned_kopie%(soustava)];\
else str[index_str-(delka++)] = small[unsigned_kopie%(soustava)];}

va_list argument;
va_start(argument, format);

for(index_str=0, index_format=0; format[index_format]!='\0'; index_format++) {
/* pokud jde o normalni znak (ne %) zkopiruj do str*/
if(format[index_format]!='%') str[index_str++] = format[index_format];

else if(format[index_format]=='%') {

/* format hh, signed or unsigned char */
if((format[index_format+1]=='h')&&(format[index_format+2]=='h')) {
integer = va_arg(argument, int);
if((integer<0)&&(format[index_format+3]!='u')) integer = (signed char)integer;
else integer = (unsigned char)integer;
index_format+=2;
}

/* format h, short or unsigned int */
else if((format[index_format+1]=='h')&&(format[index_format+2]!='h')) {
integer = va_arg(argument, int);
if((integer<0)&&(format[index_format+2]!='u')) integer = (signed short int)integer;
else integer = (unsigned short int)integer;
index_format++;
}

/* format l, long or unsigned long int */
else if(format[index_format+1]=='l') {
integer = va_arg(argument, int);
if((integer<0)&&(format[index_format+2]!='u')) integer = (signed long int)integer;
else integer = (unsigned long int)integer;
index_format++;
}

/* konverze */
switch(format[index_format+1]) {
case 'd':
case 'i': if(format[index_format]=='%') integer = va_arg(argument, int);
index_format++;

if(integer<0) {
str[index_str++]='-';
integer=0-integer; /* zmena na kladne cislo */
}

for(index_str++, emergency=integer; (emergency/=10); index_str++);
for(delka = 1, emergency=integer; emergency>0; emergency/=10) {
str[index_str-(delka++)] = small[emergency%10];
}

break;

case 'u': if(format[index_format]=='%') unsigned_integer=(unsigned int)va_arg(argument,int);
else unsigned_integer=integer;
index_format++;

for(delka=1, unsigned_kopie=unsigned_integer; (unsigned_kopie/=10); delka++, index_str++);

for(emergency=0, unsigned_kopie=unsigned_integer; emergency!=delka; emergency++, unsigned_kopie/=10) {
str[index_str-emergency]=small[unsigned_kopie%10];
}

index_str++;
break;

case 'x':
case 'X':
case 'o': if(format[index_format]=='%') unsigned_integer=(unsigned int)va_arg(argument,int);
else unsigned_integer=integer;
index_format++;

/* převod do osmickove soustavy */
if(format[index_format]=='o') {CONVERSION(8)}

/* převod na sesnactkove soustavy */
if((format[index_format]=='x')||(format[index_format]=='X')) {CONVERSION(16)}
break;

case 'c': integer = (unsigned char)va_arg(argument, int);
index_format++;

str[index_str] = integer;
index_str++;
break;

case 's': buffer = (char*)va_arg(argument, const char*);
for(emergency=0; buffer[emergency]!='\0'; emergency++) str[index_str++] = buffer[emergency];
index_format++;
break;

case 'p': unsigned_integer = (unsigned int)va_arg(argument, void*);
index_format++;

str[index_str++]='0';
str[index_str++]='x';

CONVERSION(16)
break;

case '%': str[index_str++] = '%';
index_format+=2;
break;

}
}
}

va_end(argument);
str[index_str]='\0';

return index_str;
}


/* testovani funkce */
int main(int argc, char *argv[])
{
char test;
Sprintf(&test, "%u", 3078079126);
printf("%s ", &test);

system("PAUSE");
return 0;
}


tohle mu tim automatem bez problemu proslo,ja nevim jestli to mam udelat nejak tak jak on,ja uz vazne nevim.

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
28. 5. 2007   #67
-
0
-

Nepomohl by mi s tim nekdo jak na to,jestli je tam nekde jen chyba,nebo jestli by mi nekdo nepomohl s jinym algoritmem

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
28. 5. 2007   #68
-
0
-

Tak tohle mi napsal kamarad:



Jinak chyba 1 představuje chybu ve výsledku, prostě ti ta funkce vypisuje špatný výsledky.
Podle výsledku je chyba na 100% ve výpisu void pointeru, v převodu do různých soustav
(tam se ti výsledky nevypisují vůbec), ve výpisu charu do řetězce (ten se taky vůbec nevypisuje).
Jinak některý čísla se ti převádí špatně, protože nesouhlasí s výsledkem.

nevite nekdo co stim.
jeste teda,kdo by mi s tim pomohl poslu svuj zdrojovy kod.

Nahlásit jako SPAM
IP: ...–
Jura_
~ Anonymní uživatel
236 příspěvků
28. 5. 2007   #69
-
0
-

Poslušně hlasím, že jsem testoval výstup s programem, který jsi zde uvedla(od tvého kamaráda) s výstupem Sprintf, který jsem dal na builder.cz a žádný rozdíl jsem nepozoroval. Takže chyba bude patrně v nějaké úpravě, kterou jsi provedla. A bez zdrojáku, ti nikdo neporadí.

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
29. 5. 2007   #70
-
0
-

To Jura_:tak tady je ten zdrojak:



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

enum
{ eNone = 0x00, efShort = 0x02, efLong = 0x04,
efChar = 0x08, eInt = 0x10, eString = 0x20,
efUnsDec = 0x40, eChar = 0x80, eOctal = 0x200,
eHexa = 0x400, eBigHexa = 0x800, ePointer = 0x1000
};
int Sprintf(char *str, const char *format, ...)
{

va_list l;
char * pch = (char*)format, *p1, *p2;
char* start = str;
char temp[128];
long num;
unsigned long n;
int i, t, s, len = 0;

if(str == 0) return -1;
va_start(l, format);
for (;*pch;)
{ if(*pch == '%')
{ for(pch = pch +1;*pch >= '0' && *pch<='9'; )
len = len * 10 + *pch++ - '0';
s = eNone;
if(*pch == 'l'){ s = efLong; pch ++;}
if(*pch == 'h'){ s = efShort; pch ++;}
if(s == efShort && *pch == 'h'){ s = efChar; pch ++;}
switch(*pch)
{
case 'i':
case 'd': s |= eInt; pch ++; break;
case 's': s = eString;pch ++; break;
case 'u': s |= efUnsDec;pch ++; break;
case 'c': s = eChar; pch ++; break;
case 'o': s |= eOctal;pch++; break;
case 'x': s |= eHexa;pch++; break;
case 'X': s |= eBigHexa;pch++;break;
case 'p': s = ePointer;pch++; break;
};

if(s == eNone) *str++ = *pch++;
else if(s == eString)
{ p1 = va_arg(l,char*);
for(p2=p1;*p2; ++p2, ++str)
{ if(len && (p2-p1) >= len) break;
*str = *p2;
}
}
else if(s == ePointer)
{ *str++ ='0';*str++ = 'x';
num = (long)va_arg(l, void*);
for(i=0; num > 0;num /= 16, ++i)
{ t = num % 16;
if(t > 9) { t %= 10; temp[i] = 'a'+t;}
else temp[i] = t + '0';
}
for(;i > 0;) *str++ = temp[--i];
}
else if(s == eChar)
{ *str++ = (unsigned char)va_arg(l, int);
}
else {
num = va_arg(l, long);
if(s & efShort) num = (s & efUnsDec)?(unsigned short)num:(short)num;
else if(s & efChar) num = (s & efUnsDec)?(unsigned char)num:(char)num;

if(s & eInt)
{ num = (int)num;

n = num < 0 ? -num : num;
if(num < 0) *str++ = '-';
for(i=0; n > 0; n /= 10, ++i)
temp[i] = n % 10 + '0';

}
else if(s & eOctal)
{ num = (unsigned int)num;
n = num;
for(i=0; n > 0; n /= 8, ++i)
temp[i] = n % 8 + '0';
}
else if((s & eHexa)||(s & eBigHexa))
{ num = (unsigned int)num;
for(i=0; num > 0;num /= 16, ++i)
{ t = num % 16;
if(t > 9) { t %= 10; temp[i] = (s & eBigHexa)?'A'+t:'a'+t;}
else temp[i] = t + '0';
}
}
else

{
if(s & efUnsDec)n = num;
else{
if(num < 0)
n = -num;
else
n = num;
}
if(num < 0 && !(s & efUnsDec)) *str++ = '-';
for(i=0; n > 0; n /= 10, ++i)
temp[i] = n % 10 + '0';
}
for(;i > 0; ) *str++ = temp[--i];
}
}
else
*str++ = *pch++;
}
*str = '\0';
va_end(l);
return str - start;
}
int main(int argc, char** argv[])
{ char buf[512];
int len = Sprintf(buf, "%d-%d=%d", -1, 4, -1-4);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "20%% ze 100 je %d", 100/5);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "-1000 v osmickove soustave je %o", -1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Znak %c nebo %hhc.", 165, 165);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Adresa buf je %p.", buf);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1. dva znaky ze slova %s jsou %2s\n", "Pepiku", "Pepiku");
printf("%sVytisknuto %d znaku.\n", buf, len);
system ("PAUSE");
return 0;
}


tak tohle je ten muj poupraveny kod,ktery mi tim projde.co jsem se divala,tak te n vystup je stejnej

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
30. 5. 2007   #71
-
0
-

Vazne nikdo nevi,nedival se na to nekdo

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
31. 5. 2007   #72
-
0
-

To jitkaV6:
Neví, stále jsi NEUVEDLA, jak má vypadat korektní výstup. Takhle to nikdo neodladí. Jednoduše napiš vstup a výstup.

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
31. 5. 2007   #73
-
0
-

To Jura:To je hrozny,to asi nikdy tim automatem neprojde.Vystup,myslis co to ma vyhazovat,kdyz se to zkompiluje.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
1. 6. 2007   #74
-
0
-

To jitkaV6:
Ano, prostě jednoduše uveď PŘÍKLADY.



Sprintf(buf,"%o", 1000); -->a jeho výstup na obrazovce
Sprintf(buf,"%x", 1000);-->a jeho výstup na obrazovce
// atd

To je to, oč tu běží...

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
4. 6. 2007   #75
-
0
-

To Jura:no vis to my nemame zadany co ma byt na vystupu,mame jen to zadani a z toho se to ma udelat

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
4. 6. 2007   #76
-
0
-

To jitkaV6:
Takhle to nikam nevede. Zkoušel jsem porovnávat výstup programu s progrmam, který jsi tu předvedla a jediný rozdíl jsem pozoroval u znaků(ten Sprintf, co jsme dali do kupy vypisuje presne standardniho sprintf, ten od tvého kámaráda vypisuje nějaké jiné klikyháky). Takže zkus zajít za učitelem, a požádat ho, aby ti napsal nějaký příklad a formát výpisu - že to nemáš podle čeho odladit, když neznáš výstup.

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
5. 6. 2007   #77
-
0
-

To Jura:
takze jsem zjistil ze mi to musi vyhazovtat to co je v zavorkach u toho vypisu



--- gcc-4.0 prelozeno ---
--- gcc-2.95 prelozeno ---


--- protokol "./test.2.bin" ---


44: "-1600454976, -1600454976, , 024046577300, 0x" (62: "-1600454976, -1600454976, 2694512320, 024046577300, 0xa09afec0")
83: "-64, , -320, , -1600454976, , -1600454976, 64, , 320, , 1600454976, , 1600454976, " (136: "-64, 192, -320, 65216, -1600454976, 2694512320, -1600454976, 2694512320 64, 64, 320, 320, 1600454976, 1600454976, 1600454976, 1600454976")
28: " , "Chrchly Chrchly", 32, 0x" (36: " , "Chrchly Chrchly", 32, 0xbff76844")

! Chyba: 1


---

--- protokol "./test.1.bin" ---

44: "-1600454976, -1600454976, , 024046577300, 0x" (62: "-1600454976, -1600454976, 2694512320, 024046577300, 0xa09afec0")
83: "-64, , -320, , -1600454976, , -1600454976, 64, , 320, , 1600454976, , 1600454976, " (136: "-64, 192, -320, 65216, -1600454976, 2694512320, -1600454976, 2694512320 64, 64, 320, 320, 1600454976, 1600454976, 1600454976, 1600454976")
28: " , "Chrchly Chrchly", 32, 0x" (36: " , "Chrchly Chrchly", 32, 0xbf89a168")

! Chyba: 1

---


.A jeste mi rikal ze podle toho co mi to vypisuje je chyba nekde v prevodu na kladne cisla a taky u toho
p The void * pointer -ze je tam ma taky asi chybu ze to nevypisuje co ma.

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
8. 6. 2007   #78
-
0
-

Sem to dneska ten vypis ukazovala kamaradovi a ten mi rikal ze ten pointr uz je dobrej, znaky ze fungují, řetězce taky, ale chyba je ještě pry v číslech někde v hh, h a l.Myslis ze to muze byt tim,ja teda nevim.
Jinal ten pointer jsem uz spravila i ten prevod na kladny cisla,ted uz jen tohle a je to hotovy

Nahlásit jako SPAM
IP: ...–
petr
~ Anonymní uživatel
746 příspěvků
9. 6. 2007   #79
-
0
-

potreboval bych pomoct s timto kodem, ukazateli se tu přiřadí objekt ve volném úložišti, ale několikrát a přece se nemůže ukazateli přiradit více objektů ne ? tak jak to teda prosim funguje ?



// Ukazuje objektově orientovaný přístup k propojeným
// seznamům. Seznam deleguje činnost uzlu. Uzel je
// abstraktní datový typ. Používají se tři typy uzlů:
// uzly hlavy, uzly ocasu a vnitřní uzly. Data
// obsahují pouze vnitřní uzly.
//
// Třída Data je vytvořena, aby sloužila jako objekt
// k uchování v daném propojeném seznamu.
//
// ***********************************************


#include <iostream>
using namespace std;

enum { kJeMensi, kJeVetsi, kJeStejny};

// Třída Data pro vložení propojeného seznamu. Každá
// třída v propojeném seznamu musí podporovat dvě metody:
// Zobrazit (zobrazí hodnotu) a
// Porovnat (vrátí relativní pozici)
class Data
{
public:
Data(int hodnota):mojeHodnota(hodnota){}
~Data(){}
int Porovnat(const Data &);
void Zobrazit() { cout << mojeHodnota << endl; }
private:
int mojeHodnota;
};

// Porovnat se používá k určení, kam do seznamu
// určitý objekt patří.
int Data::Porovnat(const Data & jinaData)
{
if (mojeHodnota < jinaData.mojeHodnota)
return kJeMensi;
if (mojeHodnota > jinaData.mojeHodnota)
return kJeVetsi;
else
return kJeStejny;
}

// Dopředné deklarace
class Uzel;
class UzelHlavy;
class UzelOcasu;
class VnitrniUzel;

// ADT představující objekt uzlu v seznamu
// Každá odvozená třída musí překrýt Vlozit a Zobrazit
class Uzel
{
public:
Uzel(){}
virtual ~Uzel(){}
virtual Uzel * Vlozit(Data * taData)=0;
virtual void Zobrazit() = 0;
private:
};

// Toto je uzel, který obsahuje vlastní objekt
// V tomto případě jde o objekt typu Data
// Uvidíme, jak to učinit obecněji, až si budeme
// povídat o šablonách
class VnitrniUzel: public Uzel
{
public:
VnitrniUzel(Data * taData, Uzel * dalsi);
~VnitrniUzel(){ delete mujDalsi; delete mojeData; }
virtual Uzel * Vlozit(Data * taData);
// Delegovat!
virtual void Zobrazit() { mojeData->Zobrazit(); mujDalsi->Zobrazit();}

private:
Data * mojeData; // samotná data
Uzel * mujDalsi; // ukazuje na další uzel v propojeném seznamu
};

// Konstruktor jenom inicializuje
VnitrniUzel::VnitrniUzel(Data * taData, Uzel * dalsi):
mojeData(taData),mujDalsi(dalsi)
{
}

// Základ celého seznamu
// Když do seznamu vložíte nový objekt,
// předá se uzlu, který určí jeho pozici
// a vloží jej do seznamu
Uzel * VnitrniUzel::Vlozit(Data * taData)
{

// Je ten nový hoch větší nebo menší než já?
int vysledek = mojeData->Porovnat(*taData);


switch(vysledek)
{
// Je li stejný jako já, pak podle konvence patří přede mě
case kJeStejny: // projít dál
case kJeVetsi: // nová data patří přede mě
{
VnitrniUzel * datovyUzel = new VnitrniUzel(taData, this);
return datovyUzel;
}

// Je větší než já, takže jej předáme dalšímu
// uzlu a ponecháme na NĚM, ať se stará.
case kJeMensi:
mujDalsi = mujDalsi->Vlozit(taData);
return this;
}
return this; // naplnit MSC
}


// Uzel ocasu je jen hlídka

class UzelOcasu : public Uzel
{
public:
UzelOcasu(){}
~UzelOcasu(){}
virtual Uzel * Vlozit(Data * taData);
virtual void Zobrazit() { }

private:

};

// Pokud nějaká data přijdou až ke mně, musí se vložit
// přede mě, protože já jsem ocas a za mnou už není NIC.
Uzel * UzelOcasu::Vlozit(Data * taData)
{
VnitrniUzel * datovyUzel = new VnitrniUzel(taData, this);
return datovyUzel;
}

// Uzel hlavy neobsahuje žádná data, jenom
// ukazuje na úplný začátek seznamu
class UzelHlavy : public Uzel
{
public:
UzelHlavy();
~UzelHlavy() { delete mujDalsi; }
virtual Uzel * Vlozit(Data * taData);
virtual void Zobrazit() { mujDalsi->Zobrazit(); }
private:
Uzel * mujDalsi;
};

// Jakmile se vytvoří hlava, vytvoří se
// také ocas.
UzelHlavy::UzelHlavy()
{
mujDalsi = new UzelOcasu;
}

// Před hlavou nic není, takže data
// jen předáme dalšímu uzlu.
Uzel * UzelHlavy::Vlozit(Data * taData)
{
mujDalsi = mujDalsi->Vlozit(taData);
return this;
}

// Mám všechny zásluhy a přitom nic nedělám.
class PropojenySeznam
{
public:
PropojenySeznam();
~PropojenySeznam() { delete mojeHlava; }
void Vlozit(Data * taData);
void ZobrazitVse() { mojeHlava->Zobrazit(); }
private:
UzelHlavy * mojeHlava;
};

// Při zrození vytvořím uzel hlavy.
// Ten vytvoří uzel ocasu, takže
// prázdný seznam ukazuje na hlavu, která
// ukazuje na ocas a mezi nimi nic není.
PropojenySeznam::PropojenySeznam()
{
mojeHlava = new UzelHlavy;
}

// Deleguji, deleguješ, delegujeme
void PropojenySeznam::Vlozit(Data * pData)
{
mojeHlava->Vlozit(pData);
}

// Testovací program
int main()
{
Data * pData;
int hodnota;
PropojenySeznam ps;

// Požádat uživatele a zadání nějakých hodnot
// a vložit je do seznamu.
for (;;)
{
cout << "Jaka hodnota? (konec = 0): ";
cin >> hodnota;
if (!hodnota)
break;
pData = new Data(hodnota);
ps.Vlozit(pData);
}

// Nyní projít seznamem a zobrazit data
ps.ZobrazitVse();
cin.get();
cin.get();
return 0; // ps vypadne z oboru platnosti a je zrušen!
}



tak prosim kdyby nekdo vedel tak at to sem napise, diky

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
9. 6. 2007   #80
-
0
-

Jedná se o jednosměrný spojový seznam(tento konkrétně využívá fiktivní hlavní i koncový uzel). Je to jedna ze tzv. dynamických datových struktur. Každý uzel(u tebe Vnitřní uzel) obsahuje nějaká data(pointer na Data) a ukazatel na další uzel. Díky tomu, že obsahuje tento ukazatel na další prvek, tak můžeš tyto prvky spojovat do řetězce. Jenže je jasné, že si někde musíš pamatovat začátek totoho řetezu(aby jsi se k těm datům nějak dostal), u tebe konkrétně si jej pamamtuješ ve třídě PropojenySeznam. Tahle implementace pochazí tuším z knihy "Naučte se C++ za 21 dní" a úpřímně mně celá tato kniha, tak nějak...zklamala. Implementace je zbytečně složitá pro začatečníka(volba fiktivního hlavního a koncového uzlu podle mého do začátku rozhodně vhodná není), ještě když uvážím, že autor používá látku, kterou ještě neprobral - polymorfismus. Nicméně abych se vrátil k tématu, pokud si to chceš prostudovat, myslím teorii - implemtace není zase tak složitá, tak doporučuju si zkusit něco vyhledat googlem.

Nahlásit jako SPAM
IP: ...–
petr
~ Anonymní uživatel
746 příspěvků
10. 6. 2007   #81
-
0
-

To Jura:ok, díky moc

Nahlásit jako SPAM
IP: ...–
petr
~ Anonymní uživatel
746 příspěvků
10. 6. 2007   #82
-
0
-

prosimtě jště něco. Jaktože se může vytvářet objekt ve volnym úložišti více jak jednou ve smyčce for?



pData = new Data(hodnota);

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
10. 6. 2007   #83
-
0
-

Ono to tak ze začátku jen vypadá, že pData ukazují pořád na ty stejné data v paměti. Ale skutečost je jiná, při každém zavolání operátoru new dochází k NOVÉMU hledání místa v haldě(heap). Tím pádem new alokuje pokaždé na jiném místě, tzn. pokud ti to pomůže,tak pData v každém půchodu cyklu ukazuje na jinou ADRESU. Jen takové doplnění - v C++ ještě existuje tzv.placement(??) new, tomu předáš adresu kam se mají data jakoby alokovat(ve skutečnosti se nealokuje nic), ale to je jen na okraj, rozhodně se tím nemusíš ze začátku zatěžovat. A taková malá poznámka na závěr, určitě nepoužívej označení volné úložiště, myslím, že se to ani nepoužívá, raději dej přednost označení heap(česky halda).

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
10. 6. 2007   #84
-
0
-

Nevite prosim vas nkdo jak spravit tu funkci v tom hh,h a l,aby to bylo spravne,nemohl by se na to nekdo podivat prosim.Dekuji

Nahlásit jako SPAM
IP: ...–
petr
~ Anonymní uživatel
746 příspěvků
10. 6. 2007   #85
-
0
-

To Jura:dobře, dík

Nahlásit jako SPAM
IP: ...–
jitkaV6
~ Anonymní uživatel
19 příspěvků
12. 6. 2007   #86
-
0
-

Nikdo by mi prosim Vas neporadil ten vypis ukazuje:



--- gcc-4.0 prelozeno ---
--- gcc-2.95 prelozeno ---


--- protokol "./test.1.bin" ---


59: "-109725520, -109725520, 4185241776, 0-642443520, 0x-68a4750" (60: "-109725520, -109725520, 4185241776, 037135334260, 0xf975b8b0")
136: "-80, 176, -18256, 47280, -109725520, 4185241776, -109725520, 4185241776 80, 80, 18256, 18256, 109725520, 109725520, 109725520, 109725520" (136: "-80, 176, -18256, 47280, -109725520, 4185241776, -109725520, 4185241776 80, 80, 18256, 18256, 109725520, 109725520, 109725520, 109725520")
36: "0, "Chrchly Chrchly", 48, 0xbf89af28" (36: "0, "Chrchly Chrchly", 48, 0xbf89af28")

! Chyba: 1


---




--- protokol "./test.2.bin" ---


59: "-109725520, -109725520, 4185241776, 0-642443520, 0x-68a4750" (60: "-109725520, -109725520, 4185241776, 037135334260, 0xf975b8b0")
136: "-80, 176, -18256, 47280, -109725520, 4185241776, -109725520, 4185241776 80, 80, 18256, 18256, 109725520, 109725520, 109725520, 109725520" (136: "-80, 176, -18256, 47280, -109725520, 4185241776, -109725520, 4185241776 80, 80, 18256, 18256, 109725520, 109725520, 109725520, 109725520")
36: "0, "Chrchly Chrchly", 48, 0xbfc1c4f4" (36: "0, "Chrchly Chrchly", 48, 0xbfc1c4f4")

! Chyba: 1


---




Chyba je jen na prvnich radcih posledni dve sadach cislic.Kdyz se tohle spravi tak se to uz uzna.Nepodival se na to nekdo prosmi vas,kod tomu rozumi.OCenuji lidi kdo mi s timhle programem pomohli,uz jen proto chci aby to proslo.Moc prosim dekuji.

Nahlásit jako SPAM
IP: ...–
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, 70 hostů

Podobná vlákna

Pomuze nekdo ? — založil Tod

Zahraje nekdo? — založil Jan Malý

Pomuže mi někdo? — založil f.d.

Umi někdo? — založil kesinka839

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ý