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

Υλοποίηση προγράμματος σε γλώσσα C


wakas

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

Δημοσ.

το όλο προβλημα εντοπίζεται στην λύση

 

η λύση προϋποθέτει την ύπαρξη συμμετρίας

όχι μόνο στους χαρακτήρες αλλά και στα σημεία στίξης

 

για να το αποφύγεις και να δουλέψει πρέπει να δημιουργήσεις μία νέα

συμβολοσειρά απαλλαγμένη από τα σημεία στίξης

 

κάτι τέτοιο δηλαδή

 

>
int palindrome(char String[],int n){
char String2[n+1];
int end;
int count=0,i,flag=-1;
   for (i=0;i<n;i++)
       if (String[i]>='a' && String[i]<='z')
           String[i]=String[i]-32;
for (i=0;i<n;i++)
   if (String[i]>='A' && String[i]<='Z')
       String2[count++]=String[i];
   String2[count]='\0';
   printf("\nme simeia stiksis=%s\n",String);
   printf("\nxoris simeia stiksis=%s\n",String2);
   end=count;

for(i=0; i< (end+1)/2; i++){
   if(String2[i] == String2[end - (i+1)]){
       flag = 0;
   }
   else{
       flag = 1;
       break;
   }
}

return flag;
}

  • Απαντ. 45
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Δεν είναι δυνατόν να κάνουμε το πρόγραμμα χωρίς να κατασκεβάσουμε το ανάστροφο του string;

Προσωπικά πιστεύω οτί γίνεται και γι αυτό ψάχνω το ΛΟΓΙΚΟ λάθος στις συνθήκες το for.

Δημοσ.

@wakas

 

To θέμα δεν είναι αν μπορεί να γίνει - προφανώς μπορεί.

Αλλά ότι εσύ ΔΕΝ έχεις την εξοικοίωση να το κάνεις όσο κι' αν μοιάζει απλό.

 

Γι αυτό σου είπα από την αρχή φτιάξε ένα ξεχωριστό ανάστροφο και σύγκρινε τα δύο : επειδή έτσι μπορείς να εξετάσεις το πρόβλημα πιο μεθοδικά.

Αν το είχες κάνει με αυτόν τον μεθοδικό τρόπο θα ήξερες πού και τι δεν δουλεύει.

Και ο Virxen ουσιωδώς αυτό λέει στο post #31.

 

-

Δημοσ.
το όλο προβλημα εντοπίζεται στην λύση

 

η λύση προϋποθέτει την ύπαρξη συμμετρίας

όχι μόνο στους χαρακτήρες αλλά και στα σημεία στίξης

 

για να το αποφύγεις και να δουλέψει πρέπει να δημιουργήσεις μία νέα

συμβολοσειρά απαλλαγμένη από τα σημεία στίξης

 

κάτι τέτοιο δηλαδή

 

>
int palindrome(char String[],int n){
char String2[n+1];
int end;
int count=0,i,flag=-1;
   for (i=0;i<n;i++)
       if (String[i]>='a' && String[i]<='z')
           String[i]=String[i]-32;
for (i=0;i<n;i++)
   if (String[i]>='A' && String[i]<='Z')
       String2[count++]=String[i];
   String2[count]='\0';
   printf("\nme simeia stiksis=%s\n",String);
   printf("\nxoris simeia stiksis=%s\n",String2);
   end=count;

for(i=0; i< (end+1)/2; i++){
   if(String2[i] == String2[end - (i+1)]){
       flag = 0;
   }
   else{
       flag = 1;
       break;
   }
}

return flag;
}

 

Σωστός ο Οφιτζής!!

Να σαι καλά φίλε!! 3 μέρες τώρα ψάχνουμε αυτή τη βλακεία.

Ευχαριστώωωωωωωωωωωωωωωωω!!!!

Δημοσ.
το όλο προβλημα εντοπίζεται στην λύση

 

η λύση προϋποθέτει την ύπαρξη συμμετρίας

όχι μόνο στους χαρακτήρες αλλά και στα σημεία στίξης

 

για να το αποφύγεις και να δουλέψει πρέπει να δημιουργήσεις μία νέα

συμβολοσειρά απαλλαγμένη από τα σημεία στίξης

 

κάτι τέτοιο δηλαδή

 

>
int palindrome(char String[],int n){
[color="red"]char String2[n+1];[/color]
int end;
int count=0,i,flag=-1;
   for (i=0;i<n;i++)
       if (String[i]>='a' && String[i]<='z')
           String[i]=String[i]-32;
for (i=0;i<n;i++)
   if (String[i]>='A' && String[i]<='Z')
       String2[count++]=String[i];
   String2[count]='\0';
   printf("\nme simeia stiksis=%s\n",String);
   printf("\nxoris simeia stiksis=%s\n",String2);
   end=count;

for(i=0; i< (end+1)/2; i++){
   if(String2[i] == String2[end - (i+1)]){
       flag = 0;
   }
   else{
       flag = 1;
       break;
   }
}

return flag;
}

 

Αυτό είναι C99? Γιατί κανονικά δεν πρέπει να περνάει...

Δημοσ.
Αυτό είναι C99? Γιατί κανονικά δεν πρέπει να περνάει...

 

Πήρα την απάντηση μου, variable length arrays, είναι C99 στοιχείο, νέες μόδες...

Δημοσ.
Πήρα την απάντηση μου, variable length arrays, είναι C99 στοιχείο, νέες μόδες...

 

Επικινδυνες μοδες. Με το ενα ποδι στο stackoverflow ειναι.

Δημοσ.
Πήρα την απάντηση μου, variable length arrays, είναι C99 στοιχείο, νέες μόδες...

 

Επικινδυνες μοδες. Με το ενα ποδι στο stackoverflow ειναι.

 

Μοιραστειτε την γνωση ρε παιδια. Τι εννοειται? Απο που το καταλαβες και γιατι δεν περναει?

Επισης γιατι ειναι επικινδυνο? Ευχαριστω εκ των προτερων για την οποια απαντηση

(Απλα για να μαθαινουμε οι νεοι)

Δημοσ.
Μοιραστειτε την γνωση ρε παιδια. Τι εννοειται? Απο που το καταλαβες και γιατι δεν περναει?

Επισης γιατι ειναι επικινδυνο? Ευχαριστω εκ των προτερων για την οποια απαντηση

(Απλα για να μαθαινουμε οι νεοι)

 

07fig06.gif;423615

Στο παραπανω βλεπεις πως καθεται ενα προγρμμα C στη μνημη. Στο κομματι που λεει stack μπαινουν οι μεταβλητες της συναρτησης. Οταν φτιαχνεις ενα static array τοτε αυτο μπαινει μεσα στη stack, αρα η stack σου μεγαλωνει. Το θεμα ειναι οτι η stack δεν ειναι για να κραταει μαζες απο δεδομενα, αλλα ενα περιορισμενο αριθμο απο δεδομενα τα οποια ειναι για επεξεργασια (πχ οταν θα κανεις convert μια ταινια, αυτη τη ταινια δεν θα τη ανεβασεις ολη πανω στη μνημη αλλα κομματι κομματι, αρα εχεις εναν περιορισμο της μνημης σε σχεση του δικου. Το ιδιο γινεται και στη μνημη που χωριζεται σε καποια κομματια. Εχεις λιγη stack και αρκετη heap)

 

Εαν θες να κανεις κατι πρακτικο, φτιαξε ενα static array με μεγεθος 10mb (char a[1024*1024*10];) και θα δεις οτι θα σου κρασαρει το προγραμμα. Αλλος τροπος για να προκαλεσεις stackoverflow ειναι η χρηση της αναδρομικης συνρτησης.

Δημοσ.

Όπως αναφέρθηκε και προηγουμένως, δεν χρειάζεται να αντιστρέψεις το string. Μπορείς να κάνεις κάτι σαν:

 

 

 

>int ValidChar = 1;
for (i = 0; i < Length; i++)
{
if (string[i] != string[Length-i])
{
	ValidChar = 0;
	break;
}
}
if (ValidChar = 1)
{
printf("Είναι καρκινικό");
}
else
{
printf("Μπα...");
}

 

Όπου Length είναι η επιστροφή της strlen() για το string που περιέχει τη λέξη, και string[] το char array που έχει μέσα τη λέξη μας.

Δημοσ.
Όπως αναφέρθηκε και προηγουμένως, δεν χρειάζεται να αντιστρέψεις το string. Μπορείς να κάνεις κάτι σαν:

 

 

 

>int ValidChar = 1;
for (i = 0; i < Length; i++)
{
if (string[i] != string[Length-i])
{
	ValidChar = 0;
	break;
}
}
if (ValidChar = 1)
{
printf("Είναι καρκινικό");
}
else
{
printf("Μπα...");
}

 

Όπου Length είναι η επιστροφή της strlen() για το string που περιέχει τη λέξη, και string[] το char array που έχει μέσα τη λέξη μας.

 

 

 

το for σου είναι λάθος δες το ξανά

δες τον κώδικα που έχω στείλει ήδη

Δημοσ.

Έχεις δίκιο, ελέγχω και το terminating character έτσι. Θέλει Length-1 στη for και string[(Length-1)-i] στην if.

 

Το συγκεκριμένο το δοκίμασα και λειτουργεί όπως πρέπει πάντως.

Δημοσ.
Έχεις δίκιο, ελέγχω και το terminating character έτσι. Θέλει Length-1 στη for και string[(Length-1)-i] στην if.

 

Το συγκεκριμένο το δοκίμασα και λειτουργεί όπως πρέπει πάντως.

 

ο τρόπος λειτουργίας είναι ελέγχω το πρώτο με το τελευταίο

το 2ο με το προτελευταίο .......

 

άρα πρόκειται για ζευγάρια άρα θες το μισό for από αυτό που χρησιμοποιεις

 

για να το καταλάβεις βάλε μία printf να σου δείχνει τι συγκρίνει με τι.

Δημοσ.
07fig06.gif;423615

Στο παραπανω βλεπεις πως καθεται ενα προγρμμα C στη μνημη. Στο κομματι που λεει stack μπαινουν οι μεταβλητες της συναρτησης. Οταν φτιαχνεις ενα static array τοτε αυτο μπαινει μεσα στη stack, αρα η stack σου μεγαλωνει. Το θεμα ειναι οτι η stack δεν ειναι για να κραταει μαζες απο δεδομενα, αλλα ενα περιορισμενο αριθμο απο δεδομενα τα οποια ειναι για επεξεργασια (πχ οταν θα κανεις convert μια ταινια, αυτη τη ταινια δεν θα τη ανεβασεις ολη πανω στη μνημη αλλα κομματι κομματι, αρα εχεις εναν περιορισμο της μνημης σε σχεση του δικου. Το ιδιο γινεται και στη μνημη που χωριζεται σε καποια κομματια. Εχεις λιγη stack και αρκετη heap)

 

Εαν θες να κανεις κατι πρακτικο, φτιαξε ενα static array με μεγεθος 10mb (char a[1024*1024*10];) και θα δεις οτι θα σου κρασαρει το προγραμμα. Αλλος τροπος για να προκαλεσεις stackoverflow ειναι η χρηση της αναδρομικης συνρτησης.

 

Ευχαριστω πολυ για την απαντηση. Την πρωτη φορα δεν παρατηρησα οτι ειχε σημειωσει με κοκκινο το σημειο στο οποιο αναφερεται, και τωρα με την δικια σου (πληρεστατη) εξηγηση πιστευω σχηματισα μια καλη εικονα για το τι συμβαινει. Μια τελευταια ερωτηση (αν δεν σε κουραζω), αυτου του ειδους η δηλωση πινακα δεν ηταν και στο C89?

Αρχειοθετημένο

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

  • Δημιουργία νέου...