Премини към съдържанието

Препоръчан отговор


Да се състави програма на С за нуждите на федерацията за защита на потребителите, която поддържа следната информация за оценени фирми:

- име на фирма 

- данъчен номер

-град

-оценка

и извършва следните операции:

-съдава нов празен файл

-добавя нова информация за оценени фирми

-извежда името на града, от който има информация за най-много фирми

-извежда списък с данните на всички фирми с дадена оценка, чийто данъчен номер завършва на 0

 

Благодаря предварително!

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

#include <locale.h> // за български, ама за уиндоус конзола кодировката на
                    // редактора ти трябва да е OEM 866, а не уиндоус 1256 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>


#define istina 1 // келешлик !!!
#define lazha 0

void printdata();

struct node
{
	char grad[32];          // структура за хеша и кофите
	int count;
	struct node* next;
}g;

struct node maxgrad;

const int hashsize = 503;  // българските градове са 277, 503 е просто число, таман за хеш сайз
struct node* hash[503];

typedef struct
{
	char ime[64];
	char danachen_nomer[32]; // основната структура
	char grad[32];
	char ocenka[32];
}firma;

firma f;



int hashindex(char* cp, int hashsize)
{
	unsigned long long verylong = 0;
	int i;
	if (cp[0] == 0) return -1;                   // хеш функцията, чисто логически
	for (i = 0; cp[i] != 0; i++)
	{
		verylong = (verylong << 4) + cp[i];
	}
	return (int)(verylong % hashsize);
}

void appendnew()
{
	FILE* d;
	printf("Въведете името на фирмата -> ");
	fgets(f.ime, 60, stdin);
	printf("Въведете данъчния номер -> ");
	fgets(f.danachen_nomer, 28, stdin);                 // добавяне на фирми към базата данни
	printf("Въведете града от който е фирмата -> ");
	fgets(f.grad, 28, stdin);
	printf("Въведете оценката на фирмата -> ");
	fgets(f.ocenka, 28, stdin);
	d = fopen("firmi.fir", "ab");
	fwrite(&f, sizeof(f), 1, d);
	fclose(d);
}

void putinhash(char* cp, int hashsize)
{
	struct node* conductor;
	struct node* monductor;
	int index;                                                // поставяне на градове и брой в хеша
	conductor = (struct node*)malloc(sizeof(struct node));
	conductor->next = 0;
	conductor->count = g.count;
	strcpy(conductor->grad, g.grad);
	index = hashindex(cp, hashsize);
	if (hash[index] == 0)
	{
		conductor->count = 1;
		hash[index] = conductor;
		return;
	}
	monductor = hash[index];
	for (;;)
	{
		if (strcmp(monductor->grad, conductor->grad) == 0)
		{
			monductor->count++;
			return;
		}
		if (monductor->next == 0)
		{
			monductor->next = conductor;
			conductor->count = 1;
			return;
		}
		monductor = monductor->next;
	}
}

int exists(char* fname)
{
	FILE *file;
	if (file = fopen(fname, "r"))            // проверка дали файл съществува
	{                                        
		fclose(file);
		return 1;
	}
	return 0;
}

void findmaxgrad(int hashsize)
{
	FILE* d;
	int i;
	maxgrad.count = 0;
	struct node* conductor;
	for (i = 0; i < hashsize; i++)
	{                                 //намиране на града с най много фирми
		if (hash[i] == 0) continue;
		conductor = hash[i];
		for (;;)
		{
			if (conductor->count > maxgrad.count)
			{
				maxgrad.count = conductor->count;
				strcpy(maxgrad.grad, conductor->grad);
				if (exists("maxgrad.fir")) system("del maxgrad.fir");
				d = fopen("maxgrad.fir", "ab");
				fwrite(&maxgrad, sizeof(maxgrad), 1, d);
				fclose(d);
			}
			else if (conductor->count == maxgrad.count)
			{
				maxgrad.count = conductor->count;
				strcpy(maxgrad.grad, conductor->grad);
				d = fopen("maxgrad.fir", "ab");
				fwrite(&maxgrad, sizeof(maxgrad), 1, d);
				fclose(d);
			}
			if (conductor->next == 0) break;
			conductor = conductor->next;
		}
	}
}

void destroyhash(int hashsize)
{
	int i;
	struct node* conductor;
	struct node* monductor;
	for (i = 0; i < hashsize; i++)
	{
		if (hash[i] == 0) continue;           // разрушаване на хеша, за да нема мемори лийк
		conductor = hash[i];
		for (;;)
		{
			if (conductor->next == 0)
			{
				free(conductor);
				break;
			}
			monductor = conductor;
			conductor = conductor->next;
			free(monductor);
		}
	}
}

void grad_nai_bash()
{
	int i;
	for (i = 0; i < hashsize; i++)
	{
		hash[i] = 0;
	}
	FILE* d;
	d = fopen("firmi.fir", "rb");
	if (d == 0)
	{                                         // баш функцията за намиране на града с най много фирми
		printf("Базата данни е празна !!!");  // другите дет съм ги изкоментирал са помощни
		return;
	}
	for (;;)
	{
		fread(&f, sizeof(f), 1, d);
		if (feof(d)) break;
		strcpy(g.grad, f.grad);
		putinhash(g.grad, hashsize);
	}
	fclose(d);
	findmaxgrad(hashsize);
	destroyhash(hashsize);
}

void ocenkanomernula(char* ocenka)        //за извеждане на фирми по еднаква зададена
{                                         // оценка и данъчен номер завършващ на 0
	int length, i;
	FILE* d;
	d = fopen("firmi.fir", "rb");
	if (d == 0)
	{
		printf("Базата данни е празна !!!");
		return;
	}
	for (;;)
	{
		fread(&f, sizeof(f), 1, d);
		if (feof(d)) break;
		length = strlen(f.danachen_nomer);
		for (i = length - 1; (f.danachen_nomer[i] == '/r') && (f.danachen_nomer[i] == '/n'); i--)
		{

		}
		if ((strcmp(ocenka, f.ocenka) != 0) && (f.danachen_nomer[i] != '0')) continue;
		printdata();
	}
	fclose(d);
}

void printdata()
{
	printf("\n%s%s%s%s", f.ime, f.danachen_nomer, f.grad, f.ocenka);
}

void printgraddata()
{
	printf("\n%s%d\n", maxgrad.grad, maxgrad.count);
}

void printfile()
{
	FILE* d;                                // разни мазни помощни функции за извеждане
	d = fopen("firmi.fir", "rb");
	for (;;)
	{
		fread(&f, sizeof(f), 1, d);
		if (feof(d)) break;
		printdata();
	}
	fclose(d);
}

void printgradfile()
{
	FILE* d;
	d = fopen("maxgrad.fir", "rb");
	for (;;)
	{
		fread(&maxgrad, sizeof(maxgrad), 1, d);
		if (feof(d)) break;
		printgraddata();
	}
	fclose(d);
}

int main()
{
	FILE* d;
	char ocenka[32];
	char c;
	setlocale(LC_ALL, "bg_BG");
nachalo:
	fflush(stdin);
	printf("               Меню\n");
	printf("За да въведете нова фирма натиснете 1\n");
	printf("За да изведете името на града с най много фирми натиснете 2\n");
	printf("За да изведете списък с данните на всички фирми с дадена оценка,\n"
		"чийто данъчен номер завършва на 0 натиснете 3\n");
	printf("За да създадете нова база данни и да изтриете старата натиснете 4\n");
	printf("За да излезете от програмата натиснете 5\n");
	for (;;)
	{
		c = getchar();
		fflush(stdin);
		if (c == '5') break;
		if (c == '1')
		{
			for (;;)
			{
				appendnew();
				printf("Ще въвеждате ли още фирми д/н -> ");
				c = getchar();
				if ((c == 'н') || (c == 'Н'))
				{
					fflush(stdin);
					goto nachalo;
				}
				fflush(stdin);
			}
		}
		if (c == '2')
		{
			for (;;)
			{
				grad_nai_bash();
				printgradfile();
				printf("Натиснете \"enter\" за да изведете началното меню");
				getchar();
				goto nachalo;
			}
		}
		if (c == '3')
		{
			printf("Въведете оценка -> ");
			fgets(ocenka, 28, stdin);
			ocenkanomernula(ocenka);
			printf("Натиснете \"enter\" за да изведете началното меню");
			getchar();
			goto nachalo;
		}
		if (c == '4')
		{
			d = fopen("firmi.fir", "wb");
			fclose(d);
			d = fopen("maxgrad.fir", "wb");
			fclose(d);
			printf("Базата данни бе изтрита, ся шефа шти трий сол на тиквата !!!");
			printf("\nНатиснете \"enter\" за да изведете началното меню");
			getchar();
			goto nachalo;
		}
	}
	return 0;
}

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.