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

Ερωτήσεις για C


capoelo

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

Χιλια σορρυ εγω δεν το έδωσα σωστά -στραβομαρα-. Στην δευτερη δεν ειναι _PRAGMA αλλα _Pragma(#x)

 

 

#define PRAGMA(x) _Pragma(#x)

 

Eπομενως παει οπως σωστα το ειπες.... και η εκφραση _Pragma("ident \"foo\"") γινεται :

 

 

#pragma ident "foo"

 

Διοτι ο τελεστης _Pragma αποστρινγκοποιει και αφηνει και μια οδηγια #pragma...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

Δεν θέλω να κάνω κάτι...Απλα μου δίνεται αυτός ο αλγόριθμος και πρέπει να αναλύσω το τι κάνει...Εχω την εντύπωση ότι ειναι όμως λάθος...Για αυτό ρωτάω ...δεν μπορω με τπτ να καταλαβω τι κανει!

 

Στα σχόλια αναφέρει ότι επιστέφει το μεγιστο...Και απλα ζητάει περισσοτερη αναλυση!

Ναι αυτό κάνει. Η τακτική του είναι παρόμοια με αυτή της quicksort ή μιας binary search. Για την ακρίβεια επιστρέφει το πρώτο στοιχείο του πίνακα τον οποίο όμως ταξινομεί σε φθίνουσα σειρά οπότε το A[first] είναι και το μέγιστο.

Επειδη κοντευω να τρελαθώ...Πειτε μου με σιγουρια αν ειναι αυτος ο αλγοριθμος λανθασμενος....

 

 

Function Find( array , first , last )
  if (last-first == 0) return Α[first];
  mid = floor((first+last)/2);
  for j = first to mid do {
      if (Α[j] < Α[j+mid]) then {
       swap A[j], A[j+1]        
      }
    }
   max = Find(Α, first , mid);
   return max;
}

 

 

Ας υποθέσουμε ότι έχεις ένα πίνακα arr με στοιχεία τα 1, 9, 2, 17, 3, 5, 19 δηλαδή 7 στοιχεία. Τρέχεις find(arr, 0, 6) για να σου βρει το μέγιστο.

 

Εφόσον το 6-0 δεν είναι ίσο με το μηδέν, η συνάρτηση δεν επιστρέφει και έτσι αρχίζει να κάνει τη δουλειά της. Το mid γίνεται 3 ((0 + 6) / 2). Έπειτα τρέχεις ένα βρόχο που ελέγχει το jιοστό στοιχείο με το αντίστοιχο στοιχείο από το μέσο και δεξιά. Όταν έχουμε j=0 ελέγχει το στοιχείο 0 με το στοιχείο 3+0 δηλαδή τον αριθμό 1 με τον αριθμό 17. Επειδή το 17 είναι μεγαλύτερο, αντιμεταθέτει τα δύο αυτά στοιχεία και σε αυτό το σημείο ο πίνακας γίνεται 17, 9, 2, 1, 3, 5, 19.

 

Ο βρόχος συνεχίζεται για j=1 και ελέγχονται οι αριθμοί 9 και 3 οι οποίοι είναι οκ οπότε δεν αλλάζει τίποτα. Ο βρόχος συνεχίζεται για j=2 και ελέγχονται οι αριθμοί 2 και 5 που αντιμετατίθενται και έτσι ο πίνακας γίνεται 17,9,5,1,3,2,19. Ο βρόχος συνεχίζεται για j=3 και ελέγχεται οι αριθμοί 1 και 19 οπότε έχουμε και πάλι αντιμετάθεση αυτών και προκύπτει ο τελικός μας πίνακας 17,9,5,19,3,2,1. Εδώ τελείωσε η εργασία της συνάρτησης. Όπως βλέπεις, λόγω των αντιμεταθέσεων που έγιναν, όλοι οι μεγάλοι αριθμοί εμπεριέχονται στο πρώτο μισό του πίνακα. Δεν είναι ταξινομημένοι αλλά είναι σίγουρο ότι το πρώτο μισό περιέχει αριθμούς μεγαλύτερους από το δεύτερο μισό.

 

Τώρα θα ξανατρέξει αναδρομικά η συνάρτηση αλλά από το first μέχρι το mid δηλαδή από 0 μέχρι 3 δηλαδή θα ταξινομήσει αυτό το πρώτο μισό του πίνακα. Το mid θα γίνει αυτή τη φορά 1 ((0+3)/2) και γίνεται πάλι η ίδια δουλειά. Ο πίνακας μας θα γίνει 17,19,5,9 και στο τέλος-τέλος το στοιχείο που θα βρίσκεται στη 1η θέση και θα επιστραφεί θα είναι το 19.

 

Η βασική λειτουργία του αλγορίθμου είναι αυτή δηλαδή να διαιρεί και να βασιλεύει. Έχω την εντύπωση ότι ο αλγόριθμος έχει γραφτεί με το σκεπτικό ότι οι πίνακες αρχίζουν από indexing 1 γιατί αυτούσιος δεν μου έβγαζε σωστό αποτέλεσμα σε C και τον πείραξα λίγο αλλά είναι πολύ πιθανό να έκανα βλακεία εγώ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πως μπορώ να κάνω το παρακατω να τρέξει? ειμαι λιγο ζαλισμένος....

 

 

 
#include<stdio.h>
#define N (2*M)
#define M (N+1)

int main(void)
{

 N;

return 0;
}
 
  

 

 

sum.c:8: error: ‘N’ undeclared (first use in this function)

 

Eχω επισης αυτο

 

 

 
#include<stdio.h>
#define ONE 1
#define TWO (ONE+ONE)
#define THREE (ONE+TWO)

int main(void)
{
   
    
    TWO;   //(1 +1);
    THREE;   //(1 +(1 +1));

    
return 0;
}
 

 

Γιατι μετα το πρωτο ασσακι μου έχει κενο ?????

 

 
#define GENERIC_MAX(type) \
type type##_max(type x , type y) \
{                              \
     return x > y ? x : y;  \
}
 

 

Εδω μου κτυπάει αν περάσω unsigned long μεσα στην GENERIC_MAX επειδη ειναι 2 λέξεις και οταν γινεται η επεκταση υπαρχει θεμα το οποιο ξερω να το λυσω με ενα typedef unsigned long UL; ας πουμε αλλα για long int μεσα στην GENERIC_MAX δεν μου κτυπουσε ο compiler για duplicate word τυχαιο?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Πως μπορώ να κάνω το παρακατω να τρέξει? ειμαι λιγο ζαλισμένος....

 

 

 
#include<stdio.h>
#define N (2*M)
#define M (N+1)

int main(void)
{

 N;

return 0;
}
 
  

Όταν λες να τρέξει; Το Ν; μέσα στη main γίνεται 2*(Ν+1); πάντως...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όταν λες να τρέξει; Το Ν; μέσα στη main γίνεται 2*(Ν+1); πάντως...

 

Λάθος!  (2*(N+1)); γίνεται :P

Εννοω οτι δεν μου το μεταγλωτιζει... μου βγαζει σφαλμα.

 

@Παπι το ξερω οτι δεν γινεται αναδρομη εφοσον στο rescan δεν επεκτεινεται αλλο η μακροεντολη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λάθος!  (2*(N+1)); γίνεται :P

Εννοω οτι δεν μου το μεταγλωτιζει... μου βγαζει σφαλμα.

 

@Παπι το ξερω οτι δεν γινεται αναδρομη εφοσον στο rescan δεν επεκτεινεται αλλο η μακροεντολη.

Σώστα! Ξέχασα τις εξωτερικές παρενθέσεις...

Πάντως από τη στιγμή που έχεις "αναδρομικές" σχέσεις στα defines δε μπορείς (απ'οσο ξέρω) να απαλαγείς από αυτά μέσα στη main οπότε ο compiler θα το δει σαν undeclared...

 

Δεν μπορεις να κανεις αναδρομη με preprocessor. Δεν εχει λογικη, δηλαδη τι; Θα γαμησεις ενα αρχει με 2 * 2 * 2 * ... 2

Μάλλον "Θα γεμίσεις" ήθελες να πείς ε; :P (αν κι αν το γέμισεις στην ουσία το γ@μ@ς... :P)

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

αχαχαχα θεικο ποστ του παπι ....

 

ξεμειναμε μεσα ρε γαμωτο σημερα και μας έχει σαλεψει.... επειδη εφυγε η παρεα στα χωρια :-S

 

παλι καλα που πηγα χθες σε ενα γαμο και ειχε πολυ κεφι δεν πηγε στραφι το τριημερο!!!

 

Αυριο βραδυ δεν μπορεις να ξενυχτησεις....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
 
#define N = 10
#define INC(x) x+1
#define SUB(x,y) x-y
#define SQR(x) ( (x) * (x) )
#define CUBE(x) (SQR(x) * (x) )
#define M1(x,y) x##y
#define M2(x,y) #x#y

int main(void)
{
    int a[N] , i , j , k , m;
        
        #ifdef N
          i=j;
    #else
      j=i;
    #endif

      i=10*INC(j);

      i=SUB(j,k);
      i=SQR(SQR(j));
      i=CUBE(j);
          i=M1(j,k);
          puts(M2(i,j));

      #undef SQR
           i=SQR(j);
      #define SQR
       i=SQR(j);

return 0;
}

 

Για την

 

 

i =SUB(j,k)

 

Ο King δινει την λύση :

 

 

i = (x,y) x-y(j, k);

Δεν ειναι λαθος αυτο? εγω πιστευω οτι ειναι i = j-k (και στον προεπεξεργαστη που το είδα με -E το ιδιο εμφανιζει στην επέκταση της μακρο SUB. Ρωταω επειδη βλεπω και σε επομενο ερωτημα που το χρησιμοποιει... 2 φορες δεν ειδε το λάθος ή ο δικος του προεπεξεργαστής εδωσε αλλο αποτελεσμα? Περιεργο , μηπως κανω λάθος εγω?

 

υ.γ http://knking.com/books/c2/answers/c14.html

η τελευταια ασκηση.

Επεξ/σία από Star_Light
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι εχεις δικιο δεν προσεξα το κενο μετα το SUB...

 

Παρεμπιπτόντως, αυτός είναι ένας βασικός λόγος που τα περισσότερα coding styles προτείνουν να μην αφήνουμε ποτέ κενό πριν το άνοιγμα παρένθεσης, διότι ναι μεν δεν κάνει διαφορά όταν πρόκειται για συνάρτηση, αλλά κάνει μεγάλη διαφορά όταν πρόκειται για macro.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Καλησπέρα μετα απο καμποσες μέρες που το θρεντάκι έχει μεινει ανενεργο. Προσφατα με απασχολησε ενα θεματακι σχετικα με τους γράφους ... συγκεκριμένα έγραψα ενα προγραμμα για την ευρεση καταβοθρας σε C  οποτε ειπα να το μοιραστώ.

 

Ο ορισμός της καταβοθρας δεν ειναι δυσκολος , ουσιαστικα ειναι ενας κομβος ή μια κορυφη με |V| - 1 ακμές και καθολου εξερχομενες. Το | | γυρω απο το V ειναι ο πληθικός αριθμος του.

 

Οι υπολογισμοί βασίζονται στην μήτρα γειτνιασης. Το στοιχείο εκεινο aij   έχει την τιμή 1 αν υπάρχει συνδεση αναμεσα στις 2 κορυφές ενω έχει την τιμή 0 σε διαφορετική περίπτωση. Μια v μπορουμε να καθορισουμε οτι ειναι γενικη καταβοθρα αν η γραμμή της περιέχει μονο μηδενικά ενω η στήλη της μονο άσσους. Ειναι λογικο αυτο με την γραμμη μιας και οπως ηδη ειπαμε δεν υπαρχουν εξερχομενες συνδέσεις. Θα κάνω ένα παράδειγμα και μετα θα δωσω τον κώδικα :

 

Έστω ο πίνακας γειτνίασης :

 

 

               v1       v2      v3      v4     v5
v1            0         1        1        1      1
       
v2            0          0       0        1      1
      
v3            0          1       0         1     1
 
v4            0          0       0         0     1
 
v5           0           0       0         0      0
 

 

Στην γραμμή 1 βλέπουμε οτι υπάρχει ενας άσσος κατω απο το v2 αυτο δηλώνει οτι υπάρχει συνδεση απο την v1 στην v2. Ενω δεν υπάρχει συνδεση της  v2 με την v1 (απο και προς...) μιας και υπάρχει 0 στο αντιστοιχο σημειο της μήτρας.

 

Ο αλγοριθμος τον οποίο υλοποιει ο παρακάτω κώδικας σαν σκέψη ειναι :

 

Ελέγχουμε διαδοχικά τις γραμμές του πινακα για να βρουμε μια γραμμή i με ολα τα στοιχεια της 0 τοτε θα αθροισουμε τα στοιχεια της στήλης i και αν αυτο το άθροισμα ειναι ισο με N-1 τοτε αυτη θα ειναι η καταβοθρα.

 

Ο κώδικας :

 

 

 
#include<stdio.h>
int main(void)

{

  int arr2d[5][5] = { {0,1,1,1,1} , {0,0,0,1,1} , {0,1,0,1,1} , {0,0,0,0,1} , {0,1,0,0,0} };
 
  int i=0 ,j,count,sum,res=0,N=5;
 
  while( res == 0 && i < N) {
  j=0;
    while( arr2d[i][j] == 0 && j < N)  j = j+1;
    if( j == N)
    {
    sum=0;
    
    for( count=0; count<N; count++)
    sum = sum + arr2d[count][i];
    
    if( sum == N-1 )
     res = 1;  
}
 
 i=i+1;
}

    printf("The Sink node is: %d", i);


    return 0;
}
 

 

υ.γ Θα πρέπει για διαφορετικά παραδείγματα να αλλάζουμε τον αριθμο των γραμμών και στηλών του πινακα πχ αν εχουμε εναν γραφο με 3 κορυφές. Ο κωδικας έχει ελεγχθει για 4 διαφορετικές περιπτώσεις γραφων δυο με 5 κορυφές και δυο με 3. Βελτιώστε τον οπως θέλετε εσεις.

 

Σκεφτομαι να του ανοιξω ενα δικο του θρεντ να ειναι ευκολο στην ευρεση απο την google.....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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