Zakladni programovani-pointery – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zakladni programovani-pointery – C / C++ – Fórum – Programujte.comZakladni programovani-pointery – C / C++ – Fórum – Programujte.com

 

5. 12. 2014   #1
-
0
-

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

Nahlásit jako SPAM
IP: 94.113.233.–
lukas.balaz0
Super člen
5. 12. 2014   #2
-
0
-

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š.

Nahlásit jako SPAM
IP: 80.242.41.–
5. 12. 2014   #3
-
0
-

A napsal bys prosim, jak by se to melo udelat bez pointeru?

Nahlásit jako SPAM
IP: 94.113.233.–
lukas.balaz0
Super člen
5. 12. 2014   #4
-
0
-

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.

Nahlásit jako SPAM
IP: 80.242.41.–
KIIV
~ Moderátor
+43
God of flame
5. 12. 2014   #5
-
0
-

#4 lukas.balaz
nejspis sou to jen priklady na predani adresy promennych, co se maji zamenit ci do kterych se pocita a tak...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondrej39+1
Věrný člen
6. 12. 2014   #6
-
0
-

#4 lukas.balaz
Myslím si, že se vrátí do mainu je myšleno tak, že se hodnoty neprohodí pouze na scope funkce swap, ale prohozené budou i proměnné vkládané.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
ondrej39+1
Věrný člen
6. 12. 2014   #7
-
0
-

#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;
}
Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
ingiraxo+15
Grafoman
6. 12. 2014   #8
-
0
-

#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;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ondrej39+1
Věrný člen
6. 12. 2014   #9
-
0
-

#8 ingiraxo
Snažil jsem se, no. :-D

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
ingiraxo+15
Grafoman
6. 12. 2014   #10
-
0
-

#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);
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
voty+1
Návštěvník
9. 12. 2014   #11
-
0
-

#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);
Nahlásit jako SPAM
IP: 81.19.38.–
Jednu rozbil a tu druhou ztratil.
ingiraxo+15
Grafoman
9. 12. 2014   #12
-
0
-

#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)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
9. 12. 2014   #13
-
0
-

#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....

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
9. 12. 2014   #14
-
0
-

#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. 

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
9. 12. 2014   #15
-
0
-

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

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
9. 12. 2014   #16
-
0
-

#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.

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
9. 12. 2014   #17
-
0
-

#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.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
9. 12. 2014   #18
-
0
-

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();
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
9. 12. 2014   #19
-
0
-

#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.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV
~ Moderátor
+43
God of flame
9. 12. 2014   #20
-
0
-
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Nikola
~ Anonymní uživatel
9 příspěvků
10. 12. 2014   #21
-
-1
-
Mimo téma

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á :)

Nahlásit jako SPAM
IP: 2001:718:1401:5c::d2...–
10. 12. 2014   #22
-
0
-

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

Nahlásit jako SPAM
IP: 2001:67c:1222:800:c929:52...–
KIIV
~ Moderátor
+43
God of flame
10. 12. 2014   #23
-
0
-

prvni jde pres xory..   neco jako   a ^= b; b ^= a; a ^= b;   

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Nikola
~ Anonymní uživatel
9 příspěvků
10. 12. 2014   #24
-
0
-

#22 hlucheucho
Děkuji, první příklad jsem už nakonec zvládla, s druhým právě bojuji, ale potřebovala bych více podrobnější rady :)

Nahlásit jako SPAM
IP: 2001:718:1401:5c::d2...–
Nikola
~ Anonymní uživatel
9 příspěvků
10. 12. 2014   #25
-
0
-

#23 KIIV
Děkuji za radu :)

Nahlásit jako SPAM
IP: 2001:718:1401:5c::d2...–
KIIV
~ Moderátor
+43
God of flame
10. 12. 2014   #26
-
0
-

na druhy staci do promenne max nacist prvni cislo, a pak nacitat dalsi cisla v cyklu a prepsat max pokud bude aktualne nactene cislo vetsi, nez to max

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
10. 12. 2014   #27
-
0
-

#26 KIIV
že jsou proměnné jen 3, podmínky (porovnání) bude třeba jen 2x, zde bych se asi cyklu vyhnul. Ve školní úloze bych na to šel co nejjednodušeji - hrubou silou

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:c929:52...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 39 hostů

Podobná vlákna

Programování - základní otazka — založil Michael Račan

Pointery — založil inferno-girl

C++ pointery — založil jane32

Pointery v C — založil chef06

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý