Jump to content

Visu array elementu pārbaudes algoritms


dobbleextra

Recommended Posts

dobbleextra

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 post
Share on other sites

Padomā no otras puses - Tev nevajag atrast, vai VISI ir true. Tev vajag atrast, vai nav vismaz VIENS, kurš ir false. ;)

Link to post
Share on other sites

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 post
Share on other sites

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 post
Share on other sites
dobbleextra


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!

  • Patīk 1
Link to post
Share on other sites

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. Edited by Vilx-
Link to post
Share on other sites
dobbleextra

Ā,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 post
Share on other sites

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. :p Un prieks dzirdēt, ka jau tik agri interesējies par programmēšanu! Tā turpināt! :)

Link to post
Share on other sites
dobbleextra

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 post
Share on other sites
versatile

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;

Edited by versatile
Link to post
Share on other sites
dobbleextra

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 post
Share on other sites

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... :)

Edited by Xirx
  • Patīk 1
Link to post
Share on other sites

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. :D
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! :) Edited by Vilx-
Link to post
Share on other sites
dobbleextra

Pld, Vilx, es gan jau pēdējajā laikā pildu uzdevumus hackerrank, bet šie uzdevumi arī patiešām noderēs.

Edited by dobbleextra
Link to post
Share on other sites

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.

  • Patīk 1
Link to post
Share on other sites
dobbleextra

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;
}

Edited by dobbleextra
Link to post
Share on other sites
Baigais Janka

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++)
{
// ...
}
Edited by Baigais Janka
Link to post
Share on other sites
dobbleextra

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 post
Share on other sites
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 post
Share on other sites
dobbleextra

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 post
Share on other sites
Baigais Janka

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.

Edited by Baigais Janka
Link to post
Share on other sites

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 post
Share on other sites
dobbleextra

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.

Edited by dobbleextra
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...
×
×
  • Create New...