NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 6 - Cykly v Céčku

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
DarkCoder
Člen
Avatar
Odpovídá 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.

Odpovědět
9.11.2017 14:04
"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);
}
 
Odpovědět
9.11.2017 15:09
Avatar
DarkCoder
Člen
Avatar
Odpovídá 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.
Odpovědět
9.11.2017 16:29
"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
Odpovídá 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.

Odpovědět
9.11.2017 16:45
New kid back on the block with a R.I.P
Avatar
DarkCoder
Člen
Avatar
Odpovídá 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().

Odpovědět
9.11.2017 17:34
"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
Odpovídá 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.

Editováno 9.11.2017 23:03
Odpovědět
9.11.2017 22:42
New kid back on the block with a R.I.P
Avatar
DarkCoder
Člen
Avatar
Odpovídá 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.

Odpovědět
9.11.2017 23:24
"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!

 
Odpovědět
19.2.2018 11:42
Avatar
DarkCoder
Člen
Avatar
Odpovídá 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.

Odpovědět
19.2.2018 18:13
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá 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 :))

 
Odpovědět
19.2.2018 20:10
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 10 zpráv z 55.