Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.
Στο παρακάτω πρόγραμμα έχω ένα μενού επιλογών και τρέχει σωστά όταν βάζω τιμές για το μέγεθος του πίνακα που είναι σχετικά μικρές όπως 99,101,150... αλλά για τιμές όπως 200,250 και ιδικά για  2000,50000 μέγεθος που θέλω να κάνω εγώ χρήση δεν λειτουργεί καθόλου. Βοηθήστε με σας παρακαλώ γιατί θέλω να προλάβω την προθεσμία.Υπάρχει περίπτωση να φταίει ο compiler devC/C++ που χρησιμοποιώ.? Σας ευχαριστώ εκ των προτέρων.   

 

 

 

#include<stdio.h>

#include<stdlib.h>

int main()

{

 int choice,i,N,a[N];

 do{//dhmiourgeia menou epilogwn 

    printf("Parakalw epilexte mia apo tis parakatw epiloges:\n");

    printf("EPILEXTE 1.gia na eisagete to megethos tou pinaka\n");

    printf("EPILEXTE 2.gia gia tin ektypwsh twn stoixeiwn tou pinaka\n");

    printf("EPILEXTE 3.gia na kanete anazhthsh enos arithou tis epiloghs sas ston pinaka\n");

    printf("EPILEXTE 4. EXIT \n");

    printf("DWSE EPILOGH APO TO MENOU: ");

    scanf("%d",&choice);

    switch(choice){   

    case 1:

          {

           printf("DWSE TO MEGETHOS TOU PINAKA: ");

           scanf("%d",&N);//o xrhsths dinei to megethos tou pinaka

           //topothetw tis times gia tis 2 prwtes theseis giati dn isxuei h akolouthia gia a[0],a[1]

           if(N>0)

              a[0]=0;    

           if(N>1)

              a[1]=1;  

           for(i=2;i<N;i++)//gemizw ton pinaka simfwna me tin akolouthia

              a=a[i-1]+(2*i);  

           break;                           

          }     

    case 2:

          {

           printf("Stoixeia tou pinaka:\n");

           for(i=0;i<N;i++)

           printf(" %d ",a);//ektpwnw ta stoixeia tou pinaka

           break;

          } 

    case 3:

          { 

           int x,flag=1;

           printf("DWSE ARITHMO GIA ANAZHTHSH STON PINAKA: ");

           scanf("%d",&x);//o xrhsths epilegei enan arithmo gia anazhthsh

           i=0;

           do{   

              if(a==x)

                 flag=0;//an vrehtei allazw to flag se '0' kai teliwnei h anazhthsh

              i++;//h thesi ston pinaka tou x einai (i-1) otan teleiwn h epanalhpsh

             }

           while(flag==1 && i<N ); 

           if(flag==1)

              printf("\nO arithmos pou eisagate DEN YPARXEI\n");

           else

              printf("\no arithmos %d vrethike stin thesi %d tou pinaka\n",x,(i-1));

           break;

          }

         } 

    printf("\n");

    }

  while(choice != 4 );//an epilogh=4 tote exit

  

    system("PAUSE");

 

return 0;

}

 

Δημοσ.

Αν μπορείς βάλε σε code tags το κώδικα γιατί δεν θα βγάλει άκρη κανείς με αυτή την μακαρονάδα.

Δημοσ.

To μεγεθος του πινακα πρεπει να ειναι σταθερά, δεν μπορει να το δωσει ο χρήστης. 

Για δυναμική παραχώρηση μνημης καντο με δεικτη σε int* 

Δημοσ.

To μεγεθος του πινακα πρεπει να ειναι σταθερά, δεν μπορει να το δωσει ο χρήστης. 

Για δυναμική παραχώρηση μνημης καντο με δεικτη σε int* 

Ειναι "σωστο" το int a[N]; αρκει το Ν να εχει αρχικοποιηθει. πχ

printf("DWSE TO MEGETHOS TOU PINAKA: ");
scanf("%d",&N);
int a[N];
Δημοσ.

 

Ειναι "σωστο" το int a[N]; αρκει το Ν να εχει αρχικοποιηθει. πχ

printf("DWSE TO MEGETHOS TOU PINAKA: ");
scanf("%d",&N);
int a[N];

 

Έχω την εντύπωση ότι εξαρτάται απο τον Compiler, νομίζω με τον C89 δεν γίνεται ενώ με τους μεταγενέστερους γίνεται. That being said, μιας και είναι άσκηση χρησιμοποίησε τη malloc για να περάσεις ωραία με dynamic memory management.

Δημοσ.

Απλά αρχικοποιεί τον a με junk μέγεθος μιας και το N δεν έχει πάρει τη σωστή τιμή ακόμα.

int main()
{
 int choice,i,N,a[N];  // δηλαδή πόσο μεγάλος θα είναι ο a?

Ενδεχομένως έχεις μπερδευτεί στο ότι η δήλωση "int a[N]" δε σημαίνει ότι ο a θα είναι πάντα τόσο μεγάλος όσο και το N, σημαίνει πως θα είναι τόσο μεγάλος όσο είναι το N τη στιγμή που εκτελείται αυτή η γραμμη. Αυτό είναι λάθος και προφανώς δεν σώζεται παρά μόνο μετατοπίζοντας τη δήλωση του a μετά την αρχικοποίηση του N, πράγμα το οποίο είναι ΟΚ εφόσον μιλάμε για VLA άρα C99. Έτσι όπως είναι ο κώδικας απλά κάνει overrun τον πίνακα, "σκοτώνει" όλο το stack (και το σωσμένο EBP από το προηγούμενο stack frame) και πυροτεχνήματα.

 

Πάντως θα πρότεινα αντί γι' αυτό να το κάνεις απλά με malloc.

Δημοσ.

Ναι παιδιά για c99 μιλάω -κακώς δεν το έγραψα-.

Πάντως αν είναι για άσκηση μάλλον το Ν θα είναι από define, εκτός κι αν το λέει ρητά ότι θα γίνεται δυναμική δέσμευση του πίνακα. (λίγο νωρίς για να έχουν φτάσει στη δυναμική δέσμευση)

Δημοσ.
Παιδια,ειμαι αρχαριος στη C και εχω ορισμενα προβληματα.Δεν ξερω γιατι δεν παιρνω αποτελεσματα εδω:

 

 

#include <stdio.h> 

int main()

{    

int a,b,max;

printf("Give 2 values"); 

scanf("%d%d%",&a,&B);

if (a > B)

    max = a;

else

    max = b;

printf("max is %d\n",max);

 

 

int ek1,ek2,dek1,dek2,mon1,mon2; 

ek1= a / 100; 

ek2=b / 100; 

dek1=(a % 100) / 10; 

dek2=(b % 100) / 10; 

mon1=(a % 100) % 10; 

mon2=(b % 100) % 10;

printf("ekatontades 1ou arithmou %d\n",ek1); 

printf("ekatonrades 2ou arithmou %d\n",ek2); 

printf("dekades 1ou arithmou %d\n",dek1); 

printf("dekades 2ou arithmou %d\n",dek2); 

printf("monades 1ou arithmou %d\n",mon1); 

printf("monades 2ou aritmhou %d\n",mon2);

 

 

int diaf; 

if (a > B) 

  diaf = a - b; 

else 

  diaf = b - a;

printf("The difference is %d\n",diaf);

 

 

int ek3,mon3,dek3; 

ek3= diaf / 100; 

dek3=(diaf % 100) / 10; 

mon3=(diaf % 100) %10; 

printf("ekatontades diaforas %d\n",ek3); 

printf("dekades diaforas %d\n",dek3); 

print("monades diaforas %d\n",mon3);

system("pause");

return 0;

}
Δημοσ.
 #include <stdio.h> 
int main()
{    
int a,b,max;
printf("Give 2 values"); 
scanf("%d%d%",&a,& ;
if (a >  
    max = a;
else
    max = b;
printf("max is %d\n",max);
 
 
int ek1,ek2,dek1,dek2,mon1,mon2; 
ek1= a / 100; 
ek2=b / 100; 
dek1=(a % 100) / 10; 
dek2=(b % 100) / 10; 
mon1=(a % 100) % 10; 
mon2=(b % 100) % 10;
printf("ekatontades 1ou arithmou %d\n",ek1); 
printf("ekatonrades 2ou arithmou %d\n",ek2); 
printf("dekades 1ou arithmou %d\n",dek1); 
printf("dekades 2ou arithmou %d\n",dek2); 
printf("monades 1ou arithmou %d\n",mon1); 
printf("monades 2ou aritmhou %d\n",mon2);
 
 
int diaf; 
if (a >  
  diaf = a - b; 
else 
  diaf = b - a;
printf("The difference is %d\n",diaf);
 
 
int ek3,mon3,dek3; 
ek3= diaf / 100; 
dek3=(diaf % 100) / 10; 
mon3=(diaf % 100) %10; 
printf("ekatontades diaforas %d\n",ek3); 
printf("dekades diaforas %d\n",dek3); 
print("monades diaforas %d\n",mon3);
system("pause");
return 0;
}

Καλυτερα να το βάζεις σε CODE tags μεσα για να ειναι πιο ευαναγνωστο οπως εκανα και εγω τωρα. Φτιαξε λιγο την scanf και το if γιατι δειχνει ενα emoticon και οχι κατι με νόημα. To προγραμμα αυτο έχει να κανει με κάποιους υπολογισμούς επομενως κάποιο θέμα θα έχεις στις εκφράσεις για να μην παιρνεις τα αποτελεσματα που θέλεις.

 

Επισης κατι σημαντικο για να μειώσεις τις γραμμές στον κώδικα : 

 
if (a >  b )
    max = a;
else
    max = b;
printf("max is %d\n",max);
 

ειναι 5 γραμμές ενω μπορει να γινει και με μια ως εξής : 

  printf(" Max is : %d " , a > b ? a : b );

Αν a > b επεστρεψε μου το a στην αντιθετη περιπτωση επέστρεψε b.

 

YΓ Πολυ καλή η στοιχιση σου ειδικα στα if ... else. ;)

Δημοσ.

Τι ειναι το Code Tags??

 

Ειναι ετικέτες εντος των οποίων βάζεις τον κωδικα σου. Η αρχη ειναι με 2 αγκύλες []  μεσα στις οποιες μπαινει το CODE και στο τελος το ιδιο απλα αυτη τη φορα μεσα στις αγκυλες το CODE ειναι ετσι -> /CODE ΔΕΝ μπορω να το γραψω αλλιως γιατι θα το πιάσει και δεν θα το δεις πχ ->

εδω μπαινει ο κωδικας...

Το παραπανω το έβαλα ακριβως μετα την ετικετα της αρχής και μολις τελειωσα εβαλα την ετικετα τέλους. Ετικετα αρχης ειναι οτι εγραψα και πιο πανω δηλαδη 2 αγκύλες μεσα στις οποιες ειναι το CODE και ετικετα τέλους το ιδιο απλα αυτη τη φορά /CODE. 

  • Like 1
Δημοσ.

Δουλευω την C μονο 2 βδομαδες και μερικα δεν τα πολυκαταλαβαινω.Keep Learning Newbie

 

Οτι δεν καταλαβαινεις γράψτο εδω να το συζητήσουμε. Οπως το έγραψες Keep Learning και υπομονή. ;)

 

μΕΘΟΔΙΚΗ δουλειά και υπομονή. 

Δημοσ.

Στην άσκηση έχεις 2 "λάθη" ! Το πρώτο είναι στο scanf έχεις βάλει ένα % παραπάνω και το δεύτερο είναι η τελευταία printf() έχεις ξεχάσει το f! Παρόλα αυτά ο κώδικας είναι μια χαρά και τρέχει σωστά!

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...