# Berechnung der einzelnen Zifferm einer beliebigen Zahl!



## Martin098 (19. März 2014)

Hallo Leute,
Ich bin gerade am verzweifeln. Ich versuche ein Programm zu schreiben, dass die einzelnen Ziffern einer beliebig großen Zahl berechnet. zB.: 12-stellige Zahl, Berechnung der Ziffer 1,3,5,7,9,11. Ich weiß zwar, dass ich irgendwie mit dem Modulo Operator rechnen und einer "while" Schleife arbeiten muss aber ich schaffe es nicht dieses Wissen in einen Algorithmus zu verwandeln. Dieses Programm sollte in c (Visual Studio 2013) geschrieben werden! Es wäre sehr nett, wenn mir jemand helfen könnte!


----------



## Nico Graichen (19. März 2014)

Hi Martin098

Herzlich willkommen auf Tutorials.de!

Ich weiß nicht, wie es anderen geht, aber ich versteh ehrlich gesagt deine Frage nicht bzw. was du vor hast.
Kannst du dein Vorhaben bitte nochmal in anderen Worten beschreiben? Danke

PS: 11 ist keine Ziffer


----------



## sheel (19. März 2014)

Hi

was ist eine "beliebig große" Zahl?
int-Variablen und Ähnliches sind nicht beliebig groß.
Woher kommt die Zahl bzw. in welcher Form/Art/Variable liegt sie vor?
(oder gibts da nichts vorgegeben)


----------



## Martin098 (19. März 2014)

Ok noch einmal. Also @nico graichen , ich will ein Programm schreiben, in dem ein Benutzer eine Zahl eingibt zb.:401234678978 (12-stellig) und davon will ich mir die 1,3,5,7,9,11 Stelle der Zahl berechnen. Ist es jetzt verständlich was ich meine?
@sheel eine 1,....11,12,13...-stellige Zahl.


----------



## sheel (19. März 2014)

Also, ich vermute, es gibt kein speziellen Vorgaben,
welche Variablenarten etc. zu verwenden sind.

Vorchlag: Die Eingabe nicht in ein int etc. zu machen,
sondern in einen String (mit einer Ziffer als "Buchstabe" pro Stelle).
Dann braucht man auch kein Modulo, sondern kann in einer Schleife
alle ungeraden Stellen durchgehen.

Zusätzlich wäre es evt. gut, am Anfang noch zu überprüfen,
ob wirklich eine Zahl eingegeben wurde, also ob alle Buchstaben
im String Ziffern zwischen 0 und 9 sind (>='0' && <='9')


```
std::string eingabe;
size_t i; //sowas wie ein int

//einlesen
std::getline (std::cin, eingabe);

//jede zweite Stelle ausgeben
for(i = 0; i < eingabe.length(); i += 2)
{
    std::cout << eingabe[i];
}
```
Vor der Ausgabe sollte noch das überprüfen rein, das überlass ich vorerst dir


----------



## Martin098 (19. März 2014)

Danke aber ich programmiere c in Visual Studio und habe keinen Plan was "cout" "std::getline (std::cin, eingabe);" "size_t i;" bedeuted :/


----------



## Cromon (20. März 2014)

Hallo Martin098

In C: Eingabe zum Beispiel mit scanf, Ausgabe mit printf. size_t i; deklariert und definiert eine Variable mit dem Namen i vom Typ size_t. Solltest du nicht wissen was das bedeutet -> Nochmals Grundlagen durchlesen.

Viele Grüsse
Cromon


----------



## Martin098 (20. März 2014)

Könnte mir jemand vielleicht den oben abgebildeten code in C umwandeln bzw.  kann ich was anderes als "size_t" nehmen, da ich noch nicht gelernt habe was das ist?


----------



## sheel (20. März 2014)

Was glaubst du, warum "sowas wie ein int" dabeisteht 
Ist zwar nicht wirklich richtig, aber die Computer und Datenmengen,
für die du dein Programm einsetzt, wird es funktionieren...
und bei Schulaufgaben etc. sollte es in den Lernstadium auch für den Lehrer kein Problem sein
(falls der überhaupt den Unterschied kennt. Ist leider nicht selbstverständlich).


----------



## Martin098 (20. März 2014)

Ja ok, aber könnte vielleicht jemand diesen Code in C umschreiben der oben angeführte Code ist für mich wie spanisch ...


----------



## Cromon (20. März 2014)

Hallo Martin098

Nein, ich denke das wird niemand machen. Ziel dieses Forums ist es nicht einfach Code für andere zu machen, wenn dann sollst du etwas lernen. Die wichtigen Punkte:
Ausgabe:
C++ -> std::cout, C -> printf
Eintage:
C++ -> std::cin, C -> scanf (z.B.)
Strings:
C++ -> std::string, C -> (const) char*

Nun kannst du mal versuchen bisschen damit zu werkeln, deinen Code zeigen, wo du nicht weiter kommst usw und dann kann man dir helfen.

Viele Grüsse
Cromon


----------



## Martin098 (22. März 2014)

```
//Header-Dateien
#include <stdio.h>
#include <stdlib.h>

//Funktionen
int ean_code(int zahl[]);

//Hauptprogramm
int main(void){
	//Variablendeklaration
	int zahl[11];
	int i = 0;
	
	//printf("Dieses Programm berechnet die Pruefziffer des Ean-Codes\n");
	printf("EAN-Code (12-Stellen): ");
	scanf("%d", &zahl);

	printf("\n");
	ean_code(zahl);
	
	//wert = ean_code(ean);

	return EXIT_SUCCESS;
}

int ean_code(int zahl[]){
	//Variablen
	int i = 0;

	//jede zweite Stelle ausgeben
	for (i = 0; i <= zahl[11]; i += 2){
		printf("%d", zahl[i]);
	}
	printf("\n");
	return EXIT_SUCCESS;
}
```

So ich habe das Programm so umgeformt wie oben angeführt jedoch gibt das Programm Garnichts aus Ps: Dies ist nur eine Teilberechnung


----------



## Hunter (22. März 2014)

Ein Problem: 
 - _int_-Zahlenbereich:  -2147483648 bis 2147483647 (wenn 4 Bytes) 
_int_ ist also maximal 10-Stellig

Mit _float_ könntest Du dein Programm realisieren.


----------



## sheel (22. März 2014)

?
Auch float hilft überhaupt nicht.

@Martin: Du brauchst nicht 11 int, sondern 13 char.
Dazu kein %d, sondern %s und weg mit dem & weil Array
(oder noch viel besser: mit fgets einlesen)

Und "i <= zahl[11]" kann nicht funktionieren.
Soll das nicht eher "i < 11" sein?
Und noch besser (bzw. das einzig Richtige): strlen.

PS: Die Korrektheit vom Ean-Code berechnet man anders.


----------



## Martin098 (22. März 2014)

```
//Header-Dateien
#include <stdio.h>
#include <stdlib.h>

//Funktionen
int ean_code(char zahl[]);

//Hauptprogramm
int main(void){
	//Variablendeklaration
	char zahl[13];
	int i = 0;
	
	//printf("Dieses Programm berechnet die Pruefziffer des Ean-Codes\n");
	printf("EAN-Code (12-Stellen): ");
	gets(zahl);

	printf("\n");
	
	//wert = ean_code(ean);

	return EXIT_SUCCESS;
}

int ean_code(char zahl[]){
	//Variablen
	int i = 0;

	//jede zweite Stelle ausgeben
	for (i = 0; i <= 11; i += 2){
		printf("%s", zahl[i]);
	}
	printf("\n");
	return EXIT_SUCCESS;
}
```

Wie und wo soll ich strlen einsetzen --> ich weiß das strlen die Länge einer Zeichenkette OHNE das '\0' Endezeichen bestimmt.
PS: Ich will mir die Prüfziffer des EAN-Codes berechnen und da ist dies nur eine Teilberechnung:
Die Prüfziffer errechnet sich wie folgt aus den ersten 12 Stellen:

 Summe1: Die Summe aus der 1., 3., 5., 7., 9. und 11. Ziffer
 Summe2: Die Summe aus der 2., 4., 6., 8., 10. und 12. Ziffer.
 Die Summe2 wird mit 3 multipliziert und zur Summe1 addiert.
 Die Prüfziffer ergibt sich aus der Differenz dieser Summe zur nächsten durch 10 teilbaren Zahl.
Beispiel:
 Summe1: 4 + 1 + 7 + 0 + 6 + 1 = 19
 Summe2 0 + 2 + 0 + 9 + 3 + 0 = 14 * 3 = 42
 Gesamtsumme: 61
 Differenz zu 70 = 9
 9 ist die Prüfziffer


----------



## sheel (22. März 2014)

Main schaut schon fast gut aus, bis auf das gets.
gets existiert nicht mehr, fgets verwenden.

In der Funktion:
Einserseits kein %s beim Ausgeben (sondern %c weil es einzelne Buchstaben sind).
Und das mit dem strlen war so gemeint, dass du ja gar nicht weißt,
ob der Benutzer die 12 Nicht-Prüf-Stellen auch alle eingegeben hat.
Wenn er nur drei Stellen eingibt, was macht dann deine Schleife?

(und wenn er keine Ziffern eingibt...für die Ausgabe kein Problem, aber für die Berechnung später.
Gehört auch noch geprüft: Schleife, ob jedes Ding bis zum Eingabenende >='0' und <='9' ist).


----------



## Martin098 (23. März 2014)

```
#include <stdlib.h>
#include <string.h>

//Funktionen
int ean_code(char zahl[]);

//Hauptprogramm
int main(void){
	//Variablendeklaration
	char zahl[13];
	int i = 0;
	
	//printf("Dieses Programm berechnet die Pruefziffer des Ean-Codes\n");

	printf("EAN-Code (12-Stellen): ");
	gets(zahl);
	printf("\n");
	
	//wert = ean_code(ean);

	return EXIT_SUCCESS;
}

int ean_code(char zahl[]){
	//Variablen
	int i = 0;
	strlen(zahl);
	while (*zahl >= '0' && *zahl <= '9'){
		//jede zweite Stelle ausgeben
		for (i = 0; i <= strlen(zahl); i += 2){
			printf("%c", zahl[i]);
		}
	}
	printf("\n");
	return EXIT_SUCCESS;
}
```

Bei mir geht aber komischerweise nur gets und nicht fgets, Ich hab den Code mal so umgeändert aber irgendwie mach ich da was falsches..


----------



## sheel (23. März 2014)

fgets geht ganz sicher.
Wenn es ein Problem gibt, das sich nach Lesen der Funktionsbeschreibung nicht Lösen lässt,
bitte sagen, was das Problem ist.

Und die Funktion... was denkst du, was das macht?


----------



## Martin098 (23. März 2014)

Wenn ich fgets schreibe kommt immer eine Fehlermeldung 'Zu wenig Argumente im Funktionsaufruf'.
Ich kapier irgendwie nicht wie ich jetzt die ungeraden und geraden Ziffern bekomme ich gehe vom Anfang des Arrays durch bis zum Ende des Arrays und dabei gibt die Schleife immer die zweite Stelle aus, jedoch bei mir gibt sie Garnichts aus...

```
for (i >=strlen(zahl); i <= strlen(zahl); i =i+ 2){
       printf("%c",zahl[i]);
}
```


----------



## sheel (23. März 2014)

> ...Wenn es ein Problem gibt, das sich* nach Lesen
> der Funktionsbeschreibung* nicht Lösen lässt...


http://www.cplusplus.com/reference/cstdio/fgets/

Wenn ich dir das jetzt fertig hinschreibe bist du nicht weiter als am Anfang.
Ziel ist, das du am Ende dieses Threads in der Lage bist,
die Aufgabe ggf. wieder zu lösen, aber dann allein.

Zur Funktion: Es wird dir wahrscheinlich helfen,
einmal auf Deutsch detailliert hinzuschreiben,
as die Funktion machen soll.
Also Details zu Überprüfung, ggf. Fehler(meldung),
summieren/multiplizieren und returnen (dann ausgeben) vom Ergebnis

Jedenfalls garantiere ich dir, nie fertig zu werden, wenn du vorhandene Codeteile neu ordnest
und/oder Sachen nur machst, um Compilerfehler wegzubekommen.
(das ist nämlich irgendwas in NP. Für sehr großen Input.
Schaffen=>Nobel/Turing/Field-Preis oder so)


----------

