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

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

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

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

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 17:50

Δεν υπάρχει αντίστοιχη της python len() αλλά αν θέλεις μπορείς να φτιάξεις έναν πρόσθετο τύπο αντίστοιχο των int arrays της python ή μπορείς απλά να φτιάξεις μια συνάρτηση len() για το array σου.

Αλλά η απορία μου είναι γιατί χρειάζεσαι ξεχωριστή συνάρτηση για το μήκος ενός array στη C; Αφού το δηλώνεις εσύ όταν ορίζεις το array σου (αν είναι στατικό) ή όταν το κάνεις malloc() (αν είναι δυναμικό).

Στο παράδειγμά σου, το μήκος του array σου είναι το: sum.

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

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

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 22:16

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

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

Καταρχήν απλοποίησα τον κώδικά σου, τόσο ως λογική σε ορισμένα σημεία όσο και ως ονομασίες μεταβλητών. Τα min, max τα άλλαξα σε low, high και το arraysize το άλλαξα σε maxlen, ενώ εισήγαγα ως σκέτο len αυτό που αναζητάς τελικά (δηλαδή το πλήθος των διαδιχικών κελιών που είναι γεμάτα μετά το for-loop).

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

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

// ------------------------------------------------------------------------------------
int main( void )
{
int *array=NULL, maxlen=0, len;
int i, low, high;

printf("Hello, World!\nThis program will check numbers between minimum and maximum that are divisible by 6.\n");

printf("Enter number for low limit: ");
scanf("%d", &low);

printf("Enter number for high limit: ");
scanf("%d", &high);

if (high < low) { // swap them
int temp = low;
low = high;
high = temp;
}

maxlen = high - low + 1; // calc maximum length for array
printf("sum (for array): %d\n", maxlen);

array = (int *) malloc( maxlen * sizeof(int)); // create the array dynamically
printf("Array length: %d\n", maxlen );

// put in successive array-cells only those numbers who are divisible by 6
// and count them inside the variable: len
for (len=0, i=0; i < maxlen; i++)
{
if ( (low + i) % 6 == 0 ) {
array[len] = low+i;
printf("Found %d! Added in array as item #%d\n", low + i, len);
len++;
}
}
printf("maxlen = %d, len = %d\n", maxlen, len);

free( array ); // Free memory
array = NULL;

fflush(stdin); getchar();
return 0;
}

Ο παραπάνω κώδικας παράγει ακριβώς το ίδιο αποτέλεσμα με τον δικό σου, σε λιγότερες γραμμές και με λιγότερες εντολές. Το maxlen είναι το μέγιστο μήκος του array και μετά το for-loop το len είναι το πλήθος των γεμάτων και διαδοχικών στοιχείων του array, ξεκινώντας από τη θέση 0.

Πάντως αυτό που ρωτάς, γενικώς μπορεί να γίνει ως εξής:

  • Μετά το malloc() αρχικοποιείς όλα τα στοιχεία του array σου με μια τιμή που θα μαρκάρει ως κενό το κάθε κελί. Π.χ. σε αυτή την περίπτωση με έναν αριθμό που ΔΕΝ διαιρείται με το 6, όπως για παράδειγμα το 1 (ο πιο γρήγορος τρόπος να ορίσεις την ίδια τιμή σε μια συνεχόμενη περιοχή μνήμης είναι με τη συνάρτηση: memset() )
  • Βάζεις σε διαδοχικές θέσεις μέσα στο array σου ότι θες να βάλεις, ξεκινώντας από τη θέση 0 (στην περίπτωσή μας βάζεις τα νούμερα που διαιρούνται με το 6)
  • Φτιάχνεις μια συνάρτηση σαν την παρακάτω, για να την καλείς όποτε θέλεις να βρεις το πλήθος των γεμάτων στοιχείων του array:
    Κώδικας: Επιλογή όλων

    int array_len( int array[], int maxlen )
    {
    int i = 0;
    while ( i < maxlen && array[i] != 1 )
    i++;

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

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

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 22:47

Είχα ένα λάθος στον υπολογισμό του maxlen, στη γραμμή 24. Το διόρθωσα (ήθελε: maxlen = high - low + 1; )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 06 Ιούλ 2011, 23:08

Ευχαριστώ! Θα το κοιτάξω οπωσδήποτε κι αν έχω απορίες ρωτάω :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 23:20

Cool!

Μια μικρή επισήμανση για την memset() που γράφω παραπάνω, δυστυχώς δουλεύει μόνο για αρχικοποίηση σε 0 οπότε και για την αρχικοποίηση θα χρειαστείς δυστυχώς loop :(

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

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

Δημοσίευσηαπό migf1 » 06 Ιούλ 2011, 23:24

migf1 έγραψε:Κι ένα ακόμα, το: sizeof(array) / sizeof(int) θα έπρεπε να σου δουλεύει κανονικά μετά από το malloc() του array.

Εννοώ να σου δίνει το maxlen (και όχι το len).

In fact, μπορείς να το χρησιμοποιήσεις και μέσα στην συνάρτηση: array_len() που σου έγραψα παραπάνω, ώστε να μην περνάς καθόλου το maxlen ως όρισμα. Να το υπολογίζει μέσα δηλαδή, με: sizeof(array) / sizeof(int);
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό clepto » 07 Ιούλ 2011, 02:51

διάβασα από εδώhttp://www.gvrteam.gr/forum/viewtopic.php?p=47178#p47178 για την s_gets αλλά έχω κάποιες απορίες...
πες ότι έχουμε αυτόν τον κώδικα...αυτό που κάνει είναι να τυπώνει το dvse kati...
εγώ όμως θέλω να γράφω κάτι και να τυπώνει αυτό που γράφω...
τι πρέπει να προσθέσω;
Κώδικας: Επιλογή όλων
#include <stdio.h>

main() {
const char *s;

printf("dvse kati");


char *s_get(char *s, int n)
{
register char *cp;
for (cp=s; (*cp=fgetc( stdin )) != '\n' && (cp-s) < n-1; cp++ )
; // for-loop με κενό σώμα
*cp = '\0';

return s;
}

puts( s );
return 0;

}


ίσως να είναι και η ώρα αλλά δεν μπορώ να σκεφτώ
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 07 Ιούλ 2011, 16:21

Πρέπει μετά το "Dwse kati" να το βάλεις να διαβάσει αυτό το κάτι, και μετά να του πεις να το τυπώσει αυτό το κάτι. Εσύ δεν καλείς καν την s_get() συν ότι προσπαθείς με την puts(s) να τυπώσεις το s, που όχι μόνο δεν το έχεις διαβάσει από την είσοδο, αλλά δεν το έχεις καν σαν string... το έχεις ορίσει απλά ως δείκτη σε char.

Ο παρακάτω κώδικας κάνει αυτό που ζήτησες..
Κώδικας: Επιλογή όλων

#include <stdio.h>

char *s_get(char *s, int n)
{
register char *cp;
for (cp=s; (*cp=fgetc( stdin )) != '\n' && (cp-s) < n-1; cp++ )
; // for-loop με κενό σώμα
*cp = '\0';

return s;
}

int main( void )
{
const int n = 255+1;
char s[n];

printf("dvse kati: ");
s_get(s, n);
puts( s );

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

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

Δημοσίευσηαπό clepto » 07 Ιούλ 2011, 17:24

κατάλαβα...ευχαριστώ...
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

Δημοσίευσηαπό Qdata » 08 Ιούλ 2011, 19:07

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

Ο κώδικας:
Κώδικας: Επιλογή όλων
#include <stdio.h>

main()
{
char c;
printf("Δώστε τον χαρακτήρα: ");
c = getch();
printf("\nΈδωσες τον χαρακτήρα: ");
putch(c);
putch('\n');
}


Ο compiler μου δίνει:
Κώδικας: Επιλογή όλων
$ gcc test.c -o test
/tmp/cc5JvBLW.o: In function `main':
test.c:(.text+0x17): undefined reference to `getch'
test.c:(.text+0x35): undefined reference to `putch'
test.c:(.text+0x41): undefined reference to `putch'
collect2: ld returned 1 exit status


Τι γίνετε; :?:
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

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

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