» »

Kako bi naredil en ultra simple programček?

Kako bi naredil en ultra simple programček?

AtaStrumf ::

Rad bi naredil en simple progi, ki bi preračunal FSP (frames per second) v minute/ure/sekunde, odvisno ot tega kolk FPS (PAL/NTSC/Movie,...) je. Sej verjetno že obstaja kak taka stvar, čeprav je jaz tako na hitro nisem najdu, samo itak bi rad videl kako se da vsaj tak simple programček napisat. Gre čist enostavno za deljenje, množenje, odštevane, seštevanje, pa en enostaven GUI, a-la MS Calculator, da bi imel.

Imel bi tri polja:
1) vneseš frame number
2) izbereš iz seznama ali vneseš FPS
3) izpiše HH:MM:SS

Kaj rabim, da to naredim, pa naj bo čim bolj enostavno.

sid_dabster ::

Za to sploh ne rabis programa. Zadostujejo ze nalednji trije izrazi (celostevilska deljenja in moduli):

#include <stdio.h>

int main()
{
	int frm,fps;
	printf("Enter number of frames\n");
	scanf("%d", &frm);
	printf("Enter frame rate (frames per second)\n");
	scanf("%d", &fps);
	printf("\n ->Total movie length: %d:%d:%d", (frm/fps)/3600, ((frm/fps)%3600)/60, ((frm/fps)%3600)%60);
	return 0;
}


[edit - koda - vsc]
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)

Zgodovina sprememb…

  • spremenil: Vesoljc ()

CCfly ::

AtaStrumf ::

O.K. zdaj pa eno čist glupo vprašanje: Kako iz te kode naredim program :8)?

Brilko ::

Prevedaš ga ter povežeš, da dobiš .exe datoteko. Za to uproabi kak prevajalnik oz. kar razvojno programsko okolje, ki compila in linka kar s klikom na en gumb. ;)

AtaStrumf ::

In to bi bil recimo ...

CCfly ::

Katerikoli ANSI kompatibilen prevajalnik za programski jezik C.
DJGPP
MingW
Borland

sid_dabster ::

Thanx, CCfly. Uporabno :)
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)

alesrosina ::

jst sm za c v winsih uporabil kar LCC. Dokaj simpl zadevca.

AtaStrumf ::

Potem ko sem prebral cel C++ članek, sem na koncu najdu tist kar sem rabil: dev-cpp :). Pol je pa ful simple. Sem prej probal še z LCC pa sem se zgubil :D.

Koda deluje, ampak samo za cela števila FPS-jev. Sem int nadomestil z float pa ni delal :8). Kako je treba zdaj to popravt za tri mestne decimalke?

CCfly ::

V printf funkciji moraš namesto %d pisati %f.

AtaStrumf ::

Nope, ne dela! Ven meče čist čudne cifre :'(.

speed machine ::

Poskusi z tem:

int main()
{
int frm,h,m,s;float fps,h2,m2;
printf("Enter number of frames:\n");
scanf("%d", &frm);
printf("Enter frame rate (frames per second):\n");
scanf("%f", &fps);
h=(frm/fps)/3600;
h2=((frm/fps)/3600)-h;
m=h2*60;
m2=(h2*60)-m;
s=m2*60;
printf("\n ->Total movie length: %d:%d:%d.\n",h,m,s);
system("PAUSE");
}
//

AtaStrumf ::

Noče skompilirat al kako se temu reče.

h=(frm/fps)/3600; -- assigment to 'int' from 'float'

m=h2*60; -- assigment to 'int' from 'float'

s=m2*60; -- assigment to 'int' from 'float'

system("PAUSE") -- system je undeclared

Sem naredil še eno verzijo programčka po napotkih v članku, samo isto dela samo celoštevilčne, s floati pa noče delat ;(.

Sem hotel dat kodo not, sam mi za vsak drek teži, da je neveljaven HTML bla, bla. Zakaj noče iti noter vsaj kot običan text???

Pa zakaj %60 recimo noče delat če imaš floate?

AtaStrumf ::

Evo koda s pomočjo Front Page-a:

// omogočimo uporabo V/I tokov
#include <iostream>

float sekundefull(float FrameNo, float FRT)
{
return(FrameNo / FRT);
}

int minute(int FrameNo, int FRT)
{
return(FrameNo / FRT %3600 /60);
}

int sekunde(int FrameNo, int FRT)
{
return(FrameNo / FRT %60);
}

int ure(int FrameNo, int FRT)
{
return(FrameNo / FRT /3600);
}
// funkcija main
int main()
{
// uporabljamo imenski prostor "std"
using namespace std;

// potrebujemo tri spremenljivke
int FrameNo, FRT, Rezultat;

// pozdrav
cout << "Program za preracunavanje FPS v Cas!" << endl;

// vpisujemo prvo stevilo
cout << "Vnesite stevilo slik, ter pritisnite ENTER:";
cin >> FrameNo;

// vpisujemo drugo stevilo
cout << "Vnesite stevilo slik na sekundo (FPS), ter pritisnite ENTER:";
cin >> FRT;

// ure
Rezultat = ure(FrameNo, FRT);
cout << "h= " << Rezultat << endl;

// minute
Rezultat = minute(FrameNo, FRT);
cout << "min= " << Rezultat << endl;

// sekunde
Rezultat = sekunde(FrameNo, FRT);
cout << "sec= " << Rezultat << endl;

// vrnemo nič in pavza
cout << "Pritisnite ENTER za izhod..." << endl;
cin.ignore();
cin.get();
return(0);
}



Pa ne se smejat kakšnim začetniškim gluparijam :8).

Vesoljc ::

za prilimat kodo uporabi tag-e "st.koda c" in "\st.koda c", v kvadratnih oklepajih...
Abnormal behavior of abnormal brain makes me normal...

AtaStrumf ::

Evo še celo deluje :D:

// omogočimo uporabo V/I tokov
#include <iostream>

float sekundefull(float FrameNo, float FRT)
{
     return(FrameNo / FRT);
}

int minute(int FrameNo, int FRT)
{
     return(FrameNo / FRT %3600 /60);
}

int sekunde(int FrameNo, int FRT)
{
     return(FrameNo / FRT %60);
}

int ure(int FrameNo, int FRT)
{
     return(FrameNo / FRT /3600);
}
// funkcija main
int main()
{
     // uporabljamo imenski prostor "std"
     using namespace std;

     // potrebujemo tri spremenljivke
     int FrameNo, FRT, Rezultat;      

     // pozdrav
     cout << "Program za preracunavanje FPS v Cas!" << endl;

     // vpisujemo prvo stevilo
     cout << "Vnesite stevilo slik, ter pritisnite ENTER:";
     cin  >> FrameNo;

     // vpisujemo drugo stevilo
     cout << "Vnesite stevilo slik na sekundo (FPS), ter pritisnite ENTER:";
     cin  >> FRT;

     // ure
     Rezultat = ure(FrameNo, FRT);
     cout << "h= " << Rezultat << endl;

     // minute
     Rezultat = minute(FrameNo, FRT);
     cout << "min= " << Rezultat << endl;
     
     // sekunde
     Rezultat = sekunde(FrameNo, FRT);
     cout << "sec= " << Rezultat << endl;
     
     // vrnemo nič in pavza
     cout << "Pritisnite ENTER za izhod..." << endl;
     cin.ignore();
     cin.get();
     return(0);
}


Upam, da je to sedaj malo bolj berljivo, da mi lahko kdo razloži v čm je problem, da noče računat s decimalkami.

Vesoljc ::

kakšne decimalke, če uporabljaš celoštevilčni tip int?
Abnormal behavior of abnormal brain makes me normal...

AtaStrumf ::

FPS ne sme biti int, ker so tudi 29,97 (NTSC), 26,976 itd., samo če popravim na float mi pol noče skopilirat, ker %60 recimo ne more izvajat na floatih, vsaj kakor sem jaz to zastopil.

Zdaj sem si za silo naredil programček v Excelu, samo ni tolk cool kakor v DOS-u :D. Na kakšen GUI si pa sploh več ne upam niti pomisliti, glede na to da me že konzolna verzija tolk zeza.

jype ::

To je pa res overkill, uporabljat C ali C++ za tako nalogo.

http://www.python.org/

Pa se na vseh sistemih, ki jih podpira Python bo delalo: win32, MacOS, MacOS X, Linux, *BSD, Solaris, HP-UX, OpenVMS in se kaj :)

#!/usr/bin/env python

frames = float(raw_input('Stevilo slik (npr 149234): '))
fps = float(raw_input('Stevilo slik na sekundo (npr. 29.97): '))

sec = frames/fps
hours = sec / 3600
minutes = sec % 3600 / 60
seconds = sec % 60

print 'Cas predvajanja filma: %d:%02d:%02d' % (hours, minutes, seconds)

Zgodovina sprememb…

  • spremenilo: jype ()

speed machine ::

jype: sam če ti dobiš v sec decimalno številko, kako boš pol uporabu %, ki je namenjen ostanku po celoštevilskemu deljenju. Sam vprašam, ker men to v C-ju ni hotl zagrabit.

Noče skompilirat al kako se temu reče.


Ni ti ga hotl skompilirat zato ker si ga kompiliru z prevajalnikom za c++. Program pa je pisan v C-ju. Men ga čisto lepo skompilira v C-ju.

No tak pa je potem skompiliran program.
//

AtaStrumf ::

speed machine mogoče se ti skompilira, ampak dela pa čist isto kot int verzija. Zaokroži navzdol. Vstavi noter 23 in pa 23.976 FPS pa boš videl, da dobiš isti rezultat.

Bom probal še z Pythonom.

speed machine ::

Ja ne deluje čist kot int, zato ker ti včasih zaokroži. To se dogaja zarad računanja z decimalkami, in pri večkratnem računanju se napake seštevajo. Tak da pri majhnem številu frame-ov se opazi napaka v sekundi ali pa dveh. Sam če pa računaš za nek film, ki ima kakšno uro ali več, pa se po moje tista 1s +- ne bo tolk poznala.

Drgač pa sem probu:
1000frame-ov 23FPS=0:0:43

1000frame-ov 23.976FPS=0:0:41

Hey nobody's perfect.:D
//

jype ::

V Pythonu float % int cisto ok deluje, ker Python ni nizkonivojski jezik, tako kot sta C in C++, ampak visokonivojski jezik.

Python ve, da ce zelis modulo, zelis modulo. Pac pred operacijo ustrezno pretvori tip spremenljivke v najprimernejsega za tako operacijo.

Primeri:

>>> 3.0 % 2
1.0
>>> 3.2 % 2.0
1.2000000000000002
>>> 3 % 2
1
>>> 3 % 0.16
0.11999999999999994

V tretjem primeru je Python vrnil int, v ostalih pa float, kar je logicno, saj smo le v tretjem primeru racunali samo s podatki tipa int.

Ravno zato je program v Pythonu (ali kakem podobnem visokonivojskem jeziku) bistveno krajsi, razumljivejsi in hitreje napisan, posledicno pa ga je bistveno lazje debugirati.

Vse to ima svojo ceno: performancno se Python ne more meriti z jeziki kot so C, C++ ali recimo Java, vendar lahko kriticne dele kode enostavno napisemo v katerem od teh jezikov. Pri taki matematiki, kot jo zahteva vas program pa mislim, da ni razloga za kakrsnokoli optimizacijo.

Poskusite, poberite Python in pozenite python test.py, v test.py pa skopirajte moj program. Poskusite najt kaksen bug (ce ne vpises stevila kot vhodni podatek program jasno odleti, ce koga zanima kako se temu izogne pa naj napise, pa bom povedal).

Aja, se to: Python je Interpretiran jezik (programov v Pythonu ne prevajamo, podobno kot ne prevajamo php, asp, perl, ruby, smalltalk ali lisp kode).

Zgodovina sprememb…

  • spremenilo: jype ()

AtaStrumf ::

Pri meni vrže tudi za 1000 frejmov obakrat isto. V čem je pa zdaj fora? A je z mojim DOS-om kaj narobe :)?

speed machine ::

jype: hvala za razlago.

AtaStrumf: dej piko pri 23.976, ne vejice(23,976). Pol pa bi mogl delat.
//

AtaStrumf ::

jype po #!/usr/bin/env python vrstici predvidevam, da se tako napiše v linux-u, kaj pa v winsih? Če naredim tako kot si napisal se mi samo odpre in zapre. Sem pa skopiral v shell in shranil kot test.py, morda sem ga že tu polomil.

AtaStrumf ::

Ja pika oz. vejica je bila kriva. A lahko skopiraš še source? saj veš 'st.koda c' '/st.koda c' v oglatih oklepajih. pa s katerim kompilerjem si naredu progi.

speed machine ::


#include<stdio.h>

int main()
{
int frm,h,m,s;float fps,h2,m2;
printf("Enter number of frames:\n");
scanf("%d", &frm);
printf("Enter frame rate (frames per second):\n");
scanf("%f", &fps);
h=(frm/fps)/3600;
h2=((frm/fps)/3600)-h;
m=h2*60;
m2=(h2*60)-m;
s=m2*60; 
printf("\n ->Total movie length: %d:%d:%d.\n",h,m,s);
system("PAUSE");
}


Kompilirano je bilo z DEV-C++.
//

jype ::

AtaStrumf:

Na windows se to ne da naredit lepo, zato shranis to v nek file, ki ga poljubno poimenujes. Jaz sem predlagal ime test.py.

Potem pozenes cmd, not pa napises:

c:\nekje> python test.py

In bi moralo delovat (ce si prej instaliral Python za Windows).

AtaStrumf ::

OK, kot si rekel speed machine imaš pri Dev-C++ možnost izbrat C in C++ in če izbereš C se pol normalno skompilira. Nisem vedel, da je taka razlika.

Tudi Phyton sem usposobil. Kar direkt copy/paste v test.py zaženeš iz cmd-ja in dela. Škoda edino da ni kake pavze na koncu, ker te če ne greš prek cmd-ja ven vrže preden sploh vidiš rezultat :D.

Zdaj bi rad pa samo še eno zankico na koncu, ki te vpraša a bi rad še enkrat računal ali je to konec. Kako pa to naredim?

jype ::

Hja, od programerjev se pricakuje, da se malo znajdejo, ne? :)

raw_input('Pritisni Enter') v bistvu dovoli, da vneses karkoli, ampak konec koncev caka, da pritisnes enter. Ce rezultata ne rabis ga pac ne shranis v nobeno spremenljivko in to je to.

Sicer pa takole

#!/usr/bin/env python

while True:

frames = float(raw_input('Stevilo slik (npr 149234): '))
fps = float(raw_input('Stevilo slik na sekundo (npr. 29.97): '))

sec = frames/fps
hours = sec / 3600
minutes = sec % 3600 / 60
seconds = sec % 60

print 'Cas predvajanja filma: %d:%02d:%02d' % (hours, minutes, seconds)

answer = None
while answer not in ('d', 'n'):
answer = raw_input('Se enkrat (D/N)?').lower()

if answer == 'n':
break

AtaStrumf ::

He, he moja računalniška izobrazba je tista malenkost, ki smo jo imeli v srednji šoli (za farmacijo), torej glih tolk, da če me daš v orenk hipnozo bi se mogoče kaj spomnil, samo to je bilo 8 let nazaj, vmes je pa BASIC, al karkoli smo se že učili takrat, že orenk zastarel, moj spomin pa tudi ni glih vodotesen :D.

Evo tolk, da smo si glede tega na jasnem, če bi pa kdo rad naredil opioidni analgetik iz zdravila proti kašlju, ali pa iz kakšne rastlince izoliral takšne ali drugačne substance pol se pa pri meni oglasite.

Zdaj rabim pa samo še zanko za C.

CCfly ::

for(inicializacija spremenljivk;pogoj izstopa;inkrementacije) {}
while(pogoj izstopa) {}
do { } while(pogoj izstopa);

jype ::

V jeziku C je zanka zelo podobna:


#include <stdio.h>
#include <math.h>

int main(void) {

char ans = 0;
float fps = 0.0;
long frames = 0L;
float fsec = 0.0;
long lsec = 0L;
long hours = 0, minutes = 0, seconds = 0;

while (1) {

printf("Vnesi FPS (npr. 29.97): ");
scanf("%f", &fps);

printf("Vnesi stevilo slicic (npr. 198234): ");
scanf("%ld", &frames);

fsec = frames / fps;
lsec = lroundf(floorf(fsec));
hours = lsec / 3600;
minutes = (lsec % 3600) / 60;
seconds = lsec % 60;

printf("Trajanje filma je %d:%02d:%02d\n", hours, minutes, seconds);

while (1) {
if (ans != '\n') printf("Se enkrat (D/N)? ");
scanf("%c", &ans);
if (ans == 'd' || ans == 'n' || ans == 'D' || ans == 'N') {
break;
}
}

if (ans == 'n' || ans == 'N') break;

}

return 0;

}

AtaStrumf ::

Fuuuuuul hvala vsem! Uspešno smo prišli do konca projekta, resda ni windows aplikacija z GIU-jem, samo tudi tole je bilo vseeno prav zanimivo. Z veseljem pričakujem drugi del članka C++, da si par stvari, ki me zdele matrajo razjasnim. Mogoče kje na netu najdem kak e-book o C-ju, samo če je preveč te mine volja :(.

Kljub vsemu se ne morem znebiti občutka, da bi se dalo tole še enostavneje naredit in to z GUI-jem in Win aplikacijo. Nekje sem slišal o drag and drop programiranju. Osebno sem v forrest&trees-u ene 100 let nazaj naredil eno šolsko aplikacijo, k si delal vnosna polja, padajoče sezname, gumbe itd. pa je bilo dost simple. Sigurno obstaja nekaj takega tudi za win-se ali se motim.

OwcA ::

Python zna tudi to ;)

Drugače si poglej bodisi Delphi, bodisi Visual Basic, oboje je RAD in zelo intuitivno.
Otroška radovednost - gonilo napredka.

speed machine ::

Si nism mogu kej da ne bi naredu tega programčka še kot win aplikacijo.

Zgleda da mam preveč časa.:))
//

AtaStrumf ::

Ej speed machine ti si care, kako si to naredil? Bom sčekiral še Delphi in Visual Basic, samo da jih najdem.

sid_dabster ::

Poglej si Delphi/C++ Builder (priporocam), ne pa tudi Visual Basic, ker bos pri slednjem dobil zelo slabe programerske navade.
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)

speed machine ::

kako si to naredil?


To je blo narejeno z borland c++ 6 builder-jem. Sam sem še čisti začetnik v njem. Smo mel nek tečaj v šoli, sam je blo od predvidenih 60h, ga sam 10h. Pol pa je blo konc šolskega leta.:D
//

AtaStrumf ::

A mi pošlješ kodo na e-mail: settled@email.si, da mal sčekiram zadevo -- hvala -- drugače se moram pa zaenkrat malo bolj posvetit študiju (rok so mi prestavili za 3 dni naprej ;((), tako da takele zezancije začasno odpadejo, se pa spet kaj tipkamo po izpitu.

kihc ::

speed machine al pa Ata, bi vama blo zlo odveč še meni poslat source od tega programa na mejl. Rad bi vidu kako se dela tele gumbe & stuff v c-ju.

HVALA
x

CCfly ::

Tiste gumbe in stuff se dela tako, da uporabiš funkcije ustrezne knjižnice, ki zna narediti gumbe & stuff.

AtaStrumf ::

Jaz je nimam, ker mi je Speed Machine ni poslal, ampak itak nimam več časa za to, tako da za zdaj ni važno, čeprav, če se spomniš speed machine le pošlji.

speed machine ::

Pr tem programu ni sam ena datoteka z kodo, ampak je cel kup manjših datotek, ki jih ustvari program. In zgleda da so vse vezane na moj disk, ker če jih prestavim v drugo mapo, ne delujejo več(sem se takrat ubadal z tem, ko je atastrumf prosu za kodo). Potem pa nism več mel časa, da bi se ukvarjal z tem. Tak da dol potegnte borland, in je čist simpel potem ustvarjat gumbe.
//

Vesoljc ::

mislm halo...

celo temo, ki se imenuje C++ povezave imate v oddelku Programiranje...
ce tam ne najdete kako se dela gumbe & stuff, pol vam ni pomoci... zal!
Abnormal behavior of abnormal brain makes me normal...

kihc ::

Vesolc - za popolnega zacetnika je en tak programček vreden veliko več.
x

Vesoljc ::

mas prav, vse tiste strani, ki ponujajo razne tutoriale, nikoli, ampak res nikoli ne dajo zraven kakšnega primera... :\
Abnormal behavior of abnormal brain makes me normal...

AtaStrumf ::

Kot prvo je tak način učenja bolj zanimiv/zabaven, kot drugo zakaj si pol napisal članek, če pa je itak že vse v knjigah in milijonih vodičev na netu. Tudi sam sem že zloadal najmanj 3 vodiče po C++ samo tist je too much. Tako je dost bolj. Trial/error, reverse engineering ;).


Vredno ogleda ...

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

[C++] vprašanja (strani: 1 2 3 4 5 6 7 8 9 )

Oddelek: Programiranje
44727262 (11808) aljazko1995
»

C# in slika iz kamere

Oddelek: Programiranje
61341 (1225) ql000
»

[C#] IndexOutOfRange Exception

Oddelek: Programiranje
81293 (1138) ql000
»

[C#] Sesutje aplikacije

Oddelek: Programiranje
111606 (1441) Jean-Paul
»

[c] char zadeva

Oddelek: Programiranje
222245 (2043) TheCyborg

Več podobnih tem