Πρόγραμμα διάσπασης των ψηφίων ενός αριθμού στην C  Το θέμα επιλύθηκε

...ασύγχρονα μαθήματα γλώσσας C

Πρόγραμμα διάσπασης των ψηφίων ενός αριθμού στην C

Δημοσίευσηαπό adem1 » 29 Νοέμ 2011, 22:27

Καλησπέρα σας.
Έχει κανείς να μου προτείνει έναν τρόπο για να χωρίζω έναν αριθμό τα ψηφία του δηλαδή, στην C και μετά να κάνω πράξεις με αυτούς;
Δηλαδή, έστω ότι έχω το 123 να το κάνω 1 2 3
Κανείς;
Τελευταία επεξεργασία από linuxs και 22 Φεβ 2012, 07:10, έχει επεξεργασθεί 1 φορά/ες συνολικά
Αιτία: Διόρθωση τίτλου
Pc1
3 Intel Core i5-3317U CPU @ 1.70GHz ‖ RAM 5856 MiB ‖ ASUS S56CA
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 0a)
Pc 2
3 Intel Core2 CPU E8400 3.00GHz ‖ RAM 3962 MiB ‖ FOXCONN P45A01
4 ATI RV730XT [Radeon HD 4670] [1002:9490]
5 eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 01)
Άβαταρ μέλους
adem1
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 733
Εγγραφή: 27 Οκτ 2011, 20:17
IRC: adem1
Εκτύπωση

Re: C άσκηση.

Δημοσίευσηαπό clepto » 29 Νοέμ 2011, 22:34

άλλοι θα σου πουν με loop και καθένα χαρακτήρα ξεχωριστά, εγώ θα σου πω με την split() , την έχω χρησιμοποιήσει σε java
ψάξε την λίγο
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 άσκηση.

Δημοσίευσηαπό adem1 » 29 Νοέμ 2011, 22:41

Η split ''σπάει'' αρχεία σωστά; Αλλά το θέμα είναι ότι θα παίρνω τυχαίους αριθμούς από rand και srand, γεννήτρια θα είναι η time. Οπότε αν κάνει αυτό η split τότε δεν μου κάνει.
Pc1
3 Intel Core i5-3317U CPU @ 1.70GHz ‖ RAM 5856 MiB ‖ ASUS S56CA
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 0a)
Pc 2
3 Intel Core2 CPU E8400 3.00GHz ‖ RAM 3962 MiB ‖ FOXCONN P45A01
4 ATI RV730XT [Radeon HD 4670] [1002:9490]
5 eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 01)
Άβαταρ μέλους
adem1
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 733
Εγγραφή: 27 Οκτ 2011, 20:17
IRC: adem1
Εκτύπωση

Re: C άσκηση.

Δημοσίευσηαπό clepto » 29 Νοέμ 2011, 23:09

δεν σπάει μόνο αρχείο...σπάει και string http://www.dotnetperls.com/string-split
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 άσκηση.

Δημοσίευσηαπό pc_magas » 30 Νοέμ 2011, 00:27

Ένας 3 ψήφιος αριθμός είναι πχ το 123 μπορεί να γραφεί ως: 123=1*10^2+2*10^1+3*10^0 έτσι βάση αυτού
Έτσι έχουμε τον αλγόριθμο σε μορφή ΨΕΥΔΟΚΩΔΙΚΑ:
πχ
Κώδικας: Επιλογή όλων

int digits=3 //πλήθος ψηφίων
int n=digits-1 //μέγιστη τεκθέτη βάσης
int number=123//αριθμός για είσοσο
int result[digits]//Πίνακας για να αποθηκεύουμε τα ψηφία όπου έχουμε "σπάσει"
int i=0;
do
{
result[i]=number/10^n //σπαμε
number=number-result[i]*10^n // τοφαιρούμε από το αρχικό αριθμό
n-- //μειώνουμε τον εκθέτη
i++ //πάμε στην επόμενη θέση του πίνακα
}
while(n!=0)
My blog|Κυπριακή Κοινότητα Ελευθέρου Λογισμικού Λογισμικού ανοικτού Κώδικα
Γνώσεις Linux:Ποτέ αρκετές|Προγραμματισμός: Php, javascript, nodejs, python, bash |Aγγλικά:Καλά
Οι υπολογιστές μου:
Spoiler: show
Ubuntu 16.04 64 bit σεIntel(R) Pentium(R) CPU G4400 @ 3.30GHz, 16Gib Ram, 500Gib Hard Disk, και κάρτα γραφικών Nvidia Geforce GT610
Lubuntu 14.04 σε Dell Inspiron mini 10(1010) intel Atom Z500 1Gb ram και gma500 (εδώθη σε άλλον)
Kubuntu 16.04 Lenovo G70 Intel i5 Nvidia Grapgics Card, Intel Graphics card (έχει 2) με Nouveau, 16Gb RAM, 126GB SSD Σκληρό Δίσκο
Άβαταρ μέλους
pc_magas
powerTUX
powerTUX
 
Δημοσιεύσεις: 2599
Εγγραφή: 12 Απρ 2009, 18:55
Τοποθεσία: Αχαρναί Αττικής
Launchpad: pc_magas
IRC: pc_magas
Εκτύπωση

Re: C άσκηση.  Το θέμα επιλύθηκε

Δημοσίευσηαπό migf1 » 01 Δεκ 2011, 13:29

Δυστυχώς η split() δεν υπάρχει στη στάνταρ C.

Ένας τρόπος είναι αυτός που σου πρότεινε ο pc-magas, ένας άλλος είναι να χρησιμοποιήσεις τις πράξεις / και %. Και στις 2 περιπτώσεις τα ψηφία του αρχικού αριθμού παράγονται αντεστραμμένα, για αυτό και η χρήση πίνακα για την αποθήκευσή τους, τον οποίο κατόπιν είτε πρέπει να τον αντιστρέψεις είτε να τον διατρέξεις ανάποδα.

Σου δίνω κώδικα για τη 2η περίπτωση, τον οποίον τον έχω επίτηδες συμπυκνωμένο για να κάνεις κι εσύ κάτι :P (να τον φέρεις στα μέτρα σου).

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

#include <stdio.h>

#define MAXDIGITS 25+1
int main( void )
{
int digits[ MAXDIGITS ] = {0}, num, i;

scanf( "%d", &num );
for (i=0; (digits[i] = num % 10) != 0; i++ )
num /= 10;

while ( --i > -1 )
printf( "%d ", digits[i] );

return 0;
}


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

Re: C άσκηση.

Δημοσίευσηαπό pc_magas » 01 Δεκ 2011, 15:58

@migf1
Νομίζω ο δικός σου τρόπος είναι ποιο γρήγορος
My blog|Κυπριακή Κοινότητα Ελευθέρου Λογισμικού Λογισμικού ανοικτού Κώδικα
Γνώσεις Linux:Ποτέ αρκετές|Προγραμματισμός: Php, javascript, nodejs, python, bash |Aγγλικά:Καλά
Οι υπολογιστές μου:
Spoiler: show
Ubuntu 16.04 64 bit σεIntel(R) Pentium(R) CPU G4400 @ 3.30GHz, 16Gib Ram, 500Gib Hard Disk, και κάρτα γραφικών Nvidia Geforce GT610
Lubuntu 14.04 σε Dell Inspiron mini 10(1010) intel Atom Z500 1Gb ram και gma500 (εδώθη σε άλλον)
Kubuntu 16.04 Lenovo G70 Intel i5 Nvidia Grapgics Card, Intel Graphics card (έχει 2) με Nouveau, 16Gb RAM, 126GB SSD Σκληρό Δίσκο
Άβαταρ μέλους
pc_magas
powerTUX
powerTUX
 
Δημοσιεύσεις: 2599
Εγγραφή: 12 Απρ 2009, 18:55
Τοποθεσία: Αχαρναί Αττικής
Launchpad: pc_magas
IRC: pc_magas
Εκτύπωση

Re: C άσκηση.

Δημοσίευσηαπό M.Jackson » 03 Δεκ 2011, 23:01

Απλά μαθηματικά
εκατοντάδες = num div 100 -- στην C μεταφραζεται num / 100
δεκάδες = (num mod 100) div 10 -- στην C μεταφραζεται (num % 100) / 10
μονάδες = num mod 10 -- στην C μεταφραζεται num % 10

232 div 100 = 2
(232 mod 100) = 32 => 32 div 10 = 3
232 mod 10 = 2

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

Re: C άσκηση.

Δημοσίευσηαπό maenolis » 04 Δεκ 2011, 01:43

Κάτι ενδιαφέρον που είδα γι αυτό το θέμα είναι αυτό
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

int main(){
int sum,k=0,number1=0,number=123456;
number1=number;
for(;number1!=0;k=number1%10,sum+=k,number1/=10);
printf("\na8roisma twn psifiwn tou %d=%d\n",number,sum);
getchar();
return 0;
}


Για μένα το θεωρώ ωραίο ναι μεν , αφαιρετικό αλλά μετά απο καιρό θα το δεις και δεν θα καταλάβεις τι έγραψες...Πήγε περίπατο η αναγνωσιμότητα!!Πάντως πραγματικά υπάρχουν πάρα πολλοί τρόποι για να το αντιμετωπίσει κανείς αυτό το θέμα.
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: C άσκηση.

Δημοσίευσηαπό migf1 » 04 Δεκ 2011, 02:11

maenolis έγραψε:Κάτι ενδιαφέρον που είδα γι αυτό το θέμα είναι αυτό
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

int main(){
int sum,k=0,number1=0,number=123456;
number1=number;
for(;number1!=0;k=number1%10,sum+=k,number1/=10);
printf("\na8roisma twn psifiwn tou %d=%d\n",number,sum);
getchar();
return 0;
}


Για μένα το θεωρώ ωραίο ναι μεν , αφαιρετικό αλλά μετά απο καιρό θα το δεις και δεν θα καταλάβεις τι έγραψες...Πήγε περίπατο η αναγνωσιμότητα!!Πάντως πραγματικά υπάρχουν πάρα πολλοί τρόποι για να το αντιμετωπίσει κανείς αυτό το θέμα.

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

Επόμενο

Επιστροφή στο Μαθήματα C

cron