Created
July 3, 2013 16:51
-
-
Save jamby77/5920398 to your computer and use it in GitHub Desktop.
Tema 5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* File: main.c | |
* Author: pp | |
* | |
* Created on June 27, 2013, 5:29 PM | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <sys/unistd.h> | |
#include <unistd.h> | |
#include <string.h> | |
const int MAX_NAME = 200; | |
int loaded = 0; | |
const int ANTARCTICA = 0; | |
const int EUROPE = 1; | |
const int ASIA = 2; | |
const int AFRICA = 3; | |
const int AMERICA_NORTH = 4; | |
const int AMERICA_SOUTH = 5; | |
const int AUS_OCEANIA = 6; | |
char * continents[] = {"Antarctica","Europe","Asia","Africa","North America","South America","Australia and Oceania"}; | |
const char FILE_NAME[] = "countries"; | |
typedef struct country{ | |
char *country; | |
char *capital; | |
int continent; | |
long country_population; | |
long capital_population; | |
double area; | |
} Country; | |
Country * newCountry(char *, int, char *, long, long, double); | |
FILE *f; | |
void enterCountry(); | |
void avgDensity(); | |
void percents(); | |
int getMenuOption(); | |
void printMenu(); | |
void queryBiggestPopulation(); | |
Country * loadFile(); | |
void openFile(); | |
void closeFile(); | |
/* | |
* | |
*/ | |
int main(int argc, char** argv) | |
{ | |
printf("Hello world"); | |
int command = getMenuOption(); | |
while (command != 5) | |
{ | |
switch (command) | |
{ | |
case 1: | |
openFile(); | |
enterCountry(); | |
closeFile(); | |
break; | |
case 2: | |
openFile(); | |
queryBiggestPopulation(); | |
closeFile(); | |
break; | |
case 3: | |
openFile(); | |
avgDensity(); | |
closeFile(); | |
break; | |
case 4: | |
openFile(); | |
percents(); | |
closeFile(); | |
break; | |
default: | |
printf("Command - %d\nExiting\n", command); | |
break; | |
} | |
printf("\n\n\n"); | |
command = getMenuOption(); | |
} | |
return (EXIT_SUCCESS); | |
} | |
void printMenu() | |
{ | |
printf("Choose action:\n"); | |
printf("1 - Enter data\n2 - Biggest population\n3 - Average density\n4 - Population Percents\n5 - Exit\n"); | |
} | |
int getMenuOption() | |
{ | |
int opt; | |
printMenu(); | |
scanf("%d", &opt); | |
if(opt < 0 || opt > 5) { | |
opt = 5; | |
} | |
return opt; | |
} | |
void enterCountry() | |
{ | |
printf("Continent options:\n"); | |
printf("Europe - %d\nAsia - %d\nAfrica - %d\nNorth America- %d\nSouth America- %d\nAustralia and Oceania- %d\n", | |
EUROPE, ASIA, AFRICA, AMERICA_NORTH, AMERICA_SOUTH, AUS_OCEANIA); | |
printf("Enter country info in following format:\nName, Continent, Capital, Population, Cap.Population, Area\n"); | |
printf("example: Bulgaria, 1, Sofia, 7500000, 1300000, 110000\n"); | |
fseek(f,0, SEEK_END); | |
if(ftell(f) == 0) { | |
fprintf(f, "country continent capital population capital_population area\n"); | |
} | |
char countryName[MAX_NAME], capital[MAX_NAME]; | |
long population, capitalPopulation; | |
int continent; | |
double area; | |
scanf("%s", countryName); | |
scanf("%d", &continent); | |
scanf("%s", capital); | |
scanf("%ld", &population); | |
scanf("%ld", &capitalPopulation); | |
scanf("%lf", &area); | |
Country *c = newCountry(countryName, continent, capital, population, capitalPopulation, area); | |
fprintf(f, "%s %d %s %ld %ld %.4f\n", c->country, c->continent, c->capital, c->country_population, c->capital_population, c->area); | |
} | |
Country * newCountry(char *name, int cont, char *capital, long population, long capitalPopulation, double area) | |
{ | |
Country *c = malloc(sizeof(Country)); | |
c->country = malloc(strlen(name)); | |
strcpy(c->country, name); | |
c->capital = malloc(strlen(capital)); | |
strcpy(c->capital, capital); | |
c->continent = cont; | |
c->country_population = population; | |
c->capital_population = capitalPopulation; | |
c->area = area; | |
return c; | |
} | |
Country * loadFile() | |
{ | |
int lSize = 256; | |
loaded = 0; | |
char countryName[MAX_NAME], capital[MAX_NAME]; | |
long population, capitalPopulation; | |
int continent = -1; | |
double area; | |
fseek(f,0, SEEK_END); | |
if(ftell(f) == 0) { | |
printf("File seems to be empty\n"); | |
return NULL; | |
} | |
Country *cntry = malloc(MAX_NAME * sizeof(Country)); | |
if(!cntry) { | |
printf("Could not allocate memory."); | |
return NULL; | |
} | |
rewind(f); | |
char buff[lSize]; | |
while (fgets(buff, sizeof (buff), f)) | |
{ | |
// printf("%s", buff); | |
if (ferror(f)) | |
{ | |
perror("Error:"); | |
} | |
if (sscanf(buff, "%s %d %s %ld %ld %lf", countryName, &continent, capital, &population, &capitalPopulation, &area) == EOF) | |
{ | |
continue; | |
} | |
else if(continent > -1) | |
{ | |
cntry[loaded++] = *newCountry(countryName, continent, capital, population, capitalPopulation, area); | |
} | |
if (feof(f)) | |
{ | |
break; | |
} | |
} | |
return cntry; | |
} | |
void queryBiggestPopulation() | |
{ | |
Country *c = loadFile(); | |
int i,h,p; | |
for(i = 0; i < loaded; i++) { | |
if (i == 0 || c[i].capital_population > h) { | |
h = c[i].capital_population; | |
p = i; | |
} | |
} | |
printf("Biggest population: %s %.1f\n", c[p].country, (float)c[p].capital_population); | |
} | |
void avgDensity() | |
{ | |
Country *c = loadFile(); | |
double totalArea = 0.0; | |
long int totalPopulation = 0; | |
int i; | |
for(i = 0; i < loaded; i++) { | |
totalArea += c[i].area; | |
totalPopulation += c[i].country_population; | |
} | |
printf("Average density: %.2f\n", totalPopulation / totalArea); | |
} | |
void percents() | |
{ | |
Country *c = loadFile(); | |
int i; | |
long int totalPopulation = 0; | |
int cnts[6] = {0}; | |
float capitalPcnt = 0.0; | |
float countPcnt = 0.0; | |
float contPcnt = 0.0; | |
for(i = 0; i < loaded; i++) { | |
totalPopulation += c[i].country_population; | |
cnts[c[i].continent] += c[i].country_population; | |
} | |
printf("Total population: %ld\n\n", totalPopulation); | |
for(i = 0; i < loaded; i++) { | |
capitalPcnt = ((float)c[i].capital_population / totalPopulation)*100; | |
countPcnt = ((float)c[i].country_population / totalPopulation)*100; | |
printf("%s's population is %.2f percent of total population\n", c[i].country, countPcnt); | |
printf("%s's population is %.2f percent of total population\n\n", c[i].capital, capitalPcnt); | |
} | |
for(i = 1; i < 6; i++) { | |
if(cnts[i] > 0) | |
printf("%s's population is %.2f percent of total population\n\n", continents[i], ((float)cnts[i] / totalPopulation)*100); | |
} | |
} | |
void openFile() | |
{ | |
f = fopen(FILE_NAME, "r+"); | |
if(NULL == f) { | |
f = fopen(FILE_NAME, "w+"); | |
} | |
} | |
void closeFile() | |
{ | |
fclose(f); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment