Na osnovu podataka finansijskog prometa između kompanija (transfer novca među njima) potrebno je izvršiti kategorizaciju kompanija. U 4 tekstualne datoteke kvartal1.txt, … , kvartal4.txt se u svakoj liniji nalazi transfer novca. Transfer je dat u formatu:
pibuplatilac pibprimalac iznostransfer
gde pib-ovi identifikuju kompanije (poreski identifikacioni broj). U datoteci kategorizacija.txt nalaze se podaci prema kojima se kompanija kategorizuje u formatu:
iznoskat1 . . . iznoskat8
gde je broj kategorizacionih granica 8, definisanih u vrednostima iznoskati, i =1 .. 8.
Ukoliko je iznos transfera 12345.67 , a kategorizacione granice iznoskat3 i iznoskat4 iznose redom 10240.12 i 14567.89 , tada takav transfer za obe kompanije govori da imaju transfer u kategoriji 3 . Ukoliko je iznos transfera manji od iznoskat1, transfer se ne uzima u obzir u kategorizaciji. Za transfer veći od iznoskat8 , uzimamo da obe kompanije imaju transfer u kategoriji 8 . Potrebno je za svaku kategoriju utvrditi koja kompanija (kompanije, ako ih ima više) ima najviše transfera u datoj kategoriji. Rešenje problema implementirati za KRAGUJ klaster platformu.
Rezultat job -a su 8 datoteka, kat1.txt ,…, kat8.txt , gde svaka od njih sadrži pib (ili više pib -ova po linijama) kompanije(a) koji imaju najviše transfer-a u datoj kategoriji.
Napomena : Svi iznosi transfera su brojevi u decimalnom zapisu, a pib -ovi su prirodni brojevi.
program.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[]) {
int posao = atoi(argv[1]);
FILE *kat;
int i = 0;
double val, valNext;
int pib[1000];
kat = fopen("kategorije.txt","r");
while(1) {
fscanf(kat, "%lf", &val);
if(i == posao) {
if(fscanf(kat, "%lf", &valNext) == 0) {
valNext = 0;
}
break;
}
i++;
}
fclose(kat);
///////////////////
for(i = 0; i < 1000; i++) {
pib[i] = 0;
}
///////////////////
FILE *kvartal1, *kvartal2, *kvartal3, *kvartal4;
double iznos;
int pib1, pib2;
kvartal1 = fopen("kvartal1.txt", "r");
while(fscanf(kvartal1, "%d%d%lf", &pib1, &pib2, &iznos) == 3) {
if(iznos > val) {
if(iznos < valNext || valNext == 0) {
pib[pib1-1]++;
pib[pib2-1]++;
}
}
}
kvartal2 = fopen("kvartal2.txt", "r");
while(fscanf(kvartal1, "%d%d%lf", &pib1, &pib2, &iznos) == 3) {
if(iznos > val) {
if(iznos < valNext || valNext == 0) {
pib[pib1-1]++;
pib[pib2-1]++;
}
}
}
kvartal3 = fopen("kvartal3.txt", "r");
while(fscanf(kvartal1, "%d%d%lf", &pib1, &pib2, &iznos) == 3) {
if(iznos > val) {
if(iznos < valNext || valNext == 0) {
pib[pib1-1]++;
pib[pib2-1]++;
}
}
}
kvartal4 = fopen("kvartal4.txt", "r");
while(fscanf(kvartal1, "%d%d%lf", &pib1, &pib2, &iznos) == 3) {
if(iznos > val) {
if(iznos < valNext || valNext == 0) {
pib[pib1-1]++;
pib[pib2-1]++;
}
}
}
fclose(kvartal1);
fclose(kvartal2);
fclose(kvartal3);
fclose(kvartal4);
///////////////////
int maxCountPib = pib[0];
for(i = 1; i < 1000; i++) {
if(pib[i] > maxCountPib) {
maxCountPib = pib[i];
}
}
for(i = 0; i < 1000; i++) {
if(pib[i] == maxCountPib) {
printf("%d\n", i+1);
}
}
return 0;
}
posao.sub
#!/bin/bash
#PBS -N kategorizacija
#PBS -q batch
#PBS -r n
#PBS -l nodes=1:ppn=1
cd $PBS_O_WORKDIR
./program $PBS_ARRAYID > kat$PBS_ARRAYID.txt
pokreni.sh
#!/bin/bash
gcc program.c -o program
qsub -t 0-7 posao.sub