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";
Fórum › C / C++
Převod s PHP na C++
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
neni to samozrejme cely.. chce to ten hlavni cyklus co naplni pokazdy cislo (hlavne nepouzit primo cislo jinak mas nekonecnej cyklus) a samozrejme odradkovani
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
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;
}
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;
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)
;
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..
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
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..
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");
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++;
}
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
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
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();
}
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();
}
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..
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 :)
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
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é ?
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
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á?
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.
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
MPDF - převod HTML,PHP stránky do PDF — založil ZAJDAN
Přenos proměnných z PHP stránky do dvou jiných PHP stránek současně — založil remmidemmi
PHP pre velke projekty, alebo ako na PHP profesionalne ? #2 — založil Smokie
PHP pre velke projekty, alebo ako na PHP profesionalne ? — založil greppi
Nette ako najlepší PHP framework? Alebo čisté PHP? — založil stif
Moderátoři diskuze