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

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

Δημοσ.

Λοιπον...

καταρχας για τον eclipse, δεν ειναι δεν μου εμφανιζει τα errors, απλα καποιες φορες μου πεταει μια καρτα το λειτουργικο που λεει οτι το projectName.exe σταματησε να λειτουργεί...

 

Και δευτερον, για τη διαγραφη του κομβου κατα τη διαρκεια προσπελασης της λιστας, εχω μπερδευτει λιγακι :( Το προβλημα μου δεν ειναι συγκεκριμενα αν το πεδιο data του κομβου ειναι ==4...Aπλα το απλοποιησα για να το θεσω σαν ερωτηση . Δηλαδη στο δικο μου προβλημα δεν μπορω να χρεισημοποιησω συναρτησεις αναζητης για μια συγκεκριμενη τιμη (σιγουρα σας μπερδεψα)

 

Απλα αυτο που θα ηθελα εγω ειναι να να διαγραφετε ενας κομβος κατα τη διαρκεια προσπελασης της λιστας, οτιδηποτε αλλο δεν βολευει για τις αναγκες της ασκησης μου...(η ασκηση δεν ειναι η διαγραφη του κομβου,ενα μερος ομως απαιτει διαγραφη κομβου)

 

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

 

Και κατι ακομα, ασχετο με τα προηγουμενα( που μου ηρθε φλασια), σχετικο ομως με τη C , που αμα αρχισεις δεν μπορεις να σταματησεις .... :P

 

Εστω οτι εχουμε πχ μια συναρτηση εισαγωγης κομβων στο τελος μιας λιστας η οποια περνει ως ορισμα ενα δεικτη στην αρχη της λιστας, ενα δεικτη στο τελος της λιστας ( "by-ref" και οι δυο ) και ενα int για το field της δομης...

η συναρτηση ειναι αυτη Βοοl Insert( NODE **list , NODE **tail , int data );

Μπορουμε με καποιον τροπο να χρησιμοποιησουμε την ιδια συναρτηση για για ορισματα τυπου ΝΟDE2 **list, NODE2 **tail , float data ;

Δηλαδη να μην ξανα γραφουμε την ιδια συναρτηση για διαφορετικους τυπους δεδομενων ;;

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Λοιπον...

καταρχας για τον eclipse, δεν ειναι δεν μου εμφανιζει τα errors, απλα καποιες φορες μου πεταει μια καρτα το λειτουργικο που λεει οτι το projectName.exe σταματησε να λειτουργεί...

 

Και δευτερον, για τη διαγραφη του κομβου κατα τη διαρκεια προσπελασης της λιστας, εχω μπερδευτει λιγακι :( Το προβλημα μου δεν ειναι συγκεκριμενα αν το πεδιο data του κομβου ειναι ==4...Aπλα το απλοποιησα για να το θεσω σαν ερωτηση . Δηλαδη στο δικο μου προβλημα δεν μπορω να χρεισημοποιησω συναρτησεις αναζητης για μια συγκεκριμενη τιμη (σιγουρα σας μπερδεψα)

 

Απλα αυτο που θα ηθελα εγω ειναι να να διαγραφετε ενας κομβος κατα τη διαρκεια προσπελασης της λιστας, οτιδηποτε αλλο δεν βολευει για τις αναγκες της ασκησης μου...(η ασκηση δεν ειναι η διαγραφη του κομβου,ενα μερος ομως απαιτει διαγραφη κομβου)

 

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

 

Ο κώδικας που σου έχω δώσει κάνει διαγραφή κόμβου κατά την προσπέλαση της λίστας στη συνάρτηση: list_delete_data_allOccurrences() ... το ότι έχει ως κριτήριο το πεδίο data δεν της αφαιρεί το χαρακτηριστικό πως διαγράφει κόμβους κατά την προσπέλαση. Μπορείς να βάλεις όποιο κριτήριο θέλεις (π.χ. τη διεύθυνση του προς διαγραφή κόμβου).

 

Πως αλλιώς μπορείς να διαγράψεις έναν κόμβο κατά την προσπέλαση (χωρίς δηλαδή κάποιο κριτήριο για το ποιον κόμβο θα διαγράψεις κατά την προσπέλαση);

 

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

 

Προφανώς πρέπει να την χρησιμοποιήσεις μέσα στη συνάρτηση που θα προσπελαύνει τη λίστα σου, και να της περάσεις ως όρισμα τη διεύθυνση του κόμβου που θες να διαγράψει. Σε εκείνο το σημείο (επίσης προφανώς :lol:) θα πρέπει να ασκήσεις έξτρα έλεγχο για το αν ο προς διαγραφή κόμβος είναι ο 1ος της λίστας σου, περίπτωση κατά την οποία θα πρέπει να λάβεις έξτρα μέτρα (αυτά που σου εξήγησα στο προηγούμενο ποστ, και τα χαρακτήρισα ως "tricky part")... αυτά τα έξτρα μέτρα της είναι τελείως αδιάφορα της node_delete().

 

Btw, η αυτονόμηση τμημάτων του κώδικα σε συναρτήσεις χαμηλώνει την πολυπλοκότητα της οργάνωσης, δεν την αυξάνει ;)

 

Σχετικά με το Eclipse τώρα, αυτό που μπορώ να φανταστώ είναι πως σκάει seg-fault στο πρόγραμμά σου και αυτό επηρεάζει την συμπεριφορά του Eclipse. Μια ιδέα είναι να τρέχεις το πρόγραμμά σου μέσα από τον debugger, ο οποίος κάνει catch τα seg-faults χωρίς να σκάει το γενικότερο περιβάλλον (+ ότι σου δίνει πληροφορίες για το που ακριβώς έσκασε το πρόγραμμά σου). Παρεμπιπτόντως, τα seg-faults είναι run-time errors, άρα ο compiler δεν τα πιάνει έτσι κι αλλιώς.

 

 

...

Και κατι ακομα, ασχετο με τα προηγουμενα( που μου ηρθε φλασια), σχετικο ομως με τη C , που αμα αρχισεις δεν μπορεις να σταματησεις .... :P

 

Εστω οτι εχουμε πχ μια συναρτηση εισαγωγης κομβων στο τελος μιας λιστας η οποια περνει ως ορισμα ενα δεικτη στην αρχη της λιστας, ενα δεικτη στο τελος της λιστας ( "by-ref" και οι δυο ) και ενα int για το field της δομης...

η συναρτηση ειναι αυτη Βοοl Insert( NODE **list , NODE **tail , int data );

Μπορουμε με καποιον τροπο να χρησιμοποιησουμε την ιδια συναρτηση για για ορισματα τυπου ΝΟDE2 **list, NODE2 **tail , float data ;

Δηλαδη να μην ξανα γραφουμε την ιδια συναρτηση για διαφορετικους τυπους δεδομενων ;;

 

Στη C δεν μπορείς, επειδή δεν επιτρέπει function overloading. Μπορείς να φτιάξεις αν θέλεις ένα ADT Interface (Abstract Data Type Interface) το οποίο όμως κοστίζει πολύ και σε επιδόσεις και σε πολυπλοκότητα ανάπτυξης.

 

 

Έστω μια άσκησουλα που ζητάει απο τον χρήστη να δωσει μια προταση και την εκτυπώνει με αντιστροφη σειρα των γραμματων των λέξεων..... δοκιμασα να την κανω με πινακες και δεικτες... νομιζω ενταξει βγηκε ... πως σας φαινεται η υλοποιηση ?

 

(δεν ειναι κατι το τρομερο φυσικα 2 λεπτα μου πηρε)....

 

 

 

>
// (c)

#include <stdio.h>
#define MAXLEN 10
void read_input( char [] );

   int main(void)
   {
       char arr[MAXLEN]={0} ;

       printf(" Enter a message : ");

       read_input(arr);

return 0;
}
void read_input( char arr[MAXLEN] )
{
   int c  , i=0 ;
   char *p=arr;

   while( ( c = getchar() ) != '\n' && i < MAXLEN  )
   {
        *p++ = c;
         i++;
    }

   printf(" The reversal is : ");

   while( (p--) != arr )

       printf("%c" , *p);

   return;

}


 

 

Εξαιρουμε τα check για εγκυρη εισοδο που δεν υπάρχουν....

 

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

 

>
hello there sob

 

μου δίνει έξοδο...

 

>
Enter a message : hello there sob
The reversal is : reht olleh

 

Την ίδια ακριβώς έξοδο μου δίνει και π.χ. στις εισόδους...

 

>
hello there
hello there you sob
hello theredhsadhjhdsdhsajkhdjkdhskfhskfksdh

Δημοσ.

>

Enter a message : hello there sob
The reversal is : bos ereht olleh

kostas@kostas-SSL:~/PROGRAMS$

 

Το προγραμμα εκτυπώνει με αντιστροφη σειρά τα γραμματα των λέξεων μιας προτασης.

Ξεκινωντας για αρχη απο την τελευταια λεξη της προτασης.

Δημοσ.

Σε μένα σε Win7 με mingw32 συμπεριφέρεται όπως περιέγραψα.

 

Ναι γιατι το MAXLEN ειναι ορισμενο στο 10 και οχι στο 100 οπως ειναι το δικο μου. :)

Δημοσ.

Θα το ξανα κοιταξω γιατι φαινετε πως κατι δεν καταλαβα...

Στη C δεν μπορείς, επειδή δεν επιτρέπει function overloading. Μπορείς να φτιάξεις αν θέλεις ένα ADT Interface (Abstract Data Type Interface) το οποίο όμως κοστίζει πολύ και σε επιδόσεις και σε πολυπλοκότητα

 

Κριμα γιατι ειχα ορεξη για ψαξιμο :(

Δημοσ.

Λοιπον...

καταρχας για τον eclipse, δεν ειναι δεν μου εμφανιζει τα errors, απλα καποιες φορες μου πεταει μια καρτα το λειτουργικο που λεει οτι το projectName.exe σταματησε να λειτουργεί...

 

Από ό,τι διαβάζω στο google είναι κοινό πρόβλημα και η πιο συχνή αιτία είναι ότι δεν μπορεί να φορτωθεί το libgcc_τάδε.dll. Την επόμενη φορά που θα στο βγάλει, χωρίς να κάνεις ξανά build ή οτιδήποτε, άνοιξε ένα cmd.exe και πάνε στο κατάλογο του project και τρέξε από εκεί το projectName.exe για να δεις τι error θα πάρεις. Αν είναι αυτό που διάβασα θα στο πει ότι δεν μπορεί να βρει την libgcc.

Δημοσ.

Από ό,τι διαβάζω στο google είναι κοινό πρόβλημα και η πιο συχνή αιτία είναι ότι δεν μπορεί να φορτωθεί το libgcc_τάδε.dll. Την επόμενη φορά που θα στο βγάλει, χωρίς να κάνεις ξανά build ή οτιδήποτε, άνοιξε ένα cmd.exe και πάνε στο κατάλογο του project και τρέξε από εκεί το projectName.exe για να δεις τι error θα πάρεις. Αν είναι αυτό που διάβασα θα στο πει ότι δεν μπορεί να βρει την libgcc.

και η λυση για αυτο ποια ειναι;;

Δημοσ.

 

και η λυση για αυτο ποια ειναι;;

 

ΑΝ είναι αυτό το πρόβλημα, προσθέτεις στο PATH τους κατάλληλους καταλόγους του MinGW (ή λες στον gcc να την βάζει στατικά).

Δημοσ.

 

 

Ναι γιατι το MAXLEN ειναι ορισμενο στο 10 και οχι στο 100 οπως ειναι το δικο μου. :)

 

:lol:

 

Να και μια άλλη υλοποίηση της ίδιας άσκησης με πίνακες και δείκτες, πριν την κάνω για σπίτι ;)

 

>
#include <stdio.h>
#define MAXINPUT    (255+1)

int main( void )
{
   char input[MAXINPUT] = {'\0'};
   char *cp = input + MAXINPUT-2;

   printf("%s", "Enter a message : ");
   while ( '\n' != (*cp = getchar()) && EOF != *cp && cp != input )
       cp--;

   puts( ('\n' == *cp || EOF == *cp) ? ++cp : cp );

   return 0;
}

 

 

 

Άρχισα χτες να διαβάζω (αποσπασματικά) C# κι έχω χάσει την μπάλα. Θα ανοίξω αντίστοιχο θέμα και ετοιμαστείτε για κυκεώνα ερωτήσεων :)

 

 

  • Like 1
Δημοσ. (επεξεργασμένο)

Ελα τωρα ρε που χεις χασει την μπάλα με την C# προγραμματιστης άνθρωπος. :P

 

υ.γ ΠΟλυ ωραια η προηγουμενη υλοποιηση σου.... αναιρει και την αναγκη για 2 loop .

 

EDIT: Για να κρατήσεις ολους τους πιθανους χαρακτηρες χρειαζεσαι μια μεταβλητη τυπου char . Για να κρατησεις ομως ολους τους πιθανους + τον EOF δεν θες εναν μεγαλυτερο τυπο δεδομενων ... ο int για παραδειγμα? Ειναι ιδιο με το θεμα που ειχε προκυψει στον επιστρεφομενο τυπο της getchar().

 

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1048865140&id=1043284351

Επεξ/σία από Star_Light
Δημοσ.

για να μην ξεκιναω νεα νηματα κτλπ,εχω κι εγω μια απορια για μια ασκηση.

 

εχω αναπτυξει ολοκληρο τον κωδικα που χρειαζεται.ομως σε ενα σημειο κολαω.

πρεπει σε καποια φαση να τσεκαρω αν δυο αριθμοι(πχ οι α και β) ειναι ακεραιοι.

οποτε εχω ορισει την συναρτηση

>int akeraioi(int a,int {
if(fmod(a, 1) != 0 || fmod(b, 1) != 0){
 return FALSE;
}
}

 

που κανει αυτη την δουλεια.και την χρησιμοποιω ετσι

>
if (akeraioi(a, == FALSE) {
 printf("den einai akeraios enas apo tous duo h kai oi duo");
}

.

 

ομως δεν λειτουργει.οταν στο scanf διαβαζω πχ τον α και πληκτρολογησω 2.1,πηγαινει στην αρχη της λουπας,χωρις να εκτυπωνει το μηνυμα που φαινεται παραπανω.

 

οι α και β εχουν οριστει ως int.

 

μπορει καποιος να μου εξηγησει γιατι συμβαινει αυτο?

Δημοσ.

>int akeraioi(int a,int {

 

 

ομως δεν λειτουργει.οταν στο scanf διαβαζω πχ τον α και πληκτρολογησω 2.1,πηγαινει στην αρχη της λουπας,χωρις να εκτυπωνει το μηνυμα που φαινεται παραπανω.

 

οι α και β εχουν οριστει ως int.

 

Στην scanf τι format έχεις ? Επίσης έχει νόημα η συνάρτηση akeraioi όταν της πετάς int δηλαδή ακεραίους ? Μπορείς να ζητήσεις double από την scanf και εννοείται να είναι double και οι μεταβλητές που της δίνεις για να αποθηκεύσει τις τιμές.

 

>
#include <stdio.h>
#include <math.h>

int akeraioi(double val);

int main(void)
{
   double a, b;
   scanf("%lf %lf", &a, &;
   printf("a=%f b=%f\n",a, ;
   printf("Einai akeraioi ? a=%d b=%d\n", akeraioi(a), akeraioi();

   return 0;
}

int akeraioi(double val)
{
   return fmod(val, 1) == 0;
}
Έξοδος:
% ./a.out    
3 2.1
a=3.000000 b=2.100000
Einai akeraioi ? a=1 b=0
% ./a.out
3.0 2.1
a=3.000000 b=2.100000
Einai akeraioi ? a=1 b=0

 

Διαβάζεις double στην scanf γιατί αν δίνεις int εννοείται δεν θα διαβαστούν σωστά. Το "πρόβλημα" που βλέπω είναι στη 2η περίπτωση. Το 3.0 που έδωσε ο χρήστης το θεωρείς ακέραιο ?

Δημοσ.

Περα απο την διορθωση που θα πρεπει να γινει για να δουλεψει ο κώδικας... μπορεις να βελτιώσεις τον τροπο ποπυ γράφεις την συνάρτηση δηλώνοντας την με bool επιστρεφομενο τύπο και καταργόντας την αναγκη του if.

 

>
bool is_integer(int a , int b )
{
return (fmod(a, 1) != 0 || fmod(b, 1) != 0) ? true : false ;
}

 

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

που εξεταζει το προσημο ενος αριθμου.

 

>
#include <stdio.h>
#include <stdbool.h>

bool sign(int n)
{
return n>0 ? true : false ;
}

int main( void )
{
int n;

printf(" Give a number: ");
scanf("%d" , &n);

if( n == 0 )
goto exit;

if( sign(n) )
printf(" The number is positive ");

else
printf(" The number is negative ");

return 0;

exit:
printf(" Zero number ");

 return 0;
}

Δημοσ.

...

μπορει καποιος να μου εξηγησει γιατι συμβαινει αυτο?

 

Υπάρχουν πολλά και διάφορα θέματα. Ένα είναι πως διαβάζεις και πως αναθέτεις τιμές στα a και b (που έθιξε και ο imitheos), άλλο ένα είναι πως η fmod() αναμένει float ορίσματα οπότε με το να τις περνάς ints είναι ήδη κομμένα τα δεκαδικά ψηφία.

 

Βασικά δείξε μας πως διαβάζεις και πως αναθέτεις τιμές στα a και b.

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

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