Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 13 Αύγ 2011, 14:39

Αν διαβάζεις με scanf() έχεις έτσι κι αλλιώς θέμα με τα απομεινάρια.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 13 Αύγ 2011, 19:14

Λοιπόν εγώ μόλις τελείωσα την άσκηση με τα σχόλια:

http://ideone.com/XJQCb

Μόνο που δεν έβαλα σε όλα σχόλεια αλλά στα σημεία με τις συναρτήσεις κλπ.
Επίσης εδώ δεν καταλαβαίνω γιατί γράφεις κάπου

Κώδικας: Επιλογή όλων
(list->len)++

και όχι
Κώδικας: Επιλογή όλων
list->len++

;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 13 Αύγ 2011, 20:36

stamatiou έγραψε:Λοιπόν εγώ μόλις τελείωσα την άσκηση με τα σχόλια:

http://ideone.com/XJQCb

Μόνο που δεν έβαλα σε όλα σχόλεια αλλά στα σημεία με τις συναρτήσεις κλπ.

Δεν είναι αυτό το πρόγραμμα που είπαμε να βάλετε σχόλια όμως ( http://ideone.com/QKSD6 ).

έγραψε:Επίσης εδώ δεν καταλαβαίνω γιατί γράφεις κάπου

Κώδικας: Επιλογή όλων
(list->len)++

και όχι
Κώδικας: Επιλογή όλων
list->len++

;

Απλά οι παρενθέσεις το κάνουν πιο ξεκάθαρο.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 13 Αύγ 2011, 22:16

migf1 έγραψε:
stamatiou έγραψε:Λοιπόν εγώ μόλις τελείωσα την άσκηση με τα σχόλια:

http://ideone.com/XJQCb

Μόνο που δεν έβαλα σε όλα σχόλεια αλλά στα σημεία με τις συναρτήσεις κλπ.

Δεν είναι αυτό το πρόγραμμα που είπαμε να βάλετε σχόλια όμως ( http://ideone.com/QKSD6 ).

έγραψε:Επίσης εδώ δεν καταλαβαίνω γιατί γράφεις κάπου

Κώδικας: Επιλογή όλων
(list->len)++

και όχι
Κώδικας: Επιλογή όλων
list->len++

;

Απλά οι παρενθέσεις το κάνουν πιο ξεκάθαρο.

:oops: :oops:
http://ideone.com/cPtZd
όμως έχω 2 προβλήματα:
1. Δεν είμαι σίγουρος για το τι κάνει το return i == maxelems ? -1 : i
2. Τι ακριβώς κάνει το memmove( &arr[1], &arr[0], (maxelems-1) * sizeof(int) );
3. Στο προηγούμενο πρόγραμμα γιατί περνάγαμε τα lists με pointer δλδ *List;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 13 Αύγ 2011, 23:16

stamatiou έγραψε:
όμως έχω 2 προβλήματα:
1. Δεν είμαι σίγουρος για το τι κάνει το return i == maxelems ? -1 : i

Ισοδυναμεί με:
Κώδικας: Επιλογή όλων

if ( i == maxelems )
return -1;
else
return i;

έγραψε:2. Τι ακριβώς κάνει το memmove( &arr[1], &arr[0], (maxelems-1) * sizeof(int) );

Μετακινεί τμήματα μνήμης: http://pubs.opengroup.org/onlinepubs/00 ... mmove.html. Στην προκειμένη περίπτωση το χρησιμοποιώ για να μετακινήσω μια θέση προς τα δεξιά όλα τα στοιχεία του πίνακα, από το 1ο και μετά (με την memmove() γίνεται πολύ ταχύτερα από ότι να το έκανα με loop... στην arr_delete() που χρειάζονται πάλι μετακίνηση τα στοιχεία, προς τα αριστερά αυτή τη φορά, το κάνω με loop για να υπάρχουν και οι 2 τρόποι στο πρόγραμμα).

έγραψε:3. Στο προηγούμενο πρόγραμμα γιατί περνάγαμε τα lists με pointer δλδ *List;

Γιατί θέλουμε να διατηρούνται οι αλλαγές που κάνουμε στο πεδίο len (call by reference).

Έβαλα κι εγώ σχόλια στον κώδικα: http://ideone.com/w72Kb

Με την προϋπόθεση πως είναι όλα κατανοητά, η επόμενη άσκηση είναι να φτιάξετε μόνοι σας μια συνάρτηση:
Κώδικας: Επιλογή όλων
arr_insdescending(int arr[], int maxelems, int val);

η οποία θα εισαγάγει στον πίνακα arr ένα νέο στοιχείο με τιμή val, το οποίο θα πρέπει να μπαίνει απευθείας στη σωστή θέση, ώστε ο πίνακας είναι πάντα ταξινομημένος σε φθίνουσα σειρά.

Δηλαδή, για παράδειγμα, ξεκινώντας με έναν κενό πίνακα arr[MAX_ELEMENTS] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} (αλλάξτε το EMPTY_ELEMVAL σε -1), τότε ο παρακάτω κώδικας:

Κώδικας: Επιλογή όλων

...
arr_insdescending( arr, MAX_ELEMENTS, 10);
arr_insdescending( arr, MAX_ELEMENTS, 20);
arr_insdescending( arr, MAX_ELEMENTS, 30);
...

θα πρέπει να δίνει: {30, 20, 10, -1, -1, -1, -1, -1, -1, -1}

και κατόπιν ο κώδικας...
Κώδικας: Επιλογή όλων

arr_insdescending( arr, MAX_ELEMENTS, 1);
arr_insdescending( arr, MAX_ELEMENTS, 25);

θα πρέπει να δίνει: {30, 25, 20, 10, 1, -1, -1, -1, -1, -1}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 14 Αύγ 2011, 00:06

migf1 έγραψε: ...
arr_insdescending( arr, MAX_ELEMENTS, 10);
arr_insdescending( arr, MAX_ELEMENTS, 20);
arr_insdescending( arr, MAX_ELEMENTS, 30);
...

Μα καλά γιατί υπάρχουν τόσα errors στη C! :crazy: :crazy: :lol:
Έχω αυτόν τον κώδικα:
Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define EMPTY_ELEMVAL -1
#define AISE(array,lim) ((array)[0] == EMPTY_ELEMVAL)
#define AISF(array,lim) ((array)[(lim)-1]!=EMPTY_ELEMVAL)

int arr_desc(int array[],int lim,int value) {
int i,pos = 0;
if(AISE(array,lim)) {
array[0] = value;
return 0;
}else if(AISE(array,lim)) {
return -1;
}
while(i=lim-1;(i != 0) && (array[i] != EMPTY_ELEMVAL);i--);

array[i] = value;

qsort(array, lim, sizeof(int), strcmp );
return 0;
}

int arr_print( int arr[], int maxelems )
{
register int i;

for (i=0; i < maxelems; i++)//ενώ(i=0;i είναι μικρότερο του maxelems;i++)
printf("%d ", arr[i]);//Εκτύπωσε το iοστό του arr
putchar('\n');//Εκτύπωσε '\n'

return 0;
}


int main(void) {
int array[5] = {-1,-1,-1,-1,-1,-1};

arr_desc( array, 6, 10);
arr_desc( array, 6, 20);
arr_desc( array, 6, 30);

arr_print(array,6);

return 0;
}

και τα errors είναι:
Κώδικας: Επιλογή όλων
arr_descending.c: In function ‘arr_desc’:
arr_descending.c:17:2: warning: suggest parentheses around assignment used as truth value
arr_descending.c:17:15: error: expected ‘)’ before ‘;’ token
arr_descending.c:21:2: warning: passing argument 4 of ‘qsort’ from incompatible pointer type
/usr/include/stdlib.h:761:13: note: expected ‘__compar_fn_t’ but argument is of type ‘int (*)(const char *, const char *)’
arr_descending.c:10:8: warning: unused variable ‘pos’
arr_descending.c: In function ‘main’:
arr_descending.c:38:2: warning: excess elements in array initializer
arr_descending.c:38:2: warning: (near initialization for ‘array’)
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 14 Αύγ 2011, 00:14

Διότι τα κάνεις :lol:

Π.χ. στη γραμμή 17 χρησιμοποιείς το while με σύνταξη for :P

Ένα άλλο χοντρό που βλέπω, ορίζεις τον πίνακα να έχει 5 θέσεις και του βάζεις 6 τιμές!
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 14 Αύγ 2011, 00:26

migf1 έγραψε:Διότι τα κάνεις :lol:

Π.χ. στη γραμμή 17 χρησιμοποιείς το while με σύνταξη for :P

Ένα άλλο χοντρό που βλέπω, ορίζεις τον πίνακα να έχει 5 θέσεις και του βάζεις 6 τιμές!

:oops: :oops: Φαίνεται πως είμαι λίγο κουρασμένος σήμερα :lol:
Δλδ τα arrays όταν τα κάνουμε declare δε μετράμε και το array[0];
Επίσης προς τι τα υπόλοιπα errors, ειδικά το δεύτερο είναι αρκετά παράξενο.
(Όταν λέω υπόλοιπα εννοώ: )
Spoiler: show
Κώδικας: Επιλογή όλων
arr_descending.c: In function ‘arr_desc’:
arr_descending.c:21:2: warning: passing argument 4 of ‘qsort’ from incompatible pointer type
/usr/include/stdlib.h:761:13: note: expected ‘__compar_fn_t’ but argument is of type ‘int (*)(const char *, const char *)’
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 14 Αύγ 2011, 00:36

Όταν δηλώνουμε ένα array, arr[5] σημαίνει πως έχει 5 θέσεις, από 0 έως 4.

Για την qsort σου λέει πως το 4ο όρισμα της είναι λάθος (βασικά πας να σορτάρεις έναν πίνακα από int χρησιμοποιώντας για συνάρτηση σύγκρισης την strcmp που δουλεύει σε strings). Btw, τι την θέλεις της qsort, δεν τη χρειάζεσαι για την άσκηση.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 14 Αύγ 2011, 01:07

migf1 έγραψε:Όταν δηλώνουμε ένα array, arr[5] σημαίνει πως έχει 5 θέσεις, από 0 έως 4.

Για την qsort σου λέει πως το 4ο όρισμα της είναι λάθος (βασικά πας να σορτάρεις έναν πίνακα από int χρησιμοποιώντας για συνάρτηση σύγκρισης την strcmp που δουλεύει σε strings). Btw, τι την θέλεις της qsort, δεν τη χρειάζεσαι για την άσκηση.

Την θέλω έτσι ώστε να τα ταξινομησει στο τέλος και έτσι θα είναι όλα στη σωστή σειρα
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι