[C] Převod čísel
Moderátor: Moderátoři
[C] Převod čísel
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
- x musí být long int
- c je int, ale první parametr strtol() musí být typu const char *
- c není inicializované
- b je dle promptu převáděné číslo, ale používáte to v převodu do cílové soustavy jako její základ
- jako převáděné číslo máte v strtol() c, které není načteno
- Prevod se nikde nepoužívá
Začni logicky používat podmínky a zruš psaní dlouhých keců na obrazovku, když stačí napsat jen "špatně" a opakovat zápis nebo při dobrém vstupu až potom pokračovat v dalším zápisu. Jako první bys měl dát vědět, kterou klávesou se dá vyskočit z programu.
Kód: Vybrat vše
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
int baseFrom, baseTo;
long tmp;
char from[256], to[256];
char* stop;
printf("Program pro prevod cisel mezi soustavami\n\
-------------------------------------------\n\
ukonceni na CTRL-C\n\n");
while(1)
{
printf("Zadejte soustavu, ze ktere chcete prevest cislo: ");
scanf("%d", &baseFrom);
if(baseFrom >= 2 && baseFrom <= 20)
break;
printf("Ciselna soustava musi byt v rozsahu 2-20.\n");
}
while(1)
{
printf("Zadejte soustavu, do ktere chcete prevest cislo: ");
scanf("%d", &baseTo);
if(baseTo >= 2 && baseTo <= 20)
break;
printf("Ciselna soustava musi byt v rozsahu 2-20.\n");
}
while(1)
{
printf("Zadejte cislo, ktere chcete prevest: ");
scanf("%s", from);
tmp = strtol(from, &stop, baseFrom);
if(stop == from + strlen(from))
break;
printf("Cislo neodpovida zadane soustave.\n");
}
ltoa(tmp, to, baseTo);
printf("Cislo %s v soustave %u je %s v soustave %u.\n", from, baseFrom, to, baseTo);
return 0;
}Kontrola čísla versus zadaná soustava bude fungovat jen v adresním modelu flat, ale to je dnes už snad všechno. Zkontrolujte si to.
Kód: Vybrat vše
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
int baseFrom, baseTo, i=0;
long numero;
char from[256], to[256]="";
char* stop;
printf("Program pro prevod cisel mezi soustavami\n\
-------------------------------------------\n\
ukonceni na CTRL-C\n\n");
while(1)
{
printf("Zadejte soustavu, ze ktere chcete prevest cislo: ");
scanf("%d", &baseFrom);
if(baseFrom >= 2 && baseFrom <= 20)
break;
printf("Ciselna soustava musi byt v rozsahu 2-20.\n");
}
while(1)
{
printf("Zadejte soustavu, do ktere chcete prevest cislo: ");
scanf("%d", &baseTo);
if(baseTo >= 2 && baseTo <= 20)
break;
printf("Ciselna soustava musi byt v rozsahu 2-20.\n");
}
while(1)
{
printf("Zadejte cislo, ktere chcete prevest: ");
scanf("%s", from);
numero = strtol(from, &stop, baseFrom);
if(stop == from + strlen(from))
break;
printf("Cislo neodpovida zadane soustave.\n");
}
do
{
int cifra = numero % baseTo;
to[i++] = (cifra<=9)?'0'+cifra:'a'+cifra-10;
numero /= baseTo;
}
while(numero);
strrev(to);
printf("Cislo %s v soustave %u je %s v soustave %u.\n", from, baseFrom, to, baseTo);
return 0;
}Výsledek na obrázku níže.
- Přílohy
-
prevod.JPG- (45.5 KiB) Staženo 80 x
To ne. To by nestačilo. Pro prázdný řetězec stačí, aby byla nula na prvním bajtu, ale tady je třeba mít vynulované celé pole. Tu první nulu přece přepíšu hned prvním průchodem cyklu. Ony ty nuly budou všude, takže je to v pořádku, ale teď z hlavy nevím, jak moc se na to dá spoléhat, a už jen pro přehlednost na to spoléhám nerad.rnbw píše:Premena "to" je inicializovana na prazdny retazec, je to vporiadku.