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

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


wakas

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

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

Γιατί αν βάλουμε απλά strlen τότε θα κάνει τον έλεγχο 2 φορές.! Με strlen/2 ελέγχει το πρώτο με το τελευταίο , το δεύτερο με το προτελευταίο , μέχρι το μεσαίο. Το θέμα είναι οτί και πάλι μπερδεύει.

Δημοσ.

Και γιατι να το κανεις; Εσυ θελεις να δεις αν ενα string περιεχει χαρακτηρες με στιγματα (η μη χαρακτηρες) σωστα; πχ !@#$%^ ji etc..

Δημοσ.

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

Το θέμα με τις τελείς κτλ το έχω λύσει.

Το πρόβλημα είναι η συνθήκη στο for.

Δημοσ.

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <ctype.h>

 

int palindrome(char [],int);

void ceasar(char [] , int);

int epil;

char String[100];

 

main()

{

int z,N,key;

int p;

 

printf("Please enter a string(100 characters max): \n");

gets(String);

N=strlen(String);

printf("\n (1) Check if the string is palindrome. \n (2) Encrypt the string using Ceasar 's cipher. \n (3) Exit. \n");

scanf("%d",&epil);

 

 

if (epil==1)

{

z=palindrome(String,N);

if (z==0)

{

printf ("H sumboloseira einai karkiniki");

}

else if (z==1)

{

printf ("H sumboloseira den einai karkiniki");

}

}

else if (epil==2)

{

printf("Please enter the key:");

scanf("%d",&key);

ceasar(String,key);

}

 

else{

exit;

}

system ("PAUSE");

}

 

 

 

int palindrome(char String[],int n)

{

int count;

int countback;

int end;

int i;

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

{

if (String>='a' && String<='z')

{

String=String-32;

}

}

printf("\n%s\n",String);

/*if ((n%2)==1)

end=n-1;

else

end=n;*/

end=n-1;

 

for((count=0, countback = end); count<=(end/2); ++count,--countback)

{

if ((String[count]>='A')&&(String[count]<='Z'))

{

if((String[countback]>='A')&&(String[countback]<='Z'))

{

if(String[count]!=String[countback])

{

return(1);

}

 

return(0);

}

else

{

countback--;

}

}

else

{

count++;

}

 

}}

 

 

 

void ceasar(char String[], int key)

{

 

int i;

char t;

int met;

t='Y'-21;

printf("%c",t);

while (String!='\0'){

if ((String>='A')&&(String<='Z'))

{

if (key+'String'>='Z')

{

met=26-key;

String=String-'Z';

 

}

 

}

else if (String>='a' && String<='z'){

}

}

printf("\n %s \n",String);

 

}

Δημοσ.

Τρέξε το πρόγραμμα όπως θεωρείς εσύ σωστό και πάτα τη λέξη anra και θα δεις οτί θα σου βγάλει λάθος. Θα σου βγάλει οτί είναι καρκινική ενώ δεν είναι.

 

---------- Προσθήκη στις 17:54 ---------- Προηγούμενο μήνυμα στις 17:41 ----------

 

Παιδιά το λάθος δεν είναι συντακτικό αλλά ΛΟΓΙΚΟ και το πιθανότερο είναι στις συνθήκες..

Δημοσ.
>
int palindrome(char String[],int n){

int end;
int i,flag=-1;
   for (i=0;i<n;i++)
       if (String[i]>='a' && String[i]<='z')
           String[i]=String[i]-32;


   printf("\n%s\n",String);
   end=n;

for(i=0; i< (end+1)/2; i++){
 if (String[i]>='A' && String[i]<='Z' && String[end - (i+1)]>='A' && String[end - (i+1)]<='Z') { 
   if(String[i] == String[end - (i+1)]){
       flag = 0;
   }
   else{
       flag = 1;
       break;
   }
}
}

return flag;
}

Δημοσ.
>
int palindrome(char String[],int n){

int end;
int i,flag=-1;
   for (i=0;i<n;i++)
       if (String[i]>='a' && String[i]<='z')
           String[i]=String[i]-32;


   printf("\n%s\n",String);
   end=n;

for(i=0; i< (end+1)/2; i++){
 if (String[i]>='A' && String[i]<='Z' && String[end - (i+1)]>='A' && String[end - (i+1)]<='Z') { 
   if(String[i] == String[end - (i+1)]){
       flag = 0;
   }
   else{
       flag = 1;
       break;
   }
}
}

return flag;
}

 

Αν βάλεις τη συμβολοσειρά

.,.,po.,,,ik..,ven.,.nevkiop

σου βγάζει οτί δεν είναι καρκινική ενώ είναι!!

Δημοσ.

@wakas

 

Δεν δουλεύεις το θέμα σωστά.

 

Πρέπει να χειριστείς τα μέρη του ένα ένα.

α) αποφασίζεις πώς θα χειρίζεσαι το ανάστροφο string. Δύο τρόποι υπάρχουν :

i) Εν διαβάσει, δηλ. την ώρα που κάνεις τον έλεγχο (χωρίς να φτιάξεις πραγματικά το ανάστροφο).

ii) Φτιάχνεις το ανάστροφο και έχεις να συγκρίνεις δύο strings.

Γινεται είτε με έτοιμες συναρτήσεις είτε με ιδιοκατασκευή.

 

Για μεθοδική αντιμετώπιση τo πιο σαφές είναι το ii) . Έστω ότι αυτό κάνεις.

Ελέγχεις ότι το ανάστροφο string φτιάχνεται σωστά.

 

β) Έχοντας φτιάξει το α) ii), συγκρίνεις τα δύο stings.

Και αυτό γίνεται είτε με έτοιμες συναρτήσεις είτε με ιδιοκατασκευή.

Εφόσον και το β) δουλέψει, προχωράς στο γ)

 

γ) Γράφεις την ρουτίνα που καθαρίζει το string από τους ανεπιθύμητους χαρακτήρες.

Αυτό το κάνεις τελευταίο αλλά προφανώς θα το βάλεις στο πρόγραμμα πριν εκτελεστούν τα α) , β).

Π.χ. ορίζεις ένα νέο string που είναι το φιλτραρισμένο με το οποίο τροφοδοτούνται οι ρουτίνες στα α) , β).

Ή όλους τους ανεπιθύμητους χαρακτήρες τους αντικαθιστάς με κενό.

Ή...

Δηλ. το γ) είναι το λιγότερο σημαντικό και το γράφεις τελευταίο. Θα το μπει στο πρόγραμμα αφού

γράψεις τα α), β) και ελένξεις ότι είναι σωστά.

 

 

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

Έτσι ξέρεις και πού ακριβώς είναι το τυχόν λαθος (στη σύγκριση των δύο strings, στην κατασκευή του ανάστροφου, στο 'φιλτράρισμα' ...)

Ψάχνεις μόνον το συγκεκριμένο βήμα και μόνο αφού είναι σωστό προχωράς παρακάτω.

 

Αυτό που έχεις κάνει μόνο μεθοδικό δεν είναι και δεν σε βοηθά...

 

-

Δημοσ.

Το:

>if (String[i]>='a' && String[i]<='z')
           String[i]=String[i]-32;

και το:

>if(String[i] == String[end - (i+1)]){

μπορεί να αντικατασταθούν από το:

>if(stricmp(String[i], String[end - (i+1)) == 0]){

Επίσης το end μπορεί να τεθεί ίσο με n-1 και το:

>String[end - (i+1)

να γίνει:

>String[end - i

για περισσότερη ευκολία.

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

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

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