dobbleextra Ierakstīts Februāris 21, 2015 Share Ierakstīts Februāris 21, 2015 Sveiki! Es rakstīju programmu, bet tad iesprūdu pie tā, ka man bija nepieciešams pārbaudīt visus elementus iekš masīva. Programmai būtu jāpasaka vai tie visi dalās ar noteiktu skaitli, kurš tāpat kā masīva izmērs nav zināms. Es gan varētu iziet cauri visiem elementiem ar ciklu un tad pārbaudīt vai tie dalās ar noteikto skaitli. bool ar[size]; for(int i=0;i<size;i++) { if(numbers[i]%skaitlis==0) { ar[i] = true; } else { ar[i] = false; } } //gan jau, ka var arī vieglāk , bet es nezinu algoritmu šim Man ir ideja darīt kautkā tā, bet īsti nezinu kā pēctam pārbaudīt vai visi elementi ar ir vienādi ar true. Tas gan laikam būtu vieglāk kā pārbaudīt vai visi elementi iekš numbers dalās ar skaitlis. Bet es jau nezinu. Ceru, ka kāds pateiks algoritmu. Valoda - c++ Link to comment Share on other sites More sharing options...
Vilx- Februāris 21, 2015 Share Februāris 21, 2015 Padomā no otras puses - Tev nevajag atrast, vai VISI ir true. Tev vajag atrast, vai nav vismaz VIENS, kurš ir false. Link to comment Share on other sites More sharing options...
Borja Februāris 21, 2015 Share Februāris 21, 2015 Mainiigajam, kuraa glabaa rezultaatu, nav jaabuut masiivam.Saakumaa pienjem, ka visi elementi dalaas ar skaitli.Peec tam iet cauri masiivam un, ja kaut viens nedalaas,tad arii rezultaats ir, ka nedalaas. Link to comment Share on other sites More sharing options...
camel Februāris 21, 2015 Share Februāris 21, 2015 Paņem sauju ar santīmiem un pārbaudi vai visi dalās ar 2. Kā tu to darīsi - taisīsi uz lapas sarakstu, pirmais dalās, otrais dalās, .. ? Šis varētu būt pēdējā laika dumākais jautājums programmēšanas sadaļā. Bet ja jautātājs ir vēl skolnieks, laikam tas ir ok. Link to comment Share on other sites More sharing options...
dobbleextra Februāris 21, 2015 Author Share Februāris 21, 2015 bool tests = true; for(int i=0;i<size;i++) { if(numbers%skaitlis!=0) { test=false; } } //Padomāju un beidzot izdomāju. Sākumā arī gribēju līdzīgi, bet ar nepareizo veidu. Paldies, visiem //kas atsaucās! 1 Link to comment Share on other sites More sharing options...
Vilx- Februāris 21, 2015 Share Februāris 21, 2015 (labots) PROTIP: tajā brīdī, kad esi atradis pirmo, kas nedalās, vari pārtraukt ciklu ("break" komanda), jo tālāk skatīties vairs nav vērts. Rezultāts tāpat skaidrs. PROTIP: Pieradinies jau no paša sākuma kodu tabulēt. Šitādas "plakanas" programmas nav lasāmas, ja ir garākas par 10 rindiņām: bool tests = true; for(int i=0;i<size;i++) { if(numbers[i]%skaitlis!=0) { test=false; } }Lai nebūtu pašam jāspaida spacebar kā negudram, izmanto TAB pogu uz klaviatūras. Daudzas mūsdienu IDE (piem. Visual Studio) arī ar to palīdz jau automātski. Labots Februāris 21, 2015 - Vilx- Link to comment Share on other sites More sharing options...
dobbleextra Februāris 21, 2015 Author Share Februāris 21, 2015 Ā,piedod par plakano kodu, vienkārši esmu pieradis pie tiem modernajiem IDE. Jā, break varētu, tiešām aizmirsu. Camel, jā, zinu, ka dumjš jautājums. Vajadzēja drusku vairāk padomāt pirms ieliku šo(kā vai kā es tieši rakstot kodu parasti fiksi izdomāju atbildi, bet pirms tam nekā, atrisināju šo rakstot atbildi forumā, pēkšņi izdomāju). Un jā vēl esmu 6. klases skolnieks(tomēr jautājums arī man dumjš). Link to comment Share on other sites More sharing options...
Vilx- Februāris 21, 2015 Share Februāris 21, 2015 Viss kārtībā! Jautājums normāls, un arī atbildi pats atradi! Tas ir daudz labāk nekā visi tie, kas te nāk prasīt, lai viņiem mājasdarbus priekšā atrisina. Un prieks dzirdēt, ka jau tik agri interesējies par programmēšanu! Tā turpināt! Link to comment Share on other sites More sharing options...
versatile Februāris 22, 2015 Share Februāris 22, 2015 Ja visi masīva elementi dalās ar kādu skaitli, tad arī visu masīva elementu summa dalās. Link to comment Share on other sites More sharing options...
dobbleextra Februāris 22, 2015 Author Share Februāris 22, 2015 Jā, tā arī varētu, paldies, bet risinājums nav universāls, jo der tikai dalāmības pārbaudes gadījumā, bet ja if steitments ņem vairāk resursu kā sakaitīšana, tad lielu arrayu arrayu tas varētu būt ļoti noderīgi . Manuprāt, tā visdrīzāk ir, jo if steitmentam būtu jāsadala un jāpārbauda, bet saskaitīšanā tikai jāsaskaita tmēr, ja ir vēl jāpiešķir vērtība mainīgajam, tad nezinu. Link to comment Share on other sites More sharing options...
versatile Februāris 22, 2015 Share Februāris 22, 2015 (labots) Cik nu esmu darbojies ar programmēšu tik nācies secināt, ka visas problēmas var risināt 2 veidos: a) rakstīt maksimāli ātru kodu, kas dara tieši to un tikai to, kas nepieciešams konkrētas problēmas atrisinājumam b) rakstīt kodu, ko, pamainoties prasībām, var viegli paplašināt un likt darīt kaut ko citu. Šai gadījumā tas būtu pielikt arī pārbaudi vai ir kāds masīva elements, kura ciparu summa ir kāds skaitlis. Vai izvadīt visus masīva elementus, kas neatbilst kritērijam. Utt. Jo lielāks un sarežģītāks risinājums, jo labāk izmantot otro. Mīnuss - vairāk koda, vairāk iespēju kļūdīties un bieži arī kods strādās drusku lēnāk. Daudz tādām bremzītēm sasummējoties var iekulties ķezā. Bet pirmais kods būs grūti uzturams. Man pašam ir piemērs ar kodu, kur visi mainīgie ir nodefinēti kā alfabēta burtu kombinācijas bez kādas loģikas - 2 gadus vēlāk iebraukt tai kodā nebija viegli, jo kods darīja diezgan sarežģītu operāciju vienā mega excel failā. Līdzīgu mācību dot LU datoriķos vienā no pirmajām programmēšanas lekcijām - tiek prasīta programma, kurai ievada x un y skaitļus, programma izvada visu skaitļu, kas atrodas starp tiem, vidējo aritmētisko. Var: for i=x to i <=y, i++{ sum = sum + i; } print sum / (y-x+1); bet var arī print (x+y)/2; Labots Februāris 22, 2015 - versatile Link to comment Share on other sites More sharing options...
dobbleextra Februāris 22, 2015 Author Share Februāris 22, 2015 Jā, piekrītu parasti var izveidot risinājumu, kurš vairāk atbilst tikai noteiktajam gadījumam vai dažādiem gadījumiem. Bet, manuprāt, tas ir kā kurā gadījumā. Piemēram vai visi masīva elementi atbilst 'A' var pārbaudīt gan tā: int i = 'A'; char burti[4] = {'A','B','A','A'}; int ar[4]; for(int m=0;m<4;m++) { ar[m] = burti[m]; } int sum = 0; for(int y=0;y<4;y++) { sum += ar[y]; } if(sum==65*4) { cout<<"Ir"<<endl; } else { cout<<"nav"<<endl; } /* Šodien ienāca prātā */ Gan arī tā: bool tests = true; for(int i=0;i<size;i++) { if(burti[i]!='A') { test=false; break; } } if(!tests) { cout<<"nav"<<endl; } else { cout<<"Ir"<<endl; } Manā gadījumā universālais risinājums būs labāks, ko ir īsāks un pārbaude ir vienkārša! Bet tavā gadījumā ir otrādi(kaut arī pārbaude arī ir ļoti vienkārša, bet vienalga). Takā es domāju, ka jāizmanto tajā brīdī izdevīgākais risinājums. Protams, pats jau arī teici, ka "Jo lielāks un sarežģītāks risinājums, jo labāk izmantot otro.". Es personīgi cenšos izmantot to variantu, kurš noteiktajā situācijā liekas labs, jo neesmu rakstījis super milzīgās programmas ar pāri 10'000 rindiņām. Par šo tiešām nebiju tik ļoti aizdomājies. Link to comment Share on other sites More sharing options...
Xirx Februāris 22, 2015 Share Februāris 22, 2015 (labots) Vajadzēja jau sākumā pieminēt, ka esi 6. klases skolnieks, nevis slinks students. 6. klases skolniekam visi ar prieku palīdzēs. Edit: tiek pieņemts, ka komunikācija ir godīga... Labots Februāris 22, 2015 - Xirx 1 Link to comment Share on other sites More sharing options...
dobbleextra Februāris 22, 2015 Author Share Februāris 22, 2015 Nu, jā, bet man jau arī palīdzēja! Ja domā, ka nepalīdzēja, jo nepateica visu priekša, tad es nemaz to negribēju. Link to comment Share on other sites More sharing options...
Vilx- Februāris 22, 2015 Share Februāris 22, 2015 (labots) Par to, kā labāk un pareizāk rakstīt programmas, ir daudzas grāmatas sarakstītas. Pāris vispārīgi ieteikumi: Visām savām lietām (mainīgie, funkcijas, klases, utml) dod sakarīgus nosaukumus, pēc kuriem var pateikt, ko tie dara. Nekad neej pretrunā ar šiem nosaukumiem (sak, rekur mainīgais, ko man vairs nevajag, izmantošu to!) Raksti komentārus pie lietām, kuras nav triviāli acīmredzamas no koda. Komentāros apraksti kas tiek darīts, un kāpēc. Neaizraujies ar to, "kā" tiek darīts. No šāda komentāra jēgas nav: i++; // Palielina i par 1 Domā vispirms par datu struktūrām, un tikai pēc tam par algoritmiem. Ar pareizu datu struktūru algoritms pats atradīsies. Pameditē par rakstiem iekš The Codeless Code. Bet, vispār, pieredze rodas darot, tā kā vienkārši kodē, kodē un vēlreiz kodē. Rekur, vēl pāris uzdevumi brīvajam laikam (vari pats piedzejot klāt rūķīšus un karaļvalstis, lai izklausās pēc interesanta uzdevuma): Atrast masīvā lielāko/mazāko elementu; Atrast masīvā lielāko/mazāko elementu, kas atbilst kaut kādam kritērijam (piem. dalās ar 3) Atrast visu masīva elementu summu; Atrast to masīva elementu summu kas atbilst kaut kādam kritērijam (piem. dalās ar 5); Izskaitīt, cik masīva elementi atbilst kaut kādam kritērijam (piem. pēdējais cipars ir 3); Un grūtāk:Sakārtot visus masīva elementus augošā secībā ar dažādiem algoritmiem. Uzmeklē internetā, viņi ir visdažādākie. Daži algoritmi, kurus derētu pazīt: Bubble Sort, Insert Sort, QuickSort, HeapSort. Bonus punktiem Radix Sort (ha! tas man būtu noderējis olimpiādēs!). Atrast, cik pirmā masīva elementi ir sastopami (vai nav sastopami) otrajā masīvā; Izvadīt uz ekrāna visus elementus, kas ir sastopami abos masīvos (vai arī ir sastopami tikai vienā masīvā); Atrodi funkciju, ar kuru var iegūt vienas direktorijas saturu. Uztaisi programmu, kura izskrien cauri C: diskam un atrod visus failus, kuri atbilst kaut kādam kritērijam (piem. nosaukumā ir vismaz 4, bet ne vairāk kā 6 burti). Hint: noderēs izmantot faktu, ka funkcija var izsaukt pati sevi. To, btw, sauc par "rekursiju". Have fun! Labots Februāris 22, 2015 - Vilx- Link to comment Share on other sites More sharing options...
dobbleextra Februāris 22, 2015 Author Share Februāris 22, 2015 (labots) Pld, Vilx, es gan jau pēdējajā laikā pildu uzdevumus hackerrank, bet šie uzdevumi arī patiešām noderēs. Labots Februāris 22, 2015 - dobbleextra Link to comment Share on other sites More sharing options...
Borja Februāris 22, 2015 Share Februāris 22, 2015 Ja visi masīva elementi dalās ar kādu skaitli, tad arī visu masīva elementu summa dalās. Un kaads no taa labums? Diemzheel, ja summa dalaas ar skaitli, tas nenoziimee, ka visi elementi dalaas. 1 Link to comment Share on other sites More sharing options...
dobbleextra Februāris 23, 2015 Author Share Februāris 23, 2015 (labots) Vilx, izpildīju tos uzdevums(visus izņemot pēdējo, to varētu pamēģināt vēlāk). Kods: 1. #define maxNum 9999 #define minNum -9999 int main() { int numbers[6] ={3,6,2,8,1,9}; int lielakais, mazakais; mazakais = maxNum; /* for(int v=0;v<6;v++) Atrodam lielāko un mazāko { */ if(mazakais>numbers[v]) mazakais=numbers[v]; } lielakais = minNum; for(int m=0;m<6;m++) { if(lielakais<numbers[m]) lielakais=numbers[m]; } cout<<lielakais<<endl<<mazakais<<endl; return 0; } 2. #define maxNum 9999 #define minNum -9999 int main() { int numbers[6] ={3,6,2,8,1,9}; int lielakais, mazakais; mazakais = maxNum; for(int v=0;v<6;v++) { if(mazakais>numbers[v] && numbers[v]%3==0) mazakais=numbers[v];//pārbaudām vai dalās ar 3 } lielakais = minNum; for(int m=0;m<6;m++) { if(lielakais<numbers[m] && numbers[m]%3==0) lielakais=numbers[m];//pārbaudām vai dalās ar 3 } if(lielakais!=-9999) { cout<<lielakais<<endl; } else { cout<<"Nepastav"<<endl; } if(mazakais!=9999) { cout<<mazakais<<endl; } else { cout<<"Nepastav"<<endl; } return 0; } 3. int main() { int numbers[6] ={3,6,2,8,1,9}; int sum=0; for(int b=0;b<6;b++)//Izejam cauri numbers[] un pieskaita pie sum { sum += numbers[b]; } cout<<sum<<endl; //Izprintējam uz ekrāna sum un endl return 0; } 4. int main() { int numbers[6] ={3,6,2,8,1,9}; int sum=0, elements1,elements2; bool doBreak = false; for(int b=0;b<6;b++)//Izejam cauri numbers[] un pieskaita pie sum { for(int h=0; h<6;h++)//Bez brute force nemācēju { if((numbers[b]+numbers[h])%5==0 && b!=h) //pārbaudām vai pašreizēja summa dalās ar 5 un vai indeksi nav vienādi { elements1=numbers[h]; elements2=numbers[b]; sum=numbers[h] + numbers[b]; doBreak=true; break; } if(doBreak)break; } } cout<<sum<<" "<<elements1<<" "<<elements2<<endl; //Izprintējam uz ekrāna sum, elements1 un elements2 un endl return 0; } 5. int main() { int numbers[6] ={35,63,28,83,19,92}; stringstream ss; for(int i=0;i<6;i++) { ss << numbers[i]; //pārveidojam uz string, lai pēctam pārabudītu vai pēdējais cipars ir "3" if(ss.str().substr(ss.str().length()-1,1)=="3") { cout<<numbers[i]<<endl; } } return 0; } 6. int main() { int numbers[6] ={35,63,28,83,19,92}; int tmp, counter; bool swapped = false; while(!swapped) { counter=0; swapped = true; counter++; for(int i=0;i<6-counter;i++) { if(numbers[i]>numbers[i+1]) //BUBBLE SORT { tmp = numbers[i]; numbers[i] = numbers[i+1]; numbers[i+1] = tmp; swapped = false; } } } for(int u=0;u<6;u++) { cout<<numbers[u]<<", "; } cout<<endl; int tmp2=0,tmp3=0; int numbers2[6] ={35,63,28,83,19,92}; for (int c = 1 ; c <= 6 - 1; c++) { tmp2 = c; while ( tmp2 > 0 && numbers2[tmp2] < numbers2[tmp2-1]) //INSEETION SORT { tmp3 = numbers2[tmp2]; numbers2[tmp2] = numbers2[tmp2-1]; numbers2[tmp2-1] = tmp3; tmp2--; } } for(int v=0;v<6;v++) { cout<<numbers2[v]<<", "; } return 0; } 7.,8. ielikiu abus vienā kodā, jo uzdevums apemēram vienāds int main() { int numbers[7]={35,63,28,83,19,92}; int numbers2[6]={64,72,63,92,33,35}; int counter=0; for(int i=0;i<7;i++) { for(int y=0;y<6;y++) { if(numbers[i]==numbers2[y]) //Izejam visam cauri un pārbaudam vai ir kāds skaitlis,k urš sakrīt. { cout<<numbers[i]<<", "; counter++; } } } cout<<endl; cout<<counter<<endl; return 0; } Labots Februāris 23, 2015 - dobbleextra Link to comment Share on other sites More sharing options...
Baigais Janka Februāris 23, 2015 Share Februāris 23, 2015 (labots) Uzreiz, tā uz aci par 1. un 2. #define maxNum 9999 #define minNum -9999 aivietojam ar maxNum = minNum = pirmais skaitlis masīvā (EDIT - precīzāk: mazakais = lielakais = ...). Nevajag lietot mistiskas vērtības Un vienā ciklā gan lielāko, gan mazāko meklējam. Un var tikt galā no masīva izmēra "cietas" lietošanas, tobiš, lai dinamiski masīva izmēru varētu mainīt. Tipa, #define elemof(x) (sizeof(x)/sizeof(*x)) static int numbers[] = {3,6,2,8,1,9}; // rakstām, cik tik skaitļus gribam for(int v=0; v < elemof(numbers); v++) { // ... } Labots Februāris 23, 2015 - Baigais Janka Link to comment Share on other sites More sharing options...
dobbleextra Februāris 23, 2015 Author Share Februāris 23, 2015 Ok, sapratu. Bet par tiem mazakais maxNum un lielakais = minNum. Es to darīju tāpēc, lai cikls neatkarīgi no pirmā elementa summas piešķirta mazakais pirmā elementa vērtību. Taču protams varētu jau darīt arī tā, ka sākumā piešķir mazakais numbers[0] vērtību. Link to comment Share on other sites More sharing options...
usver Februāris 23, 2015 Share Februāris 23, 2015 bool tests = true; for(int i=0;i<size;i++) { if(burti[i]!='A') { test=false; break; } } if(!tests){ cout<<"nav"<<endl; } else { cout<<"Ir"<<endl; } Nākamais solis - uztaisi kā funkciju šito. Funkcijas baigi noderēs un padarīs visu vēl labāku un uzturamāku boolean allArrayElementsTheSame(char* arr, char expectedChar) { .. if ( ) { return false; } return true; } visus cout pēc tam varēsi gan viegli pamainīt (nemainot kodā visu), gan pārbaudīt pēc kārtas dažādas char virknes, gan citādi izvērsties. if (allArrayElementsTheSame(burti, 'A')){ cout << "viss OK"; } else { cout << "bija izņēmums"; } Link to comment Share on other sites More sharing options...
dobbleextra Februāris 23, 2015 Author Share Februāris 23, 2015 Var jau izmantot funkcijas, bet tas šajā gadījumā kodu gandrīz vai pagarinātu nevis saīsinātu. Bet es pieņemu, ka mācību nolūkās tā varētu darīt, un tas saīsinātu funkciju Main(), kas ir labi. 1. uzdevumā mazākā un lielākā atrašanas kodu arī derētu padarīt par funkciju. int mazakais(int ar[8], int arSize) { int Mazakais = ar[0]; for(int i=1;i<arSize;i++) { if(Mazakais>ar[i]) { Mazakais=ar[i]; } } return Mazakais; } Un tad tik: int y[] = {5,3,2,1,8,4,6,3}; cout<<mazakais(y, sizeof(y)/sizeof(*y))<<endl; Link to comment Share on other sites More sharing options...
Baigais Janka Februāris 24, 2015 Share Februāris 24, 2015 (labots) Funkcijas nevis var lietot mācību nolūkos, bet vajag lietot. Kodu var padarīt stipri loģiskāku un vieglāk lasāmu. Un int mazakais(int ar[8], int arSize) - emmm... 'int ar[8]' - šitādas draņķības gan aizmirstam Laiks ķerties pie pointeriem, ja nav vēl pētīti. Labots Februāris 24, 2015 - Baigais Janka Link to comment Share on other sites More sharing options...
usver Februāris 24, 2015 Share Februāris 24, 2015 aha, funkcijas ir foršas ar to, ka tur neko hārdkodēt nevajag. sizeof(int) arī neaizmirstam izmantot, lai nav jāperversojas. Link to comment Share on other sites More sharing options...
dobbleextra Februāris 24, 2015 Author Share Februāris 24, 2015 (labots) Ok, paldies, es būšu to ar[8] laikam kautkā nejauši atstājis testējot vie u lietu programmā, jo es gribēju int* ar. Un pointeri tiešām būs vel jāpapēta, jo objektus un klases esmu jau izpētījis han c++, gan c#, bet pointerus savā ziņā atstājis novārtā Es gan vairāk rakstu c#, bet c++ arī nevajadzētu aizmirst. Labots Februāris 24, 2015 - dobbleextra Link to comment Share on other sites More sharing options...
Recommended Posts
Izveido kontu, vai pieraksties esošajā, lai komentētu
Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas
Izveidot jaunu kontu
Piereģistrējies un izveido jaunu kontu, tas būs viegli!
Reģistrēt jaunu kontuPierakstīties
Jums jau ir konts? Pierakstieties tajā šeit!
Pierakstīties tagad!