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

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

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

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

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

migf1 έγραψε: s[j + 1] = s[i];

Δεν καταλαβαίνω τι ακριβώς κάνει το s[j + 1] = s[i]. Και στην δεύτερη άσσκηση δεν καταλαβαίνω όχι την εκφώνηση αλλά το πώς θα την υλοποιήσω.
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

stamatiou έγραψε:Δεν καταλαβαίνω τι ακριβώς κάνει το s[j + 1] = s[i].

Αντιγράφει τον i-οστό χαρακτήρα του string s στον (j+1)-οστό χαρακτήρα του strings s.

έγραψε:Και στην δεύτερη άσσκηση δεν καταλαβαίνω όχι την εκφώνηση αλλά το πώς θα την υλοποιήσω.

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

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

Δημοσίευσηαπό Qdata » 24 Ιούλ 2011, 21:24

Κώδικας: Επιλογή όλων
/*Άσκηση:
* Να γραφεί συνάρτηση η οποία να εμφανίζει στην οθόνη ένα πλαίσιο το οποίο θα δημιουργείται
από έναν χαρακτήρα και θα έχει συγκεκριμένο πλάτος (σε χαρακτήρες) και ύψος (σε
γραμμές). Το ύψος, το πλάτος και ο χαρακτήρας θα μεταβιβάζονται ως παράμετροι στη
συνάρτηση. Η συνάρτηση θα πρέπει να έχει μια επί πλέον παράμετρο η οποία στη περί-
πτωση που έχει τιμή 1 το πλαίσιο θα είναι γεμάτο με τον χαρακτήρα και στη περίπτωση
που έχει τιμή 0 θα εμφανίζεται μόνο το περίγραμμα. Επίσης, να γράψετε ένα πρόγραμμα
το οποίο να καλεί τη συγκεκριμένη συνάρτηση.
*/

#include <stdio.h>
#include <stdlib.h> /* Για exit() */

void display(char ch,int height,int width,int fill);
main()
{
int ipsos,platos,gemisma;
char xarakthras;
printf("Δώσε χαρακτήρα: ");
scanf("%c",&xarakthras);
printf("Δώσε το ύψος: ");
scanf("%d",&ipsos);
printf("Δώσε το πλάτος: ");
scanf("%d",&platos);
printf("Δώσε το γέμισμα <0 ή 1>: ");
scanf("%d",&gemisma);
display(xarakthras,ipsos,platos,gemisma);
exit(0);
}

void display(char ch,int height,int width,int fill)
{
int i,j,d;
if(fill == 1 || fill == 0);
else
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}
for(i=1;i<=width;++i)
{
printf("%c",ch);
}
putchar('\n');
for(d=1;d<=height;++d)
{
printf("%c",ch);
for(j=1;j<=(width-2);++j)
{
if(fill==1)
printf("%c",ch);
else if(fill==0)
printf(" ");
}
printf("%c",ch);
putchar('\n');
}
for(i=1;i<=width;++i)
{
printf("%c",ch);
}
putchar('\n');
}


Στο πρόγραμμα αυτό αν αντικαταστήσω το:
Κώδικας: Επιλογή όλων
if(fill == 1 || fill == 0);
else
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}

με:
Κώδικας: Επιλογή όλων
if(!(fill == 1) || !(fill == 0))
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Μου βγάζει συνέχεια(είτε πατήσω 0 ή 1 είτε πατήσω άλλο αριθμό):
Κώδικας: Επιλογή όλων
Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!


Τι γίνετε;Επίσης γιατί το πρόγραμμα συμπεριφέρεται πάρα πολύ παράξενα όταν εισάγω ελληνικούς χαρακτήρες;
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
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 24 Ιούλ 2011, 21:32

Qdata έγραψε:
Κώδικας: Επιλογή όλων
/*Άσκηση:
* Να γραφεί συνάρτηση η οποία να εμφανίζει στην οθόνη ένα πλαίσιο το οποίο θα δημιουργείται
από έναν χαρακτήρα και θα έχει συγκεκριμένο πλάτος (σε χαρακτήρες) και ύψος (σε
γραμμές). Το ύψος, το πλάτος και ο χαρακτήρας θα μεταβιβάζονται ως παράμετροι στη
συνάρτηση. Η συνάρτηση θα πρέπει να έχει μια επί πλέον παράμετρο η οποία στη περί-
πτωση που έχει τιμή 1 το πλαίσιο θα είναι γεμάτο με τον χαρακτήρα και στη περίπτωση
που έχει τιμή 0 θα εμφανίζεται μόνο το περίγραμμα. Επίσης, να γράψετε ένα πρόγραμμα
το οποίο να καλεί τη συγκεκριμένη συνάρτηση.
*/

#include <stdio.h>
#include <stdlib.h> /* Για exit() */

void display(char ch,int height,int width,int fill);
main()
{
int ipsos,platos,gemisma;
char xarakthras;
printf("Δώσε χαρακτήρα: ");
scanf("%c",&xarakthras);
printf("Δώσε το ύψος: ");
scanf("%d",&ipsos);
printf("Δώσε το πλάτος: ");
scanf("%d",&platos);
printf("Δώσε το γέμισμα <0 ή 1>: ");
scanf("%d",&gemisma);
display(xarakthras,ipsos,platos,gemisma);
exit(0);
}

void display(char ch,int height,int width,int fill)
{
int i,j,d;
if(fill == 1 || fill == 0);
else
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}
for(i=1;i<=width;++i)
{
printf("%c",ch);
}
putchar('\n');
for(d=1;d<=height;++d)
{
printf("%c",ch);
for(j=1;j<=(width-2);++j)
{
if(fill==1)
printf("%c",ch);
else if(fill==0)
printf(" ");
}
printf("%c",ch);
putchar('\n');
}
for(i=1;i<=width;++i)
{
printf("%c",ch);
}
putchar('\n');
}


Στο πρόγραμμα αυτό αν αντικαταστήσω το:
Κώδικας: Επιλογή όλων
if(fill == 1 || fill == 0);
else
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}

με:
Κώδικας: Επιλογή όλων
if(!(fill == 1) || !(fill == 0))
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Μου βγάζει συνέχεια(είτε πατήσω 0 ή 1 είτε πατήσω άλλο αριθμό):
Κώδικας: Επιλογή όλων
Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!


Τι γίνετε;Επίσης γιατί το πρόγραμμα συμπεριφέρεται πάρα πολύ παράξενα όταν εισάγω ελληνικούς χαρακτήρες;

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

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

Δημοσίευσηαπό Qdata » 24 Ιούλ 2011, 21:34

stamatiou έγραψε:Από τι ξέρω το ! απλά αντιστρέφει αυτό που επιστρέφει αυτό που ακολουθεί. Γιαυτό το λόγο για προσπάθησε να το κάνεις αντί για == σε != και να βγάλεις το ! πριν την παρένθεση


Έχω δοκιμάσει ήδη:
Κώδικας: Επιλογή όλων
if(fill != 1) || fill != 0)
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Κώδικας: Επιλογή όλων
if(!(fill == 1) || !(fill == 0))
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Κώδικας: Επιλογή όλων
if((!(fill == 1)) || (!(fill == 0)))
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Τίποτα όμως!
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
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 24 Ιούλ 2011, 21:37

Μήπως ξέρει κανείς βρε παιδιά
Qdata έγραψε:
stamatiou έγραψε:Από τι ξέρω το ! απλά αντιστρέφει αυτό που επιστρέφει αυτό που ακολουθεί. Γιαυτό το λόγο για προσπάθησε να το κάνεις αντί για == σε != και να βγάλεις το ! πριν την παρένθεση


Έχω δοκιμάσει ήδη:
Κώδικας: Επιλογή όλων
if(fill != 1) || fill != 0)
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Κώδικας: Επιλογή όλων
if(!(fill == 1) || !(fill == 0))
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Κώδικας: Επιλογή όλων
if((!(fill == 1)) || (!(fill == 0)))
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Τίποτα όμως!

Ίσως αν βάλεις αντί για 1 '1';
Τελευταία επεξεργασία από stamatiou και 24 Ιούλ 2011, 21:51, έχει επεξεργασθεί 1 φορά/ες συνολικά
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Qdata » 24 Ιούλ 2011, 21:41

stamatiou έγραψε:Ίσως αν βάλεις αντί για 1 '1';


Όχι γιατί η μεταβλητή fill είναι δηλωμένη στις τυπικές παραμέτρους ως int.Το δοκίμασα μπας και γίνει κανένα θαύμα( :P ) αλλά πάλι τίποτα!

Δεν είναι και κάτι πάρα πολύ σημαντικό αλλά θα ήθελα να μάθω γιατί γίνετε αυτό. :oops:
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
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 24 Ιούλ 2011, 21:44

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

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

Δημοσίευσηαπό Qdata » 24 Ιούλ 2011, 21:51

stamatiou έγραψε:Εμένα μου τρέχει μια χαρά με το cc... :/


Και εμένα αλλά εγώ αναγκάστηκα να βάλω:
Κώδικας: Επιλογή όλων
if(fill == 1 || fill == 0);
else
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Δηλαδή να αφήσω το if κενό.Είναι σαν να λέω:
Κώδικας: Επιλογή όλων
ΑΝ(η fill είναι ίση με 1 ή η fill είναι ίση με 0) ΤΌΤΕ ΤΊΠΟΤΑ(πάμε στην επόμενη εντολή)
ΑΛΛΙΏΣ τύπωσε "Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!" και κλείσε το πρόγραμμα.

Εγώ θέλω να πω:
Κώδικας: Επιλογή όλων
ΑΝ(η fill ΔΕΝ είναι ίση με 0 ή 1) ΤΌΤΕ τύπωσε "Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!" και κλείσε το πρόγραμμα.
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
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 24 Ιούλ 2011, 21:56

Qdata έγραψε:
stamatiou έγραψε:Εμένα μου τρέχει μια χαρά με το cc... :/


Και εμένα αλλά εγώ αναγκάστηκα να βάλω:
Κώδικας: Επιλογή όλων
if(fill == 1 || fill == 0);
else
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}


Δηλαδή να αφήσω το if κενό.Είναι σαν να λέω:
Κώδικας: Επιλογή όλων
ΑΝ(η fill είναι ίση με 1 ή η fill είναι ίση με 0) ΤΌΤΕ ΤΊΠΟΤΑ(πάμε στην επόμενη εντολή)
ΑΛΛΙΏΣ τύπωσε "Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!" και κλείσε το πρόγραμμα.

Εγώ θέλω να πω:
Κώδικας: Επιλογή όλων
ΑΝ(η fill δεν είναι ίση με 0 ή 1) ΤΌΤΕ τύπωσε "Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!" και κλείσε το πρόγραμμα.

Δεν έχω ιδέα.. :/
--------------------------------------Είπα να συμμαζέψω μερικές από τις ερωτήσεις μου εδώ:
Spoiler: show
Έχουμε τον παρακάτω κώδικα:
Κώδικας: Επιλογή όλων
/* getline: get line into s, return length */
int getline(char s[], int lim)
{
int c, i;
i = 0;
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
s[i++] = c;
if (c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}

Αυτό το κομμάτι δεν θα έπρεπε να είναι s[++i] = c;
-----------------------------------------------2η ερώτηση:
Κώδικας: Επιλογή όλων
/* strindex: return index of t in s, -1 if none */
int strindex(char s[], char t[])
{
int i, j, k;
for (i = 0; s[i] != '\0'; i++) {
for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
;
if (k > 0 && t[k] == '\0')
return i;
}
return -1;
}

Δεν καταλαβαίνω τι σκοπό εξυπηρετεί το κομμάτι:
Κώδικας: Επιλογή όλων
for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
;
if (k > 0 && t[k] == '\0')
return i;

-----------------------------------3η
Δεν καταλαβαίνω την εκφώνηση αυτής της άσκησης:
Exercise 4-1. Write the function strindex(s,t) which returns the position of the rightmost occurrence of t in s, or -1 if there is none.
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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