Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 6. diel - Cykly v céčko

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Jan Jenda
DarkCoder:9.11.2017 14:04

Ještě si zkontroluj, zda-li máš v programu vloženou knihovnu stdio.h.

#include <stdio.h>

Zda-li ji nemáš vyjmutou do komentáře. Reaguji na dvojici znaků v programu pro ukončení komentáře.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Jan Jenda
Člen
Avatar
Jan Jenda:9.11.2017 15:09

Moc ti děkuji.

Už je mi blbé se ptát , ale zkoušel jsem kalkulačku v while cyklu napsal jsem jí sám, pak jí zkontroloval našel chyby, spustil znova, ale kalkulačka se po zadání na konci 1 stejně nezapne znova..

A rád bych se zeptal jakto , že v zadání tu je scanf("%c", &pokracovat), ale s tímto mi to nejde musel jsem mít u % mezeru jinak mi program skončil a scanf vynechal

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * File:   main.c
 * Author: X
 *
 * Created on 9. listopadu 2017, 15:05
 */

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

/*
 *
 */
int main(int argc, char** argv) {

    float a;
    float b;
    float vysledek;
    int volba;
    char pokracovat = 1;




    printf("Vítejte v kalkulačce\n");

    while
            (pokracovat == 1)

    {
    printf("Zadejte první číslo\n");
    scanf("%f", &a);
    printf("Zadejte druhé čísl\n");
    scanf("%f", &b);
    printf("1 - Sčítání\n");
    printf("2 - Odčítání\n");
    printf("3 - Násobení\n");
    printf("4 - Dělení\n");
    scanf("%d", &volba);
    switch(volba)
    {
            case 1:
                vysledek = a + b;
                break;

            case 2:
                vysledek = a - b;
                break;

            case 3:
                vysledek = a * b;
                break;

            case 4:
                vysledek = a / b;
                break;
    }

    if ((volba > 0) && (volba < 5))
    {
        printf("vysledek je %f", vysledek);
        printf("\n");


    }
    else
        printf("Zadal si špatné číslo\n");
    printf("Prejte ti pokracovat zadejte ano ne = 1 0\n");
    scanf(" %c", &pokracovat);

    }


    printf("Děkuji za použití kalkulačky");



    return (EXIT_SUCCESS);
}
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Jan Jenda
DarkCoder:9.11.2017 16:29

Není zač. Pokud někdo vynaloží aspoň trochu úsilí, nevidím důvod proč nepomoci.
To je tady hodně oblíbený nešvar používat scanf() pro načítání znaku, nedělej to tak.

Musíš se rozhodnout, s jakým typem proměnné chceš pracovat, zdali char nebo int.

  1. pokud char, tak musíš změnit kód, přidej a uprav na následující:
#include <conio.h>

char pokracovat = '1';

(pokracovat == '1')

pokracovat = _getche();

znaková konstanta musí být uzavřena mezi jednoduchými uvozovkami. Ve tvém případě si přiřazoval proměnné pokracovat hodnotu řídícího znaku jehož ASCII hodnota je 1.

  1. pokud int, tak musíš změnit kód na následující:
int pokracovat = 1;

scanf("%d", &pokracovat);

Doporučuji zvolit variantu 1)

Ještě pár tipů:

  • odděl hlášku o zadání špatného čísla od hlášky o pokračování. Ať else nepůsobí jako blok příkazů který není.
  • doplň kontrolu na dělení nulou.
Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na DarkCoder
David Hartinger:9.11.2017 16:45

Nešvar je spíše používat nestandardní funkce a knihovny jako conio, proto to tu neučíme.

Odpovedať
New kid back on the block with a R.I.P
Avatar
DarkCoder
Člen
Avatar
Odpovedá na David Hartinger
DarkCoder:9.11.2017 17:34

To že knihovna jako conio.h není standartem C ani ISO C neznamená že je špatná. Je to možnost a způsob, jak lze dosáhnout interaktivního vstupu namísto omezujícího řádkového bufferu. Ať si každý experimentuje s funkcemi dle libosti, ale rozhodně je dobré když ví, že něco takového existuje. Pokud už se bavíme o standartu tak je dobré jim říci, že pro načítání znaků slouží funkce getchar() a ne scanf().

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na DarkCoder
David Hartinger:9.11.2017 22:42

Samozrejme, ze to znamena, ze je spatna. Je to stara knihovna z MS DOSu, nekompatibilni s dalsimi systemy. Getchar je vysvetlen v lekci 5. Koukám, že je to ale lekce 5 až toho dalšího kurzu. Již nevím proč jsem ho sem nedal, možná tam byl problém s bufferem a nechtěl jsem tu mást s jeho vyprazdňováním.

Editované
Odpovedať
New kid back on the block with a R.I.P
Avatar
DarkCoder
Člen
Avatar
Odpovedá na David Hartinger
DarkCoder:9.11.2017 23:24

Ano, má samozřejmě svá omezení. Nic však nebrání nikomu použít jinou alternativu pro konkrétní prostředí (např. NCurses, apod.), popř. si vytvořit svoji vlastní, ale to už si vyžaduje vyšší skill než znalost načítání znaku. Také jsem se díval. Lekce s getchar() je opravdu hodně hluboko zanořená, přitom se jedná o základní konstrukci. Určitě by stálo za to to přesunout do jedné z prvních lekcí základního kurzu.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Tomas Bahensky:19.2.2018 11:42

Cau, mam jeden dotaz k "Mocninatoru" Je nejaky rozdil mezi zapisy podminek viz nize? Vysled se zda byt stejny....

vysledek = f;
    for (h = 1; h < g; h++)
        vysledek = vysledek * f;

a

vysledek = f;
    for (h = 0; h < (g - 1); h++)
        vysledek = vysledek * f;

Diky!

Avatar
DarkCoder
Člen
Avatar
Odpovedá na Tomas Bahensky
DarkCoder:19.2.2018 18:13

Výsledek obou úryvků kódu je stejný, jelikož je stejný počet opakování cyklu a řídící proměnné cyklu nemají vliv na příkaz uvnitř tohoto cyklu. První varianta je ale efektivnější, neboť je zapotřebí menší množství strojových instrukcí pro řízení programu než u druhé varianty. Varianta, kde řídící proměnná je inicializována na nulu, se používá zejména u polí. Důvodem je, že první prvek pole je pole s nulovým indexem.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na DarkCoder
Tomas Bahensky:19.2.2018 20:10

Diky DarkCoder! Rikal jsem si, ze to bude kvuli necemu, o cem v tuto chvili nemam paru :))

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 55.