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

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

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

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

Δημοσίευσηαπό clepto » 18 Ιουν 2011, 02:19

και εμείς κάτι λύνουμε αλλά όχι ολοκληρωμένες... :P
αφού τώρα μαθαίνουμε τι να κάνουμε...
μωρέ βάλε εσύ αλλά εδώ εγώ δεν μπορώ να λύσω αυτές θα λύσω την δύσκολη; :P
θα προσπαθήσω τουλάχιστον ;)
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 » 18 Ιουν 2011, 02:24

Να βάλω μια πιο εύκολη τότε πρώτα, και μετά η πολύ δύσκολη.

Διαβάστε ένα string από τον χρήστη, και τυπώστε το αντεστραμμένο. Π.χ. αν σας δώσει:
Κώδικας: Επιλογή όλων
hello cruel word


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

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

Δημοσίευσηαπό medigeek » 18 Ιουν 2011, 13:03

Κάτι σαν αυτό;

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

int buf = 256;

char* backwards(char *ss)
{
int i;
int max = strlen(ss) - 2;

printf("Backwards: ");

for(i=max; i >= 0; i--)
{
//printf("%d: %c\n", i, ss[i]);
printf("%c", ss[i]);
}
return 0;
}

int main()
{
char s[buf];

printf("Please enter a string: ");
fgets(s, buf, stdin);
printf("You entered: %s\n", s);
printf("String length: %lu\n", strlen(s));
backwards(s);

return 0;
}
Κύπριος; Κόπιασε στο 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 » 18 Ιουν 2011, 13:26

Oh yes! :) :) :)

Στην backwards() κανονικά θέλει:
Κώδικας: Επιλογή όλων
int max = strlen(ss) - 1;


αντί για:
Κώδικας: Επιλογή όλων
int max = strlen(ss) - 2;


αλλά δουλεύει και με τις 2 τιμές, δεν ξέρω γιατί :lol: (θα το κοιτάξω πιο επισταμένα πιο μετά, γιατί με τρώει η περιέργεια :) )

medigeek έγραψε:Κάτι σαν αυτό;

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

int buf = 256;

char* backwards(char *ss)
{
int i;
int max = strlen(ss) - 2;

printf("Backwards: ");

for(i=max; i >= 0; i--)
{
//printf("%d: %c\n", i, ss[i]);
printf("%c", ss[i]);
}
return 0;
}

int main()
{
char s[buf];

printf("Please enter a string: ");
fgets(s, buf, stdin);
printf("You entered: %s\n", s);
printf("String length: %lu\n", strlen(s));
backwards(s);

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

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

Δημοσίευσηαπό medigeek » 18 Ιουν 2011, 13:40

migf1 έγραψε:
αλλά δουλεύει και με τις 2 τιμές, δεν ξέρω γιατί :lol:

Το fgets συμπεριλαμβάνει το χαρακτήρα \n απ'ό,τι κατάλαβα.
Και ένας άλλος χαρακτήρας είναι το \0 στο τέλος του string, γι' αυτό έβαλα - 2 χαρακτήρες στο τέλος.

Αυτό που δεν καταφέρνω είναι να φτιάξω το function backwards() να κάνει return κάποιο text string. :( Καμιά ιδέα;
Βασικά θέλω στο main να εκτελέσω:
Κώδικας: Επιλογή όλων
printf("Backwards: %s", backwards(s))
Κύπριος; Κόπιασε στο 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 » 18 Ιουν 2011, 13:51

Έχεις δίκιο για το '\n' του fgets() ! Αυτή είναι όντως η εξήγηση :)

Για το άλλο που ρώτησες, δεν ξέρω αν κατέβασες την Ξερή από το άλλο νήμα, αν την κατέβασες τότε στο αρχείο s.c η συνάρτηση s_reverse() κάνει αυτό ακριβώς που ζητάς (τη βάζω και σε spoiler παρακάτω μόνη της).

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

// ***********************************************************
char *s_reverse(char *s)
{
if ( !s ) // early exit
return NULL;

char *cp1, *cp2, dummy;

cp2 = s + strlen(s) - 1; // set cp2 at end of s
for (cp1=s; cp1 < cp2; cp1++, cp2--) {
dummy = *cp1;
*cp1 = *cp2;
*cp2 = dummy;
}

return s;
}


Όπου (αν) κολλήσεις πες μου.

medigeek έγραψε:
migf1 έγραψε:
αλλά δουλεύει και με τις 2 τιμές, δεν ξέρω γιατί :lol:

Το fgets συμπεριλαμβάνει το χαρακτήρα \n απ'ό,τι κατάλαβα.
Και ένας άλλος χαρακτήρας είναι το \0 στο τέλος του string, γι' αυτό έβαλα - 2 χαρακτήρες στο τέλος.

Αυτό που δεν καταφέρνω είναι να φτιάξω το function backwards() να κάνει return κάποιο text string. :( Καμιά ιδέα;
Βασικά θέλω στο main να εκτελέσω:
Κώδικας: Επιλογή όλων
printf("Backwards: %s", backwards(s))
Τελευταία επεξεργασία από migf1 και 18 Ιουν 2011, 15:17, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 18 Ιουν 2011, 14:07

Εβγαλα το string έξω από το for loop, αλλά κατα την εκτέλεση μου βγάζει "Segmentation fault"!
Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>

int buf = 256;

char *backwards(char *ss)
{
int i;
int max = strlen(ss) - 2;
char *newss = "";

for(i=max; i >= 0; i--)
{
//printf("%d: %c\n", i, ss[i]);
//printf("%c", ss[i]);
*newss = sprintf("%s%c", newss, ss[i]);
}
printf("Backwards: %s", newss);
return 0;
}

int main()
{
char s[buf];

printf("Please enter a string: ");
fgets(s, buf, stdin);
printf("You entered: %s\n", s);
printf("String length: %lu\n", strlen(s));
backwards(s);

return 0;
}
Κύπριος; Κόπιασε στο 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 » 18 Ιουν 2011, 14:12

Πρέπει να του ορίσεις μέγιστο μήκος. Έτσι όπως το έχεις ορίσει τώρα το newss έχει μέγιστο μήκος 1. Επίσης, προσπαθείς να του περάσεις μια τιμή που είναι int (η sprintf() επιστρέφει int).

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

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

Δημοσίευσηαπό medigeek » 18 Ιουν 2011, 14:22

migf1 έγραψε:Επίσης, προσπαθείς να του περάσεις μια τιμή που είναι int (η sprintf() επιστρέφει int).

Αχα! Νομιζα ότι το sprintf ήταν το ίδιο με αυτό της php :D

migf1 έγραψε:ΥΓ. Είδες την s_reverse() που πόσταρα στο προηγούμενο ποστ;

Ναι αλλά θα πρέπει να διαβάσω ξανά αυτό που κάνουν τα αστεράκια, δεν πολυκατάλαβα τα σύμβολα * και τα & :P

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

int buf = 256;

char *backwards(char *ss)
{
int i;
int max = strlen(ss) - 2;
static char newss[sizeof(ss)];

for(i=max; i >= 0; i--)
{
//printf("%d: %c\n", i, ss[i]);
//printf("%c", ss[i]);
sprintf(newss, "%s%c", newss, ss[i]);
}
//printf("Backwards: %s", newss);
return newss;
}

int main()
{
char s[buf];

printf("Please enter a string: ");
fgets(s, buf, stdin);
printf("You entered: %s\n", s);
printf("String length: %lu\n", strlen(s));
printf("Backwards: %s", backwards(s));

return 0;
}


Ευχαριστώ πολύ για την βοηθεια!!
Κύπριος; Κόπιασε στο 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 » 18 Ιουν 2011, 14:45

Τι ευχαριστείς βρε συ, αφού τα έχουμε πει :)

Καταρχήν, ο αλγόρθιμος της s_reverse() αυτό που κάνει είναι να βάζει έναν δείκτη cp1 στην αρχή του string s κι έναν δείκτη cp2 στο τέλος του. Κατόπιν με το for-loop και για όσο ο cp1 είναι μικρότερος του cp2 (μέχρι να συνατηθούν δηλαδή), αυξάνει τον cp1, μειώνει τον cp2 και στην πορεία εναλλάσσει τα περιεχόμενά τους (κάνει swap δηλαδή τους χαρακτήρες στους οποίους δείχνουν αυτοί οι 2 δείκτες σε κάθε επανάληψη του loop). Για αυτό και η ύπαρξη του dummy... για να κρατάει προσωρινά τον χαρακτήρα *cp1 πριν την εναλλαγή, και να τον αναθέτει στον *cp2 στο τέλος της εναλλαγής.

cp1, cp2 είναι οι δείκτες (δηλαδή οι απόλυτες διευθύνεις μνήμης)
*cp1, *cp2 είναι τα περιεχόμενα της μνήμης (δηλαδή οι χαρακτήρες του s στους οποίους δείχνουν κάθε φορά οι cp1, cp2

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

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

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