Programiranje

Programiranje u C++-u - pitanja i odgovori

SteveX sub 3.1.2015 19:12

Main je prva funkcija koja se poziva prilikom pokretanja programa i budući da je to funkcija tipa int (jer "int main()") ona mora vratiti neku cjelobrojnu vrijednost. "return 0" znači da je program uspješno odradio svoj posao, tj. nije došlo do nekakvih neočekivanih grešaka i ta vrijednost se obično vraća operativnom sustavu da bi on znao da je program ispravno izvršen.

 

EDIT:

Ukoliko return 0; nije napisan u kodu, compiler će ti po defaultu vratiti 0 na kraju maina.  Bar znam da gcc compiler to radi.

SteveX sub 3.1.2015 19:46

Program će ti se svejedno izvršiti, ali će pritom signalizirati OS da se program nije normalno exitao, takoreć :D.
Quote sa stack overflowa: "The return value for main should indicate how the program exited. Normal exit is generally represented by a 0 return value from main. Abnormal termination is usually signalled by a non-zero return but there is no standard for how non-zero codes are interpreted."

Galt ned 4.1.2015 15:21

Opet imam jedan problemčić...

 

btw. imam problema s ovim novim editorom, kada kopiram kod sve mi stavi u jednu liniju... popravio sam malo ali i dalje je ružno, ispričavam se onome koji pokuša razmrsiti ovo. 

 

#include <iostream>

#include <cstdlib>

 

 

/*Napisati C program koji, u učitanoj matrici tipa (n*m), n,m ∈(1,7] pronalazi i ispisuje umnožak elemenata sporedne dijagonale. */

 

int main(){

float matrica[7][7];

int m = 0, n = 0;

float umnozak_sporedne_dijagonale = 0;

printf("Unesite broj redaka matrice: \n");

do

{

scanf("%d", &m);

if(m <= 1 || m > 7) printf("Broj redaka matrice se mora nalaziti u intervalu <1,7]\n");

}while(m <= 1 || m > 7);

printf("Unesite broj stupaca matrice: \n");

do{

scanf("%d", &n);

if(m <= 1 || m > 7)

printf("Broj redaka matrice se mora nalaziti u intervalu <1,7]\n"); }

while(m <= 1 || m > 7);

printf("Popunjavanje matrice...\n");

for(int i = 0; i < m; i++)

for(int j = 0; j < n; j++) {

printf("Unesi [%d][%d] lement matrice: \n", (i + 1), (j + 1));

scanf("%f", &matrica[i][j]);

}

for(int i = 0; i < m; i++) {

for(int j = 0; j < n; j++) {

printf("%f\t", matrica[i][j]);

}

printf("\n");

}

umnozak_sporedne_dijagonale = matrica[0][n - 1];

printf("%f\n", umnozak_sporedne_dijagonale);

for(int i = 1; i < m; i++) for(int j = 1; j < n; j++)

{

umnozak_sporedne_dijagonale *= matrica[i][n - 1 - j];

}

printf("Umnozak sporedne dijagonale matrice je: %f", umnozak_sporedne_dijagonale);

system("pause");

return 0;

}

 

nik_02 ned 4.1.2015 18:35
Galt kaže...

Opet imam jedan problemčić...

 

btw. imam problema s ovim novim editorom, kada kopiram kod sve mi stavi u jednu liniju... popravio sam malo ali i dalje je ružno, ispričavam se onome koji pokuša razmrsiti ovo. 

 

#include <iostream>

#include <cstdlib>

 

 

/*Napisati C program koji, u učitanoj matrici tipa (n*m), n,m ∈(1,7] pronalazi i ispisuje umnožak elemenata sporedne dijagonale. */

 

int main(){

float matrica[7][7];

int m = 0, n = 0;

float umnozak_sporedne_dijagonale = 0;

printf("Unesite broj redaka matrice: \n");

do

{

scanf("%d", &m);

if(m <= 1 || m > 7) printf("Broj redaka matrice se mora nalaziti u intervalu <1,7]\n");

}while(m <= 1 || m > 7);

printf("Unesite broj stupaca matrice: \n");

do{

scanf("%d", &n);

if(m <= 1 || m > 7)

printf("Broj redaka matrice se mora nalaziti u intervalu <1,7]\n"); }

while(m <= 1 || m > 7);

printf("Popunjavanje matrice...\n");

for(int i = 0; i < m; i++)

for(int j = 0; j < n; j++) {

printf("Unesi [%d][%d] lement matrice: \n", (i + 1), (j + 1));

scanf("%f", &matrica[i][j]);

}

for(int i = 0; i < m; i++) {

for(int j = 0; j < n; j++) {

printf("%f\t", matrica[i][j]);

}

printf("\n");

}

umnozak_sporedne_dijagonale = matrica[0][n - 1];

printf("%f\n", umnozak_sporedne_dijagonale);

for(int i = 1; i < m; i++) for(int j = 1; j < n; j++)

{

umnozak_sporedne_dijagonale *= matrica[i][n - 1 - j];

}

printf("Umnozak sporedne dijagonale matrice je: %f", umnozak_sporedne_dijagonale);

system("pause");

return 0;

}

 

 

 

Daj molim te probaj ovako.

Inače mi je cijeli zadatak jako sumnjiv jer teoretski daje mogućnost za matricu  npr. 2x7 u kojoj nemaš dijagonalu pa ti riješenje važi samo za jednake m i n.

Ukoliko je zadatak iz škole ili još gore s fakulteta , nije dobro postavljen.

Kako god bilo , check this out .

 

//#include <iostream> nema <iostream> u C-u , <cstdlib> -> <stdlib.h>
#include <stdio.h>
#include <stdlib.h>

/*Napisati C program koji, u učitanoj matrici tipa (n*m), n,m ∈(1,7] pronalazi i ispisuje umnožak elemenata sporedne dijagonale. */

int main()
{
    float matrica[7][7];
    int m = 0, n = 0;
    float umnozak_sporedne_dijagonale = 0;


    printf("Unesite broj redaka matrice: \n");
    do
    {
        scanf("%d", &m);
        if(m <= 1 || m > 7) printf("Broj redaka matrice se mora nalaziti u intervalu <1,7]\n");
    }
    while(m <= 1 || m > 7);


    printf("Unesite broj stupaca matrice: \n");
    do
    {
        scanf("%d", &n);
        if(n <= 1 || n > 7) // if(m <= 1 || m > 7)-> n umjesto m
            printf("Broj redaka matrice se mora nalaziti u intervalu <1,7]\n");
    }
    while(n <= 1 || n > 7);


    printf("Popunjavanje matrice...\n");
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++)
        {
            printf("Unesi [%d][%d] element matrice: \n", (i + 1), (j + 1));
            scanf("%f", &matrica[i][j]);
        }


    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            printf("%f\t", matrica[i][j]);
        }
        printf("\n");
    }
    umnozak_sporedne_dijagonale = matrica[0][n-1];
    printf("%f\n", umnozak_sporedne_dijagonale);

    for(int i = 1; i < m; i++)
        //for(int j = 0; j < n; j++) //ovoj je višak jer ideš samo kroz retke
        umnozak_sporedne_dijagonale *= matrica[i][n - 1 - /*j višak*/ i];


    printf("Umnozak sporedne dijagonale matrice je: %f", umnozak_sporedne_dijagonale);



    system("pause");
    return 0;
}

backoh ned 4.1.2015 18:54

Može li mi neko pomoći dok nisam izludio :/ Radim zadatak u kome se traži da se ispiše prvih n prostih brojeva (n se unosi sa tastature), a da li je broj prost se provjerava u

funkciji. Ovo bi bio moj kod...

 

#include <stdio.h>
#include <stdlib.h>
int prost(int);
int main()
{
   int i = 2, br = 0, n;
   do
   {
      printf("n="); scanf_s("%d", &n);
   } while (n < 1);
   printf("To su brojevi:");
   while (br < n)
   {
      if (prost(i))
      {
         printf(" %d", i); br++;
      }
      i++;
   }
   system("pause");
   return 0;
}
int prost(int i)
{
   int brd = 0,ost,m;
   for (m = 1; m <= i; i++)
   {
      ost = i%m;
      if (ost == 0)
         brd++;
   }
   if (brd == 2)
      return i;
   else
      return 1;
}

 

Kad pokrenem program jednostavno neće da ispiše brojeve nikakve...to nije prvi put da se tako dešava pa bi vas molio za pomoć...

I još jedno pitanje...zadatak glasi:

3.Napisati program koji učitava dvije matrice, a zatim računa i ispisuje njihov proizvod.

Za učitavanje elemenata matrice treba definisati i koristiti funkciju čiji je prototip:

void ucitaj(int [][10], int, int);

Za ispisivanje matrice treba definisati i koristiti funkciju čiji je prototip:

void ispisi(int [][10], int, int);

Za računanje proizvoda dvije matrice treba definisati i koristiti funkciju čiji je prototip:

void pomnozi(int [][10], int [][10], int [][10], int, int, int, int);

Nije mi jasno da li se tu očekuje da uz pomoć jedne funkcije unesemo dvije matrice koje su različitih dimenzija? :/

 

Artem ned 4.1.2015 21:42

#include <stdio.h>
#include <stdlib.h>
bool isProst(int);

int main()
{
int i = 2, br = 0, n;
do
{
printf("n=");
scanf_s("%d", &n);
} while (n < 1);
printf("To su brojevi:");


for(int i=0;i<=n;i++)
{
if (isProst(i))
{
printf(" %d", i);
}
}
system("pause");
return 0;
}
bool isProst(int n)
{
int brD = 0;
for(int i=1; i<10; i++) // proslijedjeni broj n ce se dijeliti sa svakim brojem od 1 do 10
{
if(n%i == 0)
{
brD++;
}
}
if(brD == 2)
return true;
else
return false;
}

 

Ja se nisam mogao baš snaći u tvom kodu pa sam malio izmijenio, uglavnom par napomena kada nešto provjeravaš dobro je koristiti funkciju tipa bool koja vraća dvije moguće vrijednosti true dakle prost ili false dakle nije prost, ali nije nikakv problem koristiti ni int s tim da na kraju vraćaš ili 0 ili 1 a ne varijablu 'i' koju si ti povećavao u for petlji pa si je vraćao što me je pomalo zbunilo i slobodno za varijable koristi pune nazive da se neko kasnije može snaći npr brDijeljenja itd. Eto nadam se da ćeš se moći snaći i naučiti nešto iz mog koda.

 

Što se tiče matrica koliko vidim, imaš dva parametra tipa integer tako da kroz to možeš proslijediti broj redova i broj kolona, a kod rezultata množenja ti je dato tri matrice množenik, množitelj i rezultat i za množenika imaš broj redova i kolona kao i za množitelja.

 

Artem ned 4.1.2015 21:59

OK,malo teško ide,  za u buduće...

 

backoh ako koristiš Visual Studio samo označi kod i CTRL + K + F, eclipse CTRL + SHIFT + F itd za fromatiranje teksta, ovako da ti bude sve preglednije i u linije kao što domagoj reče

emerik pon 5.1.2015 10:53

Main je glavna funkcija koja se prva pokreće pri pokretanju programa.Njezina povratna vrijednost se vraća operacijskom sustavu. Ako OS dobije 0 zna da je sve proslo u redu, ako dobije neku drugu vrijednost znaci da program nije zavrsio normalnim tokom. OS tu povratnu vrijednost spremi u neku svoju varijablu i neki drugi program ju može dohvatiti ako mu je bitna. Ti kad pises svoje funkcije koje ti rade neki posao zelis da ti funkcija vrati broj koji ti treba, a ne 0 ili 1. Nema smisla da ti funkcija kojom zelis izracunati 10. broj Fibonaccijevog reda vrati 0 ili 1 . Ti zelis da ti vrati taj 10. broj i zato u return stavis ime varijable u koju si spremio tu vrijednost.

Artem pon 5.1.2015 11:42
backoh kaže...

@Artem a kako da znam kad vraćam 0 ili 1,a kad vraćam neki broj iz funkcije?

 Ti iz funkcije vraćaš ono što tebi treba, stringove, integere, neki niz vrijednosti itd šta ti god zatreba, ovo što sam ja pričao za 0 i 1 ako ti trenutno nije jasno možeš komotno prekočiti shvatiti ćeš kasnije, to sam rekao jer sam primjetio da si funkciju koristio u if iskazu, a if iskaz radi na principu da provjerava u zagradama da li je nešto tačno ili netačno odnosno da li je vrijednost 1-tačno ili 0-netačno (dakle if iskaz pita je li to 0 ili je 1 a ti mu proslijediš recimo 5) iz tog raloga ako nešto provjeravaš koristi bool tip, bool tip posjeduje samo dvije vrijednosti 0 ili 1 (vizuelno true ili false)

 

 

Primjer korištenja funkcija:

 

bool isSnijegPada()

{

  if(pada)

   return true;

  else

   return false;

}

 

 

int saberiDvaBroja(int a, int b)
{
  return a+b;
}

 

Eto to su dva primjera kako i kada koristiti neki tip funkcije, dakle za provjeru pitanja koje ima samo dva ogovora DA ili NE koristi bool, kao u našem primjeru 'da li snijeg pada' ako uistinu pada kaže true-istina(1) ako pak nije kaže false(0), druga funkcija primjer korištenja integera rezultat može biti bilo koji cijeli broj

 

A ovako bi izgledala funkcija isSnijegPada korištenjem tipa integer (što nije primjenjivo):

 

int isSnijegPada()
{
  if(pada)
   return 1;
  else
   return 0;
}

 

Nadam se da te nisam još više zbunio sa ovim primjerima.

Floki pon 5.1.2015 12:56
Artem kaže...

#include <stdio.h>
#include <stdlib.h>
bool isProst(int);

int main()
{
int i = 2, br = 0, n;
do
{
printf("n=");
scanf_s("%d", &n);
} while (n < 1);
printf("To su brojevi:");


for(int i=0;i<=n;i++)
{
if (isProst(i))
{
printf(" %d", i);
}
}
system("pause");
return 0;
}
bool isProst(int n)
{
int brD = 0;
for(int i=1; i<10; i++) // proslijedjeni broj n ce se dijeliti sa svakim brojem od 1 do 10
{
if(n%i == 0)
{
brD++;
}
}
if(brD == 2)
return true;
else
return false;
}

 

Ja se nisam mogao baš snaći u tvom kodu pa sam malio izmijenio, uglavnom par napomena kada nešto provjeravaš dobro je koristiti funkciju tipa bool koja vraća dvije moguće vrijednosti true dakle prost ili false dakle nije prost, ali nije nikakv problem koristiti ni int s tim da na kraju vraćaš ili 0 ili 1 a ne varijablu 'i' koju si ti povećavao u for petlji pa si je vraćao što me je pomalo zbunilo i slobodno za varijable koristi pune nazive da se neko kasnije može snaći npr brDijeljenja itd. Eto nadam se da ćeš se moći snaći i naučiti nešto iz mog koda.

 

Što se tiče matrica koliko vidim, imaš dva parametra tipa integer tako da kroz to možeš proslijediti broj redova i broj kolona, a kod rezultata množenja ti je dato tri matrice množenik, množitelj i rezultat i za množenika imaš broj redova i kolona kao i za množitelja.

 

 Ne može ovako, odnosno ima dvije greške, prva je da ne vrijedi za n>100, druga je da se dopušta djeljivost sa jednim brojem u intervalu 1 - 9 koji nije 1

backoh čet 8.1.2015 11:23

Opet mi treba pomoć...radi se o upotrebi scanf i o pokazivačima.

 

#include <stdio.h>
#include <stdlib.h>
int duzina(char *s)
{
   int d = -1;
   while (s[++d]);
   return d;
}
int main()
{
   char str[101], c;
   int i = 0;
   printf("Unesite tekst:\n"); scanf("%s", str);
   printf("Duzina prve rijeci ('%s') je %d.\n", str, duzina(str));
   do
   {
      scanf("%c", &c);
      str[i++] = c;
   } while (c != '\n');
   str[i - 1] = 0;
   printf("Ostatak: ('%s')\n", str);
   printf("Duzina ostatka: %d.", duzina(str));
   system("pause");
   return 0;
}

 

U ovome zadatku korisnik unosi tekst i program izbacuje dužinu prve riječi i kasnije dužinu ostatka. Ne razumijem šta se radi u petlji do...while :/ Ima scanf,a korisnik ne unosi u tom dijelu baš ništa. Zatim, gore u argumentima funkcije ima pokazivač *s i nije mi jasno kako se on koristi ako nije nigdje definisan u obliku npr:

int *s,p; p=2; s=&p  /*Ili nešto slično*/   

Molim Vas da mi pomognete :)

TracerCPP čet 8.1.2015 11:54

Puno tu toga ne štima... Probaj ovako nešto:

 

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

int main(){
   char rijec[100];
   char recenica[256];

   printf("Unesite recenicu: ");
   gets(recenica);
   sscanf(recenica, "%s", rijec);
   printf("Duljina prve rijeci: %d\n", strlen(rijec));
   printf("Duljina ostatka recenice: %d\n", strlen(recenica) - strlen(rijec));
   return 0;
}

backoh čet 8.1.2015 12:02

Štima,kod je samo kopiran sa prezentacije na faxu :/ samo mi nije jasno to oko scanf-a...kad se program izvrši postoji samo jedno unošenje podataka.

Još jedno pitanje...ako imamo while(i<5) radnja u while petlji funkcioniše sve dok je i<5,ali šta ako imamo while(i)? Da li se onda radnja izvršava sve dok je i>0?

1domagoj1 čet 8.1.2015 13:35
backoh kaže...

Štima,kod je samo kopiran sa prezentacije na faxu :/ samo mi nije jasno to oko scanf-a...kad se program izvrši postoji samo jedno unošenje podataka.

Još jedno pitanje...ako imamo while(i<5) radnja u while petlji funkcioniše sve dok je i<5,ali šta ako imamo while(i)? Da li se onda radnja izvršava sve dok je i>0?

0 je false, sve drugo je true. Dakle, i negativni brojevi su true kao i pozitivni.

 

Iz C++11 standarda:

4.12 Boolean conversions [conv.bool]
1 A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. A prvalue of type std::nullptr_t can be converted to a prvalue of type bool; the resulting value is false.

anX čet 8.1.2015 15:05

Ako je netko voljan pomoći oko ovog zadatka...

 



Napisati program koji u unosu prima početni i krajnji broj niza. Brojevi moraju biti cijeli, pozitivni i troznamenkasti.

Program treba ispisati sve brojeve i sume njihovih znamenaka u rasponu od početnog pa sve do krajnjeg u rastućem nizu (od najmanjeg prema najvećem).

Unos i ispis možete prilagoditi i uljepšati prema izboru, dani primjeri samo pokazuju funkcionalnost programa.

Primjer:

unos: 120 124
ispis: 120 = 3
121 = 4
122 = 5
123 = 6
124 = 7


Primjer:

unos: 900 910
ispis: 900 = 9
901 = 10
902 = 11
903 = 12
904 = 13
905 = 14
906 = 15
907 = 16
908 = 17
909 = 18
910 = 10

Primjeri provjere samostalnog rada:
izmjeniti program da ispisuje unatrag (od najvećeg prema najmanjem)
pregledati kako se izračunavaju pojedine znamenke, proširenje na četveroznamenkaste i višeznamenkaste brojeve

 

 

Hvala unaprijed!

pehly čet 8.1.2015 15:52

Napisati program koji za N unešenih cijelih brojeva u dinamički niz, ispisuje elemente niza stim
da se između elemenata ispiše operator (<, >, =) koji opisuje odnos između dva susjedna
elementa. Npr. za niz od 10 elemenata [5, 2, 1, 7, 7, 4, 2, 8, 10, 3] na konzoli treba dobiti sljedeći
ispis:
5 > 2 > 1 < 7 = 7 > 4 > 2 < 8 < 10 > 3

 

Moze pomoc, pozz

Jonja čet 8.1.2015 17:54

3 godine si na forumu, valjda si nesto naucio. Ovdje ti nitko nece dati gotov kod, nego se radi na principu da ti posaljes svoj kod, a mi te ovdje uputimo u pravom smijeru i pokazemo ti greske, tako da ako hoces pomoc, prvo posalji sto si do sad napisao.