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

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

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

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

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

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

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

Δημοσίευσηαπό stamatiou » 05 Ιούλ 2011, 15:49

Παιδιά, μπορεί κάποιος να μου δείξει πώς γίνεται να γεμίσουμε μια array από structures με ένα for loop?
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Υποθέτω εννοείς να βάλουμε αρχικές τιμές σε όλα τα structures, σε κάθε στοιχείο του array, ε;

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

#include <stdio.h>
#include <string.h> // for strncpy()

#define MAX_PERSONS 100
#define MAXNAME 255+1

typedef struct person {
char name[ MAXNAME ];
int age;
} Person;

int main( void )
{
Person people[ MAX_PERSONS ]; // array of Person ( ισοδυναμεί με: array of struct person )
register int i;

for (i=0; i < MAX_PERSONS; i++)
{
strncpy( people[ i ].name, "uknown", MAXNAME); // αρχικοποίηση του name σε "uknown"
people[ i ].age = 0; // αρχικοποίηση του age σε 0
}

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

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

Δημοσίευσηαπό stamatiou » 05 Ιούλ 2011, 17:16

migf1 έγραψε:Υποθέτω εννοείς να βάλουμε αρχικές τιμές σε όλα τα structures, σε κάθε στοιχείο του array, ε;

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

#include <stdio.h>
#include <string.h> // for strncpy()

#define MAX_PERSONS 100
#define MAXNAME 255+1

typedef struct person {
char name[ MAXNAME ];
int age;
} Person;

int main( void )
{
Person people[ MAX_PERSONS ]; // array of Person ( ισοδυναμεί με: array of struct person )
register int i;

for (i=0; i < MAX_PERSONS; i++)
{
strncpy( people[ i ].name, "uknown", MAXNAME); // αρχικοποίηση του name σε "uknown"
people[ i ].age = 0; // αρχικοποίηση του age σε 0
}

...
return 0;
}

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

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

Δημοσίευσηαπό stamatiou » 05 Ιούλ 2011, 22:23

Παιδιά, πώς γίνεται να έχω ένα πρόγραμμα στη c και να βάλω τη μία function σε ένα .c file και να την καλέσω από ένα άλλο .c file;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Είναι λίγο πολύπλοκο!

Θα σου δώσω ένα πολύ απλό παράδειγμα, για να το καταλάβεις, το οποίο όμως στην πράξη δεν χρησιμοποιείται έτσι.

Έστω 2 αρχεία: main.c και secondary.c Το ένα από τα δυο πρέπει υποχρεωτικά να περιέχει την συνάρτηση main() (βασικά η main() μπαίνει ΜΟΝΑΧΑ σε ένα από όλα τα .c αρχεία).

Έστω λοιπόν πως το secondary.c είναι το εξής:
Κώδικας: Επιλογή όλων

/***********************
* File: secondary.c
************************
*/

int sum( int x, int y)
{
return x+y;
}


Για να χρησιμοποιήσεις την συνάρτηση sum() στο αρχείο main.c γράφεις κάτι σαν το παρακάτω:
Κώδικας: Επιλογή όλων

/***********************
* File: main.c
************************
*/
#include <stdio.h>

extern int sum(int, int); // το πρότυπο της sum() δηλωμένο ως extern (δηλαδή external)
// (στα πρότυπα αρκούν μονάχα οι τύποι των ορισμάτων, δεν χρειάζονται ονόματα)

int main( void )
{
int n1 = 10, n2 = 20;
printf("sum of %d and %d = %d\n", n1, n2, sum(n1, n2) );
return 0;
}


Για να κάνεις compile τώρα και τα 2 αρχεία και να παραχθεί ένα εκτελέσιμο αρχείο, το κάνεις ως εξής:
Κώδικας: Επιλογή όλων

gcc main.c secondary.c -o myprogram

και προφανώς τρέχεις το myprogram μετά για να δεις το πρόγραμμά σου.

Όταν έχεις ένα project με πολλά .c αρχεία, αντί να τα γράφεις κάθε φορά στο command line του gcc, φτιάχνεις ένα makefile κι όποτε θες να τα κάνεις compile γράφεις απλά:
Κώδικας: Επιλογή όλων
make

ή αν το makefile σου το ονομάσεις π.χ.: mymakefile, γράφεις:
Κώδικας: Επιλογή όλων
make mymakefile

Γκούγκλαρε "makefile in c" για περισσότερες λεπτομέρειες.

Επίσης, το παραπάνω παράδειγμα είναι πολύ απλοποιημένο. Πρότυπα συναρτήσεων, τύπους δεδομένων, macros, directives, σταθερές, κλπ που σκοπεύεις να τα χρησιμοποιήσεις σε περισσότερα του ενός .c αρχείου τα βάζεις μέσα σε δικά σου header file (αρχεία με κατάληξη: .h) τα οποία μετά τα κάνεις #include (π.χ.: #include "myheader1.h") σε όσα .c αρχεία χρειάζεται.

Δες για παράδειγμα το πρόγραμμα της Ξερής που έχω ποστάρει στην ενότητα: Ανάπτυξη Λογισμικού... αποτελείται από 3 .c και 2 .h αρχεία (δες για παράδειγμα το stack.h που το κάνω include και στο stack.c και στο main.c)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 06 Ιούλ 2011, 14:09

Παιδιά, θα ήθελα να ρωτήσω κάτι στον παρακάτω κώδικα:
Κώδικας: Επιλογή όλων

void bubblesort(int x[],int n)
{
int i,k,temp;
for(i=0;i<n;i++)
{
if(x[k]<x[k-1])
{
temp=x[k];
x[k] = x[k-1];
x[k-1] = temp;
}
}
}
}

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

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

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

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

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

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

migf1 έγραψε:Η bubble-sort εναλλάσσει διαδοχικά τα περιεχόμενα του τρέχοντος στοιχείου του πίνακα με το επόμενο, οπότε αν πάει στο τελευταίο δεν υπάρχει επόμενο για να γίνει η εναλλαγή ;)

Ααααα, εγώ νόμιζα ότι συγκρίνει το τελευταίο με το προτελευταίο. Χαζή ερώτηση. Ευχαριστώ πάντως
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Αυτό το πρόγραμμα δίνει αριθμούς διαιρούμενους με το 6 από μια σειρά αριθμών (π.χ. από -100 μέχρι 100):

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

int main()
{
int *array, arraysize;
int i, x, i1, i2, min, max;
int sum = 0;

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

printf("Enter the minimum number: ");
scanf("%d", &i1);
getchar(); // Clear stdin buffer
printf("Enter the maximum number: ");
scanf("%d", &i2);
getchar();
if (i1 < i2) { min = i1; max = i2; }
else { max = i1; min = i2; }
printf("Checking between %d and %d\n", min, max);

// Allocate size for maximum possible items
if (min < 0 && max < 0) { sum = -(max - min); }
else if (min < 0 && max >= 0) { sum = max - min; }
else if (min >= 0 && max >= 0) { sum = max + min; }
sum += 1;

printf("sum (for array): %d\n", sum);
array = (int*) malloc(sum*sizeof(int)); // dynamic array
printf("Array length: %lu\n", sizeof(array) / sizeof(int));

for (i=0, x=min; x<=max; x++) {
if ((x % 6) == 0) {
array[i] = x;
printf("Found %d! Added in array as item #%d\n", x, i);
i++;
}
}

arraysize = i; // Already +1, includes item #0
printf("Array length: %d\n", arraysize);
free(array); // Free memory
array = NULL;
return 0;
}


Ερώτηση: Για να βρω τον αριθμό των αντικειμένων στο array, στην python υπάρχει το len(). Υπάρχει αντίστοιχο για C; Διάβασα για "sizeof(array) / sizeof(int)" αλλά δεν δουλεύει, πάντα επιστρέφει 8 / 4 = 2
Κύπριος; Κόπιασε στο 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
Εκτύπωση

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

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