Pereiti prie turinio

C++ programavimo uzdaviniai


Rekomenduojami pranešimai

Gal ir pasikarscaivau truputi, zodziu, atsiprasau, bet pastangu patikek bandau deti. Is tiesu gaila, kad programavima aptikau taip velai, gal jau ir veloka, bet dar visa vasara yra ir t.t. Zodziu kita karta prasydamas pagalbos bandysiu zmoniskai formulacija pateikti ir t.t. . pagrindine priezastis kodel nededu kodo, ar dedu tik jo fragmenta yra ta, kad noriu pats spresti. Siaip suprantu, kad is fragmento yra sudetinga kazka suprasti... Nu zodziu pats kaltas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ikeliu visa uzduoti, gal kam pades geriau susiorentuoti mano kode.

Problema ta, kad negaunu tinkamo minimumo(ten kur raudonai apveziau ieskau min, nes ieskau seniausio vyro). Visa programa:

#include <iostream>
#include <fstream>
using namespace std;
const unsigned long int Cmax = 100;
const char CD[]="Duomenys.txt";
const char CR[]="Rezultatai.txt";
void Skaitymas(int & n, unsigned long long A[]);
void Skaiciavimai(int & n, unsigned long long A[], int S[], int Y[], int M[], int D[], int X[]);
void Tikrinimas(int & minn, int & Mminn, int & n, int S[], int Y[], int M[], int D[]);
int main(){
int n, minn, Mminn;
int S[Cmax], Y[Cmax], M[Cmax], D[Cmax], X[Cmax];
unsigned long long A[Cmax];
Skaitymas(n, A);
Skaiciavimai(n, A, S, Y, M, D, X);
Tikrinimas(minn, Mminn, n, S, Y, M, D);
}
void Skaitymas(int & n, unsigned long long A[]){
ifstream fd(CD);
fd >> n;
for(int i=0; i<n; i++){
   fd >> A[i];
}
fd.close();
}
void Skaiciavimai(int & n, unsigned long long A[], int S[], int Y[], int M[], int D[], int X[]){
for(int i=0; i<n; i++){
S[i]=A[i]/10000000000;
Y[i]=A[i]%10000000000/100000000;
M[i]=A[i]%100000000/1000000;
D[i]=A[i]%1000000/10000;
//cout << S[i] << " " << Y[i] << " " << M[i] << " " << D[i] << endl;
}
}
void Tikrinimas(int & minn, int & Mminn, int & n, int S[], int Y[], int M[], int D[]){///////////
for(int i=0; i<n; i++){///////////////////////////////
if (S[i]==3 || S[i]==5){ // Tikrinu kad butu tik vyrai///////
minn=Y[0]; // prisisikiriu, kad minimumas yra pirmasis masyvo narys/////
if(minn>Y[i]){/////////
   minn=Y[i]; // naujas minimumas////////
}
}
}
for(int i=0; i<n; i++){////////
if(S[i]==4 || S[i]==6){ // Tikrinu, kad butu tik moterys///////////
minn=Y[0]; // prisisikiriu, kad minimumas yra pirmasis masyvo narys//////////
if(Mminn>Y[i]){//////////
   Mminn=Y[i]; // naujas minimumas///////////
}
}
}
cout << minn << " " << Mminn; // Isveda, kad minimumas minn=65(turetu buti 3). Kas blogai?//////
}

post-80785-0-76134800-1371490938_thumb.jpg

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Turiu kita problema( pataisiau koda) ir tikrinu vyro ir moters gimimo metu paskutinius skaitmenis y. Beda ta, kad vyro ismeta bloga atsakyma minn=65, o ne 3. Su moterimi viskas gerai. Kur gali buti klaida? Istrynus moters Mminn tikrinima vyro minn tampa vel teisingas 3. Nujauciu, kad kazkas su skliaustais ne taip.

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Darau tokia uzduoti: Beda ta, kad nesugalvoju kaip tikrinti, kad saulegrazos butu GRETA. Max reiksme radau, bet tikrinimo niekaip neismastau. Beje salygoje yra duota, kad n(1<=n<=1000). Kiek suprantu, tai cia reiketu pries main f-joje parasyti tikrinima su if'u, if(n<=1000) ir if(1<=n).

#include <fstream>
#include <iomanip>
using namespace std;
const int Cmax = 100;
const char CD[]="Duomenys.txt";
const char CR[]="Rezultatai.txt";
void Skaityti (int A[], int & n);
void Skaiciuoti(int A[], int & n, int S[]);
int main(){
int A[Cmax], S[Cmax], n;
Skaityti(A, n);
Skaiciuoti(A, n, S);
}
void Skaityti (int A[], int & n){
ifstream fd(CD);
for(int i=0; i<n; i++){
   fd >> A[i];
}
fd.close();
}
void Skaiciuoti(int A[], int & n, int S[]){
int maxx=A[0]; // pradine max reiksme pirmasis masyvo narys
for (int i=0; i<n; i++){
   if(maxx<A[i]){
       maxx=A[i]; // naujas max. Cia niekaip nesuvokiu kaip patikrinti, kad saulegrazos butu greta.
}

}
}

post-80785-0-00790500-1371540614_thumb.jpg

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Eini per masyvą nuo nulinio iki n-2 elemento imtinai, kur n – elementų skaičius (tai yra paskutinio elemento į for ciklą neįtrauki). Kiekvieno ciklo metu patikrini, ar i ir i+1 saulėgrąžos yra (t. y. ≠ 0). Jei taip, tai bandai priskirti jų sumą maksimumui. Tęsi ciklą.

 

O kad sektum maksimumą, tai išsisaugok saulėgrąžų poros kairiosios saulėgrąžos poziciją ir poros masę.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki, noreciau paklausti del vieno uzdavinio. Tekstiniame faile

6 2
0 1 0 1 1 1

noreciau tikrinti po viena nari ar jis attitinka tuos 3 punktus pvz 0, 1 ir t.t. Susidariau masyva ir kaip reiktu pasiekti jo tarikme 5 nari? (numeruoju nuo 0). Suprantu, kad reiktu daryti taip A[4], bet cia jei butu duota aiskus masyvo vietu skaicius. Cia taip nera duota raide n, kuri gali kisti. Tad kaip pasiekti reikiama masyvo nari?

post-80785-0-53358000-1372180940_thumb.png

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki, noreciau paklausti del vieno uzdavinio. Tekstiniame faile

6 2
0 1 0 1 1 1

noreciau tikrinti po viena nari ar jis attitinka tuos 3 punktus pvz 0, 1 ir t.t. Susidariau masyva ir kaip reiktu pasiekti jo tarikme 5 nari? (numeruoju nuo 0). Suprantu, kad reiktu daryti taip A[4], bet cia jei butu duota aiskus masyvo vietu skaicius. Cia taip nera duota raide n, kuri gali kisti. Tad kaip pasiekti reikiama masyvo nari?

 

O tam pavyzdy n nėra 6?

 

tu nusiskaitai su ciklu for

 

for (int i = 0; i < n; i++) - kažkaip panašiai (nemoku c++)

 

nu o iškviesi su A[4] penktą narį

Redagavo JohnSmith
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na taip, bet as klausiu, kad tarkim n=1000. ir kaip tada po viena ir tikrinti reiktu?

 

Šiaip apribojimas 1<=n<=100

 

Na, bet jei tu nori 1000 tai gerai.

 

su for ciklu nusiskaitai, o po to su for ciklu tikrini nuo 1 iki 1000 masyvo narius

 

Bet aš gal nesuprantu, ko tu klausi :)

Redagavo JohnSmith
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Greiciausiai. Sunku man issaiskinti normaliai :D. Na pavyzdziui usduotyje yra punktas, kuris sako, kad zibintai nesvies jei abu jo kaimynai sviete, tai jei masyve yra 100 vietu, tai visus ir tikrinti na pavyzdziui

if(A[0]==1 && A[2]==1) ir t.t.iki 100?

A[1]=1;

?

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

for(int i = 1; i < n - 1; i++)
{
   if(A[i - 1] && A[i + 1])
   {
       //some logic
   }
   //...
}

 

Kraštiniams nariams tikrinimą padarai atskirą (i = 0, n).

 

Kažkaip per daug tu prisirišęs prie skaičių. Programavime yra tik du skaičiai — nulis ir vienas. Visiem kitiem skaičiams yra kintamieji arba konstantos.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Del uzdavinio vis dar kyla problemos nesuprantu kodel paskutini skaiciu man meta 0 juk diena yra lygine turetu mesti 1. taip pat viska isvedziau i ekrana for cikle greciausiai del to man ismeta per daug skaiciu. Kodas:

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const int Cmax=10;
const char CD[]="Duomenys.txt";
const char CR[]="Rezultatai.txt";
void Skaitymas(int & n, int & k, int A[], int a);
void TikRasymas(int n, int k, int A[]);
int main(){
int n, k, A[Cmax], a;
Skaitymas(n, k, A, a);
TikRasymas(n, k, A);
}
void Skaitymas(int & n, int & k, int A[], int a){
ifstream fd(CD);
fd >> n >> k;
for(int i=0; i<n; i++){
fd >> A[i];
}
fd.close();
}
void TikRasymas(int n, int k, int A[]){
ofstream fr(CR);
if(k%2==0){
       A[0]=1;
       A[n-1]=1;
   }
   else
       A[0]=0;
       A[n-1]=0;

for(int i=1; i<n; i++){
   if(A[i-1]==1 && A[i+1]==1){
       A[i]=0;
   }
   else if ((A[i-1]==1 && A[i+1]==0) || (A[i-1]==0 && A[i+1]==1)){
       A[i]=1;
   }
   else if(A[i-1]==0 && A[i+1]==0){
       if(k%2==0){
       A[i]=1;
   }
   else
       A[i]=0;
   }
   cout << A[0] << " " << A[i] << " " << A[n-1] << " " ; // GREICIAUSIAI, KAD NEREIKEJO TAI DARYTI FOR CIKLE, NES ISMETA DAUG REZULTATAU.
}

}

post-80785-0-72968800-1372253246_thumb.png

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Darasiau truputeli kodo, bet tada vel viena skaitmeni blogai meta. Butu idomu suzinoti kas ne taip, nes pirmai paskutinis 6-asisis skaicius ne toks, o dabar 3-iasis.

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const int Cmax=10;
const char CD[]="Duomenys.txt";
const char CR[]="Rezultatai.txt";
void Skaitymas(int & n, int & k, int A[], int a);
void TikRasymas(int n, int k, int A[]);
int main(){
int n, k, A[Cmax], a;
Skaitymas(n, k, A, a);
TikRasymas(n, k, A);
}
void Skaitymas(int & n, int & k, int A[], int a){
ifstream fd(CD);
fd >> n >> k;
for(int i=0; i<n; i++){
fd >> A[i];
}
fd.close();
}
void TikRasymas(int n, int k, int A[]){
ofstream fr(CR);
if(k%2==0){
       A[0]=1;
       A[n-1]=1;
}
   else if(k%2!=0){ // PAPILDYTAS KODAS
       A[0]=0; //!!!!
       A[n-1]=0; // !!!!
   }
for(int i=1; i<n; i++){
   if(A[i-1]==1 && A[i+1]==1){
       A[i]=0;
   }
   else if ((A[i-1]==1 && A[i+1]==0) || (A[i-1]==0 && A[i+1]==1)){
       A[i]=1;
   }
   else if(A[i-1]==0 && A[i+1]==0){
       if(k%2==0){
       A[i]=1;
   }
   else
       A[i]=0;
   }
   cout << A[0] << " " << A[i] << " " << A[n-1] << " " ;
}

}

post-80785-0-94080600-1372259964_thumb.png

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Keletas pastebėjimų:

  • kai tikrini kraštinius narius, nereikia else if'o, nes jei ne lyginė diena, tai nelyginė;
  • tas pats kai tikrini vidinius narius, kur antras else if'as;
  • kiek suprantu, tu iškart informaciją įrašinėji į tą patį masyvą. Taip tu prarandi informaciją, ką veikė kaimynas iš kairės praeitą naktį, o žinai tik ką veiks šiąnakt. Tau reikia laikino masyvo ir po kiekvienos iteracijos perkopijavimo atgal į pagrindinį.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Viliau, dekoju uz atsakyma, bet nezinau ar tu bogai supratai ar as del to laikino masyvo. Kiek supratau as irasydamas i masyva prarandu praeitos nakties duomenis. Bet manau, kad toks variantas tinka tik jei yra 2 naktys (tokiu atveju reiktu kurtis 2 masyvus) viena 1 nakties, o kita kitos duomenims irasyti. O jei pavyzdziui yra 6 naktys tai reiktu net 6 skirtingus masyvus kurtis?

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Bet pažiūrėk iš kitos pusės: kad apsiskaičiuotum antros nakties būseną, tau reikia žinoti pirmos (vakarykštės) nakties būseną. Kai viską apsiskaičiuoji ir atspausdini, eini skaičiuoti trečios nakties. Kad apskaičiuotum trečios (šiandienykštės) nakties būseną, tau reikia antros (vakarykštės) būsenos. Apskaičiuoji, atspausdini. Tada — 4-tos (šiandienykštės) ir 3-čios (vakarykštės).

 

Taigi mums kiekvienoj iteracijoj reikia tik dviejų naktų duomenų. Visos kitos naktys jau nebesvarbios (žinoma, jei neužmiršome jų atspausdinti). Jeigu jos nesvarbios, tai joms ir nereikia jokių masyvų — kam švaistyti atmintį. Taigi turi masyvą A1 (vakarykštis), iš jo užpildai A2 (šiandienykštis), atspausdini ir perkeli A2 → A1 (pereini viena diena pirmyn). Tada kartoji.

 

Kitą kartą kai mąstysi, kaip spręsti užduotį, pabandyt mažiau galvoti apie skaičius. Klausk savęs, ko tau reikia, kad galėtum nustatyti, kaip švies ne 4-toji, o i-toji lempa; ne 5-toji diena, o k-toji diena. Programuojant kažkokį veiksmą darai arba 1 kartą, arba n kartų. Net jei jau iš anksto žinai, kad kažką darysi 2 kartus, pasirašai ciklą, kuris ir prasisuktų su tuo 2 kartus.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Imesiu savo koda, nes rezultata isspausdina ne toki(greiciausiai su masyvais blogai, nes pati tikrinima daug sykiu perdariau)

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const int Cmax=10;
const char CD[]="Duomenys.txt";
const char CR[]="Rezultatai.txt";
void Skaitymas(int & n, int & k, int A[], int a);
void TikRasymas(int n, int k, int A[], int B[]);
int main(){
int n, k, A[Cmax], B[Cmax], a;
Skaitymas(n, k, A, a);
TikRasymas(n, k, A, B);
}
void Skaitymas(int & n, int & k, int A[], int a){
ifstream fd(CD);
fd >> n >> k;
for(int i=0; i<n; i++){
fd >> A[i];
}
fd.close();
}
void TikRasymas(int n, int k, int A[], int B[]){
ofstream fr(CR);
if(k%2==0){ // TIKRINU PIRMA IR PASKUTINI NARI, NES JIE NETURI POROS.
   B[0]=1;
   B[n-1]=1;
}else{
B[0]=0;
B[n-1]=0;
}
cout << B[0] << " ";
fr << B[0] << " ";
for(int i=2; i<n; i++){
   if(A[i-1]==1 && A[i+1]==1){
       B[i]=0;
   }
   if((A[i-1]==1 && A[i+1]==0)|| (A[i-1]==0 && A[i+1]==1)){
       B[i]=1;
   }
   if(A[i-1]==0 && A[i+1]==0){ // SITAS ATVEJIS NERA APRASYTAS TUOSE 3 PUNKTUOSE, TAI KAIP SUPRATAU REIKTU VEL GRIZTI I LYGINIU IR NELYGINIU DIENU SITUACIJA.
       if(k%2==0){
           B[i]=1;
       }else{
       B[i]=0;
       }
   }
   cout << B[i]<< " ";
   fr << B[i] << " ";
}
cout << B[n-1];
fr << B[n-1];
}

post-80785-0-78378600-1372597936_thumb.png

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dalykas toks, kad iš pradžių apsiskaičiuoji 0-linį ir (n-1)-ąjį elementą, o po to cikle pereini nuo antrojo iki (n-1)-ojo elemento. Taigi pas tave atspausdinta:

B[0] B[2] B[3] ... B[n-2] B[n-1] B[n-1]

 

Ciklas turi būti:

for (int i = 1; i < n-1; i++) {...}

 

 

Ir būtų labai gerai, kad sutvarkytum indentaciją ir įprastum teisingai indentuoti. Nes ne tik kad kitam sunku skaityti, bet ir pats būtinai privelsi visokių bug'ų ir nesugebėsi jų atrasti.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...