132 lines
3.6 KiB
C
132 lines
3.6 KiB
C
/*
|
|
* Im folgenden Programm soll eine Eingabe nur bestehend aus Zahlen als String eingelesen werden. Die einzelnen Zahlen sollen extrahiert, konvertiert
|
|
* und deren Summe ausgegeben werden.
|
|
*
|
|
* 1. Ergänzen Sie in den vorhandenen Funktionen zunächst das Schlüsselwort const bei geeigneten Parametern.
|
|
* 2. Implementieren Sie nun die Funktion konvertiereZahlen, die einen String übergeben bekommt, die enthaltenen Zahlen nach int konvertiert und in einem
|
|
* int-Array speichert. Der String soll nicht verändert werden. Die Funktion soll die Anzahl an extrahierten Zahlen zurückgeben oder 0, falls Wörter enthalten
|
|
* sind, die keine Zahlen sind. Sehen Sie sich für die genauen Anforderung an die Funktion auch unten deren Verwendung in der main-Funktion an. Vergessen Sie
|
|
* nicht, Parameter mit dem Schlüsselwort const zu markieren, wenn es Sinn ergibt.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#define PUFFER_GROESSE 100
|
|
|
|
|
|
char *gibTextEin(const char *ausgabeText, char *puffer, unsigned int groesse);
|
|
void gibSummeAus(const unsigned int zahlen[], unsigned int anzahl);
|
|
unsigned int konvertiereZahlen(const char *text, unsigned int zahlen[], unsigned int maxZahlen);
|
|
|
|
int main()
|
|
{
|
|
char eingabe[PUFFER_GROESSE];
|
|
unsigned int zahlen[PUFFER_GROESSE];
|
|
unsigned int vorhandeneZahlen = 0;
|
|
|
|
gibTextEin("Geben Sie Zahlen ein: ", eingabe, PUFFER_GROESSE);
|
|
|
|
vorhandeneZahlen = konvertiereZahlen(eingabe, zahlen, PUFFER_GROESSE);
|
|
|
|
gibSummeAus(zahlen, vorhandeneZahlen);
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
char *gibTextEin(const char *ausgabeText, char *puffer, unsigned int groesse)
|
|
{
|
|
printf("%s", ausgabeText);
|
|
fgets(puffer, groesse, stdin);
|
|
|
|
if(puffer[strlen(puffer)-1] == '\n')
|
|
puffer[strlen(puffer)-1] = '\0';
|
|
else
|
|
while(getchar() != '\n') {}
|
|
|
|
return puffer;
|
|
}
|
|
|
|
// 1. Variante mit strtok (zahl steht separat) und a) sscanf oder b) stroul
|
|
// unsigned int konvertiereZahlen(const char *text, unsigned int zahlen[], unsigned int maxZahlen)
|
|
// {
|
|
// unsigned int anzahl = 0;
|
|
// char *kopie = malloc((strlen(text)+1) * sizeof(char));
|
|
|
|
// if(kopie != NULL)
|
|
// {
|
|
// const char *trenner = " \t;,.:\n";
|
|
// char *token;
|
|
|
|
// strcpy(kopie, text);
|
|
|
|
// token = strtok(kopie, trenner);
|
|
|
|
// while(token != NULL && anzahl < maxZahlen)
|
|
// {
|
|
// //if(sscanf(token, "%u", &zahlen[anzahl]) == 1)
|
|
// // anzahl++;
|
|
// char *endZgr;
|
|
|
|
// zahlen[anzahl] = strtoul(token, &endZgr, 10);
|
|
|
|
// if(token != endZgr)
|
|
// anzahl++;
|
|
|
|
// token = strtok(NULL, trenner);
|
|
// }
|
|
|
|
// }
|
|
|
|
// free(kopie);
|
|
|
|
// return anzahl;
|
|
// }
|
|
|
|
// 2. Variante direkt mit strtoul (Zahl ist nahtlos in String integriert)
|
|
unsigned int konvertiereZahlen(const char *text, unsigned int zahlen[], unsigned int maxZahlen)
|
|
{
|
|
unsigned int anzahl = 0;
|
|
const char *anfangsZgr = text;
|
|
char *endZgr;
|
|
|
|
while(anzahl < maxZahlen && *anfangsZgr != '\0')
|
|
{
|
|
zahlen[anzahl] = strtoul(anfangsZgr, &endZgr, 10);
|
|
|
|
if(endZgr != anfangsZgr)
|
|
{
|
|
anfangsZgr = endZgr;
|
|
anzahl++;
|
|
}
|
|
else
|
|
{
|
|
anfangsZgr++;
|
|
}
|
|
}
|
|
|
|
return anzahl;
|
|
}
|
|
|
|
void gibSummeAus(const unsigned int zahlen[], unsigned int anzahl)
|
|
{
|
|
int summe = 0;
|
|
|
|
if(anzahl > 0)
|
|
{
|
|
printf("%d", zahlen[0]);
|
|
summe = zahlen[0];
|
|
}
|
|
|
|
for(int i = 1; i < anzahl; i++)
|
|
{
|
|
printf(" + %d", zahlen[i]);
|
|
summe += zahlen[i];
|
|
}
|
|
|
|
if(anzahl > 0)
|
|
printf(" = %d\n", summe);
|
|
else
|
|
printf("%s", "Keine Werte vorhanden!\n");
|
|
} |