Zdravim, jako programator-zacatecnik bych vas chtel pozadat o pomoc. Ve skole jsme dostali par ukolu na procviceni a nevim si s nekterymi rady. Doplnuji ze se jedna o jazyk C.
1. Sestavte funkci pro záměnu obsahu dvou proměnných. Funkce bude mít dva parametry a bude výsledky vracet zpět do main, kde je vytiskněte
2. Sestavte funkci, která převede čas zadaný v sekundách na hodiny, minuty a sekundy. Výsledky funkce vrátí do main, kde je vypište. Čas zadaný v sekundách pošlete do funkce jako parametr. Ošetřete jeho hodnotu v main.
4. Sestavte funkci, která načte větu ukončenou tečkou (načítejte znak po znaku). Zjistěte:
a. počet malých písmen
b. počet velkých písmen
c. počet číslic
d. počet ostatních znaků
Funkce vrátí všechny výsledky do main, kde je vypište.
Dekuji za pripadnou radu/vytvoreni
Fórum › C / C++
Zakladni programovani-pointery
Ako myslíš "vrátiť do main" ?? akože return nejakej štruktúry (pretože pri každej úlohe musíš vrátiť viac ako jedno číslo) ? Ak to je tak, tak pointery ani nepotrebuješ.
A napsal bys prosim, jak by se to melo udelat bez pointeru?
Ešte raz som si prečítal úlohu 1, ale nejako stále nechápem. Je tam, že sa tie hodnoty vymenia, ale je tam aj to, že sa vrátia. Tak teda ktoré z toho ? Chceš to urobiť tak, že tú funkciu spustíš, nič nevráti, ale potom budú nejaké dve premenné vymenené ? To sa naozaj nedá urobiť bez pointerov (v C). Alebo to chceš tak, že v parametroch budú 2 čísla, a funkcia vráti štruktúru s dvoma číslami, pričom to prvé bude to druhé na vstupe ? To je trochu sprosté a neviem si predstaviť na čo by to bolo. Predpokladám, že si myslel to prvé. http://stackoverflow.com/questions/3377158/how-to-change-variable.
#1 Andddrew158
Základní implementace toho tvýho prvního úkolu může vypadat třeba takto...
#include "stdafx.h"
#include <iostream>
using namespace std;
// Prototypy funkce;
bool swap(int &, int &);
bool swap(int *, int *);
int main()
{
int a, b; // deklarace proměnný
// inicializace
a = 10;
b = 8;
cout << "Cislo A: " << a << endl
<< "Cislo B: " << b << endl;
cout << endl;
//volání funkce swap referenčně
swap(a, b);
cout << "Cislo A: " << a << endl
<< "Cislo B: " << b << endl;
cout << endl;
int * pA, * pB;
pA = &a;
pB = &b;
cout << "Cislo pA: " << *pA << endl
<< "Cislo pB: " << *pB << endl;
cout << endl;
//vyvolání funkce swap s ukazateli
swap(pA, pB);
cout << "Cislo pA: " << *pA << endl
<< "Cislo pB: " << *pB << endl;
cout << endl;
system("PAUSE");
return 0;
}
bool swap(int & a, int & b)
{
bool prohozeno = false;
int c; // deklarace pomocné proměnné
c = a;
a = b;
b = c;
prohozeno = true;
return prohozeno;
}
bool swap(int * a, int * b)
{
bool prohozeno = false;
int c; // deklarace pomocné proměnné
c = *a;
*a = *b;
*b = c;
prohozeno = true;
return prohozeno;
}
#7 ondrej39
ten tvůj bool u swapu je naprosto zbytečný, když už, tak
template <typename T> bool swap(T* a, T* b)
{
if (*a == *b) return false;
T t = *a;
*a = *b;
*b = t;
return true;
}
template <typename T> void swap(T& a, T& b)
{
if (a == b) return false;
T t = a;
a = b;
b = t;
return true;
}
#9 ondrej39
však v pohodě, jen že vždy vrátíš true :)
#1 Andddrew158
Ten tvůj druhej úkol může vypadat nějak takto
typedef unsigned long ulong;
struct Time
{
unsigned hours;
unsigned minutes;
unsigned sec;
};
Time& getTime(const ulong& sec)
{
Time tm;
ulong t = sec;
tm.sec = t % 60; t /= 60;
tm.minutes = t % 60; t /= 60;
tm.hours = t % 24;
return tm;
}
ulong sec = 12345;
Time tm = getTime(sec);
#10 ingiraxo
Ten zdroják bych si dovolil trochu poopravit, vracet referenci na proměnnou na stacku nebývá dobrý nápad.
struct Time
{
unsigned hours;
unsigned minutes;
unsigned sec;
};
Time getTime(unsigned long t)
{
Time tm;
tm.sec = t % 60; t /= 60;
tm.minutes = t % 60; t /= 60;
tm.hours = t % 24;
return tm;
}
Time tm = getTime(12345);
#11 voty
ono záleží kdy a kde to použiješ, pro ten jeho úkol, kde má vrátit a nejspíš jen vypsat čas a ukončit app, to je spíše výhoda, protože se nevytváříš zbytečně nový objekt, ale pracuješ furt s jedním
ale souhlasím s tím, že pro běžnou app, která dělá opravdu víc věcí, tak je lepší vracet nový objekt, případně ptr (pokud je potřeba)
#12 ingiraxo
vracet referenci na lokalni promennou, to si koledujes presne o toto:
0x7ffff9ff0be0: created
0x7ffff9ff0be0: destroyed
0x7ffff9ff0c20 < 0x7ffff9ff0be0: created
0x7ffff9ff0c20: destroyed
pro konstruktory a destruktor:
Time() { cout << this << ": created\n"; }
Time(const Time& y) { cout << this << " < " << &y << ": created\n"; }
~Time() { cout << this << ": destroyed\n"; }
Vsimni si hlavne ty casti, kde je destruktor lokalni promenne zavolan PRED zavolanim copy construktoru....
#12 ingiraxo
Okrem toho ze ten tvoj priklad je chybny (viz KIIV a voty), tak s nim ani nic nedosiahnes lebo ak by si rovno vratil strukturu Time tak snad skoro kazdy prekladac pouzie pouzie copy elision optimalizaciu (alebo priamo vrati navratovu hondotu cez registre ak sa tam zmesti), pripadne rovno inlinuje celu funkciu.
Takže vlastně to není žádná optimalizace? Já měl za to, že před zavoláním destruktoru to uloží referenci do registru a z registru to uvolní při zavolání destruktoru u další metody, do který jsem to vrátil (nebo objektu)
jako reference na lokální proměnný normálně nevracim, ale v tomhle případě, kdy se má vrátit pouze struktura a ta se potom má vypsat a ukončit app, tak by to mělo být v pohodě a bez zbytečného vytváření nového objektu, nebo aspoň v tom žádný riziko nevidim
#15 ingiraxo
to bude zalezet od prekladace, g++ verze 4.8.1 vyhodilo toto. Kazdopadne je vyhodnejsi pouzit move konstruktory a nevracet tu referenci na lokalni promennou vubec (samozrejme pro obycejnou strukturu to moc nepomuze, ale jak bys v tom mel nejaky standartni kontejnery, tak se presune reprezentace a nedelaj se jejich kopie, aby se za chvili zrusily)
Daleko vetsi problem bys mel, kdybys pouzil Time & vracena = getTime(...);
jak bys zavolal cokoliv jinyho, tak si prave prisel o data na pozici, kam ukazuje vracena.
#15 ingiraxo
Vratenie adresy lokalnej premennej je 'undefined behavior', to znamena ze compilator moze z kodom spravyt hocico, moze to nahodou fungovat tak ako si chcel, compilator moze pouzit daku optimalizaciu ktora ti totalne rozhasi cely kod a kludne ti to moze aj zmenit status na facebooku. Preto sa nevrcaju adresy lokalnych premennych.
ok, budu mít na paměti ;)
jinak trochu OT, ale když už probíráme reference, tak je pravda, že když metoda vrací referenci na novou instanci, ale předám to do proměnný, tak ztratím ukazatel natrvalo? nebo jde ještě nějak "vydlabat" ?
Time& getTime() {
Time* t = new Time();
return *t;
}
// spravne reseni
Time& t = getTime();
delete &time;
// je mozny uvolnit ptr, pri teto konstrukci nebo jsem ptr ztratil na dobro?
Time t = getTime();
#18 ingiraxo
Stratis pointer. V C++ sa nedoporucuje pouzivat ciste pointre/referencie na transfer vlastnictva. Vecsinou nebudes potrebovat vobec pointre a ak ano tak pouzi unique_ptr/shared_ptr.
#18 ingiraxo
tohle presne probiral Stroustrup na svy prednasce o c++11 a c++14 (https://www.youtube.com/watch?v=86xWVb4XIyE)
Zdravím, jsem úplný začátečník, co se týče programování v programu C++. Mám za úkol několik cvičení a vůbec si s tím nevím rady, mohl by mi prosím někdo pomoci?
Tady jsou ty příklady:
1)Vytvořte v jazyce C program, který přehodí hodnoty dvou
proměnných, aniž by k tomu použil proměnnou třetí. O proměnné
můžete požádat uživatele,
2)
Napište v jazyku C program, který po zadání trojice čísel určí největší z nich a vypíše jej na obrazovku.
Příklad výstupu:
Zadejte první cislo: 4
Zadejte druhé číslo : 8
Zadejte treti číslo : 1
Nejvetsi číslo je: 8
3)
Vytvořte v jazyku C program, který po zadání čísla určí jeho faktoriál.
Příklad výstupu:
Zadejte číslo: 5
Faktoriál je: 120
Zadejte číslo: 0
Faktoriál je: 1
Zadejte číslo: 1
Faktoriál je 1
6)
Napište
v jazyku C program, který po zadání mzdy vypočítá a
na obrazovku vypíše výši odpovídající daně.
Pro
účel této úlohy
uvažujme progresivní zdanění ve výši 10 % pro příjem do 10000, 20 %
pro příjem od 10000 do 20000 a 30 % pro příjem nad 20000.
Příkad výstupu:
Zadejte mzdu: 12000
Odpovidajici dan je: 1400
Zadejte mzdu: 33353
Odpovidajici dan je: 7005.9
Například, pokud máme hrubou mzdu 24000, bude se prvních 10000
danit 10 % (tj. daň z této části mzdy je 1000), dalších 10000 se daní 20
% (daň z této části je 2000) a zbývající 4000 se daní 30 % (daň je
1200). Celkovou výši daně pak vypočítáme jako součet jednotlivých
"částečných" daní (tj. celková daň 4200).
Prosím odpovězte mi případně na můj e-mail Nika.novakova@seznam.cz
Děkuji moc, budu Vám moc vděčná :)
U úkolu 1) bych viděl problém s nemožností použít třetí proměnnou. Běžně se tato výměna dělá tak, že kromě zadaných a, b mám ještě pomocnou proměnnou p
Příklad 2) je na podmínky, příklad 3) na cyklus. Poslední příklad je v podstatě na podmínky taky.
Chtělo by to trochu vlastní tvořivosti, můj domácí úkol to není.
hu
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Programování - základní otazka — založil Michael Račan
Tablet pro základní programování v javě — založil pivko
C++ pointery — založil jane32
Pointery v C — založil chef06
Moderátoři diskuze