Jump to content

Trabalho Linguagem C - Estruturas E Ponteiros


Karbust
 Share

Recommended Posts

Boas pessoal

 

Venho aqui postar o meu mais recente trabalho de avaliação para a aula de linguagens de programação

 

 

 

 

#include <stdio.h>

#include <conio.h>

#include <string.h>

 

struct trabalhador

{

int id_trabalhador;

char nome[50];

int idade;

char morada[30];

float salario_bruto;

float percentagem_irs;

float percentagem_tsu;

char departamento[50];

float valor_irs;

float valor_tsu;

float salario_liquido;

 

};

 

#define num_trabalhadores 100

 

struct trabalhador x[num_trabalhadores];

 

alterar_struct(int id_trab)

{

printf("%d\n\n", id_trab);

 

int idade2;

float salario_bruto2, salario_liquido2, percentagem_irs2, percentagem_tsu2, valor_tsu2, valor_irs2;

char nome2[50], morada2[30], departamento2[50];

 

printf("ATENCAO: Quando pretender manter o valor anterior introduza 0!\n\n");

 

//-------------------------------------------------------------------------------------------------

 

printf("Introduza o um novo nome para o trabalhador %d: ", id_trab);

scanf(" %s", &nome2);

 

//printf("%s\n", nome2);

 

if(nome2 == "0")

{

return;

}

else

{

strcpy((x+(id_trab-1))->nome,nome2);

}

 

//-------------------------------------------------------------------------------------------------

 

printf("Introduza uma nova idade para o trabalhador %d: ", id_trab);

scanf("%d", &idade2);

 

if(idade2 == 0)

{

return;

}

else

{

(x+(id_trab-1))->idade = idade2;

}

 

//-------------------------------------------------------------------------------------------------

 

printf("Introduza uma nova morada para o trabalhador %d: ", id_trab);

scanf(" %s", &morada2);

 

if(morada2 == "0")

{

return;

}

else

{

strcpy((x+(id_trab-1))->morada,morada2);

}

 

//-------------------------------------------------------------------------------------------------

 

printf("Introduza um novo departamento para o trabalhador %d: ", id_trab);

scanf(" %s", &departamento2);

 

if(departamento2 == "0")

{

return;

}

else

{

strcpy((x+(id_trab-1))->departamento,departamento2);

}

 

//-------------------------------------------------------------------------------------------------

 

printf("Introduza uma nova percentagem de IRS para o trabalhador %d (ex: 10%c = 0.10): ", id_trab);

scanf("%f", &percentagem_irs2);

 

if(percentagem_irs2 == 0)

{

return;

}

else

{

(x+(id_trab-1))->percentagem_irs = percentagem_irs2;

}

 

//-------------------------------------------------------------------------------------------------

 

printf("Introduza uma nova percentagem de TSU para o trabalhador %d (ex: 10%c = 0.10): ", id_trab);

scanf("%f", &percentagem_tsu2);

 

if(percentagem_tsu2 == 0)

{

return;

}

else

{

(x+(id_trab-1))->percentagem_tsu = percentagem_tsu2;

}

 

//-------------------------------------------------------------------------------------------------

 

printf("Introduza um novo salario bruto para o trabalhador %d: ", id_trab);

scanf("%f", &salario_bruto2);

 

if(salario_bruto2 == 0)

{

return;

}

else

{

(x+(id_trab-1))->salario_bruto = salario_bruto2;

 

(x+(id_trab-1))->valor_irs = (x+(id_trab-1))->salario_bruto * (x+(id_trab-1))->percentagem_irs;

 

(x+(id_trab-1))->valor_tsu = (x+(id_trab-1))->salario_bruto * (x+(id_trab-1))->percentagem_tsu;

 

(x+(id_trab-1))->salario_liquido = (x+(id_trab-1))->salario_bruto - ((x+(id_trab-1))->valor_irs + (x+(id_trab-1))->valor_tsu);

}

 

//-------------------------------------------------------------------------------------------------

 

printf("Trabalhador %d editado com sucesso!", id_trab);

}

 

eliminar_dado(int id)

{

strcpy((x+(id-1))->nome,"");

 

(x+(id-1))->idade = 0;

 

strcpy((x+(id-1))->morada,"");

 

(x+(id-1))->salario_bruto = 0;

 

(x+(id-1))->percentagem_irs = 0;

 

(x+(id-1))->percentagem_tsu = 0;

 

strcpy((x+(id-1))->departamento,"");

 

(x+(id-1))->valor_irs = 0;

 

(x+(id-1))->valor_tsu = 0;

 

(x+(id-1))->salario_liquido = 0;

 

(x+(id-1))->id_trabalhador = 0;

}

 

main()

{

int opcao, op, id, num_dados;

int i;

 

do

{

printf("Menu:\n");

printf("1 - Inserir dados\n");

printf("2 - Listagem geral dos dados\n");

printf("3 - Consultar dados e alterar dados\n");

printf("4 - Alterar dados\n");

printf("5 - Eliminar dado\n");

printf("6 - Sair\n");

printf("Insira o numero da opcao: ");

scanf("%d",&opcao);

printf("\n");

 

switch(opcao)

{

case 1:

 

printf("Quantos dados pretende inserir? ");

scanf("%d",&num_dados);

 

if(num_dados <= 0 || num_dados > num_trabalhadores)

{

printf("So pode inserir valores entre 1 e %d", num_trabalhadores);

}

 

else

{

for(i=0; i < num_dados; i++)

{

int id_trabalhador_antes;

int *id_trabalhador_antes_ponteiro;

 

printf("\nInsira o id do trabalhador %d: ", i+1);

scanf("%d",&id_trabalhador_antes);

 

id_trabalhador_antes_ponteiro = id_trabalhador_antes;

 

if(id_trabalhador_antes_ponteiro <= 0)

{

printf("Os valores tem de ser maiores que 0.");

 

getch();

 

break;

}

 

int i2;

 

for(i2=0; i2 < num_trabalhadores; i2++)

{

if((x+i2)->id_trabalhador == id_trabalhador_antes_ponteiro)

{

printf("Ja existe um trabalhador com esse id!");

 

getch();

 

system("cls");

 

main();

}

else

{

(x+i)->id_trabalhador=id_trabalhador_antes_ponteiro;

}

}

 

printf("Insira o nome do trabalhador %d: ", i+1);

//scanf(" %s",&x.nome);

scanf("%s",&(x+i)->nome);

 

printf("Insira a idade do trabalhador %d: ", i+1);

scanf("%d",&(x+i)->idade);

 

printf("Insira a morada do trabalhador %d: ", i+1);

scanf("%s",&(x+i)->morada);

 

printf("Insira o salario bruto do trabalhador %d: ", i+1);

scanf("%f",&(x+i)->salario_bruto);

 

printf("Insira a percentagem de IRS do trabalhador %d (ex: 10%c = 0.10): ", i+1, 37);

scanf("%f",&(x+i)->percentagem_irs);

 

printf("Insira a percentagem de TSU do trabalhador %d (ex: 10%c = 0.10): ", i+1, 37);

scanf("%f",&(x+i)->percentagem_tsu);

 

printf("Insira o nome do departamento do trabalhador %d: ", i+1);

scanf("%s", &(x+i)->departamento);

 

(x+i)->valor_irs = (x+i)->salario_bruto * (x+i)->percentagem_irs;

 

(x+i)->valor_tsu = (x+i)->salario_bruto * (x+i)->percentagem_tsu;

 

(x+i)->salario_liquido = (x+i)->salario_bruto - ((x+i)->valor_irs + (x+i)->valor_tsu);

 

system("cls");

}

}

 

break;

 

case 2:

 

if(num_dados <= 10)

{

for(i=0; i < num_dados; i++)

{

printf("ID Trabalhador: %d\n", (x+i)->id_trabalhador);

printf("Nome: %s\n", (x+i)->nome);

printf("Idade: %d\n", (x+i)->idade);

printf("Morada: %s\n", (x+i)->morada);

printf("Departamento: %s\n", (x+i)->departamento);

printf("Salario Bruto: %.2f\n", (x+i)->salario_bruto);

printf("Percentagem IRS: %.2f\n", (x+i)->percentagem_irs);

printf("Percentagem TSU: %.2f\n", (x+i)->percentagem_tsu);

printf("Valor IRS: %.2f\n", (x+i)->valor_irs);

printf("Valor TSU: %.2f\n", (x+i)->valor_tsu);

printf("Salario Liquido: %.2f\n\n", (x+i)->salario_liquido);

}

}

 

else if(num_dados > 10)

{

for(i=0; i < num_dados; i++)

{

if(i % 10 == 0)

{

getch();

}

 

printf("ID Trabalhador: %d\n", (x+i)->id_trabalhador+1);

printf("Nome: %s\n", (x+i)->nome);

printf("Idade: %d\n", (x+i)->idade);

printf("Morada: %s\n", (x+i)->morada);

printf("Departamento: %s\n", (x+i)->departamento);

printf("Salario Bruto: %.2f\n", (x+i)->salario_bruto);

printf("Percentagem IRS: %.2f\n", (x+i)->percentagem_irs);

printf("Percentagem TSU: %.2f\n", (x+i)->percentagem_tsu);

printf("Valor IRS: %.2f\n", (x+i)->valor_irs);

printf("Valor TSU: %.2f\n", (x+i)->valor_tsu);

printf("Salario Liquido: %.2f\n\n", (x+i)->salario_liquido);

}

}

 

getch();

 

system("cls");

 

break;

 

case 3:

 

printf("Introduza o id de trabalhador que pretende visualizar: ");

scanf("%d",&id);

 

printf("ID Trabalhador: %d\n", (x+(id-1))->id_trabalhador);

printf("Nome: %s\n", (x+(id-1))->nome);

printf("Idade: %d\n",(x+(id-1))->idade);

printf("Morada: %s\n", (x+(id-1))->morada);

printf("Departamento: %s\n", (x+(id-1))->departamento);

printf("Salario Bruto: %.2f\n", (x+(id-1))->salario_bruto);

printf("Percentagem IRS: %.2f\n", (x+(id-1))->percentagem_irs);

printf("Percentagem TSU: %.2f\n", (x+(id-1))->percentagem_tsu);

printf("Valor IRS: %.2f\n", (x+(id-1))->valor_irs);

printf("Valor TSU: %.2f\n", (x+(id-1))->valor_tsu);

printf("Salario Liquido: %.2f\n\n", (x+(id-1))->salario_liquido);

 

getch();

 

printf("Pretende editar os dados do trabalhador?\n");

printf("1 - Sim\n");

printf("2 - Nao\n");

scanf("%d",&op);

 

if(op == 1)

{

alterar_struct(id);

}

else if (op == 2)

{

system("cls");

}

else

{

printf("Opcao Invalida!");

}

 

break;

 

case 4:

printf("Introduza o id de trabalhador que pretende alterar: ");

scanf("%d",&id);

 

alterar_struct(id);

 

system("cls");

 

break;

 

case 5:

printf("Introduza o id de trabalhador que pretende remover: ");

scanf("%d",&id);

 

eliminar_dado(id);

 

getch();

 

system("cls");

 

break;

 

case 6:

exit(0);

 

break;

}

} while(opcao != 6);

 

}

 

 

 

 

 

Link no Pastebin http://pastebin.com/FakrKAut

 

Qualquer dúvida, digam :p

 

Abraço

Link to comment
Share on other sites

 

Só um tip: quando um if (ao ser true ou false) só chama uma função, não precisas de usar as chavetas.

Ex:

if (cond)

return;

 

Eu sei, mas estou mais habituado assim, é uma questão de organização para mim...

 

Mas obrigado pela dica ;)

Link to comment
Share on other sites

Visto que no teu trabalho implementaste estruturas e ponteiros não podias ter brincado com Malloc's e Free's ?

 

Por exemplo em vez de declarares o teu vetor principal onde metes toda a informação: x[num_trabalhadores] podias ter feito já em notação de ponteiros *x e depois farias talvez uma função de inicialização do teu vetor para lhe dar os bytes necessários através do malloc.

 

Aspeto/sugestão: Penso eu(ainda não sou pro na àrea xD) que normalmente quando usas estruturas tens de encapsular a tua informação ao máximo para o utilizador não saber o que andas a fazer por exemplo: Criares Operações Básicas para a tua estrutura e.g: Função que Remove/Adiciona/Procura um trabalhador ou quem sabe uma Função que ordene o teu vetor por ordem alfabética do departamento num ficheiro à parte que depois compilavas e juntava tudo.

 

Por fim resta-me dizer que existem estruturas melhores que vetores para o teu programa ser mais eficiente por exemplo em termos de procura de um certo elemento que o utilizador queira como: Listas Simplesmente/Duplamente Ligadas, HashTables e Arvores(AVL, Binária, RedBlack).

 

PS: Eu dei estas sugestões mas não sei qual era o objetivo do teu trabalho ao certo, de qualquer forma mais uma vez gostei da tua partilha dado que implementaste pequenas coisas que eu não sabia como a inclusão da biblioteca <conio.h> e de alguns comandos como: getch() e o system().

Link to comment
Share on other sites

 

Visto que no teu trabalho implementaste estruturas e ponteiros não podias ter brincado com Malloc's e Free's ?

 

Por exemplo em vez de declarares o teu vetor principal onde metes toda a informação: x[num_trabalhadores] podias ter feito já em notação de ponteiros *x e depois farias talvez uma função de inicialização do teu vetor para lhe dar os bytes necessários através do malloc.

 

Aspeto/sugestão: Penso eu(ainda não sou pro na àrea xD) que normalmente quando usas estruturas tens de encapsular a tua informação ao máximo para o utilizador não saber o que andas a fazer por exemplo: Criares Operações Básicas para a tua estrutura e.g: Função que Remove/Adiciona/Procura um trabalhador ou quem sabe uma Função que ordene o teu vetor por ordem alfabética do departamento num ficheiro à parte que depois compilavas e juntava tudo.

 

Por fim resta-me dizer que existem estruturas melhores que vetores para o teu programa ser mais eficiente por exemplo em termos de procura de um certo elemento que o utilizador queira como: Listas Simplesmente/Duplamente Ligadas, HashTables e Arvores(AVL, Binária, RedBlack).

 

PS: Eu dei estas sugestões mas não sei qual era o objetivo do teu trabalho ao certo, de qualquer forma mais uma vez gostei da tua partilha dado que implementaste pequenas coisas que eu não sabia como a inclusão da biblioteca <conio.h> e de alguns comandos como: getch() e o system().

 

 

O objetivo do meu trabalho era englobar a matéria dada até ao módulo em que estou (6 ou 7 acho eu >.<), e foi isso que fiz, a função malloc e os free's ainda não dei, e essas listas de que aí falaste não sei o que são >.<

 

Na biblioteca conio.h só a uso para a função getch(), que faz o mesmo que return 0; acho eu, apenas serve para parar o programa para se poder ver o output, e quando se quer continua basta clicar numa tecla qualquer...

 

Essa de ordenar por ordem alfabética nem me lembrei, talvez venha a fazer num próximo trabalho, acho que agora vamos dar ficheiros, posso até fazer um import de um ficheiro txt fazendo de base de dados, guardando depois na estrutura para a execução e talvez possa ordenar por ordem alfabética no ficheiro...

Link to comment
Share on other sites

O meu segundo projeto de algoritmos foi fazer um programa que tendo só 4-5 comandos era fazer um buffer de hashtags como o twitter faz. Por exemplo recebendo frases tem de selecionar só as hashtags e fazer algo com elas. O problema do projeto é sobretudo eficiência e não a dificuldade em si. Se nos for dado mais de 1kk de hashtags convém que a coisa corra rápido e que não use muita memória :p

Link to comment
Share on other sites

 

O meu segundo projeto de algoritmos foi fazer um programa que tendo só 4-5 comandos era fazer um buffer de hashtags como o twitter faz. Por exemplo recebendo frases tem de selecionar só as hashtags e fazer algo com elas. O problema do projeto é sobretudo eficiência e não a dificuldade em si. Se nos for dado mais de 1kk de hashtags convém que a coisa corra rápido e que não use muita memória :p

 

 

O meu professor não quer avançar muito no C, ele diz que esta linguagem já não é usada por nenhuma empresa... Ele está à espera que instalem o Visual Studio nos pc's da escola para começar com o C#

Link to comment
Share on other sites

Pois isso tem a ver com cada escola xD Eu faço o que me pedem e pronto, vivemos felizes para sempre. Mas é certo que se começares com C vais saber trabalhar melhor com C++ e C#, porque convém começares no mais básico e depois é só aprenderes os pormenores das outras linguagens que advêm do C :p

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...