Joj zaboravio sam, u ovom 1. zadatku im je rečeno da barem jedna funkcija mora biti riješena rekurzivno.
Raspravljate o temi Zadaci iz programiranja c++ : please help u Školarci i Studenti forumu, dio Društvo foruma; Mlađem bratu bi mi trebalo ovo riješiti, ja dugo nisam prismrdio c++-su (a i kad jesam nisam pojma imao ) ...
Joj zaboravio sam, u ovom 1. zadatku im je rečeno da barem jedna funkcija mora biti riješena rekurzivno.
2. zadatak
Evo mislim da je to to što se tiče drugog zadatka, evo prikaza primjera kako to radi...#include "stdafx.h"
#include<iostream>
using namespace std;
float *alociranje_prostora(int x);
void unos_vremena(float *polje,int n);
void zbroj_vremena(float *X,float *Y,float *Z,int broj);
void sortiranje(float *polje,int n);
float iznad_prosjeka(float *Z, float *P,int broj);
void ispis(float *niz,int broj);
int main()
{
int broj_natjecatelja,iznadprosjecni;
cout<<"Unosenje rezultata za koliko skijasa? : \t";
cin>>broj_natjecatelja;
float *X,*Y,*Z,*P;
X=alociranje_prostora(broj_natjecatelja);
Y=alociranje_prostora(broj_natjecatelja);
Z=alociranje_prostora(broj_natjecatelja);
P=alociranje_prostora(broj_natjecatelja);
cout<<"Unos vremena prve voznje : "<<endl; unos_vremena(X,broj_natjecatelja);cout<<endl;
cout<<"Unos vremena druge voznje : "<<endl; unos_vremena(Y,broj_natjecatelja);cout<<endl;
zbroj_vremena(X,Y,Z,broj_natjecatelja);
sortiranje(Z,broj_natjecatelja);
iznadprosjecni=iznad_prosjeka(Z,P,broj_natjecatelja);
cout<<"Ispis niza X : "<<endl; ispis(X,broj_natjecatelja);cout<<endl<<endl;
cout<<"Ispis niza Y : "<<endl; ispis(Y,broj_natjecatelja);cout<<endl<<endl;
cout<<"Ispis niza Z (zbroj X i Y sortiran uzlazno) : "<<endl; ispis(Z,broj_natjecatelja);cout<<endl<<endl;
cout<<"Ispis niza P (iznad prosjecni iz niza Z) : "<<endl; ispis(P,iznadprosjecni);cout<<endl<<endl;
delete[]X;delete[]Y; delete []Z;delete []P; X=NULL;Y=NULL;Z=NULL,P=NULL;
return 0;
}
float *alociranje_prostora(int x){
float *niz=new float[x];
return niz;
}
void unos_vremena(float *polje,int n){
int i=0;
for(i=0;i<n;i++){
cout<<"Unesite vrijeme za "<<i+1<<". natjecatelja u skijanju ";
cin>>*(polje+i);}
}
void zbroj_vremena(float *X,float *Y,float *Z,int broj){
int i;
for(i=0;i<broj;i++){
*(Z+i)=*(X+i)+*(Y+i);
}
}
void sortiranje(float *polje,int n){
for(int i=0;i<n-1;i++)
for(int j=0;j<n-1-i;j++)
if(*(polje+j)>*(polje+j+1)){
float temp=*(polje+j);
*(polje+j)=*(polje+j+1);
*(polje+j+1)=temp;
}
}
float iznad_prosjeka(float *Z, float *P,int broj){
float suma,prosjek=0;
for(int i=0;i<broj;i++)
suma+=*(Z+i);
prosjek=suma/broj;
int k=0;
for(int j=0;j<broj;j++)
if(*(Z+j)>prosjek){
*(P+k)=*(Z+j);
k++;}
return k;
}
void ispis(float *niz,int broj){
for(int i=0;i<broj;i++)
cout<<*(niz+i)<<"\t";
}
E sad jedino, ovaj unos je napravljen kao unos za decimalne brojeve, a ne u formatu sat/minuta/sekunda to bi još vjerojatno trebalo modificirati (neznam kako im je rečeno), ali nek se i brat s nečim pozabavi... tu se još dosta sitnica da dodati ali ovo mu je dobra baza, bar mislim...
Ako nešto nije jasno , slobodno pitaj, nije mi se dalo pisati sad komentare na sve... ali mislim da bi trebalo bit jasno za isčitat kod s obzirom na ovo što su do sada radili...
Budem vjerojatno i 1. zadatak riješio ali malo kasnije, neda mi se sad pisat odmah i taj...
imam i ja nesto,ali tko zna malo vise u c++
1. zadatak
Evo stavio sam i par komentara da bude sve jasno, ali stvarno ovo ne bi trebao biti problem....
#include "stdafx.h"
#include <iostream>
#include<string>
using namespace std;
#define max 50
int suma_ascii_vrijednosti_naziva(char tvrtka[]);
int suma_znamenki_broja_zaposlenih(int broj);
void pretvorba_u_hex(int zbroj,int baza);
int main()
{
char poduzece[max];
int broj_zaposlenika,zbroj_ascii=0,zbroj_znamenaka=0;
int zbrojeno_ascii_i_znam;
cout<<"Unesite naziv tvrtke ";
cin.getline(poduzece,max);
cout<<"Unesite broj zaposlenih ";
cin>>broj_zaposlenika;
zbroj_ascii=suma_ascii_vrijednosti_naziva(poduzece);
cout<<"suma ascii vrijednosti unesenog naziva tvrtke iznosi "<<zbroj_ascii<<endl;
zbroj_znamenaka=suma_znamenki_broja_zaposlenih(broj_zaposlenika);
cout<<"suma znamenki od broja zaposlenih iznosi "<<zbroj_znamenaka<<endl;
zbrojeno_ascii_i_znam=zbroj_znamenaka+zbroj_ascii;
cout<<"zbrojene sume znamenaka i sume ascii kodova prebaceni u sustav s bazom 16 iznose"<<endl;
pretvorba_u_hex(zbrojeno_ascii_i_znam,16);
cout<<endl;
return 0;
}
int suma_ascii_vrijednosti_naziva(char tvrtka[]){
int zbroj=0,i;
for(i=0;i<strlen(tvrtka);i++){ //koristimo strlen iz biblioteke string, petlja ide od 0 do duljine naziva tvrtke
zbroj+= int(tvrtka[i]); //pretvara se svako slovo u ascii ekvivalente i odmah se zbrajaju
}
return zbroj;
}
int suma_znamenki_broja_zaposlenih(int broj)
{
int znamenka,suma=0;
while(broj>0)
{
suma+=broj%10; // npr. 200%10=0 200/10=20 pa opet 20%10=0 20/10=2
// i tako dobivamo znamenku po znamenku od iza prema naprijed koje pozbrajamo jel
broj/=10;
}
return suma;
}
void pretvorba_u_hex(int zbroj,int baza){
if(zbroj/baza>0){
pretvorba_u_hex(zbroj/baza,baza);} //rekurzija izvrsava se sve dok je kvocijent broja koji se dijeli s bazom(u nasem slucaju 16) veci od 0 //(to nam je sidreni uvjet koji zaustavlja petlju, bez toga funkcija bi beskonacno pozivala samu sebe)
int ost=zbroj%baza; //operator modulo vraca ostatak pri dijeljenju
if(ost>=10){
cout<<char(ost+55); //ostatak +55 jer je ascii
//kod slova A 65, a mi imamo ostatke od 10 do najviše 15 s obzirom na hex
}
else{
cout<<ost; //ako je ostatak dijeljenja manji od 10 najnormalnije moze ispisivati taj broj (npr. broj 5 je isto 5 i u hex-u)
}
}
Nadam se da nece samo prepisati rješenje jer onda niš od toga svejedno ... evo recimo neka proba funkciju za sumu znamenaka napisati kao rekurzivnu i tako skratiti kod što se tiče ove funkcije... (pisalo je da bar jedna mora biti rekurzivna ali u biti dvije se ovdje vrlo lako mogu rekurzijom riješiti...)..
Evo ovdje ima tablicu ascii kodova, obično su fore s ascii - ima uvijek prisutne u ovakvim zadačićima ...
http://www.asciitable.com/
I mišo dužan si pivu-dvije kad budem na kojoj fešti u Lovranu, brzo će maškare
edit :
@kale
daj molim te nabaci to rješenje da vidim malo, baš me zanima kako si riješio...
Zadnji Uredio Ive_ri : 20-12-08 u 20:31
Ivesvaka ti dala
Malo kasnije kad brat dođe doma ću mu dati to pa ću pitati ovdje ako mu nešto ne bude bilo jasno.
Puno ti hvala
Ne mogu sada repati jer sam nedavno, ali dobit ćeš repicu čim budem mogao, i to više nego zasluženo
Evo pogledao buraz ova rješenja.
U prvom zadatku je sve jasno, super si ga komentirao.
Samo par pitanja što se tiče 2. zadatka:
Što ova funkcija točno radi (osim što rezervira prostor)? Možeš li malo objasniti kako točno vraća ovu vrijednost sa return-om?float *alociranje_prostora(int x){
float *niz=new float[x];
return niz;
float iznad_prosjeka(float *Z, float *P,int broj){
float suma,prosjek=0;
for(int i=0;i<broj;i++)
suma+=*(Z+i);
prosjek=suma/broj;
int k=0;
for(int j=0;j<broj;j++)
if(*(Z+j)>prosjek){
*(P+k)=*(Z+j);
k++;}
return k;
}
Zašto je tu ovaj k uveden?
Ostalo je jasno. Brat ti puno zahvaljuje na svemu, sigurno si dosta vremena na ovo potrošio.
Ma imao sam jučer viška slobodnog vremena i uz to bilo mi dosadno, pa reko ajde da i ja jednom na ovom forumu nešto korisno napravim
Evo dodao sam komentare u kod...
float *alociranje_prostora(int x){
float *niz=new float[x]; //deklaracija pokazivača 'niz' i alokacija prostora (naredba new) i to onoliko blokova memorije kolika je vrijednost spremljena u x (1 blok memorije za podatak tipa float zauzima 4 byta ako se ne varam)
//x predstavlja broj natjecatelja za koje cemo unositi (ovdje možemo staviti bilo koji naziv jer su ove varijable lokalne (x je formalni argument)- vidi ga samo funkcija, a stvarni argumenti su oni kod poziva f-je u mainu)
return niz; //funkcija vraća memorijsku lokaciju koja je sadrzana u pokazivacu i onda kada u main-u pozivamo funkciju za alociranje
pojedinog din. polja tamo dobivamo tu lokaciju(hex.kod te lokacije u memoriji) i spremamo je u pokazivac X,Y,Z (u main-u) da bi kasnije mogli raditi s vrijednostima na tim mem.lokacijama
float iznad_prosjeka(float *Z, float *P,int broj){
float suma,prosjek=0;
for(int i=0;i<broj;i++)
suma+=*(Z+i);
prosjek=suma/broj;
int k=0;
for(int j=0;j<broj;j++)
if(*(Z+j)>prosjek){
*(P+k)=*(Z+j);
k++;}
return k;
}
Varijabla k je brojač koji broji koliko je brojeva iz niza Z iznad prosjeka. Funkcija vraća vrijednost tog brojača (i kasnije u main-u spremamo tu vrijednost u neku varijablu) zato jer nam kod poziva za ispis niza P treba ograničenje koliko će članova ispisivati.
U slučaju ako bi i za niz P kao i za ostala dva kod poziva ispisa stavljali ograničenje broj_natjecatelja, kod ispisa P-a bi osim tih članova koji su veći od prosjeka c++ "pokušavao" ispisivati još neke vrijednosti,pa bi ispisao neke gluposti koje bi se u tom času našle na tim memorijskim lokacijama (gdje brojevi nisu bili iznad prosjeka pa nisu bili ni upisani na te lokacije) Ako me kužiš.. nek proba zamijeniti u pozivu funkcije da bude broj natjecatelja ograničenje pa će vidjeti što će mu se događati i u čemu je problem...
Evo ima u temi navedenoj ispod u zadnjem postu na toj stranici par linkova sa dobrim tutorialima za c++ pa nek si pogleda malo...
Linkovi za svakog školarca i studenta
Zadnji Uredio Ive_ri : 21-12-08 u 18:05
ive---care--ti mene smatras c++ znalcem
krivo..imam ija nesto za rijesiti,a ne rjesenje![]()
Pa stavi tu tekst zadatka, možda netko bude znao riješiti... Fora bi bila da ova tema zaživi, ne samo za ovaj slučaj, nego da jedni drugima pomažemo oko raznih zadataka... Od toliko ljudi svaki zadatak će barem netko znati riješiti...