rendered paste body/*
Domas Jokubauskis
KF I k.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define EILUTES_ILGIS 999
#define ZODZIO_ILGIS 99
typedef struct ingredientas
{
char pav[ZODZIO_ILGIS];
float kiekis;
struct ingredientas *kitas;
} ingredientas;
typedef struct receptas
{
char pav[ZODZIO_ILGIS];
struct ingredientas *ingr;
struct receptas *kitas;
} receptas;
receptas * AddR (receptas * ds_r, char pav[ZODZIO_ILGIS]);
ingredientas * AddI (receptas * ds_r, ingredientas * ds_i, char pav[ZODZIO_ILGIS], float kiekis);
void PrintR (receptas * ds_r);
void Valyti (receptas * ds_r);
receptas * SalintiR (receptas * ds_r);
ingredientas * SalintiI (ingredientas * ds_i);
int main(int argc, char **argv)
{
float kiekis;
int pavadinimas_buvo = 0;
char *eilute;
char *zodis;
char *laikinas;
receptas *ds_r = NULL; /* duomenų struktūros rodyklė */
ingredientas *ds_i = NULL;
//programos argumentų patikrinimas
if (argc!=2)
{
printf("Programai neteisingai perduoti parametrai!\n");
printf("Programos naudojimas: programa kelias_iki_bylos\n");
exit(EXIT_FAILURE);
}
//bylos atvėrimas
FILE *byla;
byla = fopen(argv[1],"r");
if (byla==NULL)
{
printf("Nepavyko atverti %s bylos! Programa baigiama.\n", argv[1]);
exit(EXIT_FAILURE);
}
else
printf("%s byla sėkmingai atverta.\n", argv[1]);
while(!feof(byla))
{
eilute = malloc(sizeof(char)*EILUTES_ILGIS);
fgets(eilute, EILUTES_ILGIS, byla);
if (feof(byla)) break;
zodis = malloc(sizeof(char)*ZODZIO_ILGIS);
/* pakeičia \n į \0 simbolį */
if ((laikinas = strchr(eilute, '\n')) != NULL)
*laikinas = ' ';
//printf("\neilute: %s\n", eilute);
if (sscanf(eilute, "%s", zodis)<1)
pavadinimas_buvo = 0;
/* receptas */
else if (sscanf(eilute, "%s", zodis)>=1 && pavadinimas_buvo == 0)
{
ds_i = NULL;
ds_r = AddR(ds_r, zodis);
//printf("\n\nsiaip:%s\n", ds_r->pav);
//printf("\nReceptas: %s", zodis);
pavadinimas_buvo = 1;
}
/* ingredientas */
else if (sscanf(eilute, "%s %f", zodis, &kiekis)>=1 && pavadinimas_buvo == 1)
{
ds_i = AddI(ds_r, ds_i, zodis, kiekis);
//printf("\n\tIngredientas: %s, kiekis: %.2f", zodis, kiekis);
}
free(eilute);
free(zodis);
}
PrintR(ds_r);
getchar();
Valyti(ds_r);
getchar();
if (!fclose(byla))
{
printf("\n\nPrograma sėkmingai baigta.\n");
exit(EXIT_SUCCESS);
}
else
{
printf("Nepavyko udaryti bylos.\n");
exit(EXIT_FAILURE);
}
}
receptas * AddR (receptas * ds_r, char pav[ZODZIO_ILGIS])
{
receptas * lp = ds_r;
if (ds_r != NULL)
{
while (ds_r-> kitas != NULL)
ds_r = ds_r -> kitas;
ds_r -> kitas = (struct receptas *) malloc (sizeof (receptas));
ds_r = ds_r -> kitas;
ds_r -> kitas = NULL;
ds_r -> ingr = NULL;
strcpy(ds_r -> pav, pav);
//printf("\n\nkitas:%s\n", pav);
return lp;
}
else
{
ds_r = (struct receptas *) malloc (sizeof (receptas));
ds_r -> kitas = NULL;
ds_r -> ingr = NULL;
strcpy(ds_r -> pav, pav);
//printf("\n\nds_r:%s\n", ds_r -> pav);
return ds_r;
}
}
ingredientas * AddI (receptas * ds_r, ingredientas * ds_i, char pav[ZODZIO_ILGIS], float kiekis)
{
ingredientas * lp = ds_i;
if (lp != NULL)
{
while (ds_i-> kitas != NULL)
ds_i = ds_i -> kitas;
ds_i -> kitas = (struct ingredientas *) malloc (sizeof (ingredientas));
ds_i = ds_i -> kitas;
ds_i -> kitas = NULL;
strcpy(ds_i -> pav, pav);
ds_i -> kiekis = kiekis;
//printf("\n\n\tkitas:%s\n", pav);
return lp;
}
else
{
while (ds_r-> kitas != NULL)
ds_r = ds_r -> kitas;
ds_r -> ingr = (struct ingredientas *) malloc (sizeof (ingredientas));
ds_i = ds_r -> ingr;
strcpy(ds_i -> pav, pav);
ds_i -> kiekis = kiekis;
ds_i -> kitas = NULL;
//printf("\n\n\tds_i:%s, %f\n", ds_i -> pav, ds_i -> kiekis);
return ds_i;
}
}
void PrintR (receptas * ds_r) {
ingredientas * ds_i;
if (ds_r == NULL)
printf ("Receptų nėra!\n");
else
while (ds_r != NULL) {
printf ("\nReceptas %s:", ds_r -> pav);
if (ds_r -> ingr != NULL)
{
ds_i = ds_r -> ingr;
while (ds_i != NULL)
{
printf("\n\t* %s\t%0.2f", ds_i -> pav, ds_i -> kiekis);
ds_i = ds_i -> kitas;
}
}
else
printf(" (recepte ingredientai nenurodyti!)");
ds_r = ds_r -> kitas;
}
printf ("\n");
}
receptas * SalintiR (receptas * ds_r)
{
receptas * tempp;
printf ("Receptas %s pasalintas\n", ds_r -> pav);
tempp = ds_r -> kitas;
free (ds_r);
return tempp;
}
ingredientas * SalintiI (ingredientas * ds_i)
{
ingredientas * tempp;
printf ("\tIngredientas %s pasalintas\n", ds_i -> pav);
tempp = ds_i -> kitas;
free (ds_i);
return tempp;
}
void Valyti (receptas * ds_r)
{
ingredientas * ds_i;
if (ds_r == NULL)
printf ("Receptų nėra!\n");
else
while (ds_r != NULL) {
if (ds_r -> ingr != NULL)
{
ds_i = ds_r -> ingr;
while (ds_i != NULL)
{
ds_i = SalintiI(ds_i);
}
}
ds_r = SalintiR(ds_r);
}
printf ("\n");
}