C :: Aufgabe #2 :: Lösung #2

2 Lösungen Lösungen öffentlich
#2

Zahlenfolge berechnen und fortsetzen

Anfänger - C von pocki - 24.11.2012 um 19:50 Uhr
Es soll eine Zahlenfolge wiefolgt berechnet werden:
Die nacheinander folgenden gleichen Zahlen werden gezählt und zusammen mit der Zahl ausgegeben.
Aus der neu berechneten Zahlenfolge errechnet sich die nächste.

Beispiel:
1. Folge: 112
2. Folge: 2112 (2 Einser und 1 Zweier)
3. Folge: 122112 (1 Zweier, 2 Einser, und 1 Zweier)
usw.

Es soll nun mit dieser ersten Folge startend die 15. Folge berechnet und ausgegeben werden.
Wenn mehrstellige Zahlen vorkommen sind diese gleich auszugeben. Bsp: 12 Einser = 121
#2
1x
vote_ok
von mraimbot (590 Punkte) - 07.01.2019 um 00:38 Uhr
Quellcode ausblenden C-Code
///////////////////////////////////////////////////////////
//! @file Aufgabe-0002.c
//! @date 06.01.2019
//! @author Sebastian Schröder
//! @details
//! Compiler    : gcc 5.1.0
//! C-FLAGS     : -pipe -std=c99 -Wall -Wextra -pedantic -Werror -D_DEFAULT_SOURCE -O0 -g
//! Testumgebung: Windows 10 - Windows PowerShell
//!
//! Aufgabe: Zahlenfolge berechnen und fortsetzen
//! Es soll eine Zahlenfolge wiefolgt berechnet werden:
//! Die nacheinander folgenden gleichen Zahlen werden gezählt und zusammen mit der Zahl ausgegeben.
//! Aus der neu berechneten Zahlenfolge errechnet sich die nächste.
//!
//! Beispiel:
//! 1. Folge: 112
//! 2. Folge: 2112 (2 Einser und 1 Zweier)
//! 3. Folge: 122112 (1 Zweier, 2 Einser, und 1 Zweier)
//! usw.
//!
//! Es soll nun mit dieser ersten Folge startend die 15. Folge berechnet und ausgegeben werden.
//! Wenn mehrstellige Zahlen vorkommen sind diese gleich auszugeben. Bsp: 12 Einser = 121
///////////////////////////////////////////////////////////


#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>


int getNumber();
char *getStartSequence();
char *getNextSequence(char *sequence, bool toFree);
bool checkSequence(const char *sequence);
char *strdup(const char *source);


int main(int argc, char **argv) {
	int check = 0;
	int times = 0;
	char *sequence = NULL;

	if (2 <= argc) {
		check = sscanf(argv[1], "%i", ×);
		
		if (0 == check) {
			printf("Argument 1 (%s) fuer die Laenge der Folge ist ungueltig. Die Laenge muss eine Ganzzahl sein.\n", argv[1]);
		}

		if (3 <= argc) {
			sequence = (char*) strdup(argv[2]);

			if (NULL == sequence) {
				perror("Fehler bei strdup");
				return EXIT_FAILURE;
			}

			if (false == checkSequence(sequence)) {
				printf("Argument 2 (%s) fuer die Startfolge ist ungueltig. Die Startfolge darf nur Ziffern enthalten.\n", argv[2]);
				sequence = NULL;
			}
		}
	}

	if (0 == times) {
		times = getNumber();
	}

	if (NULL == sequence) {
		sequence = getStartSequence();
	}

	printf("--- START ---\n");
	printf("%4i: %s\n", 0, sequence);

	for (int i = 1; i < times; ++i) {
		sequence = getNextSequence(sequence, true);

		if (NULL == sequence) {
			perror("Fehler bei getNextSequence");
			exit (EXIT_FAILURE);
		}

		printf("%4i: %s\n", i, sequence);
	}

	free(sequence);

	return EXIT_SUCCESS;
}


int getNumber() {
	int times = 0;
	int check = 0;
	char ch;

	do {
		printf("Wie oft soll der Algorithmus auf die Folge angewendet werden?: ");
		check = scanf("%i", ×);

		while ((ch = getchar()) != '\n' && ch != EOF);

		if (1 != check) {
			printf("Eingabe ungueltig. Eingabe muss eine Ganzzahl sein.\n");
		}

		if (0 > times) {
			printf("Eingabe ungueltig. Eingabe muss positiv sein.\n");
			check = 0;
		}
	} while (check != 1);
	
	return times;
}


char *getStartSequence() {
	bool check = false;
	char sequence[256];

	do {
		printf("Startfolge eingeben: ");
		scanf("%255s", sequence);

		check = checkSequence(sequence);

		if (false == check) {
			printf("Eingabe ungueltig. Eingabe darf nur Ziffern enthalten.\n");
		}
	} while (false == check);	

	return (char*) strdup(sequence);
}


char *getNextSequence(char *sequence, bool toFree) {
	int strLength = 0;
	int tmpLength = 0;
	int counter = 0;
	char ch[2];
	char strCounter[9] = { 0 };
	char *newSequence = NULL;

	if (NULL == sequence) {
		return NULL;
	}

	strLength = strlen(sequence);
	tmpLength = strLength * 2 + 1;
	counter = 1;
	ch[0] = sequence[0];
	ch[1] = '\0';
	strCounter[0] = '\0';
	newSequence = (char*) calloc(tmpLength, sizeof(*newSequence));

	if (NULL == newSequence) {
		perror ("Fehler bei calloc");
		exit (EXIT_FAILURE);
	}
	
	for (int i = 1; i < strLength + 1; ++i) {
		if (i < strLength && sequence[i] == ch[0]) {
			counter++;
			continue;
		}

		sprintf(strCounter, "%i", counter);
		strcat(newSequence, strCounter);
		strcat(newSequence, ch);

		counter = 1;
		ch[0] = sequence[i];
	}

	newSequence = realloc(newSequence, strlen(newSequence) + 1);

	if (true == toFree) {
		free(sequence);
	}

	return newSequence;
}


bool checkSequence(const char *sequence) {
	int strLength = 0;

	if (NULL == sequence) {
		return false;
	}

	strLength = strlen(sequence);

	for (int i = 0; i < strLength; ++i) {
		if (sequence[i] < 48 || sequence[i] > 57) {
			return false;
		}
	}

	return true;
}


char *strdup(const char *source) {
	char *destination;
	
	destination = malloc(strlen(source) + 1);

	if (NULL == destination) {
		perror("malloc failed");
	}

	strcpy(destination, source);

	return destination;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben