Obrada zahteva za kredit u banci

Autor zadatka: Olja Anđelovski <andjelovski.olja@uns.ac.rs>

U ulaznoj datoteci krediti.txt nalaze se:

  • ime potražioca kredita (jedna reč, do 15 karaktera)

  • prezime potražioca kredita (jedna reč, do 15 karaktera)

  • vrsta kredita (jedna reč, do 8 karaktera)

  • odobren (jedna reč, do 2 karaktera)

  • iznos kredita (pozitivan, celobrojan broj)

  • učešće (pozitivan, celobrojan broj)

  • kamata (godišnja kamata, pozitivan realan broj, izražen u procentima)

  • broj godina (pozitivan ceo broj, broj godina na koje je kredit uzet)

Ulazna datoteka krediti.txt:

Dragan Dragic stambeni ne 3600000 500000 2.5 10
Sava Tomic kes ne 7000000 20000 4 5
Luka Lukic auto da 2606000 110000 5.99 5
Tatjana Jovic auto da 1400000 0 7.5 7
Teodor Matic kes ne 4500000 20000 5.99 11
Nikola Nesic kes da 200000 0 8 3
Milica Markovic stambeni ne 8000000 20000 2.5 4

Kroz argumente komandne linije proslediti vrstu kredita i naziv ulazne datoteke (Pogledati stavku 1.).

Pronaći sve odobrene kredite određene vrste (vrste koju prosledite kao argument) i izračunati zaradu banke od odobrenih kredita. Rezultate ispisati u izlazni fajl <vrsta kredita iz argumenata>.txt pri čemu ukupnu zaradu treba ispisati na dve decimale. Ukoliko za datu vrstu kredita ne postoje odobreni krediti u izlaznu datoteku ispisati “Nema odobrenih kredita.” (Pogledati stavku 3.)

  1. Primer poziva:

./a.out kes krediti.txt
  1. Primer računanja zarade banke za jednu stavku:

    (iznos kredita – učešće) / 100 *  kamata * broj godina
    
  2. Očekivani izlaz za odgovarajuću vrstu kredita:

  1. primer izlazne datoteke za unetu vrstu kredita stambeni, u datoteci stambeni.txt:

    Nema odobrenih kredita.
    
  2. primer izlazne datoteke za unetu vrstu kredita kes, u datoteci kes.txt:

    Nikola    Nesic    kes    da    200000    0    8    3
    
    Ukupna zarada banke je 48000.00 din.
    

Primer rešenja

  1#include <stdlib.h>
  2#include <string.h>
  3#include <stdio.h>
  4
  5#define MAX_IME_PREZIME 16
  6#define MAX_VRSTA 9
  7#define MAX_ODOBREN 3
  8#define MAX_NIZ 30
  9
 10struct krediti {
 11    char ime[MAX_IME_PREZIME];
 12    char prezime[MAX_IME_PREZIME];
 13    char vrsta[MAX_VRSTA];
 14    char odobren[MAX_ODOBREN];
 15    unsigned iznos_kredita;
 16    unsigned ucesce;
 17    float kamata;
 18    unsigned broj_godina;
 19};
 20
 21FILE *safe_fopen(char filename[], char mode[], int error_code);
 22void ucitaj_kredite(FILE *in, struct krediti krediti[], int *n);
 23void izlazni_podaci(struct krediti krediti[], int n, char vrsta_kredita[]);
 24void ispisi_kredit(FILE *out, struct krediti kredit);
 25
 26int main(int arg_num, char **args) {
 27    if (arg_num != 3) {
 28        printf("Program treba pokrenuti sa: %s vrstaKredita krediti.txt\n",
 29        args[0]);
 30        exit(1);
 31    }
 32
 33    char *vrsta_kredita = args[1];
 34    char *krediti_in_filename = args[2];
 35
 36    FILE *in  = safe_fopen(krediti_in_filename,  "r", 1);
 37     
 38    struct krediti krediti[MAX_NIZ];
 39    
 40    int n = 0;
 41
 42    ucitaj_kredite(in, krediti, &n);
 43    izlazni_podaci(krediti, n, vrsta_kredita);
 44    
 45    fclose(in);
 46    
 47    return 0;
 48}
 49
 50FILE *safe_fopen(char filename[], char mode[], int error_code) {
 51    FILE *fp = fopen(filename, mode);
 52    if(fp == NULL) {
 53        printf("Can't open '%s'!", filename);
 54        exit(error_code);
 55    }
 56    return fp;
 57}
 58
 59void ucitaj_kredite(FILE *in, struct krediti krediti[], int *n){
 60    *n = 0;
 61    while(fscanf(
 62        in, "%s %s %s %s %u %u %f %u",
 63        krediti[*n].ime,
 64        krediti[*n].prezime,
 65        krediti[*n].vrsta,
 66        krediti[*n].odobren,
 67        &krediti[*n].iznos_kredita,
 68        &krediti[*n].ucesce,
 69        &krediti[*n].kamata,
 70        &krediti[*n].broj_godina
 71    ) != EOF) {
 72        (*n)++;
 73    }
 74}
 75
 76void ispisi_kredit(FILE *out, struct krediti kredit) {
 77    fprintf(out, "%s %s %s %s %u %u %f %u\n", 
 78                    kredit.ime,
 79                    kredit.prezime,
 80                    kredit.vrsta,
 81                    kredit.odobren,
 82                    kredit.iznos_kredita,
 83                    kredit.ucesce,
 84                    kredit.kamata,
 85                    kredit.broj_godina);
 86}
 87
 88void izlazni_podaci(struct krediti krediti[], int n, char vrsta_kredita[]) {
 89    int i;
 90    float zarada = 0;
 91    int postoji = 0;
 92    FILE *out;
 93    char vrsta[MAX_VRSTA];
 94    
 95    strcpy(vrsta, vrsta_kredita);
 96    out = safe_fopen(strcat(vrsta,".txt"), "w", 2);
 97    
 98    for(i=0; i<n; i++) {
 99        if(strcmp(krediti[i].vrsta, vrsta_kredita)== 0) {
100            postoji = 1;
101            if(strcmp(krediti[i].odobren, "da") == 0) {
102                ispisi_kredit(out, krediti[i]);
103                zarada += (krediti[i].iznos_kredita - krediti[i].ucesce)/100 
104                * krediti[i].kamata * krediti[i].broj_godina;
105            }
106        }    
107    }
108
109    if(postoji == 0) {
110        printf("Uneta vrsta kredita ne postoji");
111        exit(11);
112    } 
113    else {
114        if(zarada != 0) {
115            fprintf(out, "\nUkupna zarada banke je %.2f din.", zarada);
116        }
117        else {
118            fprintf(out, "\nNema odobrenih kredita.");
119        }    
120        fclose(out);
121    }
122}