» »

[C] Razumevanje kode

[C] Razumevanje kode

sobota56 ::

Zdravo,

s pomočjo sem spisal spodnjo kodo, ki pa je v nekaterih delih ne razumem najbolje. Koda je bila prav tako delno že narejena, sam pa bi rad vedel točno kako deluje.
Begajo me vhodni in izhodni parametri. Se pravi, če razumem pravilno, void, return...

#include <cs50.h>
#include <stdio.h>

int get_cents(void);                    //vrstica 4
int calculate_quarters(int cents);      //vrstica 5
int calculate_dimes(int cents);         //vrstica 6
int calculate_nickels(int cents);       //vrstica 7
int calculate_pennies(int cents);       //vrstica 8

int main(void)
{
    // Ask how many cents the customer is owed
    int cents = get_cents();                                     //vrstica 13

    // Calculate the number of quarters to give the customer
    int quarters = calculate_quarters(cents);                    //vrstica 16
    cents = cents - quarters * 25;                               //vrstica 17

    // Calculate the number of dimes to give the customer
    int dimes = calculate_dimes(cents);                          //vrstica 20
    cents = cents - dimes * 10;                                  //vrstica 21

    // Calculate the number of nickels to give the customer
    int nickels = calculate_nickels(cents);                      //vrstica 24
    cents = cents - nickels * 5;                                 //vrstica 25

    // Calculate the number of pennies to give the customer
    int pennies = calculate_pennies(cents);                      //vrstica 28
    cents = cents - pennies * 1;                                 //vrstica 29

    // Sum coins
    int coins = quarters + dimes + nickels + pennies;            //vrstica 32

    // Print total number of coins to give the customer
    printf("All coins: %i\n", coins);                            //vrstica 35
}

int get_cents(void)                         //vrstica 38
{
    // TODO
    int cents;                              //vrstica 41
    do
    {
        cents = get_int("Enter cents: ");   //vrstica 44
    }
    while (cents <= 0);
    printf("cents %i\n", cents);            //vrstica 47
    return cents;                           //vrstica 48
}

int calculate_quarters(int cents)           //vrstica 51
{
    // TODO
    int quarters = cents / 25;              //vrstica 54  
    printf("quarters %i\n", quarters);      //vrstica 55
    return quarters;                        //vrstica 56
}

int calculate_dimes(int cents)
{
    // TODO
    int dimes = cents / 10;
    printf("dimes %i\n", dimes);
    return dimes;
}

int calculate_nickels(int cents)
{
    // TODO
    int nickels = cents / 5;
    printf("nickels %i\n", nickels);
    return nickels;
}

int calculate_pennies(int cents)
{
    // TODO
    int pennies = cents / 1;
    printf("pennies %i\n", pennies);
    return pennies;
}



Tole pa je moje razumevanje kode:

Imamo spremenljivke tipa integer, ki so zapisane v vrsticah 4 do 8.
Spremenljivka int get_cents ne sprejme vhodnih parametrov (zato v oklepaju "void").
Ostale spremenljivke (vrstice 5 - 8) sprejmejo vhodni parameter tipa integer (int cents).

Sledi main funkcija, ki ne sprejme vhodnih parametrov (zato v oklepaju "void").
Prebere vrstico 13 od desne proti levi. Ker nima podatkov za funkcijo get_cents(), ko gre iskat.
Najde jo v vrstici 38, kjer funkcija ne sprejme vhodnih podatkov (void - ne vem, zakaj je tako?).
Določi se spremenljivka int cents (vrstica 41), ki še ni določena.
Izvede se zanka do-while, dokler uporabnik ne vpiše števila, ki je večje od 0. To se zapiše v spremenljivko cents.
Nazaj dobimo vrednost spremenljivke cents (vrstica 48). Ta return mi ni ravno jasen. Zakaj mora biti?

Potem se vrnemo v vrstico 13 in se vrednost return cents oz. cents (iz vrstice 48) zapiše v int cents (vrstica 13).

Potem gremo v vrstico 16, kjer kliče funkcijo calculate_quarters(cents), ki jo najde v vrstici 51.
Ta ima vhodne parametre int cents, ki smo jih prej izračunali. Izvede se desni del zapisa v vrstici 54, kje cents delimo z 25.
Rezultat se izpiše (vr. 55).
Vrednost dobimo z returnom (ne vem zakaj tako?) (vr. 56), kot spremenljivko quarters, ki je bila prvič definirana v vr. 54.

Gremo spet nazaj v main in vr. 20, kjer se v funkcijo calculate_dimes vpiše vrednost cents.
To je potem enako, kot prejšnji korak, le da gremo v vr. 59 itd.

Vse se nato izvaja na enak način, dokler se ne izvede še vr. 29, kjer dobimo še pennies.

Potem se vse sešteje v vr. 32 in izpiše v vr. 35.


Prosim, če bi mi lahko kdo razložil, če je moje razumevanje poteka kode pravilno in odgovoril na boldane zapise, kjer ne vem, kako deluje ta return in void.

Hvala že v naprej.

kuall ::

nauči se iskat z googlom
vrstica 38: https://stackoverflow.com/questions/693...

vrstica 48: si ziher, da ti ni jasno?

btw napačno si se lotil programiranja: prevajanje kode v človeški jezik. to se ne dela, predvsem zato ne, ker ni fun in boš hitro zgubil veselje.

kow ::

Narobe si predstavljas kako sploh vse deluje, pomembno je da razumes analiticno kaj se zgodi, primer:
"Prebere vrstico 13 od desne proti levi. Ker nima podatkov za funkcijo get_cents(), ko gre iskat."

Kaj se v resnici zgodi:

- ze prej je prevajalnik prebral vse vrstice nad omenjeno vrstico
- vrstico PREVAJALNIK razbije na posamezne besede - "int", "cents", "=", "get_cents()".
- C prevajalnik ima neka pravila, in ugotovi:
- klice se funkcija, ki smo jo oznacili z besedo "get_cents". Aha, na to besedo sem naletel ze prej (vrstica 4 - programer napove obliko/tip funkcije, napovedana oblika funkcije/spremenljivke se imenuje deklaracija.). V tem primeru funkcija nima vhodnih parametrov (to se oznaci z besedo void), vrne pa rezultat tipa "int"
- izvajanje se prenese v samo kodo funkcije. Ce zanemarimo kaj tocno ta funkcija dela, v nekem trenutku vrne rezultat - t.i. "return" statement.
- ta rezultat tipa int, se skopira oz. "assigna" (to je programer oznacil z enacajem, t.i. assignment operator, v del pomnilnika, ki ga je poimenoval z "cents"). Pred cents je programer napisal "int", kar pomeni da se bodo 4 bajti podatkov skopirali v 4 bajte lokalnega pomnilnik -> ne bo prislo do napake, da bi prepisal sosednji del pomnilnika.

ne, da se mi vec.. ampak, tako v grobem si moras predstavljati:
- kaj sploh je spremenljivka
- kaj pomeni klicati funkcijo
- kaj je assignment

Naceloma je trivialno, ko enkrat zapopades.

Ce imas funkcijo oblike int get_cents(void). Pomeni, da bo return statement v tej sami funkciji moral vrniti podatek tipa "int". Prevajalnik bi ti preprecil, da bi recimo vrnil tip "char", e.g: "return 'a';"

Zgodovina sprememb…

  • spremenil: kow ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Izračun normale v C++ in povezava z Excelom

Oddelek: Programiranje
141595 (1245) primoz4p
»

pra števila.. (strani: 1 2 )

Oddelek: Znanost in tehnologija
788699 (5038) Yacked2
»

[Android] Kaj metoda vrne?

Oddelek: Programiranje
6906 (744) virusss8
»

[NALOGA] Java: Rekurzija

Oddelek: Programiranje
5942 (756) Spura
»

OpenGL orr v ansi c

Oddelek: Programiranje
121618 (1406) igor12

Več podobnih tem