NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Filip Miska
Člen
Avatar
Filip Miska:7.6.2016 22:25

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.6.2016 22:25
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Filip Miska
Martin Dráb:7.6.2016 23:34

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
7.6.2016 23:34
2 + 2 = 5 for extremely large values of 2
Avatar
Neaktivní uživatel:27.9.2016 2:42
/* 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.9.2016 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.