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

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

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

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

Δημοσίευσηαπό Star_Light » 02 Φεβ 2012, 00:15

OK ;) κοιτα αρχικα το κανω με προκαθορισμενη εισοδο.... την οποια αρχικοποιω εγω δηλαδη
τα elements του πινακα.

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

#include<stdio.h>
#define N 5
#define M 5
void swap_table(int table1[M] , int table2[N] );
void print_array(int table1[M] , int table2[N]);

int main()

{
int table1[M] = { 1 , 2 , 3 , 4 , 5 };
int table2[N] = { 6 , 7 , 8 , 9 , 10 };

print_array(table1,table2); //before
swap_table(table1,table2);
print_array(table1,table2); // after

return 0;
}
void swap_table( int table1[M] , int table2[N] )
{

int tmp=0 , *pt1 , *pt2;
int i=0;

pt1=table1;
pt2=table2;

for(pt1=pt2; (*pt1) && (*pt2) !=-1; pt1++)
{
tmp = *pt1;
*pt1=*pt2;
*pt2= tmp;
}

for(; i<5; i++)
printf("\n O 1os kai o 2os : %d , %d",table1[i] , table2[i]);


return;
}
void print_array(int table1[M] , int table2[N])
{
int i=0;

for(; i<5; i++)
printf(" \n %d , %d \n " , table1[i] , table2[i]);

return ;
}


Το προβλημα υπάρχει εκει που παω να κανω το swap .

Και btw ετσι μου τα εκτυπωνει μια χαρα

Κώδικας: Επιλογή όλων
for(pt1=table1; (*pt1)!= -1 ; pt1++)
printf("\n%d \n", *pt1);

for(pt2=table2; (*pt2)!= -1 ; pt2++)
printf("\n%d", *pt2);
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 02 Φεβ 2012, 00:28

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

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

Δημοσίευσηαπό migf1 » 02 Φεβ 2012, 00:42

Star_Light έγραψε:
Και btw ετσι μου τα εκτυπωνει μια χαρα

Κώδικας: Επιλογή όλων
for(pt1=table1; (*pt1)!= -1 ; pt1++)
printf("\n%d \n", *pt1);
...

Αυτό δουλεύει μονάχα αν έχεις την τιμή -1 στο τελευταίο στοιχείο του πίνακα (σαν να προσομοιώνεις δηλαδή ένα c-string αλλά για int). Σε αυτή την περίπτωση μπορεί να γραφεί κι έτσι ο κώδικας (κι ο δικός σου δουλεύει)...

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

Bool print_array( const int *arr )
{
if ( !arr )
return FALSE;

while ( *arr != -1 )
printf( "%d ", *arr++ );
putchar('\n');

return TRUE;
}

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

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

Δημοσίευσηαπό parenthesis » 02 Φεβ 2012, 00:53

Σκέψου πρώτα βήμα-βήμα τι θες να κάνεις. Για το swap θέλεις τα εξής:

1. Θέτεις τον δείκτη pt1 να δείχνει στο table1
2. Θέτεις τον δείκτη pt2 να δείχνει στο table2
loop:
3. Εκχωρείς το περιεχόμενο του pt1 στο tmp.
4. Εκχωρείς το περιεχόμενο του pt2 στο περιεχόμενο του pt1.
5. Εκχωρείς το tmp στο περιεχόμενο του pt2.
6. Προχωράς στην επόμενη θέση και των 2 πινάκων.

Και τώρα δες τον κώδικά σου. ;-)
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
2 Dual boot:
  • Ubuntu 13.04 raring 3.8.0-34-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic
  • Fedora 19 Schrödinger’s Cat 3.13.5-101.fc19.x86_64 64bit (el_GR.utf8, gnome)
3 Intel Core i5-3337U CPU @ 1.80GHz ‖ RAM 3844 MiB ‖ TOSHIBA VCUAA - TOSHIBA SATELLITE U940
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 eth0: Realtek RTL8101E/RTL8102E Ethernet [10ec:8136] (rev 05) ⋮ wlan0: Intel Centrino Wireless-N 2230 [8086:0887] (rev c4)
Άβαταρ μέλους
parenthesis
punkTUX
punkTUX
 
Δημοσιεύσεις: 150
Εγγραφή: 06 Οκτ 2009, 22:47
Launchpad: mara_sdr
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 02 Φεβ 2012, 00:54

Oταν λες με διαφορετικο μηκος εννοεις ο ενας να ειναι 10 στοιχεια και ο αλλος 15 ?

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

void fill_table_randomly( int table1[M] , int table2[N])
{
srand ( time (NULL) );
table1[M]= rand() % 10 ;
table2[N] = rand() % 10 ;

return;
}



Μαλλον δεν χρησιμοποιω σωστα την rand γιατι δινει αλλοκοτα αποτελεσματα :/
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 02 Φεβ 2012, 00:58

Το βασικό θέμα είναι τα μήκη τους, δεν αρκεί μονάχα η αντιμετάθεση των δεικτών των ονομάτων τους. Πρέπει μετά ή κατά την αντιμετάθεση να ενημερωθούν και τα μήκη τους, που με τη σειρά του "φωνάζει" για χρήση δομών ;)

Κι αν υλοποιηθούν με δομές (όπως είναι το σωστό) τότε αλλάζει και η γενικότερη προσέγγιση του κώδικα (διότι π.χ. τα ορίσματα θα πρέπει να είναι δείκτες στις δομές που περιέχουν του πίνακες).

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

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

Δημοσίευσηαπό Star_Light » 02 Φεβ 2012, 00:59

@parenthesis ακριβως αυτα νομιζω πως ειχα κανει και εξαρχης :D

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


pt1= table1; <=> // Θέτεις τον δείκτη pt1 να δείχνει στο table1
pt2 = table2; <=> // Θέτεις τον δείκτη pt2 να δείχνει στο table2

for(....)
{
tmp=*pt1; <=> // Εκχωρείς το περιεχόμενο του pt1 στο tmp
*pt1=*pt2; <=> // Εκχωρείς το περιεχόμενο του pt2 στο περιεχόμενο του pt1
*pt2=tmp; <=> // Εκχωρείς το tmp στο περιεχόμενο του pt2
}


Ισως κατι πηγε στραβα μεσα στο for με τις θεσεις :/
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 02 Φεβ 2012, 01:02

@migf1 για την ωρα δεν κοιταω να βγαλω το απλο? :/

Πχ να εχω 2 πινακες προκαθορισμενους και να χρησιμοποιω 3 συναρτησεις... η μια να τους γεμιζει randomize..

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

δεν θα σηκωνομαι αυριο απο το λουμπαγκο :lol: :lol: :lol:
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό parenthesis » 02 Φεβ 2012, 01:05

@Star_Light : Και πάλι, έχεις πρόβλημα στις αρχικοποιήσεις (δηλ κάνοντας for(pt1=pt2; ....), χάνεις τον δείκτη που έδειχνε στο table1) κι επίσης, δεν προχωράς ποτέ τον pt2 στην επόμενη θέση...
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
2 Dual boot:
  • Ubuntu 13.04 raring 3.8.0-34-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic
  • Fedora 19 Schrödinger’s Cat 3.13.5-101.fc19.x86_64 64bit (el_GR.utf8, gnome)
3 Intel Core i5-3337U CPU @ 1.80GHz ‖ RAM 3844 MiB ‖ TOSHIBA VCUAA - TOSHIBA SATELLITE U940
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 eth0: Realtek RTL8101E/RTL8102E Ethernet [10ec:8136] (rev 05) ⋮ wlan0: Intel Centrino Wireless-N 2230 [8086:0887] (rev c4)
Άβαταρ μέλους
parenthesis
punkTUX
punkTUX
 
Δημοσιεύσεις: 150
Εγγραφή: 06 Οκτ 2009, 22:47
Launchpad: mara_sdr
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 02 Φεβ 2012, 01:05

Αν το κάνεις με τον τρόπο που το ξεκίνησες, δηλαδή με χρήση του -1 ως σηματοδότη τέλους του κάθε πίνακα, τότε είναι πολύ πιο απλός ο κώδικας από αυτό που λέτε (ειδικά αν δεν βάλουμε ελέγχους αποτυχίας στην main() )...

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

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

typedef enum { FALSE=0, TRUE } Bool;

/* --------------------------------------------------
*
* --------------------------------------------------
*/
Bool arrswap( int **arr1, int **arr2 )
{
int *temp = NULL;

if ( !arr1 || !arr2 )
return FALSE;

temp = *arr1;
*arr1 = *arr2;
*arr2 = temp;

return TRUE;
}

/* --------------------------------------------------
*
* --------------------------------------------------
*/
Bool arrprint( const int *arr )
{
if ( !arr )
return FALSE;

while ( *arr != -1 )
printf( "%d ", *arr++ );
putchar('\n');

return TRUE;
}

/* --------------------------------------------------
*
* --------------------------------------------------
*/
int main( void )
{
int arr1[] = {1, 2, 3, 4, -1};
int arr2[] = {10, 20, 30, -1};

arrprint( arr1 );
arrprint( arr2 );

arrswap( &arr1, &arr2 );

arrprint( arr1 );
arrprint( arr2 );

exit( EXIT_SUCCESS );


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

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

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