Untitled

 avatar
unknown
plain_text
2 years ago
5.1 kB
4
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

#define maxo 100
#define maxlo 50

char** o;
int nrorase = 1;
int maxorase = maxo;

char* citeste_oras() {
	char* o = (char*)malloc(maxlo * sizeof(char));
	printf("Introduceti un oras (minim 3 caractere, prima litera mare, restul litere mici): ");
	scanf("%s", o);

	if (strlen(o) < 3 || !isupper(o[0])) {
		printf("Orasul introdus nu respecta conditiile.\n");
		free(o);
		return NULL;
	}
	int i;
	for (i = 1; i < strlen(o); ++i) {
		if (!islower(o[i])) {
			printf("Orasul introdus nu respecta conditiile.\n");
			free(o);
			return NULL;
		}
	}
	return o;
}

void adauga_oras() {
	char* on = citeste_oras();
	if (on != NULL) {
		if (nrorase >= maxorase) {
			maxorase *= 2;
			o = (char**)realloc(o, maxorase * sizeof(char*));
		}
		o[nrorase++] = on;
		printf("Orasul adaugat: %s\n", on);
	}
}

void afiseaza_orase() {
	int i;
	printf("Lista de orase:\n");
	for (i = 1; i < nrorase; ++i) {
		printf("%d. %s\n", i, o[i]);
	}
}

void oras_maxcaractere() {
	int lmax = 0, i;
	char* ocl = NULL;

	for (i = 1; i < nrorase; ++i) {
		if (strlen(o[i]) > lmax) {
			lmax = strlen(o[i]);
			ocl = o[i];
		}
	}

	printf("Orasul cu cele mai multe caractere: %s\n", ocl);
}

void oras_mincaractere() {
	int lmin = maxlo + 1, i;
	char* ocs = NULL;

	for (i = 1; i < nrorase; ++i) {
		if (strlen(o[i]) < lmin) {
			lmin = strlen(o[i]);
			ocs = o[i];
		}
	}

	printf("Orasul cu cele mai putine caractere: %s\n", ocs);
}

void sortare_oraseAlfabetic() {
	int i, j;
	char** temp;
	for (i = 1; i < nrorase - 1; ++i) {
		for (j = i + 1; j < nrorase; ++j) {
			if (strcmp(o[i], o[j]) > 0) {
				temp = &o[i];
				o[i] = o[j];
				o[j] = *temp;
			}
		}
	}

	printf("Orasele in ordine alfabetica:\n");
	afiseaza_orase();
}

void lungime_oraseBinar() {
	int i, j;
	for (i = 1; i < nrorase; ++i) {
		printf("Orasul %s: ", o[i]);
		unsigned char l = strlen(o[i]);
		for (j = 7; j >= 0; --j) {
			printf("%d", (l >> j) & 1);
		}
		printf("\n");
	}
}

void oras_aparitiiA() {
	int maxap = 0, i, j;
	printf("Orasele cu cele mai multe aparitii ale caracterului 'a':\n");
	for (i = 1; i < nrorase; ++i) {
		int c = 0;
		for (j = 0; j < strlen(o[i]); ++j) {
			if (o[i][j] == 'a') {
				c++;
			}
		}
		if (c > maxap) {
			maxap = c;
		}
	}
	for (i = 1; i < nrorase; ++i) {
		int c = 0;
		for (j = 0; j < strlen(o[i]); ++j) {
			if (o[i][j] == 'a') {
				c++;
			}
		}
		if (c == maxap) {
			printf("%s\n", o[i]);
		}
	}
}

void copiere_ultimCaracter() {
	int l, i;
	printf("Ultimul caracter din fiecare oras:\n");
	for (i = 1; i < nrorase; ++i) {
		l = strlen(o[i]);
		printf("%c\n", o[i][l - 1]);
	}
}

void puteri2_ultimoras() {
	int pi, ps, l;
	l = strlen(o[nrorase - 1]);
	pi = 1;
	ps = 1;
	while (ps < l) {
		pi = ps;
		ps *= 2;
	}
	printf("Lungimea ultimului oras din sir se regaseste intre 2^%d si 2^%d.\n", (int)(log(pi) / log(2)), (int)(log(ps) / log(2)));
}

void media_aritmetica() {
	int i;
	double s = 0.0;
	for (i = 1; i < nrorase; ++i) {
		s += strlen(o[i]);
	}
	printf("Media aritmetica a lungimii oraselor din sir: %.2lf\n", s / (nrorase - 1));
}

void formeaza_cuvant() {
	int i;
	char* nc = (char*)malloc(nrorase * sizeof(char));
	for (i = 1; i < nrorase; ++i) {
		nc[i - 1] = o[i][0];
	}
	nc[nrorase - 1] = '\0';
	printf("Noul cuvant format din primul caracter al fiecarui oras: %s\n", nc);
	free(nc);
}

int main() {
	o = (char**)malloc(maxo * sizeof(char*));
	o[0] = strdup("Timisoara"); // Evitarea modificării unui șir literal

	int optiune;
	do {
		printf("0. Iesire\n");
		printf("1. Adaugare oras nou\n");
		printf("2. Afisarea oraselor\n");
		printf("3. Afisarea orasului cu cele mai multe caractere\n");
		printf("4. Afisarea orasului cu cele mai putine caractere\n");
		printf("5. Afisarea oraselor in ordine alfabetica\n");
		printf("6. Reprezentarea lungimii oraselor in binar\n");
		printf("7. Afisarea orasului/oraselor cu cele mai multe aparitii ale caracterului 'a'\n");
		printf("8. Copierea ultimului caracter din fiecare oras si afisarea acestuia\n");
		printf("9. Afisarea intre ce puteri ale lui 2 se regaseste lungimea ultimului oras din sir\n");
		printf("10. Calcularea mediei aritmetice a lungimii oraselor din sir\n");
		printf("11. Formarea unui nou cuvant din primul caracter al fiecarui oras\n");
		printf("Introduceti optiunea dvs.: ");
		scanf("%d", &optiune);

		switch (optiune) {
		case 0:
			printf("Iesire...\n");
			break;
		case 1:
			adauga_oras();
			break;
		case 2:
			afiseaza_orase();
			break;
		case 3:
			oras_maxcaractere();
			break;
		case 4:
			oras_mincaractere();
			break;
		case 5:
			sortare_oraseAlfabetic();
			break;
		case 6:
			lungime_oraseBinar();
			break;
		case 7:
			oras_aparitiiA();
			break;
		case 8:
			copiere_ultimCaracter();
			break;
		case 9:
			puteri2_ultimoras();
			break;
		case 10:
			media_aritmetica();
			break;
		case 11:
			formeaza_cuvant();
			break;
		default:
			printf("Optiune invalida. Incercati din nou.\n");
		}
	} while (optiune != 0);

	// Eliberarea memoriei
	for (int i = 0; i < nrorase; ++i) {
		free(o[i]);
	}
	free(o);
	return 0;
}
Editor is loading...
Leave a Comment