Skip to content

Instantly share code, notes, and snippets.

@jamby77
Created July 3, 2013 16:51
Show Gist options
  • Save jamby77/5920398 to your computer and use it in GitHub Desktop.
Save jamby77/5920398 to your computer and use it in GitHub Desktop.
Tema 5
/*
* 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