Programiranje

Programiranje u C-u - od svega pomalo

rustweaver uto 14.9.2010 16:04
mbaksa kaže...

Pod Linuxom cini se da boje mozes mijenjati koristeci odredjenu escape sekvencu kod ispisa tekst: http://www.linuxquestions.org/questions/programming-9/changing-text-color-in-c-172930/

Probao sam to pod Windowsima u DevC++-u, ali ne radi.

 

Moglo se to i u cistom DOS-u nekoc, koristeci ansi.sys driver. Windowsi sa NT jezgrom ne emuliraju dovoljan dio DOS-a da bi to funkcioniralo, a ansi.sys driver se vec odavno ne isporucuje sa microsoftovim operativnim sustavima.

1domagoj1 uto 14.9.2010 16:42
mbaksa kaže...
1domagoj1 kaže...
rustweaver kaže...

...

Nisi procitao moj post s razumijevanjem - eksplicitno sam pojasnio to sto si naknadno pitao:

...

Khm, stvar je u tome što nisam uopće pročitao :). Samo preletio (očito nedovoljno). NHF, sve je ok sad.

beno101 pon 3.1.2011 09:59

Evo pa da oživim temu.
Kako se u c++u napravi kao u BASICu ovo:

RANDOMIZE TIMER

X=INT(RND*10)

Znam da donja linija izgleda ovako:

int x=rand();

Ali me zanima kako naredba RANDOMIZE TIMER izgleda u C++u?

Hvala! ;)

kajmak pon 3.1.2011 10:39
beno101 kaže...

Evo pa da oživim temu.
Kako se u c++u napravi kao u BASICu ovo:

RANDOMIZE TIMER

X=INT(RND*10)

Znam da donja linija izgleda ovako:

int x=rand();

Ali me zanima kako naredba RANDOMIZE TIMER izgleda u C++u?

Hvala! ;)

srand( (unsigned int) time( NULL ) );

Trebas samo "seed"-ati rand( ) funkciju, a cesto se to radi upravo vremenom.
rustweaver ned 16.1.2011 15:44
Joco55 kaže...
beno101 kaže...

Trenutno u svojim igrama koristim GOTO naredbu..

Ima li neka bolja?

ZZ

Koristiš while, switch, if-else...

Ako koristi GOTO onda vjerojatno vec i koristi neke komande za uvjetno grananje. Ono sto njemu treba je restrukturiranje kôda i promjena nacina razmisljanja.

 

Beno101 daj neki primjer gdje bi inace koristio GOTO i pokazat cemo ti kako da napravis to isto bez GOTO-a

beno101 ned 16.1.2011 17:07
rustweaver kaže...
Joco55 kaže...
beno101 kaže...

Trenutno u svojim igrama koristim GOTO naredbu..

Ima li neka bolja?

ZZ

Koristiš while, switch, if-else...

Ako koristi GOTO onda vjerojatno vec i koristi neke komande za uvjetno grananje. Ono sto njemu treba je restrukturiranje kôda i promjena nacina razmisljanja.

 

Beno101 daj neki primjer gdje bi inace koristio GOTO i pokazat cemo ti kako da napravis to isto bez GOTO-a

 

eto:

 

#include <cstdio>

#include <iostream>

using namespace std;

int main () {

int x=0;

cin >> x;

if (x==1) goto igra;

if (x==2) goto kraj;

igra:

printf ("IGRA");

kraj:

printf ("KRAJ");

return 0;

}

 

rustweaver ned 16.1.2011 17:15
beno101 kaže...

 

eto:

 

#include <cstdio>

#include <iostream>

using namespace std;

int main () {

int x=0;

cin >> x;

if (x==1) goto igra;

if (x==2) goto kraj;

igra:

printf ("IGRA");

kraj:

printf ("KRAJ");

return 0;

}

 

Ovako to napravi

 

#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
    int x=0;
    cin >> x;
    if (x==1)
    {
        printf("IGRA");
    }
    if (x==2)
    {
       printf("KRAJ");
    }

    return 0;
}

rustweaver ned 16.1.2011 17:37
beno101 kaže...

A zašto ne bi koristio GOTO, mislim, što je loše?

Zato sto veoma ruzno izgleda i tesko je pratiti kad se stvari zakompliciraju. Kôd doslovce skace s jednog mjesta na drugo. Vidjet ces kad budes napisao nesto malo kompliciranije, goto vamo, goto tamo, pa goto opet natrag, pa goto izmedu ona prva dva, pa goto natrag, zavrti ti se u glavi od svega toga...

slobo14 ned 16.1.2011 17:49
rustweaver kaže...
beno101 kaže...

 

Ovako to napravi

 

#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
    int x=0;
    cin >> x;
    if (x==1)
    {
        printf("IGRA");
    }
    if (x==2)
    {
       printf("KRAJ");
    }

    return 0;
}

a mogao bi i sa switch naredbom

 

#include <cstdio>

#include <iostream>

using namespace std;

 

int main()

{

int x = 0;

cin >> x;

switch(x)

{

     case 1:

             printf("IGRA");

             break;

     case 2:

             printf("KRAJ");

             break;

    default:

             break;

}

 

return 0;

}

beno101 uto 18.1.2011 18:14

Pozdrav ekipa!

Došao sam do male prepirke sa mojim učiteljem iz tehničke kulture.

Ja robotičar i nadam se budući programer sam prisiljen "programirati" u RoboPro-u, što ja ne smatram programiranje već crtanje dijagrama toka.

Možete li mi molim vas reći postoji li mogućnost da robota upravljam(na USB interface) pomoću C/C++a?

Hvala!

1domagoj1 uto 18.1.2011 18:27
beno101 kaže...

A zašto ne bi koristio GOTO, mislim, što je loše?

Na FER-u se za korištenje goto naredbe momentalno pada ispit. Eventualno, ali eventualno gdje bi ti goto mogao proći je višestruki break (iako se i tu petlje daju tak složiti da breakaju bez goto-a). Goto je nešto što preziru svi programeri (i nešto što bi svatko ko se smatra programerom trebao prezirati). To ti je ono, ultimativno zlo u programiranju (bar u C-u). Na netu imaš cijele eseje i romane zašto je goto loš i zašto ga ne koristiti. Uglavnom, nemoj ga koristiti osim u nužnom zlu. Imaš for, while, do-while od petlji, te if, switch što se tiče uvjetnog grananja. S tim možeš sve napraviti.

 

Što se tiče programiranja robota. Daj malo više informacija? Kak se to programira taj robot? Staviš mu čip u programator ili? Što fali RoboPro-u? I dijagrami toka su programiranje! Niti jedan program se ne ide raditi bez razrade dijagrama toka i plana što točno treba raditi. Smatram da je bolje da se RP-a držiš, jer pravo, čisto programiranje robota od nule, ima tu previše posla. I asemblera.

beno101 uto 18.1.2011 18:29
1domagoj1 kaže...
beno101 kaže...

A zašto ne bi koristio GOTO, mislim, što je loše?

Na FER-u se za korištenje goto naredbe momentalno pada ispit. Eventualno, ali eventualno gdje bi ti goto mogao proći je višestruki break (iako se i tu petlje daju tak složiti da breakaju bez goto-a). Goto je nešto što preziru svi programeri (i nešto što bi svatko ko se smatra programerom trebao prezirati). To ti je ono, ultimativno zlo u programiranju (bar u C-u). Na netu imaš cijele eseje i romane zašto je goto loš i zašto ga ne koristiti. Uglavnom, nemoj ga koristiti osim u nužnom zlu. Imaš for, while, do-while od petlji, te if, switch što se tiče uvjetnog grananja. S tim možeš sve napraviti.

 

Što se tiče programiranja robota. Daj malo više informacija? Kak se to programira taj robot? Staviš mu čip u programator ili? Što fali RoboPro-u? I dijagrami toka su programiranje! Niti jedan program se ne ide raditi bez razrade dijagrama toka i plana što točno treba raditi. Smatram da je bolje da se RP-a držiš, jer pravo, čisto programiranje robota od nule, ima tu previše posla. I asemblera.

Šta više informacija?

U BASICU to kolega radi:

OUT 888,16

OUT 888,8

itd...

 

Mene zanima dali je to moguće napravit u Cu?

1domagoj1 uto 18.1.2011 18:39

Koje informacije?! LOL, pa sve! Koji čip, kakvo adresiranje, memorijski sustav, protočne arhitekture? Vanjski sklopovi? UART, GPIO? Kakav robot uopće? Robotska ruka? Što točno?

 

Super. Šta ti je to 888,16? Koordinate?


EDIT: Aha, malo sam proguglal, tu OUT naredbu. Kolko sam skužil šalje na paralelni port tu adresu neku, nešto nemam pojma. Kolko ja znam u C-u nema ničeg sličnog, trebal bi neki API srediti ili naći negdje library pa includeat. U asembleru bi znal to napraviti, ako je na ARM-u, možda i na kojem drugom procesoru, samo bi dokumentaciju trebal proučiti...

MrBlc uto 18.1.2011 20:52
rustweaver kaže...
beno101 kaže...

 

eto:

 

#include <cstdio>

#include <iostream>

using namespace std;

int main () {

int x=0;

cin >> x;

if (x==1) goto igra;

if (x==2) goto kraj;

igra:

printf ("IGRA");

kraj:

printf ("KRAJ");

return 0;

}

 

Ovako to napravi

 

#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
      int x=0;
      cin >> x;
      if (x==1)
      {
              printf("IGRA");
      }
      if (x==2)
      {
            printf("KRAJ");
      }

      return 0;
}

Zapravo, ova dva koda neće dati isti rezultat. U prvom će u slučaju da je x = 1 ići na igra, ispisati IGRA, pa će se program od tu nastaviti izvršavati i ispisati još i KRAJ. Isto tako, ako je X različit i od 1 i od 2, ispisati će se obe riječi.

Identičan program bi bio:

 

#include <cstdio>#include <iostream>using namespace std;int main(){  int x=0;  cin >> x;  if (x!=2)  {      printf("IGRA");  }  printf("KRAJ");  return 0;}

rustweaver uto 18.1.2011 21:24
beno101 kaže...

Šta više informacija?

U BASICU to kolega radi:

OUT 888,16

OUT 888,8

itd...

 

Mene zanima dali je to moguće napravit u Cu?

Naravno da je moguce, koristis inline assembly u C-u. Ali ima jedna kvaka, Windowsi s NT jezgrom ne dozvoljavaju direktan pristup hardwareu obicnim aplikacijama. Morao bi napisati driver koji bi radio na ring0 razini zajedno s kernelom.

 

Primjer inline assemblija za GCC koji salje broj 16 na port 888:

 

int main()
{
    short port=888;
    char data=16;

    __asm__("movw %0, %%dx;
             movb %1, %%al;
             outb %%dx, %%al"
             :
             : "g"(port) , "g"(data)
             : "eax", "edx");

    return 0;
}

Nazalost, GCC koristi nadasve odvratnu AT&T sintaksu koju ne znam bas dobro, pa je moguce da sam ovdje nesto i fulao...

 

EDIT: sad vidim da si spominjao i USB programiranje. E za to ce ti, izmedu ostalog, trebati i poznavanje rada USB chipseta i signalizacije, nije to bas malo posla. Pretpostavljam da bi dio USB komunikacije u toj cijeloj prici uvelike nadmasio kolicinu kôda samog robota. Ako to u tim godinama mozes izvesti, ja bih na tvom mjestu ozbiljno razmislio o radu na linux driverima. FOSS zajednici veoma trebaju takvi genijalci...

rustweaver uto 18.1.2011 21:33
MrBlc kaže...

Zapravo, ova dva koda neće dati isti rezultat. U prvom će u slučaju da je x = 1 ići na igra, ispisati IGRA, pa će se program od tu nastaviti izvršavati i ispisati još i KRAJ. Isto tako, ako je X različit i od 1 i od 2, ispisati će se obe riječi.

Identičan program bi bio

Ocito mi je nesto promaklo... {#}

nisam ni gledao sto tocno radi, samo sam pretpostavio sto zeli postici.

slobo14 sri 19.1.2011 00:12
beno101 kaže...

Pozdrav ekipa!

Došao sam do male prepirke sa mojim učiteljem iz tehničke kulture.

Ja robotičar i nadam se budući programer sam prisiljen "programirati" u RoboPro-u, što ja ne smatram programiranje već crtanje dijagrama toka.

Možete li mi molim vas reći postoji li mogućnost da robota upravljam(na USB interface) pomoću C/C++a?

Hvala!

Hehe... i ja sam se bavio sa robo pro cijelo prvo polugodiste ove skolske godine, pisao sam program i funkcije za automatsko upravljanje dizalice i senzorsko-automatsko kretanje vozila i onda sve to smo na rucno upravljanje napravili lemljenjem obicnih tipki na plocicu i pravili smo daljinski za dizalicu i onda smo od palice za pc napravili upravljac za vozilo i to sve sam morao "isprogramirati" u robo pro sucelju koji podrzava samo slicice tj dijagram toka, a ne i varijable ili bilo sta kompliciranije pa sam i sam trazio neko resenje ali dok ga nisam nasao vec sam sve isprogramirao u tom programu..... ali evo da nepricam vise Off topic evo ti jedan link do njihove stranice na kojem imas razlicite .dll i biblioteke za koristenje sa raznim programskim jezicima, nezz da li ce ti to pomoci(znam da meni nije) ali kad te to vec zanima evo link. Tu moras jos i da nadjes za specifican kontroler njegovu biblioteku, a ako nema pogledaj tu oko te stranice mora biti jos negdje za download datoteka samo nezz gdje....{#}

beno101 čet 27.1.2011 21:06

Pozdrav ekipa!

Baš sam rješavao neki zadatak, tj. više njih...

Prva 2 sam riješio bez problema, ali je naravno tu i treći...

 

Princeza se jednog dana šetala kraj jezera i ugledala svog omiljenog žapca kako skače izmeñu četiri lopoča.
Odmah ga je poželjela poljubiti da ga pretvori u kraljevića. Suočena je s problemom, ona želi do žapca stići
što je moguće prije, ali ne zna do kojeg lopoča treba plivati jer on stalno skače s jednog na drugi.
Promatrajući s ruba bare princeza je uočila da žabac skače meñu lopočima redom od prvog prema
zadnjem pa zatim ponovno nazad prema prvom (1, 2, 3, 4, 3, 2, 1, 2, 3...). Nju zanima gdje će se žabac
nalaziti nakon T skokova da bi mogla što prije stići do njega. Zamolila je vas da joj pomognete pronaći
izgubljenu ljubav, a tko može odbiti lijepu princezu...
Ulazni podaci:
− cijeli broj T (0 ≤ T ≤ 1000), broj skokova koje je žabac napravio.
Izlazni podaci:
− prirodan broj L, redni broj lopoča na kojem se žabac nalazi nakon T skokova.

 

Ne tražim da ga riješite već pomoć pri rješavanju..

Nez kako da riješim ovo trenutno mjesto, tj. trenutno lopoč...

Hvala na bilo kakvoj pomoći!

Luuka pet 28.1.2011 22:24

zapravo je dosta jednostavno :D

polje=[ 1 2 3 4 3 2]

 

L=polje[T%6]

 

Kako sam došao do toga?

 

Vidimo da se žabac kreće stalno isto, i da stalno radi ciklus 1 2 3 4 3 2 i onda ide ispočetka. To stavimo u polje i vidimo da ono što će dati T/duljina_ciklusa neće utjecati ne njegov položaj, to samo određuje koliko puta je prošša 1 2 3 4 3 2. Ono što nas zanima su oni koraci koji su preostali, a to je T%6. Polje smo napravili tako da ako je žabac napravio k skokova, nalazi se na polje[k] (k=0,1,..,5 što su jedini ostaci pri dijeljenju sa 6)

 

Mislim da bi trebalo bit ok :D

beno101 uto 8.2.2011 17:21

 

Pozdrav svima!

Može li netko molim vas nać grešku u ovom kodu?

HVALA!

#include <cstdio>
#include <cstring>
int main () {
char r1[10];
char r2[10];
char r3[10];
char r4[10];
char r5[10];
char tipka[10];
scanf ("%s %s %s %s %s",r1,r2,r3,r4,r5);
if (r4="#...#") puts (tipka, "KVADRAT");
printf ("%s",tipka);
return 0;
}

 

rustweaver uto 8.2.2011 17:29
beno101 kaže...

 

Pozdrav svima!

Može li netko molim vas nać grešku u ovom kodu?

HVALA!

#include <cstdio>
#include <cstring>
int main () {
char r1[10];
char r2[10];
char r3[10];
char r4[10];
char r5[10];
char tipka[10];
scanf ("%s %s %s %s %s",r1,r2,r3,r4,r5);
if (r4="#...#") puts (tipka, "KVADRAT");
printf ("%s",tipka);
return 0;
}

 

Boldano je. Prvo u C-u ne mozes direktno usporedivati stringove na taj nacin, moras koristiti strcmp ili nesto slicno. I drugo koristis samo jedan znak jednakosti '=', to u C-u predstavlja dodjeljivanje vrijednosti varijabli. Znaci ovo sto ti trenutno radis je da varijabli r4 dodjeljujes vrijednost "#...#". Vjerojatno to nisi planirao :D

 

Za provjeru jednakosti moras koristiti dva znaka jednakosti '=='

 

npr.

 

if (a==3)
{
...

 

Isto tako nije mi bas jasno sto tocno pokusavas postici sa ovim kôdom.

 

Za provjeru jednakosti stringa sa nekim drugim stringom koristis ovako nesto:

 

char test[]="lol"

if (strcmp(test, "lol")==0)
   printf("stringovi su jednaki");

Da bi saznao sto tocno strcmp radi potrazi na internetu referencu (ukratko funkcija vraca broj nula ako su oba stringa jednaka)...

beno101 uto 8.2.2011 17:34
rustweaver kaže...
beno101 kaže...

 

Pozdrav svima!

Može li netko molim vas nać grešku u ovom kodu?

HVALA!

#include <cstdio>
#include <cstring>
int main () {
char r1[10];
char r2[10];
char r3[10];
char r4[10];
char r5[10];
char tipka[10];
scanf ("%s %s %s %s %s",r1,r2,r3,r4,r5);
if (r4="#...#") puts (tipka, "KVADRAT");
printf ("%s",tipka);
return 0;
}

 

Boldano je. Prvo u C-u ne mozes direktno usporedivati stringove na taj nacin, moras koristiti strcmp ili nesto slicno. I drugo koristis samo jedan znak jednakosti '=', to u C-u predstavlja dodjeljivanje vrijednosti varijabli. Znaci ovo sto ti trenutno radis je da varijabli r4 dodjeljujes vrijednost "#...#". Vjerojatno to nisi planirao :D

 

Za provjeru jednakosti moras koristiti dva znaka jednakosti '=='

 

npr.

 

if (a==3)
{
...

 

Isto tako nije mi bas jasno sto tocno pokusavas postici sa ovim kôdom.

Valjam se po podu i smijem se...

Kak to nisam skužil...

A šta ćeš....

Hvala ti!

To je jedan zadatak koji rješavam....

 

beno101 uto 8.2.2011 17:36

Opet neće!
/usr/include/stdio.h: In function ‘int main()’:
/usr/include/stdio.h:688: error: too many arguments to function ‘int puts(const char*)’
plejka.cpp:11: error: at this point in file

rustweaver uto 8.2.2011 17:39
beno101 kaže...
Opet neće!
/usr/include/stdio.h: In function ‘int main()’:
/usr/include/stdio.h:688: error: too many arguments to function ‘int puts(const char*)’
plejka.cpp:11: error: at this point in file

Ako pogledas referencu za puts, shvatit ces zasto ne radi. Funkcija prima samo jedan argument!

 

napravi ovako:

 

printf("%s KVADRAT", tipka);

1domagoj1 uto 8.2.2011 17:41
beno101 kaže...
Opet neće!
/usr/include/stdio.h: In function ‘int main()’:
/usr/include/stdio.h:688: error: too many arguments to function ‘int puts(const char*)’
plejka.cpp:11: error: at this point in file

Pa normalno da neće, vidiš kaj ti veli. Previše argumenata predaješ f-ji puts. Još ti je i napisal deklaraciju f-je:

 

int puts(const char* str)   -   str sam ja dodal

 

tj. to je f-ja koja ispisuje na stdout (obično monitor) string na koji pokazuje pointer str, a ti toj f-ji si dodal i neki "KVADRAT". 

 

EDIT: rustweaver me pretekel... *sigh* :)

beno101 uto 8.2.2011 17:41
rustweaver kaže...
beno101 kaže...
Opet neće!
/usr/include/stdio.h: In function ‘int main()’:
/usr/include/stdio.h:688: error: too many arguments to function ‘int puts(const char*)’
plejka.cpp:11: error: at this point in file

Ako pogledas referencu za puts, shvatit ces zasto ne radi. Funkcija prima samo jedan argument!

 

napravi ovako:

 

printf("%s KVADRAT", tipka);

No kak da onda u string tipka stavim rijec KVADRAT??