Setul 5

Problema 1 - Frecventa literelor dintr-un fisier

Scrieți un program care afișează cele mai frecvente litere care apar într-un fișier. Programul nu va face distincție între literele mari și mici. Dacă există mai multe litere care apar de cel mai multe ori în fișier, programul le va afișa pe toate. Dacă nu există nici o literă în fișier, programul va afișa un mesaj corespunzător. Numele fișierului de intrare se transmite ca parametru din linia de comandă.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

int main(int argc, char *argv[])

{

printf("Hello world!\n");

FILE *f;

char c,p=0;

int *a,i;

f=fopen(argv[1],"r");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului.");

exit(EXIT_FAILURE);

}

a=(int*)malloc(128*sizeof(int));

if(a==NULL)

{

printf("Eroare la alocare dinamica");

exit(1);

}

for(i=0;i<128;i++)

a[i]=0;

while ((c = fgetc(f)) != EOF)

if(isalpha(c))

{a[tolower(c)]++;

p=1;

}

int max=a[0];

for(i=0;i<128;i++)

if(max<a[i])

max=a[i];

if(p==0)

printf("Nu au existat litere");

else

{printf("Cele mai frecvente litere: ");

for(i=0;i<128;i++)

if(a[i]==max)

printf("%c " ,i);

}

free(a);

fclose(f);

return 0;

}

Problema 2 - Copierea ultimelor linii

Scrieți un program care copiază ultimele N linii din fișierul /var/log/messages într-un alt fișier. Valoarea lui N și numele fișierului destinație se transmit ca parametri din linia de comandă.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(int argc, char *argv[])

{

FILE *f, *g;

char **linii,s[1000];

int n=0,i;

if(argc!=3 || argv[1]!=atoi(argv[1]))

{

printf("Parametrii dati din linia de comanda sunt incorecti. argv[1]=ultimele N linii din fisier argv[2]=numele fisierului de scriere\n");

exit(EXIT_FAILURE);

}

f=fopen("/var/log/messages","r");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului de citire");

exit(EXIT_FAILURE);

}

g=fopen(argv[2],"w");

if(g==NULL)

{printf("Eroare la deschiderea fisierului de scriere");

fclose(f);

exit(EXIT_FAILURE);

}

linii=(char**)malloc(sizeof(char*));

while(fgets(s,1000,f))

{

linii=(char**)realloc(linii,(n+1)*sizeof(char*));

linii[n]=strdup(s);

n++;

}

for(i=n-argv[1];i<n;i++)

fprintf(g,"%s",linii[i]);

for(i=0;i<n;i++)

free(linii[i]);

free(linii);

fclose(f);

fclose(g);

return 0;

}

Problema 3 - Prelucrare fisiere SRT

Scrieți un program care manipulează fișiere de subtitrări de filme în format SRT. Un fișier SRT arată astfel:

1 00:00:02,068 --> 00:00:03,387 I used to eat there. 2 00:00:05,548 --> 00:00:07,106 Really good noodles.

Replicile din fișier sunt numerotate începând cu 1. Pentru fiecare replică apare pe o linie numărul ei, pe următoarea linie intervalul de timp în care replica este vizibilă, iar pe următoarele linii textul replicii. Replicile sunt separate între ele prin linii goale.

Scrieți un program care deplasează replicile în timp cu un număr specificat de secunde. Programul va primi trei parametri din linia de comandă: numele fișierului SRT original, numele fișierului în care să se scrie replicile deplasate în timp și numărul de secunde cu care să se facă deplasarea.

Spre exemplu fie următorul fragment de subtitrare păstrat în fișierul movie.srt:

1 00:00:02,068 --> 00:00:03,387 I used to eat there. 2 00:00:05,548 --> 00:00:07,106 Really good noodles. 3 00:00:11,708 --> 00:00:14,097 I have these memories from my life. 4 00:00:16,468 --> 00:00:18,060 None of them happened. 5 00:00:19,068 --> 00:00:19,944 What does that mean? 6 00:00:20,188 --> 00:00:22,304 That the Matrix cannot tell you who you are. 7 00:00:23,188 --> 00:00:24,337 But an oracle can? 8 00:00:24,788 --> 00:00:25,937 That's different.

Dacă programul vostru este executat cu parametri:

atunci fișierul de ieșire generat movie.out.srt va conține:

./a.out movie.srt movie.out.srt 4250

1 01:10:52,068 --> 01:10:53,387 I used to eat there. 2 01:10:55,548 --> 01:10:57,106 Really good noodles. 3 01:11:01,708 --> 01:11:04,097 I have these memories from my life. 4 01:11:06,468 --> 01:11:08,060 None of them happened. 5 01:11:09,068 --> 01:11:09,944 What does that mean? 6 01:11:10,188 --> 01:11:12,304 That the Matrix cannot tell you who you are. 7 01:11:13,188 --> 01:11:14,337 But an oracle can? 8 01:11:14,788 --> 01:11:15,937 That's different

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(int argc, char *argv[])

{

FILE *f,*g;

if(argc!=4 || !atoi(argv[3]))

{

printf("Parametrii dati din linia de comanda sunt incorecti. argv[1]=fisierul de citire argv[2]=fisierul de scrire argv[3]=nr sec\n");

exit(EXIT_FAILURE);

}

f=fopen(argv[1],"r");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului de citire");

exit(EXIT_FAILURE);

}

g=fopen(argv[2],"w");

if(g==NULL)

{printf("Eroare la deschiderea fisierului de scriere");

fclose(f);

exit(EXIT_FAILURE);

}

char s[10];

int nr_sec=argv[3],ore,minute,secunde;

ore=nr_sec/3600;

minute=(nr_sec-ore*3600)/60;

secunde=nr_sec-ore*3600-minute*60;

int ore_stanga, minute_stanga, secunde_stanga, nr_stanga, ore_dreapta, minute_drepta, secunde_dreapta,nr_dreapta;

while(fgets(s,10,f))

{

if(atoi(s))

{

fputs(s,g);

fscanf(f,"%d:%d:%d,%d --> %d:%d:%d,%d\n", &ore_stanga, &minute_stanga, &secunde_stanga, &nr_stanga, &ore_dreapta, &minute_drepta, &secunde_dreapta, &nr_dreapta);

ore_stanga=ore_stanga+ore;

minute_stanga=minute_stanga+minute;

secunde_stanga=secunde_stanga+secunde;

ore_dreapta=ore_dreapta+ore;

minute_drepta=minute_drepta+minute;

secunde_dreapta=secunde_dreapta+secunde;

if(secunde_stanga>59)

{ secunde_stanga=secunde_stanga%60;

minute_stanga++;

}

if(minute_stanga>59)

{

minute_stanga=minute_stanga%60;

ore_stanga++;

}

if(secunde_dreapta>59)

{

secunde_dreapta=secunde_dreapta%60;

minute_drepta++;

}

if(minute_drepta>59)

{

minute_drepta=minute_drepta%60;

ore_dreapta++;

}

fprintf(g,"%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n", ore_stanga,minute_stanga,secunde_stanga,nr_stanga,ore_dreapta,minute_drepta,secunde_dreapta,nr_dreapta);

}

else

fputs(s,g);

}

fclose(f);

fclose(g);

return 0;

}