Diskuze: Převod z osmičkové do desítkové soustavy

C++ C a C++ Převod z osmičkové do desítkové soustavy

Avatar
Filip Miska
Člen
Avatar
Filip Miska:

Zdravím,
dělám úkol do programování a chtěl bych se zeptat jestli je tento zdrojový kód správně popř. poupravit ty mé vysvětlivky. Snažím se to pochopit. Děkuji

#include <stdio.h>
#include <math.h>            /*Matematické funkce pro reálná čísla*/

int main()
{

    long int osum, desitkove = 0;
    int i = 0;

    printf("Zadej osmickove cislo: ");
    scanf("%ld", &osum);                                                                  /*%ld = Long Integer - Dlouhé celé číslo*/
    while (osum != 0)
    {
        desitkove =  desitkove +(osum % 10)* pow(8, i++);      /* i++ - zvyšuje hodnotu o jedno*/
        osum = osum / 10;                                                                  /* pow - Vrací umocněné číslo např. pow (x, 1./2.) je umocnění na jednu polovinu*/
    }
    printf("Vysledek v desitkove soustave je: %ld",desitkove);
    return 0;
}
 
Odpovědět 7. června 22:25
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Filip Miska
Martin Dráb:

No, jeden problém je, že nekontroluješ, že opravdu dostaneš osmičkové číslo. Spíš bych čekal, že nebudeš načítat do celého čísla, ale do řetězce, který pak budeš procházet znak po znaku a konvertovat na desítkové číslo (to klidně už do proměnné celočísleného typu).

Díky procházení opačným směrem se zbavíš nějakých těch dělení a volání funkce pow (a floatům), pokud použiješ Hornerovo schéma.

Co se týče popisků, psát komentář, že i++ zvětší hodnotu i o jedničku, je podle mě zbytečné, protože je to popsáno již v samotném příkazu. Komentář by měl popisovat hlubší význam tvého konání.

Já bych to viděl nějak takto (popisky si doplň ale sám):

char osmickove[20];  /* Necht je uzivatel hodny a nezada vic nez 19 cislic, jinak tu mame preteceni zasobniku. */
long int desitkove = 0;
scanf("%s\n", osmickove);
while (*osmickove != '\0') {
  char cifra = *osmickove;
  if (cifra >= '0' && cifra <= '7')
    desitkove = desitkove*8 + (cifra - '0');
  else {  ... tezka chyba vstupu ... }

  ++osmickove;
}
Nahoru Odpovědět  +1 7. června 23:34
2 + 2 = 5 for extremely large values of 2
Avatar
Neaktivní uživatel:
/* Prevod z 8 soustavy do 10 soustavy */

#define _CRT_SECURE_NO_WARNINGS

#include <math.h> // pow()
#include <stdio.h> // gets_s(), printf()
#include <string.h> // strlen()

#define SIZE 20 // max velikost osmickoveho cisla

int main(int argc, char *argv[]){
        char osm[SIZE + 1]; // zadane osmickove cislo
        int i, delka, jeosm = 1; // je vstup osmickovy
        long int deset = 0; // vystupni desitkove cislo

        printf("Prevod z osmickove soustavy do desitkove\n\n");
        printf("Zadej cislo v osmickove soustave: ");
        gets_s(osm, SIZE);
        delka = strlen(osm);
        for (i = 0; i < delka; i++) if ((osm[i] < '0') || (osm[i] > '7')) jeosm = 0;
        if (!jeosm) printf("Spatne zadane osmickove cislo\n\n");
        else {
                for (i = delka-1; i >= 0; i--) deset = deset + (osm[i]-'0') * (int)pow(8.0, (double)(delka - i - 1));
                printf("Cislo %s v osmickove soustave je v desitkove soustave: %ld\n\n", osm, deset);
        }
        return 0;
}

Vše už bylo řečeno, snad jen hlídat si typy parametrů funkcí - pow().

Nahoru Odpovědět 27. září 2:42
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.