Převod s PHP na C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Převod s PHP na C++ – C / C++ – Fórum – Programujte.comPřevod s PHP na C++ – C / C++ – Fórum – Programujte.com

 

dogy20050
Newbie
1. 10. 2010   #1
-
0
-

Dobrý den
potřeboval bych pomoct jak přepsat tento program S PHP do C++ zvláště toto je pro mně záhodou
$Z = $C - ( $B * 3);
$Vysledek = "$Z$Vysledek";

jsem v programování nováček, něco jsem se naučil sám ale toto nezvládnu předem Děkuji

for($a=0;$a<=2000;$a++ )
{
$C = $a;
$Vysledek = "";
$Tisk = "";
//echo "<p>\n";
//echo "Zdroj = $a<br>";
do
{
$B = floor($C/3);

$Z = $C - ( $B * 3);
// echo "$C/3 = $B (Z = $Z )<br>\n";
$Vysledek = "$Z$Vysledek";
$C = $B;
}
while($B>0);

$Tisk = str_pad($Vysledek, $PocetMist, "0", STR_PAD_LEFT);
echo "$a|";
// echo"</p>\n";

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
1. 10. 2010   #2
-
0
-

co ze to ma vlastne delat ? prevod do trojkovy soustavy?

i php umi vypocitat zbytek po celociselnem deleni: %
v C++ muzes vynechat floor pokud jsou oba argumenty / celociselne...

no proste ja to delam asi takto:

cislo = 100;

delitel = 3;
while ( cislo > 0 ) {
retezec = ('0'+cislo%delitel) + retezec;
cislo /= delitel;
}
cout << retezec;


pripadne se da retezec vypsat pospatku ...
pro vetsi delitele jak 10 uz budes potrebovat prekladovou tabulku nebo podminku

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
4. 10. 2010   #3
-
0
-

To KIIV : vypisuje to všechny kombinace 0,1,2 z hodnoty a, takže zkusím co dělá Tvůj soubor děkuji

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
4. 10. 2010   #4
-
0
-

neni to samozrejme cely.. chce to ten hlavni cyklus co naplni pokazdy cislo (hlavne nepouzit primo cislo jinak mas nekonecnej cyklus) a samozrejme odradkovani

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
5. 10. 2010   #5
-
0
-

To KIIV :
když to dám zkompilovat tak řádek cout << retezec; napíše, že retezec není definován,
ačkoliv v řádku retezec = ('0'+cislo%delitel) + retezec; jsem dal int retezec = ('0'+cislo%delitel) + retezec;

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
5. 10. 2010   #6
-
0
-

ano nejsme v php.. kazda promenna musi byt definovana a jeste s konkretnim typem...
int cislo, delitel;
string retezec;

taky predpokladam: using namespace std a include string.h a iostream.h

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
6. 10. 2010   #7
-
0
-

To KIIV : takhle jsem to přepsal, dal zkompilovat a napsalo mi to chyby, takže nevím co s tím. Zkus si to hodit k sobě, zkompilovat a pak ukázat jak jsi to opravil. Děkuji

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

using namespace std;
main(void)
{

int cislo = 100;

int delitel = 3;
string retezec;

while ( cislo > 0 ) {
retezec = ('0'+cislo%delitel) + retezec;
cislo /= delitel;
}
cout << retezec;
}

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
6. 10. 2010   #8
-
0
-

stdio.h nepotrebujes vubec
stdlib.h zatim ne ale budiz muze zustat..
iostream.h se dava jen iostream
string.h se dava jen string

a pak to chce jeste static_cast<char>('0'+cislo%delitel) .. pro int nevi jak to tam narvat... ale znak to zvladne

a asi se bude hodit odradkovat .. cout << retezec << endl;

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
6. 10. 2010   #9
-
0
-

To KIIV : Tak jak jsi to opravil nehlásí žádnou chybu. Výborně.
Zkusil jsem tam dát zápis do souboru na disk a hlásí chyby nevím co s tím. Děkuji

#include <stdlib.h>
#include <string>
#include <iostream>
FILE *f;
using namespace std;
main(void)
{

int cislo = 100;

int delitel = 3;
string retezec;

while ( cislo > 0 ) {
retezec = static_cast<char>('0'+cislo%delitel) + retezec;
cislo /= delitel;
}
cout<<retezec<<endl;
}

f = fopen ("zapis.txt","a");

fprintf(f,"%s,\n"
,retezec
)
;
fclose(f)
;

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
6. 10. 2010   #10
-
0
-

tak zaprve bych vyuzil rovnou <fstream> (pouziva se to stejne jako iostream akorat musis otevrit soubor)

a pokud se ti nechce tak je to samozrejme knihovna (tj stdio.h) kterou sem ti doporucil smazat protoze ji nepotrebujes.. ale kdyz uz delas v C++ tak je lepsi pouzit ten fstream..

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
8. 10. 2010   #11
-
0
-

To KIIV :
Funguje to, počítá to, zapisuje to.Výborně, děkuji za pomoc.

Nahlásit jako SPAM
IP: 90.179.215.–
dogy20050
Newbie
11. 10. 2010   #12
-
0
-

To dogy2005 :
mám ještě dva dotazy
z výsledného řetězce chci získat celkový počet výskytu daného znaku zkusil jsem to řešit
retezec.count"0" , ale nefunguje.
chci získat jaký znak je na dané pozici zkusil jsem retezec.charAt[5] ale nefunguje to. Děkuji

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
11. 10. 2010   #13
-
0
-

proc charAt? string ma operator [] primo... tj. retezec[10] hodi jedenactou pozici (pokud existuje)
pripadne se da prochazet pomoci iteratoru a tak dale..

spocitani si uz muzes udelat sam..

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
11. 10. 2010   #14
-
0
-

To KIIV :
v tom programu potřebuji počítat i tak vysoké čísla, že výsledek je v exp. tvaru, ale pak celkový retezec je taky exp. tvaru, což je samozřejmě špatně. Řetězec má obsahovat asi 400 znaků, ale v požadovaném tvaru, mně vytiskne asi 20 dvojek a spoustu nul s mezerami. Snažil jsem se to řešit s pomocí "%lf, ale nefunguje to. Děkuji.

#include <math.h>

double cislo = pow(3,400);

printf("%lf,\n""a");

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
11. 10. 2010   #15
-
0
-

joo to uz budes muset mrknout na lepsi typy nez double .. asi mrkni na nejakou knihovnu.. mozna GMP MP

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
11. 10. 2010   #16
-
0
-

To KIIV :

myslel jsem, že by se pow hodnota načetla v plném tvaru ale netiskla na obrazovku a pak třeba pomocí scan s ní pracovalo nebo tak.

Nahlásit jako SPAM
IP: 90.179.215.–
dogy20050
Newbie
11. 10. 2010   #17
-
0
-

To dogy2005 :

jak z výsledného řetězce získam počet výskytu pro jednotlivé znaky 0, 1, a 2 neptám se na délku řetězce.

Nahlásit jako SPAM
IP: 90.179.215.–
liborb
~ Redaktor
+18
Guru
11. 10. 2010   #18
-
0
-

Počet znaků v řetězci zjistíš tak, že řetězec projdeš počet znaků spočítáš. A je jedno, jestli to projdeš v cyklu jako pole nebo na to půjdeš funkcí podobnou strchr.

Nahlásit jako SPAM
IP: 78.80.52.–
dogy20050
Newbie
11. 10. 2010   #19
-
0
-

To liborb : protože jsem laik je dobré pro mně praktická ukázka, nedá se nějak využít funkce count?

Nahlásit jako SPAM
IP: 90.179.215.–
liborb
~ Redaktor
+18
Guru
11. 10. 2010   #20
-
0
-

No jestli máš funkci count, kterou můžeš použít, tak ji použij. Já mám tu smůlu, že patřím k té (troufám si tvrdit) menšině, která než by hledala nějakou vhodnou funkci 4 dny, tak si radši ten cyklus s 2 (3) podmínkama napíšu. Příklad p5edpokládá, že v řetězci jsou jenom znaky 0, 1, 2:

for (int i = 0;i < retezec.length();i++) {

if (retezec[i] == '0') nula++;
else if (retezec[i] == '1') jedna++;
else dva++;
}

Nahlásit jako SPAM
IP: 78.80.52.–
dogy20050
Newbie
12. 10. 2010   #21
-
0
-

To liborb : Děkuji

Nahlásit jako SPAM
IP: 90.179.215.–
dogy20050
Newbie
12. 10. 2010   #22
-
0
-

liborb napsal:
No jestli máš funkci count, kterou můžeš použít, tak ji použij. Já mám tu smůlu, že patřím k té (troufám si tvrdit) menšině, která než by hledala nějakou vhodnou funkci 4 dny, tak si radši ten cyklus s 2 (3) podmínkama napíšu. Příklad p5edpokládá, že v řetězci jsou jenom znaky 0, 1, 2:

for (int i = 0;i < retezec.length();i++) {
if (retezec[i] == '0') nula++;
else if (retezec[i] == '1') jedna++;
else dva++;
}





no ale hází to úplně nesmyslná čísla

Nahlásit jako SPAM
IP: 90.179.215.–
liborb
~ Redaktor
+18
Guru
12. 10. 2010   #23
-
0
-

Tak v tom případě je potřeba provést inicializaci počítacích proměnných na 0. Btw nečekáš, že na první dostaneš kompletní kód, že ne? :)

Nahlásit jako SPAM
IP: 195.189.142.–
KIIV
~ Moderátor
+43
God of flame
12. 10. 2010   #24
-
0
-

jeje a pocitat delku retezce uvnitr podminky cyklu :D at zije kvadraticka slozitost

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m->29+6
Super člen
12. 10. 2010   #25
-
0
-

To KIIV : std::tring to počíta len ako "pointer na koniec" - "pointer na začiatok", nie? Takže to nie je až také zlé :-)

Nahlásit jako SPAM
IP: 90.177.12.–
KIIV
~ Moderátor
+43
God of flame
12. 10. 2010   #26
-
0
-

To m->29 : to schvalne otestuju

EDIT: jo tak pro 100000x253B retezec.. cyklus, kterej tam nic nemeni
real 0m0.119s s length v cyklu
a real 0m0.101s s length pred cyklem
coz je vesmes rezie ve volani

kazdopadne to neni dobrej zvyk.. obzvlaste pokud hrozi ze bude delat s cstring

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
13. 10. 2010   #27
-
0
-

To KIIV : Máš samozřejmě naprostou pravdu, i když si ji v tomto konkrétním případě neměl :)

Nahlásit jako SPAM
IP: 78.80.52.–
dogy20050
Newbie
14. 10. 2010   #28
-
0
-

To liborb :
pomocí retezec[2] si vytáhnu znak a dále sním chci pracovat abych mohl provádět další operace spolu s dalšími vytaženýmy znaky sčítat násobit atak, ale při zápisu mi napíše že unula,ujedna udva není definován ačkoliv už je. Tak nevím kde je chyba.

int unula = 0;
int ujedna = 0;
int udva = 0;
int u;

u = retezec[2];

if ( u == 0) unula++;
if ( u == 1) ujedna++;
if ( u == 2) udva++;
}
soubor.open("zapis.txt",ios::app |ios::out );

soubor << retezec << "\n";

soubor << unula << ujedna << udva <<"\n";
soubor.close();
}

Nahlásit jako SPAM
IP: 90.179.215.–
dogy20050
Newbie
14. 10. 2010   #29
-
0
-

To KIIV :


To liborb [#134551]:
pomocí retezec[2] si vytáhnu znak a dále sním chci pracovat abych mohl provádět další operace spolu s dalšími vytaženýmy znaky sčítat násobit atak, ale při zápisu mi napíše že unula,ujedna udva není definován ačkoliv už je. Tak nevím kde je chyba.

int unula = 0;
int ujedna = 0;
int udva = 0;
int u;

u = retezec[2];

if ( u == 0) unula++;
if ( u == 1) ujedna++;
if ( u == 2) udva++;
}
soubor.open("zapis.txt",ios::app |ios::out );

soubor << retezec << "\n";

soubor << unula << ujedna << udva <<"\n";
soubor.close();
}

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
14. 10. 2010   #30
-
0
-

v prve rade si musis uvedomit, co je cislo a co znak cisla... a nepocitej ze nula, ktera se vyskytuje v retezci je == 0
no kazdopadne prolitni ASCII tabulku..

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
14. 10. 2010   #31
-
0
-

dogy2005 napsal:
, ale při zápisu mi napíše že unula,ujedna udva není definován ačkoliv už je. Tak nevím kde je chyba.



Chyba je mimo jiné v tom, že (pokud dobře vidím tu uzavírací závorku pod těmi podmínkami) je máš jako lokální (asi v nějakém cyklu) a když ten cyklu skončí, tak skončí i "život" těchto proměnných. No a dále, co ti radí KIIV resp. stačí se podívat na ten kód, co jsem ti psal, protože tam není == 0 atd. Btw jsou i jiné datové typy než int, třeba char :)

Nahlásit jako SPAM
IP: 78.80.52.–
dogy20050
Newbie
14. 10. 2010   #32
-
0
-

To KIIV :
Děkuji za spolupráci, Díky Vaším radám to funguje jsem spokojen Děkuji

Nahlásit jako SPAM
IP: 90.179.215.–
dogy20050
Newbie
14. 10. 2010   #33
-
0
-

To liborb :
Děkuji za spolupráci, Díky Vaším radám to funguje jsem spokojen Děkuji

Nahlásit jako SPAM
IP: 90.179.215.–
dogy20050
Newbie
14. 10. 2010   #34
-
0
-

To dogy2005 :

mám další problém když otevřu zápis na disku nevím proč se mi tam zapisují všechny výsledky i zminulosti, které již nejsou aktuální, potřebuji to nějak vynulovat nebo co. Já nevím

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
14. 10. 2010   #35
-
0
-

soubor.open("zapis.txt",ios::app |ios::out ); prostuduj schvalne co dela ios::app

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
14. 10. 2010   #36
-
0
-

To KIIV : no, ale jde o to, že ten soubor vymažu, spustím nový výpočet a v zápisu se objeví i výpočty,které jsem dělal už před dvěma dny.!

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
14. 10. 2010   #37
-
0
-

To dogy2005 : opravdu se podivej co dela ten flag ios::app ..

pokud to mazes rucne tak neni moc sanci, aby se neco takoveho stalo.. snad jen vadnej disk / filesystem / ci system jako takovej

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
14. 10. 2010   #38
-
0
-

To KIIV :
to app jsem pochopil tak, že když si dám cyklus třeba od 0 do 1000 místo čísla tak mi to má vypsat všechny kombinace
pěkně zasebou, a místo toho mi to přepisuje tu původní a zůstane tam jen ta poslední. Tak jak to mám udělat, aby tam zůstaly všechny zapsané ?

Nahlásit jako SPAM
IP: 90.179.215.–
KIIV
~ Moderátor
+43
God of flame
14. 10. 2010   #39
-
0
-

no je to otevreni souboru pro "pripojeni na konec" tj. kdyz do nej zapisujes tak se ti nesmaze to co tam bylo - jak to dela jen ciste write..

nicmene v ramci jednoho programu bych neotviral jeden soubor vicekrat .. je to zbytecne a hodi se to maximalne na nektere druhy logovani

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dogy20050
Newbie
15. 10. 2010   #40
-
0
-

To KIIV :
když si vezmu ten původní PHP
$Tisk = str_pad($Vysledek, $PocetMist, "0", STR_PAD_LEFT);
to znamená str_pad("0", STR_PAD_LEFT) že mi doplní znak O zleva na požadovanou délku retezce.
Příklad, ted mi to hází retezec o délce 10 znaků a já potřebuji délku třeba 12 nebo 15 a ty místa potřebuji doplnit
znakem O zleva tak jaká je proto funkce nebo jak se to dělá?

Nahlásit jako SPAM
IP: 90.179.215.–
m->29+6
Super člen
15. 10. 2010   #41
-
0
-

Skús niečo takéto:

enum sides {STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH};


void str_pad(char *vysledek, int pocetMist, const char znak, enum sides strana) {
unsigned i = 0; // index
int delka = strlen(vysledek);
pocetMist -= delka;

if(pocetMist <= 0) { return; }

if(strana == STR_PAD_LEFT) {
while(delka >= 0) {
vysledek[delka+pocetMist] = vysledek[delka];
delka--;
}
}
else if(strana == STR_PAD_RIGHT) {
vysledek[delka+pocetMist] = '\0';
i = delka;
}
else if(strana == STR_PAD_BOTH) {
// za domácu úlohu ;-)
return;
}
else {
return;
}

while(pocetMist > 0) {
vysledek[i] = znak;

pocetMist--;
i++;
}
}


Nekontroloval som to (neprekladal), ale hádam to pôjde. Ak tam sú chyby tak by si to mal zvládnuť aspoň opraviť. Snáď som to dobre pochopil. A hlavne si musíš dať pozor aby si tam predal dostatočný buffer pre reťazec.

Nahlásit jako SPAM
IP: 83.208.112.–
dogy20050
Newbie
18. 10. 2010   #42
-
0
-

To m->29 :

našel jsem taky tohle
C++
#include <iostream>
#include <iomanip>
int main(){ std::cout << std::setfill('0') << std::setw(9) << std::fixed << std::setprecision(3) << 7.125 << std::endl; return 0;}

co myslíš?

Nahlásit jako SPAM
IP: 90.179.215.–
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, 36 hostů

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ý