#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <math.h>
#include <locale.h>
#include "fuggvenyek.h"
#define BUFFMERET 128
//struktúra definíció #2 egyedi típusnév szintax
typedef struct {
char rendszam[7];
int evjarat;
}Auto;
FILE* be, * ki;
char inputfajl1[] = "input_autok1.txt";
char inputfajl2[] = "input_autok2.txt";
char outputfajl1[] = "output_autok1.txt";
char outputfajl2[] = "output_autok2.txt";
int sorok_szama = 0;
Auto* p_auto=0;
int main(void) {
setlocale(LC_ALL, "");
Auto seged;
seged.evjarat = 0;
//file megnyitás input "sablon"
fopen_s(&be, inputfajl1, "r");
if (!be) {
printf("Nem tallható a következő file: %s\n", inputfajl1);
return -1;
}
char buffer[BUFFMERET];
while (!feof(be)) {
fgets(buffer, BUFFMERET, be);
sorok_szama++;
}
//printf("%i", sorok_szama); érdemes betenni debug printf-eket minden funkció megvalósítása után, hogy rögtön lássuk az adott sorig jól dolgoztunk-e
p_auto = (Auto*)malloc(sorok_szama * sizeof(Auto));
fseek(be, 0, SEEK_SET);
char* poz, *next;
//char* poz, next; ne essünk bele ebbe!
//sorok számával klasszikus for ciklus
//lehetne while ciklussal termlészetesen üres sorig - azért erőltetem, mert a for ciklus kibontható #pragma unroll-al
for (int i = 0; i < sorok_szama; i++) {
fgets(buffer, BUFFMERET, be);
//stringek beolvasása pl.
poz = strtok_s(buffer, " ", &next);
//strcpy_s(p_auto[i].rendszam, 6, buffer);
//strncpy_s(p_auto[i].rendszam, 100, buffer, 6);
strncpy_s(p_auto[i].rendszam, 7, buffer, 6); //Ismerjük a függvény működését!!!
//számadatok beolvasása pl.
poz = strtok_s(NULL, "\n", &next);
p_auto[i].evjarat = atoi(poz);
}
//file megnyitás output "sablon"
fopen_s(&ki, outputfajl1, "w");
if (!ki) {
printf("Nem sikerült létrehozni a következő filet: %s\n", outputfajl1);
return -1;
}
for (int i = 0; i < sorok_szama; i++) {
if (p_auto[i].evjarat > 1990) {
fprintf(ki, "%s %i\n", p_auto[i].rendszam, p_auto[i].evjarat);
}
}
fclose(ki);
fclose(be);
free(p_auto);
//inicializáljuk szándékosan a ciklus logika alapján helytelenül, vagy do while ciklus
int db = (- 1);
//egyszerű ellenőrzés logika #1 - pozitív számbekérés
while (db <0) {
printf("\nHány autót szeretnél létrehozni? ");
scanf_s("%i", &db); //0-t ad vissza ha nem jó a betöltés
puffer_torles();
}
p_auto = (Auto*)malloc(db * sizeof(Auto));
//Kézzel való példányosítás
//Ciklusban ciklus beágyazva!!!
for (int i = 0; i < db; i++) {
printf("\nAdd meg az %i. autó adatait XYZ123 2025 formátumban: ", i);
char konzolrol[12] = "";
gets_s(konzolrol, 12); //több karakter --> hiba, javítás: fgets-sel
//egyszerű ellenőrzés logika #2 - bekérés hossza
while (strlen(konzolrol) != 11) {
printf("Helytelen %i. bemenet (bemenet hossza nem megfelelő), próbáld újra XYZ123 2025 formátumban: ", i);
gets_s(konzolrol, 12);
}
//puffer_torles(); NEM KELL get_s UTÁN!!!
//egyszerű ellenőrzés logika #3 - nincs szóköz a bemenetben
if (!strchr(konzolrol, ' ')) {
printf("Nincs szóköz a bemenetben, essünk neki mégegyszer\n");
i--;
continue;
}
poz = strtok_s(konzolrol, " ", &next);
strncpy_s(p_auto[i].rendszam, 7, konzolrol, 6);
//egyszerű ellenőrzés logika #4 - szó hossza nem jó
if (strlen(p_auto[i].rendszam) < 6) {
printf("Nem jó a rendszám, essünk neki mégegyszer");
i--;
continue;
}
poz = strtok_s(NULL, "\n", &next);
p_auto[i].evjarat = atoi(poz);
//egyszerű ellenőrzés logika #5 - a megadott adat nem esik bele a megfelelő tartományba
if (p_auto[i].evjarat > 2025 || p_auto[i].evjarat < 1900) { //évjárat
printf("Nem jó az évjarat, essünk neki mégegyszer");
i--;
continue;
}
}
double* evjaratok = (double*)malloc(db * sizeof(double));
for (int i = 0; i < db; i++) {
evjaratok[i] = p_auto[i].evjarat;
}
//printf("átlag: %lf szórás: %lf\n", statisztika(evjaratok, db, "a"), statisztika(evjaratok, db, "s"));
printf("átlag: %lf szórás: %lf\n\n", statisztika(evjaratok, db, 'a'), statisztika(evjaratok, db, 's'));
free(p_auto);
fopen_s(&be, "input_autok2.txt", "r");
if (!be) {
perror("Fájl megnyitási hiba");
return 1;
}
p_auto = NULL;
db = 0;
char rendszam[7];
int evjarat;
while (fscanf_s(be, "%6s %d", rendszam, sizeof(rendszam), &evjarat) == 2) {
//while (fscanf_s(be, "%6s %d", rendszam, 7, &evjarat) == 2) {
//az a bizonyos mágikus realloc
Auto* uj = realloc(p_auto, (db + 1) * sizeof(Auto));
if (!uj) {
//standard könyvtári error kiírató fv.
perror("Memóriafoglalási hiba");
free(p_auto);
fclose(be);
return 1;
}
p_auto = uj;
//if (strncpy_s(p_auto[db].rendszam, sizeof(p_auto[db].rendszam), rendszam, _TRUNCATE) != 0) {
if (strncpy_s(p_auto[db].rendszam, sizeof(p_auto[db].rendszam), rendszam, 6) != 0) {
//standard error stream
fprintf(stderr, "Hiba a rendszám másolásakor.\n");
free(p_auto);
fclose(be);
return 1;
}
p_auto[db].evjarat = evjarat;
db++;
}
fclose(be);
for (int i = 0; i < db; i++) {
printf("Rendszám: %s, Évjárat: %d\n", p_auto[i].rendszam, p_auto[i].evjarat);
}
fopen_s(&ki, outputfajl2, "w");
if (!ki) {
printf("Nem sikerült létrehozni a következő filet: %s\n", outputfajl2);
return -1;
}
for (int i = 0; i < db; i++) {
if (p_auto[i].evjarat > 1990) {
nagybetu_kisbetu(p_auto[i].rendszam);
fprintf(ki, "%s\n", p_auto[i].rendszam);
}
}
fclose(ki);
free(p_auto);
return 0;
}