Pereiti prie turinio

C++ programavimo uzdaviniai


Rekomenduojami pranešimai

Problema gali būti ir tarpai tarp skaičių arba nematomi simboliai. Nematomi simboliai kas tai yra? Kaip juos pasalinti? Ar tikrai problema juose?, nes tokiu net negirdejes esu :/ Asmeniskai pats manau, kad ciklas yra blogas. + del vienos eilutes nuskaitymo kaip su tuo while ciklu reiketu elgtis. Visa duomenu faila nuskaityciau naudojant

while(fd.eof()){
  fd >> A[i];
}     

, bet kaip tik 1 eilute va sito ir nezinau.

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Problema gali būti ir tarpai tarp skaičių arba nematomi simboliai. Nematomi simboliai kas tai yra? Kaip juos pasalinti? Ar tikrai problema juose?, nes tokiu net negirdejes esu :/ Asmeniskai pats manau, kad ciklas yra blogas. + del vienos eilutes nuskaitymo kaip su tuo while ciklu reiketu elgtis. Visa duomenu faila nuskaityciau naudojant

while(fd.eof()){
  fd >> A[i];
} 	

, bet kaip tik 1 eilute va sito ir nezinau.

 

Viskas priklauso nuo to kaip yra nuskaitomi duomenys iš failo, vienu atveju gali būti, kad nematomi simboliai neturės įtakos, kitu atveju gali nepavykti tinkamai nuskaityti duomenų. Nematomi simboliais yra tarpai, TAB, line break ir panašiai :) Su uždaviniu šiuo metu nelabai galiu padėti, nes C++ jau truputi pamiršau, jau daugiau kaip metai kai su c++ nieko nedariau. Reikės vėliau kai daugiau laiko turėsiu prisiminti viską ko mokiausi.

Redagavo mantys89
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Viskas priklauso nuo to kaip yra nuskaitomi duomenys iš failo, vienu atveju gali būti, kad nematomi simboliai neturės įtakos, kitu atveju gali nepavykti tinkamai nuskaityti duomenų. Nematomi simboliais yra tarpai, TAB, line break ir panašiai :) Su uždaviniu šiuo metu nelabai galiu padėti, nes C++ jau truputi pamiršau, jau daugiau kaip metai kai su c++ nieko nedariau. Reikės vėliau kai daugiau laiko turėsiu prisiminti viską ko mokiausi.

Na aisku, aciu :). Kazkoks labai jau sudetingas skaitymas man is failo cia gaunasi. Dar teks pagalvoti.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tiesa sakius as taip ir dariau

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const int Cmax = 50;
const char CD[]="Duomenys.txt";
const char CR[]="Rezultatai.txt";
void Skaitymas(int & p, int & n, int A[], int K[], int & sum);
   int main(){
   int p, n, A[Cmax], K[Cmax], sum=0;
   Skaitymas(p, n, A, K, sum);
}
void Skaitymas(int & p, int & n, int A[], int K[], int & sum){
ifstream fd(CD);
   fd >> p >> n;
   for(int i=0; i<n; i++){
           fd >> A[i];
           fd.ignore(50,'\n');
           //cout << A[i] << endl; // nusiskaitau pirmus kiekvienos eilutes skaicius 3; 5; 4; 2.
   }
   for(int i=1; i<=A[0]; i++){ // Cikla suku iki 1-ojo nario t.y. 3.
           fd >> K[i];            // viska rasau i nauja masyva
           cout << K[i] << endl;

   }
fd.close();
}

Taciau isvedus i ekrana gaunu

19945325; -1; 36.

Pats ieskojau internete ir radau kad visas daroma su while ciklais. Bet ar yra kitas (paprastesnis) budas?

 

Nuskaito nesąmones, nes nebėra ką skaityti. O nebėra ką skaityti, nes su pirmu for'u pasieki failo galą.

 

Pabandysiu pailiustruoti, kaip vyksta skaitymas (skliausteliuose parašyta, kokiam kintamajam priskirta reikšmė, žvaigždutė – reikšmė nenuskaityta):

1000(p) 4(n)
3(A[0]) 15(*) 360(*) 8(*)
5(A[1]) 2(*) 1(*) 145(*) 99(*) 300(*)
4(A[2]) 700(*) 600(*) 900(*) 800(*)
2(A[3]) 8(*) 1(*)<skaitymo kursorius>

Ir čia tai ką nuskaitei po pirmo for'o. Kai paleidi antrą for'ą, skaitymo kursorius jau būna pabaigoje, todėl nėra ką skaityti.

 

Norėčiau pakartoti du gerus patarimus: failą skaitai tik vieną kartą ir perskaitai tik tiek, kiek tau reikia šiuo metu.

 

Pati užduotis sako: Kindziulis prieina prie vienos lentynos ir išsirenka brangiausią prekę; tada jis nueina prie kitos lentynos ir vėl išsirenka brangiausią prekę; vėl eina prie kitos lentynos... O tu nori padaryti taip: Kindziulis nueina prie pirmos lentynos, tada prie antros, ..., tada prie n-tos. Po to kindziulis išsirenka brangiausią prekę iš pirmos lentynos, tada išsirenka iš antros, ..., tada iš n-tos.

 

Kada tau reikia išrinkti brangiausią lentynos prekę? Kai esi prie tos lentynos. Tai kodėl taip ir nepadarius?

 

Nežinau, ar kažkas tave taip primokė, kad iš pradžių nusiskaitytum visą failą, bet tai ne visada yra geriausias variantas, o kai kuriais atvejais ir iš viso neįmanomas.

 

Tai kaipgi reiktų skaityti failą?

1000(p) 4(n)
3(k) 15(A[0]) 360(A[1]) 8(A[2])  <išsirenki brangiausią prekę ir jos kainą išminusuoji>
5(k) 2(A[0]) 1(A[1]) 145(A[2]) 99(A[3]) 300(A[4])  <išsirenki brangiausią prekę ir jos kainą išminusuoji>
4(k) 700(A[0]) 600(A[1]) 900(A[2]) 800(A[3])  <išsirenki brangiausią prekę ir jos kainą išminusuoji>
2(k) 8(A[0]) 1(A[1])  <išsirenki brangiausią prekę ir jos kainą išminusuoji>

Taip galėsi skaityti ir atlikti skaičiavimus vienu metu bei tereikės viso labo dviejų for ciklų, esančių vienas kitame.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Koda idedu i pastebina (graziau skaitysis) http://pastebin.com/jHWTKCEU apacioje palikau komentara kaip MANO MANYMU turetu veikti programa. Kas blogai jau nebepajegiu suprasti. Isvedziau kiekviena nari i ekrana k ismeta teisingus, o maxx reiskmes jau blogas.

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Šitose eilutėse yra pora klaidų. Pabandyk pasiimti popierių ir nuosekliai vykdyti kiekvienos eilutės veiksmus bei žiūrėti, kokias kintamųjų reikšmes gauni:

           fd >> A[j];
   maxx=A[0];
       if(maxx<A[i]){
           if(maxx<=p){
               maxx=A[i];
       }
   }

 

O šiaip tokiu būdu skaičiuoti netgi dar protingiau, nei apie kurį aš tau sakiau, nes gali išsiverti ir be masyvo. Tau užtenka žinoti, ar skaičius, kurį dabar nuskaitei, yra didesnis už prieš tai buvusius. Jeigu perskaitęs du skaičius išsirenki didžiausią, tai perskaitęs trečią ir palyginęs jį su prieš tai buvusiu didžiausiu gausi didžiausią iš pirmų trijų skaičių. Perskaitęs m-tąjį skaičių ir palyginęs jį su didžiausiu iš pirmų (m-1) narių gausi didžiausią skaičių iš pirmųjų m narių.

 

Be to, nelabai supratau ką norėjai tokia eilute pasakyti, nes į vieną masyvo elementą telpa tik vienas skaičius

A[0]= 15; 360; 8

 

Ir, žinoma, reikia nepamiršti teisingai sudėti įtraukas, nes dabar teko skaityti tavo kodą trigubai ilgiau nei būtų tekę teisingai išlygiavus.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jau man paciam baisu, kad savarankiskai neisprendziu uzdaviniu, bet del sio jau taip ilgai galvoju ir niekaip neiseina. Pacio uzdavinio nedesiu, tik parodysiu vieta del kurios man reiktu pagalbos. Turiu tekstini faila

8
8 4 2 8 10 5 4 5
10
2 2 2 5 5 4 4 4 2 4

is kurio i masyva A[]

 fd >> n;
   for(int i=0; i<n; i++){
    fd >> A[i];
}

nusiskaiciau skaicius 8; 4; 2; 8; 10; 5; 4; 5. Kitame masyve B[] nusiskaiciau kita eilute 2; 2; 2; 5; 5; 4; 4; 4; 2; 4. Man reikia, kad butu abu masyvai butu tikrinami ir jei masyve A[] ir masyve B[] yra saugomos tos pacios reiksmes pvz:.

A[] 8; 4; 2; 8; 10; 5; 4; 5

B[] 2; 2; 2; 5; 5; 4; 4; 4; 2; 4

jas ismestu. Pats galvojau toki varianta (idesiu visa koda i pastebin) http://pastebin.com/Vw88H8rR

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Neapibrėži pats sau taisyklių tikslių. Ką reiškia „saugomos tos pačios reikšmės“? Pagal tavo dabartinę logiką, tai programa elgiasi visiškai teisingai, tavo atveju randa 4 dvejeto sutapimus, 2 penketo sutapimus ir t.t. O tu nori kiekvieną skaičių tikrinti tik po kartą?

 

Ir dar, tavo kode, esančiam komentare – kam tas išorinis ciklas, jei jo niekur nenaudoji? Tai tau ir reikia, kad eitų per visus narius, jei 0 įhardcodini, tai jo niekaip nepadidinsi... Ar tikrai gerai supranti, kaip veikia ciklas cikle?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai taip, bet man reikia, kad tas reiksmes ismestu. Kaip ir rodziau pavyzdyje

A[] 8; 4; 2; 8; 10; 5; 4; 5

B[] 2; 2; 2; 5; 5; 4; 4; 4; 2; 4

man reiktu, kad masyvas atrodytu taip

A[] 8; 2; 8; 10; 4; 5

B[] 2; 2; 2; 5; 4; 4; 2; 4

kitaip sakant, kad jei skaicius masyve yra toks pat kaip kitame masyve jie abu turi buti pasalinti.

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aciu. Ilgai galvojau ir manau, kad norint patikrinti ar masyve yra vienodu nariu reikia ji isrusiuoti. Internete radau "Burbulo" metoda. Ji issianalizavau, bet masyvo narius isdeste ne visai taip kaip norejau (vel dedu koda) http://pastebin.com/BfknZMfs

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

Tokie ciklai turetu buti, beje, cia ne burbulas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Berods, kai mokykloj darėm šitą, naudojom „netikrą rikiavimą“. T.y. pirmiausiai nusinulini veržlių/varžtų masyvus (21 vietos, tuoj suprasi kodėl), tada vietoj masyvo indekso naudojam nusiskaitytus veržlių/varžtų numerius. T.y. sutikę pirmą varžtą nededam varztai[0] = 8, o varztai[8] += 1. Nusiskaitę turim tokį masyvą, kur varztai parodo, kiek yra dydžio i varžtų (analogiškai su veržlėmis).

 

Tada, kaip wi_lius sakė, belieka iš kiekvieno veržlių skaičiaus atimti varžtų ir žiūrėti, ar skiriasi (ir į kurią pusę)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Berods, kai mokykloj darėm šitą, naudojom „netikrą rikiavimą“. T.y. pirmiausiai nusinulini veržlių/varžtų masyvus (21 vietos, tuoj suprasi kodėl), tada vietoj masyvo indekso naudojam nusiskaitytus veržlių/varžtų numerius. T.y. sutikę pirmą varžtą nededam varztai[0] = 8, o varztai[8] += 1. Nusiskaitę turim tokį masyvą, kur varztai parodo, kiek yra dydžio i varžtų (analogiškai su veržlėmis).

 

Tada, kaip wi_lius sakė, belieka iš kiekvieno veržlių skaičiaus atimti varžtų ir žiūrėti, ar skiriasi (ir į kurią pusę)

 

Šis metodas ir yra protingiausias šio uždavinio atžvilgiu. Pasidarai masyvą A[21] (20 – maksimalus dydis). Tik galima skaitant veržles pliusuoti (A[k]++), o skaitant varžtus minusuoti (A[k]--). Tada jei skaičius teigiamas — trūksta tiek varžtų, jei neigiamas — trūksta tiek vežlių.

 

Kur kas įdomiau, jei varžtų dydžiai galėtų būti daug didesni. Tada tektų susirikiuoti abu masyvus ir lygiagrečiai per juo iteruoti ieškant vienodų narių.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Idesiu savo koda:

void Uzpildyti(int A[], int B[], int n){
   for(int i=0; i<Cmax+1; i++){
       A[i]=0;
       B[i]=0;
       for(int A[i]; A[i]<Cmax+1; A[i]++){
           A[i]+=1;
            cout << A[i] << endl;
       }
   }
}

Greiciausiai jis nera geras, bet niekaip nesuprantu kodel reikia uzpildyti abu masyvus nuliais? Ir varztai[8] = varztai[8] + 1 sio uzrasymo esme suprantu, bet kodel taip ? Na jei masyvo A[8] narys yra 4, tai kodel prie 4+1?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Idesiu savo koda:

void Uzpildyti(int A[], int B[], int n){
   for(int i=0; i<Cmax+1; i++){
       A[i]=0;
       B[i]=0;
       for(int A[i]; A[i]<Cmax+1; A[i]++){
           A[i]+=1;
            cout << A[i] << endl;
       }
   }
}

Greiciausiai jis nera geras, bet niekaip nesuprantu kodel reikia uzpildyti abu masyvus nuliais?

Čia funkcija, skirtas masyvams užpildyti nuliais? Jei taip, tai nesąmonę padarei šiek tiek. Pradėk skirti, kas yra masyvo elementas, o kas – masyvo indeksas.

void Uzpildyti(int masyvas[], int n) {
   for (int i = 0; i < n; i++) {
       masyvas[i] = 0;
   }
}

Funkcija, tinkanti bet kokiam vienmačiam int masyvui. Žinoma, paskui ją išsikvieti tiek kartų, kiek tau reikia. (C++ pagrindai)

 

Iteruoji visada per skaičių progresiją (nuo 0 iki n). Nes A++ yra masyvo elemento didinimas, o ne indekso (i).

 

Reikia užpildyti nuliais todėl, kad galėtum nuo nulio skaičiuoti savo norimus varžtus. Kai tik apsibrėži masyvą, jo elementai nebūtinai yra lygūs nuliams – ten gali būti bet kas, kas užsilikę atminty nuo kažkada anksčiau. Jei pradinė reikšmė bus kokia 10000, tai pridėjęs penkis kartus ir turėsi 10005, o ne 5.

 

Ir varztai[8] = varztai[8] + 1 sio uzrasymo esme suprantu, bet kodel taip ? Na jei masyvo A[8] narys yra 4, tai kodel prie 4+1?

Tokia ir esmė, jei turi 4 aštunto dydžio varžtus, ateina dar vienas, tai turi penkis varžtus... Nesuprantu, ko nesupranti :blink:

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Man toks jausmas, kad autorius nelabai suvokia kaip masyvas veikia ir su kuo jis valgomas. Siūlyčiau paskaityti ir įsisavinti C++ Language Tutorial: Arrays.

 

Ir visgi faktas, kad tau reikia suskaičiuoti varžtus bei veržles, turėtų atsakyti visus šioje užduotyje iškilusius klausimus apie masyvą.

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.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

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