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

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

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

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

Δημοσίευσηαπό babisisto » 12 Ιαν 2013, 17:50

Προσπαθώ να κάνω ένα πρόγραμμα και μεσα στα πολλά πρέπει να κάνω και το ακόλουθο που αντιμετωπίζω ένα πρόβλημα:
Θέλω να διαβάζω από το χρήστη 5 σειρές των 5 αριθμών.. Για παράδειγμα θέλω να μου δίνει ο χρήστης το ακόλουθο:
12345
45678
48952
45685
12323
(προτέποντάς τον εγώ σε κάθε σειρά να μου δώσει πέντε αριθμούς) Έγραψα το παρακάτω..
Κώδικας: Επιλογή όλων
  int array[5][5];
  for(i=0;i<5;i++)
  {
      printf("line %d : ", i+1);
      for(j=0;j<5;j++)
      {
          scanf("%1d", &array[i][j]);
      }
  }

Πως μπορώ να ελέγχω αν ο χρήστης θα δώσει 5 αριθμούς σε κάθε σειρά; Αν δώσει παραπανω θα του δίνω πχ ένα printf οτι εκανε λαθος

Ευχαριστώ!
babisisto
babeTUX
babeTUX
 
Δημοσιεύσεις: 3
Εγγραφή: 12 Ιαν 2013, 17:44
Εκτύπωση

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

Δημοσίευσηαπό babisisto » 12 Ιαν 2013, 17:54

Μπορώ επίσης να αντικαταστήσω το scanf με ενα gets και μετα να μετατρέπω τη συμβολοσειρά σε αριθμούς για να τους περάσω στο πίνακά μου..Πάλι όμως δημιουργείται πρόβλημα.. μια μου λεει line1 μια line5 και γενικα μπερδεμενα.. κατι με το buffer παιζει και γιαυτο θέλω βοήθεια
babisisto
babeTUX
babeTUX
 
Δημοσιεύσεις: 3
Εγγραφή: 12 Ιαν 2013, 17:44
Εκτύπωση

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

Δημοσίευσηαπό clepto » 12 Ιαν 2013, 19:46

πιστεύω αυτό κάνει το πρώτο μέρος
Μορφοποιημένος Κώδικας: Επιλογή όλων
int array[5];
for(i=0;i<5;i++)
{
printf("line %d : ", i+1);
do {
printf("Give 5 digit number");
scanf("%d", &array[i]);

} while (sizeof(array[i]) != 5 );
}

δεν το έκανα compile για να δω αν όντως δουλεύει
είναι ανάγκη να χρησιμοποιήσεις πίνακα δυο διαστάσεων;
έχω καιρό να ασχοληθώ με C και μπορεί να έχω κανένα λαθάκι...νομίζω ότι δεν συνιστάτε η χρήση της gets
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

Δημοσίευσηαπό evolgen » 12 Ιαν 2013, 19:46

Δεν έχω ιδιαίτερη εμπειρία από C, ωστόσο αυτό που γράφω φαίνεται να δουλεύει όπως θέλεις:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
int i,j;
int array[5][5];
for(i=0; i<5; i++)
{
printf("line %d : ", i+1);
j = 0;
while(scanf("%1d", &array[i][j]) == 1)
{
j++;
if ( j == 5 )
{
char c;
scanf("%c",&c);
if(!(c == '\n'))
{
printf("ERROR!\n");
return(1);
}
break;
}
}
}
return(0);
}


Όταν ο j γίνει 5, αν το αμέσως επόμενο input δεν είναι η αλλαγή γραμμής, θα πετάξει error. Αλλιώς, θα προχωρήσει στην επόμενη σειρά.
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

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

Δημοσίευσηαπό simosx » 13 Ιαν 2013, 02:14

clepto έγραψε:έχω καιρό να ασχοληθώ με C και μπορεί να έχω κανένα λαθάκι...νομίζω ότι δεν συνιστάτε η χρήση της gets


Δεν συνίσταται η gets() διότι μπορεί να γίνει

Κώδικας: Επιλογή όλων
char buf[80];

gets(buf);

και αν γράψεις ένα αλφαριθμητικό που είναι πάνω από 80 χαρακτήρες (αν είναι με ελληνικά, γύρω στους 45 χαρακτήρες), τότε θα επικαλυφθούν περιοχές της μνήμης του προγράμματος σε εκτέλεση. Και μάλλον θα καταρρεύσει.

Αντί για gets(), το σωστό είναι η χρήση της fgets(), διότι έχει όρισμα για το μέγεθος του πίνακα. Έτσι,

Κώδικας: Επιλογή όλων
fgets(buf, 80, stdin);
i = atoi(buf);


Οπότε, και η scanf() και η gets(), έχουν πρόβλημα ασφάλειας, διότι δεν έχουν παράμετρο για το μέγιστο μέγεθος του πίνακα.
Όταν λαμβάνουμε είσοδο από το χρήστη, πρέπει να μετράμε πάντα να μη ξεπερνούν τα όρια στους πίνακες, κτλ.

προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

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

Δημοσίευσηαπό babisisto » 13 Ιαν 2013, 19:22

Σας ευχαριστώ όλους για τις απαντήσεις ..

fgets λοιπόν....

Το i είναι το πλήθος των χαρακτήρων;
babisisto
babeTUX
babeTUX
 
Δημοσιεύσεις: 3
Εγγραφή: 12 Ιαν 2013, 17:44
Εκτύπωση

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

Δημοσίευσηαπό simosx » 13 Ιαν 2013, 20:04

babisisto έγραψε:Σας ευχαριστώ όλους για τις απαντήσεις ..

fgets λοιπόν....

Το i είναι το πλήθος των χαρακτήρων;


Είναι το μέγεθος του πίνακα. Ανάλογα με το αν γράφεις αγγλικά ή ελληνικά, είναι ανάλογος αριθμός χαρακτήρων.
Για αγγλικά, μια θέση στον πίνακα είναι και ένας χαρακτήρας.
Για ελληνικά, ο ελληνικός χαρακτήρας θέλει δύο θέσεις στον πίνακα (για κωδικοποίηση UTF-8).
Ο χαρακτήρας του διαστήματος είναι ένας χαρακτήρας.
Το σημαντικό από αυτά είναι ότι αν θέλεις να λάβεις κείμενο στα ελληνικά, υπολόγισε το μισό μέγεθος του πίνακα θα είναι πάνω κάτω οι ελληνικοί χαρακτήρες που θα μπορεί να δεχτεί.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Το πρόγραμμα δεν προχωράει.......ΒΟΗΘΕΙΑ..

Δημοσίευσηαπό vale2000 » 02 Μαρ 2013, 13:53

Καλημέρα σας
είμαι αρχάριος στο C και δυσκολεύομαι να βρω το λάθος στην προσπάθεια μου αυτή

μπορείτε να με βοηθήσετε???????

.....
τέσσερα διαφορετικά είδη ροφημάτων (καφέ, καφέ με γάλα, σοκολάτα και σοκολάτα με γάλα), που κοστίζουν 1.5, 1.8, 2.1 και 2.4 ευρώ αντίστοιχα. Η μηχανή δέχεται κέρματα των 10, 20 και 50 λεπτών, του ενός ευρώ και των 2 ευρώ, καθώς και χαρτονομίσματα των 5 και 10 ευρώ, και επιστρέφει ρέστα χρησιμοποιώντας μόνο κέρματα. Να υλοποιηθεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο:
1. Εμφανίζει κατάλογο επιλογής (μενού) των προσφερόμενων ειδών (αριθμούμενα από το 1 έως το 4) με το αντίστοιχο αντίτιμο για το καθένα, την επιλογή 0 για έξοδο από το πρόγραμμα και στη συνέχεια διαβάζει την επιλογή του χρήστη (είδος που προτιμά ή έξοδος), εφαρμόζοντας αμυντικό προγραμματισμό προκειμένου να διασφαλιστεί ότι ο χρήστης εισάγει τιμή μεταξύ 0 και 4.
2. Στη συνέχεια διαβάζει το ποσό που απαιτείται για την πληρωμή του είδους που επέλεξε ο χρήστης. Κατά την εισαγωγή του ποσού να χρησιμοποιηθεί αμυντικός προγραμματισμός, ώστε το ποσό που εισάγει ο χρήστης να αντιστοιχεί σε αποδεκτό κέρμα ή χαρτονόμισμα. Το πρόγραμμα να ελέγχει εάν το ποσό που εισήχθη είναι μεγαλύτερο ή ίσο με το ποσό που απαιτείται. Στην περίπτωση που έχει εισαχθεί ποσό μικρότερο από το απαιτούμενο, το πρόγραμμα τυπώνει κατάλληλο μήνυμα με το επιπλέον ποσό που πρέπει να εισαχθεί και προτρέπει το χρήστη να εισάγει το υπολειπόμενο ποσό. Αυτή η διαδικασία συνεχίζεται μέχρι να εισαχθεί ποσό ίσο με ή μεγαλύτερο από το ποσό που απαιτείται για την αγορά του είδους που επελέγη από το χρήστη.
3. Υπολογίζει το υπόλοιπο (ρέστα) που πρέπει να επιστρέψει και τυπώνει κατάλληλο μήνυμα που ενημερώνει το χρήστη για το ποσό που θα του επιστραφεί.
4. Υπολογίζει το ελάχιστο πλήθος κερμάτων που θα επιστραφούν στο χρήστη ως υπόλοιπο (ρέστα) και τυπώνει μήνυμα με πόσα και ποιας αξίας κέρματα πραγματοποιείται αυτό.
Το πρόγραμμα θα δέχεται από το χρήστη τα ποσά σε ευρώ με ακρίβεια ενός δεκαδικού ψηφίου, αλλά θα χειρίζεται τα ποσά σε λεπτά.


Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h> 
main()
{
int n,a;
float x[5]= {0, 1.5, 1.8, 2.1, 2.4};
float b;
printf("Parakalw epilekste ena apo ta parakatw\n");
printf("\n");
printf("1. Kafe 1.5 euro\n");
printf("2. Kafe me gala 1.8 euro\n");
printf("3. Sokolata 2.1 euro\n");
printf("4. Sokolata me gala 2.4 euro\n");
printf("0. Exodos\n");
printf("\n");
printf("Parakalw eiasgete thn epilogh sas: ");
scanf ("%d", &n);
if (n!=0);
{
printf("Prepei na eisagetai %1.1f euro synolika\n",x[n]);
printf("Posa eisagete ?");
scanf("%d",&a);
do
{
b=a-x[n] ;
if (b<0)
{
printf("prepei na eisagete %f euro synolika",-b);
printf("posa eisagetai ?");
scanf("%d",&a);
b=b+a;
}
else
{
printf("Epistrofh %f euro",b);
}
}
while (b!=0) ;
}
getchar();
return 0;
}




Τον κώδικα τον βάζουμε μέσα σε [cοde]κώδικας[/cοde] ή καλύτερα σε z_code tags. Επιλέγουμε το κείμενο και πατάμε το κουμπάκι Εικόνα.

Τελευταία επεξεργασία από vale2000 και 03 Μαρ 2013, 10:07, έχει επεξεργασθεί 2 φορά/ες συνολικά
vale2000
babeTUX
babeTUX
 
Δημοσιεύσεις: 7
Εγγραφή: 02 Μαρ 2013, 13:37
Εκτύπωση

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

Δημοσίευσηαπό konnn » 03 Μαρ 2013, 03:05

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


Καλημέρα και καλώς ήρθες.
Ποιο λάθος και πού ακριβώς πιστεύεις πως γίνεται αυτό;;στον κώδικα που παραθέτεις ;
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

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

Δημοσίευσηαπό vale2000 » 03 Μαρ 2013, 10:38

konnn έγραψε:
vale2000 έγραψε:Καλημέρα σας
είμαι αρχάριος στο C και δυσκολεύομαι να βρω το λάθος στην προσπάθεια μου αυτή


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



Καλημέρα σας
Σας ευχαριστώ για τις διευκρινήσεις στο φόρουμ.....
Το πρόβλημα που με απασχολεί είναι:
1) δεν μπορώ να αφαιρέσω ποσό 0.10, 0.80 κτλ,
δλδ. μου ζητάει το πρόγραμμα να δώσω χρήματα για τον καφέ ας πούμε 2.80,
αν δώσω 5 ε θα μου πει τα ρέστα σου είναι τόσο --> ΟΚ
αν δώσω 2 ε όταν θα μου ζητήσει 0.800000, δεν μπορώ να τα προσθέσω(ούτε τα εικοσάλεπτα τα οπία έπρεπε να δέχεται) ;;;;
Στον κώδικα δεν ξέρω που θα μπορούσα να παρέμβω, αλλά πιστεύω πώς πρέπει να έχει σχέση με τους δεκαδικούς..
2) το τέταρτο μέρος της άσκησης μου ζητάει να μου μετρήσει τα ρέστα, ε αυτή την εντολή δεν ξέρω να την φτιάξω, έχω μπερδευτεί πάρα πολύ........

Σας ευχαριστώ για την υπομονή....
vale2000
babeTUX
babeTUX
 
Δημοσιεύσεις: 7
Εγγραφή: 02 Μαρ 2013, 13:37
Εκτύπωση

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

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

cron