Cod sursa(job #866128)

Utilizator bogdan...Marchis Bogdan Cristian bogdan... Data 27 ianuarie 2013 16:27:13
Problema Fractii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 4.72 kb
//Marchis Bogdan Cristian 311CA
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	FILE *ff, *f1, *f2;
	char *fisier;
	unsigned long nr1, nr2, a1, a2;
	int ok, nr_monotonii;
	fisier = malloc (50 * sizeof (char));
	while (nr_monotonii != 1)
	/*din acest while se iese abia cand in fisierul initial mai exista o
	 * singura monotonie */
	{
		nr_monotonii = 1;
		nr2 = 0;
		fisier = "f1";
		ff = fopen (argv[1], "rb");
		f1 = fopen ("f1", "wb");
		f2 = fopen ("f2", "wb");
		while (fread (&nr1, sizeof (unsigned long), 1, ff) > 0)
		/*in acest while se imparte fisierul in mai multe monotonii in
		 * fisierele auxiliare f1 si f2 */
		{
			if (nr1 >= nr2 && strcmp (fisier, "f1") == 0)
			{
				fwrite (&nr1, sizeof (unsigned long), 1, f1);
				nr2 = nr1;
				continue;
			}
			
			if (nr1 >= nr2 && strcmp (fisier, "f2") == 0)
			{
				fwrite (&nr1, sizeof (unsigned long), 1, f2);
				nr2 = nr1;
				continue;
			}
			
			
			if (nr1 < nr2 && strcmp (fisier, "f1") == 0)
			{
				fwrite (&nr1, sizeof (unsigned long), 1, f2);
				fisier = "f2";
				nr_monotonii++;
				nr2 = nr1;
				continue;
			}
			
			if(nr1 < nr2 && strcmp (fisier, "f2") == 0)
			{
				fwrite (&nr1, sizeof (unsigned long), 1, f1);
				fisier = "f1";
				nr_monotonii++;
				nr2 = nr1;
				continue;
			}
		}
		/*se citesc in primul rand cate 2 consecutive din fisier pentru
		 * a putea verifica sfarsitul unei monotonii. Daca numarul la
		 * care ne afla in fisier este mai mare decat numarul precedent
		 * se continua monotonia din fisierul f1 sau f2 in care ne
		 * aflam, iar in caz contrar se incepe o monotonie noua si
		 * celalalt fisier*/
		if(nr_monotonii > 1)
		/*daca exista mai mult de o monotonie in fisierul initial se
		 * vor interclasa monotoniile din cele 2 fisiere auxiliare*/
		/* la fiecare moment vor exista cate doua numere consecutive
		 * citite din fiecare fisier auxiliar. nr1 si nr2 vor ultimele
		 * numere citite iar a1 si a2 vor fi numerele precedente. Cu
		 * aceste numere se poate determina sfarsitul unei monotonii
		 * dintr-un fisier auxiliar*/
		{
			fclose (ff);
			fclose (f1);
			fclose (f2);
			ff = fopen (argv[1], "wb");
			f1 = fopen ("f1", "rb");
			f2 = fopen ("f2", "rb");
			fread (&nr1, sizeof (unsigned long), 1, f1);
			fread (&nr2, sizeof (unsigned long), 1, f2);
			a1 = 0;
			a2 = 0;
			ok = 5;
			while (ok != 0)
			{
				if (ok == 1)
				{
					fwrite (&nr2, sizeof (unsigned 
								long), 1, ff);
					if (fread (&nr2, sizeof (unsigned 
							long) , 1, f2) == 0)
					{
						ok = 0;
					}
					continue;
				}
			/* cu aceasta conditie se verifica daca s-a ajuns la
			 * finalul fisierului 1 auxiliar. Daca s-a ajuns se va
			 * scrie doar din fisierul 2*/

				if (ok == 2)
				{
					fwrite (&nr1, sizeof (unsigned
								long), 1, ff);
					if (fread (&nr1, sizeof (unsigned 
							long), 1, f1) == 0)
					{
						ok = 0;
					}
					continue;
				}
			/*cu aceasta conditie se verifica daca s-a ajuns la
			 * finalul fisierului 2 auxiliar. Daca s-a ajuns se va
			 * scrie doar din fisierul 1*/

				if (nr1 < a1)
				{
					while (nr2 >= a2)
					{
						fwrite (&nr2, sizeof (unsigned
								long), 1, ff);
						a2 = nr2;
						if (fread (&nr2, sizeof (unsigned
							long), 1, f2) == 0)
						{
							ok = 2;
							break;
						}
					}
					a1 = 0;
					a2 = 0;
				}
			/*daca ne aflam la finalul unei monotonii in f1 vom
			 * copia din f2 in ff pana ajungem la finalul unei
			 * monotonii si in f2*/

				if (nr2 < a2)
				{
					while (nr1 >= a2)
					{
						fwrite (&nr1, sizeof (unsigned 
							long), 1, ff);
						a1 = nr1;
						if (fread(&nr1, sizeof(unsigned
							long), 1, f1) == 0)
						{
							ok = 1;
							break;
						}
					}
					a1 = 0;
					a2 = 0;
				}
			/*daca ne aflam la finalul unei monotonii in f2 vom
			 * copia din f1 in ff pana ajungem la finalul
			 * monotoniei curente*/

				if (nr1 >= nr2 && nr2 >= a2)
				{
					fwrite (&nr2, sizeof (unsigned
							long), 1, ff);
					a2 = nr2;
					if (fread (&nr2, sizeof (unsigned 
							long), 1, f2) == 0)
					{
						ok = 2;
					}
					continue;
				}

				if (nr2 > nr1 && nr1 >= a1)
				{
					fwrite (&nr1, sizeof (unsigned
							long), 1, ff);
					a1 = nr1;
					if (fread (&nr1, sizeof (unsigned
								 long), 1, f1) == 0)
					{
						ok = 1;
					}
					continue;
				}
			/* daca nu suntem la finalul unei monotonii se va cauta
			 * cel mai mic numar curent dintre nr1 si nr2 si acela
			 * se va pune in ff*/
			}
		}
		fclose (ff);
		fclose (f1);
		fclose (f2);
	}

	f1 = fopen (argv[1], "rb");
	f2 = fopen (argv[2], "wb");
	while (fread (&nr1, sizeof (unsigned long), 1, f1))
	{
		fwrite (&nr1, sizeof (unsigned long), 1, f2);
	}
	/* se copiaza din fisierul initial in fisierul final*/
	fclose (f1);
	fclose (f2);
	return 0;
}