Calculator γραμμένο σε C

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

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

Re: Calculator γραμμένο σε C

Δημοσίευσηαπό evolgen » 05 Ιουν 2011, 13:19

evolgen έγραψε:
Qdata έγραψε:
UnKnown96 έγραψε:Για κάποιο λόγο στο Linux δεν δέχετε τις εντολές pow sqrt και getch δοκίμασε κάτω από το #include <stdio.h> να βάλεις και αυτό : #include <math.h>
και πες μου αν δουλεύει.

edit: και αντικατέστησε το getch(); με getchar();


Τώρα μου βγάζει:

Κώδικας: Επιλογή όλων
$ gcc calc.c -o calc
/tmp/ccUJ2S1N.o: In function `main':
calc.c:(.text+0x288): undefined reference to `pow'
calc.c:(.text+0x2e2): undefined reference to `sqrt'
collect2: ld returned 1 exit status


Οπότε δεν δέχεται τις εντολές pow και sqrt. :problem:

Μήπως αν δοκίμαζες και
Κώδικας: Επιλογή όλων
gcc -lm calc.c -o calc


Λοιπόν, το κατέβασα και το μεταγλώττισα. Τρία ήταν τα προβλήματα:
- getch -> getchar
- #include <math.h>
- gcc -lm

Μετά από αυτά, η μεταγλώττιση έγινε κανονικά. :)
Γενικά, όταν χρησιμοποιείς μαθηματικά και το math.h, σχεδόν πάντα βάζε το "-lm". Από τη σχολή το ξέρω και νομίζω προσθέτει δυνατότητα για μαθηματικά ή κάτι τέτοιο.
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις 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: Calculator γραμμένο σε C

Δημοσίευσηαπό M.Jackson » 05 Ιουν 2011, 13:27

UnKnown96 έγραψε:
Σε ευχαρίστω πολύ!

Να σε ρωτίσω κάτι...
Εσένα σου δουλεύει;
Δεν καταλαβένω γιατί δεν δέχετε τις εντολές στον Qdata...


Δεν το έτρεξα.. διάβασα τον κώδικα μόνο :)
Άβαταρ μέλους
M.Jackson
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1053
Εγγραφή: 28 Μάιος 2010, 19:06
Εκτύπωση

Re: Calculator γραμμένο σε C

Δημοσίευσηαπό UnKnown96 » 05 Ιουν 2011, 13:46

Οπότε ο Qdata μονο την εντολή του GCC να εκτελέση και όλα καλά . :)

Edit: Έβαλα τις διορθώσεις στον κώδικα.
Άβαταρ μέλους
UnKnown96
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 370
Εγγραφή: 08 Ιουν 2010, 15:23
Τοποθεσία: Ρόδος
Εκτύπωση

Re: Calculator γραμμένο σε C

Δημοσίευσηαπό Qdata » 05 Ιουν 2011, 16:03

evolgen έγραψε:Μήπως αν δοκίμαζες και
Κώδικας: Επιλογή όλων
gcc -lm calc.c -o calc


Ναι.Έτσι το κάνει compile!
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: Calculator γραμμένο σε C

Δημοσίευσηαπό maenolis » 06 Ιουν 2011, 10:02

evolgen έγραψε:από evolgen » Χθες, 13:19

Γενικά, όταν χρησιμοποιείς μαθηματικά και το math.h, σχεδόν πάντα βάζε το "-lm". Από τη σχολή το ξέρω και νομίζω προσθέτει δυνατότητα για μαθηματικά ή κάτι τέτοιο.


Η math.h είναι η μοναδική έτοιμη βιβλιοθήκη στην c που θέλει να προσθέσουμε κάτι στην μεταγλώτιση αν θυμάμαι καλά.
1 Γνώσεις → Linux: Αρχάριος ┃ Προγραμματισμός: c,c++,sql,html,css ┃ Αγγλικά: Μέτριος
2 Λειτουργικό →Dual boot Ubuntu 12.04 64-bit (en_US.UTF-8) & Windows 7 Professional 64-bit
3 Προδιαγραφές → Intel® Core™ i3-2330M CPU @ 2.20GHz × 4 ‖ RAM 7.7 Gb
4 Κάρτες γραφικών: Intel® HD3000
5 Σκληρός Δίσκος: → OCZ Vertex4 Sata III 128Gb
Άβαταρ μέλους
maenolis
punkTUX
punkTUX
 
Δημοσιεύσεις: 261
Εγγραφή: 12 Μάιος 2011, 09:56
Τοποθεσία: Ν.Κόσμος
Εκτύπωση

Re: Calculator γραμμένο σε C

Δημοσίευσηαπό konnn » 06 Ιουν 2011, 10:06

UnKnown96 έγραψε:Εννοώ ότι ας πούμε ότι διαλέγεις την επιλογή 4 (διέρεση) και δώσεις 9/2 αντί να βγάλει 3,5 βγάζει 4...

Αυτό συμβαίνει διότι οι μεταβλητές σου είναι integer, δηλαδή ακέραιοι.
edit:9/2=4,5.
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: Calculator γραμμένο σε C

Δημοσίευσηαπό migf1 » 06 Ιουν 2011, 11:19

Καλημέρα, μόλις έτρεξα το πρόγραμμα και αμέσως εντόπισα 2 προβλήματα:
1. Αν αντί για νούμερο δώσω string, μπαίνει σε infinite loop
2. Αν διαιρέσεις με το 0, κρασάρει

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

Re: Calculator γραμμένο σε C

Δημοσίευσηαπό migf1 » 06 Ιουν 2011, 15:00

Λοιπόν έριξα μια ματιά στον κώδικά σου, και άλλαξα μερικά πράγματα, συμπεριλαμβανομένων των 2 προβλημάτων που αναφέρω στο προηγούμενο ποστ.

Συνοπτικά:

1. Άλλαξα τα x,y από int σε double ώστε το πρόγραμμα να δουλεύει και με πραγματικούς αριθμούς
2. Αντικατέστησα τα 2 goto labels s και r που είχες με ένα do-while loop (τα goto είναι καλό να αποφεύγονται τελείως)
3. Άλλαξα την επιλογή του μενού σε απλό χαρακτήρα (ήταν ακέραιος) που διαβάζεται με getchar() και προσάρμοσα ανάλογα τους ελέγχους στο switch
4. Προσέθεσα επιλογή "8. Exit" στο κυρίως μενού
5. Έβαλα έλεγχο για μηδενικό παρανομαστή στη διαίρεση και προσέθεσα στο αποτέλεσμα της πράξης και το υπόλοιπο

Άλλαξα και τα μηνύματα που βγάζει το πρόγραμμα, αλλά αυτό δεν είναι κάτι το ουσιώδες. Τον παλιό κώδικα δεν τον έχω σβήσει, τον έχω βάλει σε σχόλια που ξεκινάνε με: // ***

Ελπίζω να σου φανεί χρήσιμος:
Κώδικας: Επιλογή όλων

/* Copyright © 2011 UnKnOwN96.
A simple Command Line Calculator by UnKnOwN96.

This program is Free Software:
You can redistribute it and/or modify it under the terms of the GNU General Public License,
as published by the Free Software Foundation, either version 3 of the License, or any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY,
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details. */

#include <stdio.h>
#include <math.h>
#include <stdlib.h> // for exit()

// Main Class
int main (void)
{
// Variables
// *** int x, y, c, r; // *** Variables set: x, y, c (choice), r (restart).
double x, y;
int stop; // boolean

// *** s: (Start)
// *** s:

stop = 0; // FALSE
do
{
// Asking kind of calculation.
puts("\n\nAVAILABLE OPTIONS\n=================");
printf ("1. Addition\n2. Subtraction\n3. Multiplication\n4. Division\n5. Percentage\n6. Power\n7. Square Root\n8. Exit\n\nYour choice: ");

// **** scanf ("%d", &c);
fflush(stdin);
// Checking the answer.
switch ( getchar() )
{

// ADDITTION // *** In case the choice is No1, do:
case '1': // *** case 1:
puts("\nAddition\n--------");
printf ("1st addendum: ");
fflush(stdin);
scanf("%lf", &x); // *** scanf ("%d", &x);
printf ("2nd addendum: ");
fflush(stdin);
scanf("%lf", &y); // *** scanf ("%d", &y);
printf ("--------\nRESULT: %g\n", x + y);
break;

// SUBTRACTION // *** In case the choice is No2, do:
case '2':
puts("\nSubtraction\n-----------");
printf ("Reducer : ");
fflush(stdin);
scanf ("%lf", &x);
printf ("Subtrahend: ");
fflush(stdin);
scanf ("%lf", &y);
printf ("-----------\nRESULT: %g\n", x - y);
break;

// MULTIPLICATION // *** In case the choice is No3, do:
case '3':
puts("\nMultiplication\n--------------");
printf ("1st number: ");
fflush(stdin);
scanf ("%lf", &x);
printf ("2nd number: ");
fflush(stdin);
scanf ("%lf", &y);
printf ("--------------\nRESULT: %g\n", x * y);
break;

// DIVISION // *** In case the choice is No4, do:
case '4':
puts("\nDivision\n--------");
printf("Divident: ");
fflush(stdin);
scanf ("%lf", &x);
do { // demand non-zero value
printf ("Divisor : ");
fflush(stdin);
scanf ("%lf", &y);
}while (y == 0.0);
printf ("--------\nRESULT: %g (quotient = %d, remainder = %d)\n",
x/y, (int)x/(int)y, (int)x%(int)y );
break;

// PERCENTAGE // *** In case the choice is No5, do:
case '5':
puts("\nPercentage\n----------");
printf ("Number: ");
fflush(stdin);
scanf ("%lf", &x);
printf ("----------\nRESULT: %g\n", x / 100);
break;

// POWER // *** In case the choice is No6, do:
case '6':
puts("\nPower\n-----");
printf ("Base : ");
fflush(stdin);
scanf ("%lf", &x);
printf ("Exponent: ");
fflush(stdin);
scanf ("%lf", &y);
printf ("-----\nRESULT: %g\n", pow(x, y));
break;

// SQUARE ROOT // *** In case the choice is No7, do:
case '7':
puts("\nSquare Root\n-----------");
printf ("Number: ");
fflush(stdin);
scanf ("%lf", &x);
printf ("-----------\nRESULT: %g\n", sqrt(x));
break;

// EXIT
case '8':
stop = 1; // TRUE
break;

// In case the user is too stupid, do:
default:
printf ("Wrong answer...\n");
break;
}

// *** r: (Restart)
// *** r:

// *** Asking if another calculation is needed.
// *** if ( !stop ) {
// *** printf ("\n\nWill you make another calculation?\n1. Yes\n2. No\n\nYour choice:\n");
// *** }
// *** scanf ("%d", &r);

} while ( !stop );

// *** Checking the answer.
// *** if (r == 1) {printf ("\nRestarting...\n"); goto s;}
// *** else if (r == 2) printf ("\nPress any key to terminate the application.");
// *** else {printf ("\nWrong number given..."); goto r;}

// *** Ending up the Program.
// *** getchar();
exit(0); // *** return 0;
}
// End

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

Re: Calculator γραμμένο σε C

Δημοσίευσηαπό mangelasakis » 06 Ιουν 2011, 15:11

Γιατί αντικατέστησες το return 0; με το exit(0);??? H main είναι τύπου int οπότε νομίζω πρέπει να επιστρέφει κάτι...
Spoiler: show
Linux: 5ετής χρήση ┃ Προγραμ: μόνο C προς το παρών ┃ Αγγλικά: Μέτριος προς καλός
Desktop:
Ubuntu gnome 14.04 amd64 - Debian testing amd64
CPU: 4x AMD Phenom II X4 955 ‖ RAM 8000 MiB ‖ Gigabyte GA-MA785GT-UD3H
[Radeon HD 4200] Radeon HD 7750 ⎨1002:9710⎬
RTL8111/8168B PCI ⎨10ec:8168⎬ (rev 02)
Laptop:
Ubuntu gnome 14.04 amd64
4x Intel Core i3 M 330 2.13GHz ‖ RAM 3628 MiB ‖ Sony Corporation VPCEB1J1E
Intel VGA [8086:0046] (rev 02)
eth0: [11ab:4381] (rev 11) ⋮ wlan0: AR9285 [168c:002b] (rev 01)
mangelasakis
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1149
Εγγραφή: 10 Μαρ 2009, 06:08
Εκτύπωση

Re: Calculator γραμμένο σε C

Δημοσίευσηαπό migf1 » 06 Ιουν 2011, 15:18

mangelasakis έγραψε:Γιατί αντικατέστησες το return 0; με το exit(0);??? H main είναι τύπου int οπότε νομίζω πρέπει να επιστρέφει κάτι...

Το ANSI στάνταρ επιβάλλει να χρησιμοποιείς exit(0) στην main() και όχι return, γιατί η exit() κάνει και cleanup (π.χ. κλείνει τυχόν ανοιχτά αρχεία).

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

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

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

cron