Dalsi zahada v C -> Prevod long int na string

Milan B. milan na bastl.sk
Pondělí Červenec 25 23:08:36 CEST 2011


On 25.7.2011 20:54, Michal Gregor wrote:
> Je tam pointer "s". K cemu slouzi na co tam je?
> Staci napsat VystupniRetezec nebo VystupPrevedeneCisloRetezec a na 
> prvni pohled vidim k cemu ta promenna je. Nemusim studovat kod.
>

Prehnanene verbozne nazvy premennych zhorsuju prehladnost.  Vobec to 
neprispieva k vizualnej prehladnosti rogramu, ktora je tiez dolezitym 
prvkom. Viz vas priklad s prevodom (inac tesim sa na long verziu).

Pokial ide o urcenie vyznamu parametrov (hlavne u takychto kratkych 
funkcii), tak to riesi skor  kratkym komentarom v hlavicke funkcie.

Jedno- a dvoj-pismenove premenne sa obvykle pouzivaju ako pomocne 
premenne s lokalnou posobnostou, kde je ich vyznam jasny z kontextu. 
i,j,k su obvykle typu integer, s su retazce, c znaky, f float, ff double 
- to su zvyklosti ustalene za dlhe roky, ciastocne pochadzajuce z cias 
FORTRANu. s ako retazcovy parameter jednoduchych funkcii pre retazcove 
operacie je tiez jednym z takychto zvykov. Pochadza, ak sa nemylim, 
priamo od K&R, kde bol pouzivany snad vo vsetkych prikladoch.

pisat XUmocneneNaDruhou=x*x; namiesto x2=x*x; (hlavne v pripade, ak sa 
x2 pouzije len v dalsich par riadkoch vypoctu) je trochu absurdne.

Ty ucebnicu co pouzivate radsej zahodte.

-m-



> Michal Gregor
>
>
> ----- Original Message ----- From: "Michal Gregor" <a2x1nptda8 na email.cz>
> To: "HW-news" <hw-list na list.hw.cz>
> Sent: Monday, July 25, 2011 8:52 PM
> Subject: Re: Dalsi zahada v C -> Prevod long int na string
>
>
> Ja bych rekl ze je to ukazka toho jak se nemaji psat programy. Je to dost
> neprehledne a tyhle silene zapisy obvykle ne vsechny prekladace sezerou.
> Navic takto zahusteny kod nebude po prekladu kratsi.
>
>
> Michal Gregor
>
>
> ----- Original Message ----- From: "Petr Tošovský" <PetrTos na altopro.cz>
> To: "HW-news" <hw-list na list.hw.cz>
> Sent: Monday, July 25, 2011 7:46 PM
> Subject: Re: Dalsi zahada v C -> Prevod long int na string
>
>
> Mam dotaz k radku
> s[i++] = "0123456789ABCDEF"[n % radix];
> Jestli to dobre chapu, tak na jednom radku definujete pole primym 
> zapisem a
> indexem z polehned vyberete vhodny prvek podle zbytku deleni. To je 
> korektni
> zapis? C znam jen na urovni beznych zakladu. Mate zkusenost jak se to pak
> implemenuje? Neni lepsi mit retezec v datove pameti jako promennou 
> primo? Ma
> to nejake vyhody/nevyhody?
> Diky za peknou ukazku.
>
> Tosa
>
> "Milan B." <milan na bastl.sk> napsal(a):
>
>> On 24.7.2011 11:37, Michal Gregor wrote:
>>> Tak jsem program upravil na funkce itoa() a utoa().
>>> Kompilator ale hlasi chybu. Tyto funkce nezna.
>>> Koukam do navodu - jsou tam.
>>> Divam se do knihoven, nic takoveho tam neni. Ht-Soft je sice napsal
>> do
>>> navodu, ale do knihoven je zapomnel dat.
>>>
>>
>> Netreba z toho robit tragediu. Su to jednoduchucke funkcie a a daju sa
>> spichnut za par minut. Napriklad (vsetko bolo kompilovane a testovane v
>>
>> gcc, kontrola (radix >0 && radix <= 16) je umyselne vynechana):
>>
>> char *utoa(char *s, unsigned n, int radix)
>> {
>>     int i,j;
>>     unsigned char c;
>>
>>     i=0;
>>     do {
>>         s[i++] = "0123456789ABCDEF"[n % radix];
>>     } while ((n /= radix) > 0);
>>
>>     s[i]='\0';
>>
>>     for (j = 0, i--; j<i; i--, j++) {
>>         c = s[i];
>>         s[i] = s[j];
>>         s[j] = c;
>>     }
>>    return s;
>> }
>>
>> char *itoa(char *s,int n, int radix)
>> {
>>     if (n<0) {
>>         s[0]='-';
>>         utoa(s+1,(unsigned)(-n),radix);
>>     } else {
>>         utoa(s,(unsigned)n,radix);
>>    }
>>    return s;
>> }
>>
>> Ak staci len do desiatkovej sustavy, tak sa to moze (bezvyznamne)
>> zjednodusit:
>>
>> char *utoa(char *s, unsigned n)
>> {
>>      int i,j;
>>      unsigned char c;
>>
>>      i=0;
>>      do {
>>          s[i++] = n % 10 + '0';
>>      } while ((n /= 10) > 0);
>>
>>      s[i]='\0';
>>
>>      for (j = 0, i--; j<i; i--, j++) {
>>          c = s[i];
>>          s[i] = s[j];
>>          s[j] = c;
>>      }
>>    return s;
>> }
>>
>> char *itoa(char *s,int n)
>> {
>>     if (n<0) {
>>         s[0]='-';
>>         utoa(s+1,(unsigned)(-n));
>>     } else {
>>         utoa(s,(unsigned)n);
>>    }
>>    return s;
>> }
>>
>> Poznamka pre uplnost: takato itoa nefunguje s najzapornejsim cislom pre
>>
>> rozsah int, pretoze napr. pri 16-bitovom int  pre najzapornejsie cislo
>> -32768  neexistuje kladne 32768 (max. je 32767).
>>
>> Napriklad pre 16-bitovy integer by bolo vhodne osetrenie trebars takto
>> (vo funkcii itoa):
>>
>> if (n==-32768) {
>>   strcpy(s,"-32768");
>> } else {
>> ...
>> }
>>
>> utoa je v poriadku pre cely rozsah.
>>
>> -m-
>



Další informace o konferenci Hw-list