All pastes #710278 Raw Edit

Vermischtes

public cpp v1 · immutable
#710278 ·published 2007-09-25 12:18 UTC
rendered paste body
]/* Programm läuft leider nur mit Eingabedaten von maximal 2500 Zeichen proZeile, bzw je nachdem wie gross die ZEILENLAENGE definiert wird */#include <stdio.h>#include <stdlib.h>#include <string.h>#define ZEILENLAENGE 2500char* pToken;int laenge, breite,i,j,fillcount;int ** matrix;char puffer[ZEILENLAENGE];/* Diese Funktion liest die Anzahl der Zahlen pro Zeile ein und prüft ob es es sich bei der Eingabe wirklich nur um Zahlen handelt.Benötigt wird diese Funktion um die grösse des dynamischen Arrayszu ermitteln */int zahlen_zaehlen(){	int z=1;	int test=-1;	size_t size;	pToken = strtok(puffer, ",\n");	while(pToken != NULL)	{		size = strlen(pToken);		test = (int)strspn(pToken, "0123456789\n");		if ( (unsigned int)test >= size )		{			z++;		}		else		{			/* Wird ein falsches Eingabeformat entdeckt wird -2			** zurück gegeben und anschliessend als Abbruch-			** kriterium verwendet. */			return -2;  		}				pToken = strtok(NULL, ",\n");	}	return z;}/* Hier wird der Speicher für das Array reserviert in dem später die Container sortiert werden */void speicher_reservieren(int groesse){	laenge = groesse;	breite = groesse;	matrix = (int **)malloc(laenge*sizeof(int*)); 	if( NULL == matrix )	{		printf( "Konnte keinen Speicher reservieren, ..\n" );		exit( EXIT_FAILURE ); 	}	for (i =0; i< laenge;i++)           	{		matrix[i] = (int*)malloc( breite*sizeof(int) );  		if( NULL == matrix[i] )		{			printf( "Konnte keinen Speicher reservieren, ..\n" );			exit( EXIT_FAILURE ); 		}	}} /* Diese Funktion füllt das angelegte Array mit -1, was den Status leer darstellen soll */void array_fuellen_leer(int **array){	for (i = 0; i < breite; i++)	{		for (j = 0; j < laenge; j++)		{			array[j][i] = -1;  		}	}}/* In dieser Funktion werden die Container im Array sortiert, vorher wird jeder String in ein int umgewandelt (Zahlen). Die Funktion geht das Array solange durch bis eine passende Position für den aktuellen Container gefunden wurde. Ist die aktuelle Container Nummer höher als die des aktuell geprüften Containers, wird zum nächsten Stapel gesprungen. Sobald eine passende Position für den Container gefunden wurde, wird die Funktion abgebrochen und der nächste Container eingelesen. Zusätzlich wird fillcount(Stapelzähler) erhöht falls der Container einen neuen Stapel eröffnet hat  */void array_fuellen_zahlen(int **array){	int Zahl;	Zahl=atoi(pToken);	for (i = 0; i < breite; i++)	{		for (j = 0; j < laenge; j++)		{			if (array[j][i] == -1)			{				array[j][i] = Zahl;								if (j == 0)				{					fillcount++;				}								i = breite;				j = laenge;				break; /* teambeta: break unnötig, da variablen i und j mit limit gefüllt */			}			if (array[j][i] < Zahl)			{				i++;				j = -1;			}		} /* for (j = 0; j < laenge; j++) */	} /* for (i = 0; i < breite; i++) */}/* Diese Funktion gibt einfach das Array in optimierter Ausgabeform aus */void ausgabe( void ){	printf("%d",fillcount);	for (i = 0; i < breite; i++)	{		printf( " " );		for (j = 0; j < laenge; j++)		{			if (matrix[j][i] != -1)			{				printf("%d",matrix[j][i]);								if ((j-laenge) <= 0)				{					if (matrix[j+1][i] != -1)					{						printf(",");					}					if ( (i-breite) <= 0 )					{				        if ( (matrix[0][i+1] == -1) && (matrix[j+1][i]==-1) )						{				          i=breite-1;						}					}				} /* if ((j-laenge) <= 0) */			} /* if (matrix[j][i] != -1) */		} /* for (j = 0; j < laenge; j++) */	} /* for (i = 0; i < breite; i++) */}int main(int argc, char **argv) {	FILE *fDatei;	int iCnt = 0;		int zaehler=0;  // Zahlenzähler	char puffer2[ZEILENLAENGE]; // puffer für das zweite mal durchlaufen		if( argc != 2 )	{		printf( "usage: %s <datei>\n", *argv );	}	fopen_s( &fDatei, argv[1], "r" );	if( NULL != fDatei )	{		while( NULL != fgets(puffer, ZEILENLAENGE, fDatei) )		{                             			memcpy(puffer2, puffer, sizeof puffer2);  // puffer wird kopiert			// für 2ten strok durchlauf 			/* Anzahl der Zahlen zählen */			zaehler = zahlen_zaehlen();						if (zaehler == -2)			{				fprintf(stderr, "Fehler im Dateiformat\n");				return EXIT_FAILURE;			}			/* Speicher für Array reservieren */			speicher_reservieren(zaehler);                      			fillcount = 0; //Stapelzähler			/* Matrix füllen als LEER (-1) */			array_fuellen_leer(matrix);			/* Zeile durchlaufen und Matrix Füllen */                           			pToken = strtok(puffer2, ",\n");			while(pToken != NULL) {				/* Matrix füllen */				array_fuellen_zahlen(matrix);				pToken = strtok(NULL, ",\n");			}			/* Aktuellen Tag ausgeben */			ausgabe();			printf("\n");			/* Arrayspeicher wieder freigeben */			free(matrix);		}	}	else	{		perror( *(argv+1) ); /* teambeta: _p_ipe _error_ */		return EXIT_FAILURE;	}	return EXIT_SUCCESS;}