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

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

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

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

Δημοσίευσηαπό Star_Light » 13 Αύγ 2011, 12:30

migf1 έγραψε:Καλά, έχω κάνει μεγάλη πατάτα, αντί να αθροίζω τα νούμερα, αθροίζω τα i :lol:


αυτο το ειχα παθει και εγω αρχικα και αναρωτιομουν
για ποιο λογο δεν μου δουλευει :P
Γνώσεις ⇛ 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 » 13 Αύγ 2011, 12:31

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

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

Δημοσίευσηαπό migf1 » 13 Αύγ 2011, 12:34

Εδώ και με επιλογή του χρήστη...
Spoiler: show
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>
// -----------------------------------------------------------------------------------
int main( void )
{
int arr[10] = {0};
char inbuf[256] = "", c;
register int i=0, sum = 0, evsum = 0, odsum = 0;;

puts("a:\tsum all\no:\tsum odds\ne:\tsum evens");
do {
printf("select: ");
fgets(inbuf, 256, stdin);
} while ( (c = *inbuf) != 'a' && c != 'e' && c != 'o');

putchar('\n');
do {
printf("Enter #%2d: ", i+1);
fgets(inbuf, 256, stdin);
arr[i] = atoi(inbuf);
if ( c == 'a')
sum += arr[i];
if (c == 'o')
odsum += (arr[i]%2 ? arr[i] : 0);
if (c == 'e')
evsum += ( arr[i]%2 == 0 ? arr[i] : 0 );
} while ( ++i < 10 );

puts("\n");
if (c == 'a')
printf("Total sum:\t%d\n", sum);
else if ( c == 'e' )
printf("Sum of even:\t%d\n", evsum);
else
printf("Sum of odd:\t%d\n", odsum);

return 0;
}

Δεν έχω βάλει έλεγχο για το τι διαβάζει για νούμερα (βαρέθηκα). Π.χ. αν του πατήσει κάποιος ENTER αντί για νούμερο θα το πάρει για 0 αντί για να τον ξαναρωτήσει (ομοίως κι αν δώσει γράμματα, σύμβολα, κλπ).

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

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

Δημοσίευσηαπό migf1 » 13 Αύγ 2011, 13:05

Σε επίπεδο λογικής μια χαρά τον βλέπω τον κώδικα, αλλά έχεις ένα θέμα στο table[] που διαβάζεις με fgets(). Από τη στιγμή που το έχεις ορίσει μονάχα σε 2 χαρακτήρες, δεν λύνεις το πρόβλημα με τα απομεινάρια στην κύρια είσοδο. Πρέπει να το βάλεις με μεγάλη χωρητικότητα ( > 256). Εναλλακτικά, μπορείς να χρησιμοποιήσεις την s_getflushed() τον κώδικα της οποίας έχω ποστάρει σε προηγούμενο ποστ αυτού του νήματος, η οποία και διαβάζει το πλήθος χαρακτήρων που της λες και καθαρίζει και την κύρια είσοδο, χωρίς να χρησιμοποιεί την fflush().

Επίσης, δεν χρειάζεσαι και N και M (ένα από τα 2 αρκεί).

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

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

Δημοσίευσηαπό Star_Light » 13 Αύγ 2011, 13:34

migf1 έγραψε:Σε επίπεδο λογικής μια χαρά τον βλέπω τον κώδικα, αλλά έχεις ένα θέμα στο table[] που διαβάζεις με fgets(). Από τη στιγμή που το έχεις ορίσει μονάχα σε 2 χαρακτήρες, δεν λύνεις το πρόβλημα με τα απομεινάρια στην κύρια είσοδο. Πρέπει να το βάλεις με μεγάλη χωρητικότητα ( > 256). Εναλλακτικά, μπορείς να χρησιμοποιήσεις την s_getflushed() τον κώδικα της οποίας έχω ποστάρει σε προηγούμενο ποστ αυτού του νήματος, η οποία και διαβάζει το πλήθος χαρακτήρων που της λες και καθαρίζει και την κύρια είσοδο, χωρίς να χρησιμοποιεί την fflush().

Επίσης, δεν χρειάζεσαι και N και M (ένα από τα 2 αρκεί).

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


Κατσε οταν λες ενα απο τα 2 αρκει... γιατι μου βγαζει συντακτικο λαθος....

στο μεταξυ γιατι ας πουμε με μονο 2 χαρακτηρες δεν καθαριζει την κυρια εισοδο??? εχει εξηγηθει καπου αυτο και δεν το εχω δει????

οσο για τα σχολια τωρα ειναι ενταξει????

Spoiler: show
Κώδικας: Επιλογή όλων
/*========================================
*
* Calculating odd and even sum of
* elements in the arrays table_odd
* and table_even. The input was given from user
* and will store in the arrays. After all through
* the switch the user choose A or B if want to call
* function sum_odd and calculates the odd sum or
* call sum_even and calculates the even sum the simply solution
* about this problem creates by Kostas at 12/8/11 on this code
*
=========================================*/
#include<stdio.h>
#include<stdlib.h>
#define N 10
#define M 10
int sum_odd(int table_odd[N]); //sum_odd function declaration
int sum_even(int table_even[M]); // sum_even function declaration
int result; //declaration result variable as a global variable , note that is
// not good programming technique and actually might create problems
// we use it only for this specific example


int main()

{

int table_odd[N];
int table_even[N];
char table[2]="";
char c;

printf("\t\t Welcome in C programm: \n");
printf("Give A or B for odd or even sum or Q for quit: \n");
fgets(table,2,stdin); //We use the fgets function from stdlib and not getchar() because she has problem with the buffer
sscanf(table,"%c",&c); // And now we can use the sscanf instead the classic scanf


switch(c)
{
case 'A':
printf("You have choose the odd sum\n");
result=sum_odd(table_odd); //call sum function for the odd calculating
printf("The odd sum is : %4d",result); //display the odd result
break;
case 'B':
printf("You have choose the even sum\n");
result=sum_even(table_even);
printf("The even sum is: %4d",result); //display the even result
break;
default:
;
}

return 0;
}
/*The defining of sum_odd function is here */
int sum_odd(int table_odd[N])
{
int i;
result=0;

printf("\n\nGive the 10 numbers(one under of others):\n");

for(i=0; i<N; i++)
{

scanf("%d",&table_odd[i]); //save the user input into the table_odd
if((table_odd[i]%2)==0)
continue;
result += table_odd[i];
}
return result;

}
/*The defining of sum_even function is here */
int sum_even(int table_even[M])
{
int i;
result=0;

printf("\n\nGive 10 numbers(one under of others):\n");


for(i=0; i<M; i++)
{

scanf("%d",&table_even[i]); //save
if((table_even[i]%2)==0)
result += table_even[i];
}
return result;
}
/*-------------------------------------- */




αμα τα παω τελειως τερμα στον μεταγλωτιστη μου δειχνει οτι πρεπει να παω δεξια κατω κατω την μπαρα για να φανουν για αυτο
δεν ξερω αμα στο code reposiroty εχει αυτο το θεμα...
Τελευταία επεξεργασία από Star_Light και 13 Αύγ 2011, 13:40, έχει επεξεργασθεί 1 φορά/ες συνολικά
Γνώσεις ⇛ 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 » 13 Αύγ 2011, 13:40

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

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

Δημοσίευσηαπό migf1 » 13 Αύγ 2011, 13:55

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

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

Δημοσίευσηαπό Star_Light » 13 Αύγ 2011, 14:12

migf1 έγραψε:Στην βρήκα: viewtopic.php?p=201872#p201872 :)


Nα σαι καλα migf1. Αν και νομιζω δεν ειναι η ιδια που εχεις φτιαξει και στο 3ο σου τουτοριαλ στο σαιτ που εισαι ιδιοκτητης?
Τελοςπαντων... προς το παρον εβαλα 256 χαρακτηρες στο table και οκ. Θα την διαβασω καλυτερα οταν θα εχω περισσοτερο χρονο
προς το παρον εφυγα...... καλη συνεχεια!
Γνώσεις ⇛ 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 » 13 Αύγ 2011, 14:15

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

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

Δημοσίευσηαπό Star_Light » 13 Αύγ 2011, 14:35

στο μεταξυ κατι τελευταιο τωρα που το θυμηθηκα.... μηπως ειναι περιττο το fgets εδω???? στον δικο μου κωδικα μιας και ο χρηστης δινει εναν χαρακτηρα μπαινει στην switch καλειται η αντιστοιχη συναρτηση και μετα το προγραμμα τερματιζει.... θελω να πω και θεμα με to buffer να υπαρχει εφοσον τερματιζει το προγραμμα μας αφορα? ΜΗπως πρεπει να βάλω και μια while στην switch??? (Για οσο δηλαδη ο χρηστης δινει χαρακτηρες απο το πληκτρολογιο)
Γνώσεις ⇛ 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
Εκτύπωση

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

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