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

Που κανω λαθος; Προγραμμα C


gl_xristos

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

Δημοσ.

Καλησπερα.Εχω στησει το Netbeans με mingw και προσπαθω να μαθω την C.

Εχω το βιβλιο των Κ&R και προσπαθω να κανω την ασκηση 2.5.

Ο σκοπος ειναι να επιστρεφει την πρωτη θεση του αλφαριθμητικου s1 οπου υπαρχει οποιοσδηποτε απο τους χαρακτηρες του s2 ή την τιμη -1 αν δεν υπαρχει κανενας.Υπαρχει ετοιμη εντολη αλλα δεν μου κανει αφενος γιατι επιστρεφει δεικτη που δειχνει στη θεση αυτη και αφετερου γιατι πρεπει το φτιαξω εγω.Το προβλημα ειναι οτι το προγραμμα ελεγχει μονο τον τελευταιο χαρακτηρα αν εχει πολλους. Δηλαδη αν στο s2 βαλω ik. Θα βγαλει -1 και ας υπαρχει το i μεσα. Οριστε το προγραμμα μου. Ευχαρηστω εκ των προτερων.

 

#include <stdio.h>

#include <stdlib.h>

 

 

int any(char s1[],char s2[]);

 

int main(int argc, char** argv) {

int c;

c = any("geia","ia");

if (c==-1)

printf(" %d ",c);

else

printf(" %c ",c);

return (EXIT_SUCCESS);

}

 

int any(char s1[],char s2[])

{

int i,j;

 

for (j=0;s2[j]!='\0';j++)

for(i=0; s1!=s2[j] && s1!= '\0';i++)

;

if (s1=='\0')

return -1;

else return s1;

 

}

Δημοσ.

μέσα στην any στο else return επιστρέφεις char και όχι int που θα έπρεπε

μιας και αυτό περιμένει το πρόγραμμα

για κάτι άλλο δεν κοίταξα

αν θέλεις κάτι άλλο ξανά λες..

Δημοσ.

Οι char ειναι μικροι ακεραιοι και στις αριθμητικες παραστασεις οι μεταβλητες και οι σταθερες char ειναι ιδιες με int.

Οταν ειχα βαλει την any σαν char δεν μπορσουσα να δωσω αποτελεσμα -1. Ετσι σκεφτηκα να τις περασω σε int και αναλογα

το ορισμα στην printf να παρω το καταλληλο αποτελεσμα. Χωρις να ειμαι σιγουρος.

Διορθωσε με αν κανω καπου λαθος.

Ειτε δηλωσω την any ως char ειτε ως int ελεγχει μονο τον τελευταιο χαρακτηρα (δεν ξερω γιατι). Δεν αλλαζει κατι.

Εκτος αν μου προτεινες κατι αλλο που δεν καταλαβα.

Ευχαρηστω.

Δημοσ.
for (j=0;s2[j]!='\0';j++)

for(i=0; s1!=s2[j] && s1!= '\0';i++)

;

 

Ξέχασες μερικά {}, τα for εκτελούνται διαδοχικά όπως το έχεις γράψει. Και να τα βάλεις δε θα δουλέψει όπως θες, αφού ζητάει την πρώτη θέση του s1 που θα βρεθεί match, πρέπει να το αλλάξεις λίγο.

 

Επίσης άρχισε από τώρα να παίζεις με τον debugger, δηλαδή να προχωράς βήμα βήμα το πρόγραμμα και να κοιτάς κάθε στιγμή τις τιμές των μεταβλητών σου (με breakpoints και watches), θα σε βοηθήσει πολύ.

Δημοσ.

Καταλαβα οτι κατι με τις επαναλαψεις παιζει αλλα δεν το ελυσα ακομα. Το εχω γραψει με διαφορους τροπους αλλα δεν πετυχαινει.

Θα μπορουσες να κανεις την διορθωση και να μου πεις γιατι.

Ευχαρηστω.

Δημοσ.

εγώ θα το έγραφα έτσι....

 

>
#include <stdio.h>
#include <stdlib.h>


int any(char s1[],char s2[]);

int main(int argc, char** argv) {
   int c;
   c = any("geiiaa","ai");
   if (c==-1)
       printf(" %d ",c);
   else
       printf(" %d ",c);
   getchar();
   return (EXIT_SUCCESS);
}

int any(char s1[],char s2[]){
   int i,j,min=-1;
   if (s1==NULL || s2==NULL)
       return -1;
   for (j=0;s2[j]!='\0';j++)
       for(i=0;s1[i]!='\0';i++){
            if (s1[i]==s2[j]){
               if (min==-1)
                   min=i; 
               else
                   if (i<min)
                       min=i;
               break;           
           }
       }
   return min;
}

  • 2 εβδομάδες αργότερα...
Δημοσ.

ελυσες το προβλημα σου ?

 

Ναι το προβλημα λυθηκε. Ευχαρηστω για το ενδιαφερον.

Συγνωμη που αργησα να απαντησω τωρα το ειδα.

  • 2 μήνες μετά...
Δημοσ.

Αν και πολύ καθυστερημένα (σήμερα ανακάλυψα αυτό το υπο-φόρουμ) παραθέτω τη δική μου λύση, υλοποιημένη με pointers (ίσως έχεις φτάσει ήδη στο κεφάλαιο των pointers).

 

Η λογική μοιάζει πολύ με τη δική σου υλοποίηση, αλλά διορθώνω με τη μεταβλητή found το λάθος που κάνεις με τα return στο if-else statement της any() (τα οποία εξαναγκάζουν τη συνάρτηση να τερματίσει μετά από τον έλεγχο μόνο του 1ου χαρακτήρα στο s1).

 

Επίσης, χρησιμοποιώ τη συμπτυγμένη μορφή ( ? : )του if-else, επειδή εκτελείται πιο γρήγορα. Και τέλος, επειδή δεν χρησιμοποιώ integer μετρητές, τη θέση του χαρακτήρα στο s1 σε περίπτωση επιτυχίας την υπολογίζω απευθείας με pointer arithmetic (cp1-s1)

 

Ελπίζω να φανεί χρήσιμο σε κάποιους

 

>
#include <stdio.h>

// ---------------------------------------------------
// επιστρέφει την θέση του πρώτου *s1 που υπάρχει μέσα στο s2, αλλιώς -1
//
int any(const char *s1, const char *s2)
{
const char *cp1, *cp2;
int found = -1;

if ( !s1 || !s2 )
	return -1;

for (cp1=s1; *cp1 && found == -1; cp1++)
{
	for (cp2=s2; *cp2 && *cp2 != *cp1; cp2++) ;
	found = *cp2 ? (cp1-s1) : -1;
}

return found;

}

// --------------------------------
int main( void )
{
printf("%d", any("geiiaa","ia"));
getchar();
return 0;
}

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

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

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