Trabalhando com Listas e C

Pessoal, após um exercíco de arquivos, lá vai um exercício de listas.

Faça uma lista ligada de funcionário
   codigo(int)
   nome (101 char)
   sexo(1 caracter – m/f)
   salario(float)

   Defina Funções
   a) inserir um funcionario na lista
   b) exibir os dados de todos os funcionários
   c) dado o codigo de um funcionário e uma porcentagem p, aumentar o salario deste funcionário em p%
   d) contar quantos funcionarios do sexo masculino e feminino ha na lista
   e) dado o codigo de um funcionario, remove-lo da lista
   f) somar o salario de todos os funcionario

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct no{
        int codigo;
        char nome[101];
        char sexo;
        float salario;
        struct no * prox;
}no;
void inserir (no ** lista, int cod, char nom[],char sex, float sal)
{
     no * aux;
     aux=(no*) malloc(sizeof(no));
     aux->codigo=cod; /* ->(seta) pq é enderço de mem.*/
     strcpy(aux->nome, nom);
     aux->sexo =sex;
     aux->salario=sal;
     aux->prox=*lista;
     *lista=aux;
}
void listar(no*lista)
{
     no * aux;
     aux=lista;
     while(aux!=NULL)
     {
         printf(" Cod: %d \n Nome: %s \n Sexo: %c \n Salario: %f \n\n", aux->codigo, aux->nome, aux->sexo, aux->salario);
         aux=aux->prox;       
     }
}
int porcentagem(no**lista)
{
    no* aux;
    aux=*lista;
    int p,c;
    if(aux==NULL)
    {
         printf("\nLista vazia");
         return(0);            
    }else{
          printf("\nDigite o codigo: ");
          scanf("%d",&c);
          printf("\nDigite a porcentagem: ");
          scanf("%d",&p);

          while(aux!=NULL){
              if(aux->codigo==c)
              {
                  aux->salario= aux->salario+(aux->salario*p/100);
                  free(aux);
                  return (1);
              }         
          }
    }   
}
void conta(no**lista)
{
     no*aux;
     aux=*lista;
     int fem=0, mas=0; 
     if(aux==NULL)
     {
          printf("\nLista vazia"); 
     }else{
           while(aux!=NULL)
           {
                 if((aux->sexo)=='f')
                 {
                       fem++;                  
                 }
                 if(aux->sexo=='m'){
                       mas++;
                 }     

                 aux=aux->prox;       
           }    
     }
     printf("\n Ha %d homen(s) e %d mulhere(s)\n\n", mas, fem);
}
void removeporcod(no**lista)
{
     no * ant=NULL;
     no * aux;
     aux=*lista;
     int cod;
     printf("Digite o codigo:");
     scanf("%d",&cod);
     if(aux==NULL){
         printf("Lista vazia");
     }else{
           while(aux!=NULL)
           {
               if(cod==aux->codigo)
               {
                   if(ant==NULL)
                   {
                        *lista=aux->prox;
                        free(aux);
                   }else{
                         ant->prox=aux->prox;
                         free(aux);
                   }
                   return;
               }else{               
                     ant=aux;
                     aux=aux->prox;             
               }                     
           }
     }   
}
void somasalario( no **lista ){
     no * aux;
     aux=*lista;
     float soma_salario=0;
     if(aux==NULL){
         printf("Lista vazia");
     }else{
          while(aux!=NULL){
                soma_salario=soma_salario+aux->salario; 
                aux=aux->prox;                     
          }
     }
     printf("A soma é: %f", soma_salario);
}
int main (){
    no*lista;
    int codigo;
    char nome[101];
    char sexo;
    float salario;

    int opcao, cod;
    lista=NULL; /*Null:define um end nulo, pois não cadastrei nada*/

    do{
        printf("\n Menu \n");
        printf("\n 1 - Inserir dados");
        printf("\n 2 - Listar dados");
        printf("\n 3 - Aumentar salario");
        printf("\n 4 - Contar por sexo");
        printf("\n 5 - Remove por codigo");
        printf("\n 6 - Somar salario");
        printf("\n 7 - Sair");
        printf("\n Digite a opcao desejada : ");
        scanf("\n %d",&opcao); 

        switch(opcao){
            case 1:
                printf("\n\n Digite o codigo: ");
                scanf("%d",&codigo);
                printf("\n Digite o nome: ");
                scanf("%s",&nome);
                printf("\n Digite o sexo (F/M): ");
                fflush(stdin);
                scanf("%c",&sexo);
                printf("\n Digite o salario: ");
                scanf("%f", &salario);               
                inserir(&lista,codigo,nome,sexo,salario);
                break;  
             case 2:
                listar(lista);
                break;
             case 3:
                porcentagem(&lista);
                break;
             case 4:
                conta(&lista);
                break;
             case 5:
                removeporcod(&lista);
                break;
             case 6:
                somasalario(&lista);
                break;
             }
     }while(opcao!=7);
}

Bons estudos a todos!

Trabalhando com Arquivos em C

Galera, espero que estejam aproveitando os exercícios, hoje postarei um dos difíceis.

1- Faça um programa para manipular os dados de funcionários de uma empresa em um arquivo binário com registros com o seguinte formato:
- código (int)
- nome (101 caracteres)
- sexo (1 caracter => M/F)
- salário (float)
Defina funções para:
a) Inserir um funcionário no arquivo;
b) Exibir os dados de todos os funcionários;
c) Dado o código de um funcionário e uma porcentagem (p), aumentar o salário do funcionário em p %;
d) Contar quantos funcionários do sexo masculino (M) e feminino (F) há cadastrados;
e) Somar o salário de todos os funcionários;
f) Crie dois arquivos binários separando os funcionários:
- do sexo masculino devem ser gravados no arquivo “masc.dat”;
- do sexo feminino devem ser gravados no arquivo “fem.dat”.
g) Crie dois arquivos texto (formatados – fprintf) separando os funcionários:
- salário menor que 1000 reais devem ser gravados no arquivo “menor.txt”;
- salário maior ou igual a 1000 reais devem ser gravados no arquivo “maior.txt”.

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct func{
        int codigo;
        char nome[101];
        char sexo;
        float salario;
}func;
void grava_registro()
{
     func F;
     FILE * arquivo; 
     printf("\n\nDigite o codigo: ");
     scanf("%d",&F.codigo); 
     printf("\nDigite o nome: ");
     fflush(stdin);
     gets(F.nome);
     printf("\nDigite o sexo (F/M): ");
     scanf("%c",&F.sexo);
     printf("\nDigite o salario: ");
     scanf("%f",&F.salario);
     arquivo=fopen("funcionario.dat", "ab");
     if (arquivo == NULL) {
         arquivo = fopen("funcionario.dat", "wb");     
         if (arquivo == NULL) {
              printf("Erro abrindo arquivo");
              getch();
              exit(0);
         }
     }
     fwrite(&F, sizeof(F), 1,arquivo);
     fclose(arquivo);    
}
void listar()
{
     func F;
     FILE *arquivo;
     arquivo=fopen("funcionario.dat","rb");
     if(arquivo ==NULL){
          printf("Erro ao abrir o arquivo");
          getch();
          exit(0);
     }else{
           fread(&F, sizeof(F), 1, arquivo);
           while(!feof(arquivo))
           {
                printf("Codigo: %d \n Nome: %s \n Sexo: %c \n Salario: %f", F.codigo, F.nome, F.sexo, F.salario);
                fread(&F, sizeof(F),1,arquivo);                              
           }
           fclose(arquivo);
     }

}
void p_salario()
{
     int cod, porc;
     func F;
     FILE * arquivo;
     arquivo=fopen("funcionario.dat","r+b");
     if(arquivo==NULL)
     {
           printf("Erro ao abrir o arquivo");
     }else{
           printf("\n Digite o cod do funcionario a ser alterado: ");
           scanf("%d",&cod);
           printf("\n Digite a porcentagem: ");
           scanf("%d",&porc);
           fread(&F,sizeof(F),1,arquivo);
           while(!feof(arquivo))
           {
                if(F.codigo==cod)
                {
                     F.salario=F.salario+(F.salario*(porc/100));
                     fseek(arquivo,-sizeof(F),1);              
                     fwrite(&F, sizeof(F), 1,arquivo);
                     fclose(arquivo);
                     return;
                }
                fread(&F,sizeof(F),1,arquivo);

           }
           fclose(arquivo);
     }   
}
void conta()
{

  func F;
  FILE * arquivo;
  int Masc=0, Fem=0;
  arquivo=fopen("funcionario.dat","rb");
  if(arquivo==NULL)
  {
      printf("Erro ao abrir o arquivo");
  }else{
  fread(&F,sizeof(F),1,arquivo);
  while(!feof(arquivo)) 
  {
      if(F.sexo=='m')
      {
         Masc++;  
       }
      if(F.sexo=='f'){
         Fem++;
      }   
      fread(&F,sizeof(F),1,arquivo);

  }   
  printf("\n\nHa %d homens e %d mulheres cadastradas no sistema", Masc, Fem);
  fclose(arquivo);
  }     
}
void soma_salario()
{
  float soma=0;
  func F;
  FILE * arquivo;
  arquivo=fopen("funcionario.dat","rb");
  if(arquivo==NULL){
      printf("Erro ao abrir o arquivo");
  }else{
      fread(&F, sizeof(F),1,arquivo);
      while(!feof(arquivo)){
           soma=soma+F.salario;  
           fread(&F,sizeof(F),1,arquivo);                       
      }  
      printf("A soma dos salarios é: %f", soma); 
      fclose(arquivo);
  } 

}
void separa_arquivo()
{
     func F, Fem, Masc;
     FILE * arquivo;
     FILE * arquivoFem;
     FILE * arquivoMasc;
     arquivo=fopen("funcionario.dat","rb");
     arquivoMasc = fopen("masc.dat", "a+b");
     arquivoFem = fopen("fem.dat", "a+b");
     if(arquivo==NULL){
           printf("Erro ao abrir o arquivo");
     }else{
           fread(&F,sizeof(F),1,arquivo);
           while(!feof(arquivo))
           {
               if(F.sexo=='f')
               {
                  fwrite(&F, sizeof(F),1, arquivoFem);           
               }
               if(F.sexo=='m'){
                  fwrite(&F, sizeof(F),1, arquivoMasc);                         
               }
               fread(&F,sizeof(F),1,arquivo);                                        
           }          
           fclose(arquivo);
           fclose(arquivoFem);
           fclose(arquivoMasc);
     }
}
void arquivo_1000()
{
    func F;
    FILE * arquivo;
    FILE * arquivoMaior;
    FILE * arquivoMenor;

    arquivo=fopen("funcionario.dat","rb");
    arquivoMaior=fopen("maior.txt","w");
    arquivoMenor=fopen("menor.txt","w");
     if(arquivo==NULL){
           printf("Erro ao abrir o arquivo");
     }else{
           fread(&F,sizeof(F),1,arquivo);
           while(!feof(arquivo))
           {
               if(F.salario>1000)
               {
                   fprintf(arquivoMaior, " Codigo: %d \n Nome: %s \n Sexo: %c \n Salario: %f \n\n\n", F.codigo, F.nome, F.sexo, F.salario);
               }else{
                   fprintf(arquivoMenor, " Codigo: %d \n Nome: %s \n Sexo: %c \n Salario: %f \n\n\n", F.codigo, F.nome, F.sexo, F.salario);
               }              
               fread(&F,sizeof(F),1,arquivo);
           }
           fclose(arquivo);
           fclose(arquivoMaior);
           fclose(arquivoMenor);
     }                  
}
int main()
{
  int op;
  do{
        printf(" **********Cadastro de funcionarios**********\n 1-Inserir um funcionario\n 2-Exibir funcionarios\n 3-Aumentar salario\n 4-Conta Masculino e Feminino\n 5-Soma Salario\n 6-Separar arquivo(FEM- MASC)\n 7-Seperar arquivo >1000<\n 8-Sair\n\n\n Digite a opcao desejada: ");
        scanf("%d", &op);
        switch(op){
        case 1: grava_registro();
        break;             
        case 2: listar();
        break;
        case 3: p_salario();
        break;
        case 4: conta();
        break;
        case 5: soma_salario();
        break;
        case 6: separa_arquivo();
        break;
        case 7: arquivo_1000();
        break;
        }
    }while(op!=8);
  return 0;
}   

 Abraços a todos!

Funções

Olá pessoal, começarei uma serie de posts diferentes dos anteriores, estes novos serão destinados a todos que estão procurando exercícios  básicos e avançados sobre lógica e programação em linguagem C e  principalmente para o pessoal da Fatec Americana que estão fazendo a matéria Programação 2 com o professor Carrilho e querem ver a resolução de alguns exercícios e se prepararem para as “provinhas” dele, que não são nada fáceis e exigem muito estudo e dedicação.

Abaixo os exercícios sobre funções e suas resoluções.

1. Faça uma função em C que recebe como parâmetro um número inteiro e calcula o seu fatorial, retornando este valor. 

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
int fatorial(int n)
{
       int fat, total=1;
       for(fat=1;fat<=n; fat++){
               total*=fat;
       }
       return (total);          
}
main(){
       int n;
       printf("Informe o numero a ser calculado o N!:" );
       scanf("%d",&n);      
       printf("\n\nO N! de %d eh: %d", n, fatorial(n)); 
       getch(); 
} 
 

2. Escreva uma função em C que recebe três parâmetros (peso, altura e sexo) e verifica se a pessoa está acima do peso ideal. Deve-se pegar o peso dividido pelo quadrado da altura. Se o valor (índice de massa corporal – IMC) estiver acima de 25 a pessoa está acima do peso.

#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
float calcula (float peso, float altura, char sexo[1])
{
   float imc;
   imc=peso/(altura*altura);
   return(imc);
}
main()
{
      float peso, altura,imc;
      char sexo[1];
      printf("Digite o peso: ");
      scanf("%f",&peso);
      printf("\n\nDigite a altura: ");
      scanf("%f",&altura);
      printf("\n\nDigite o sexo: (f = feminino / m = masculino) ");
      scanf("%s",&sexo);     
      imc=calcula(peso,altura,sexo);  
      if(imc>25)
      {
          printf("\n\nVoce esta acima do peso, seu imc eh: %5.3f", imc);
      }else{
          printf("\n\nParabens!! Seu imc eh: %5.3f", imc);
      }
      getch();     
}

3. Escreva uma função em C que recebe um vetor de notas de alunos e seu tamanho e imprime a maior e menor nota bem como a média desta turma.

#include<conio.h>
#include<stdio.h>
#define alunos 100
void calcula (float notas[], int tam)
{
      int i;
      float maior=0, menor, media=0;
      menor=notas[1];
      for(i=0; i<tam; i++)
      {
             media = media + notas[i];
             if(notas[i]>maior)
             {
                       maior=notas[i];
             }
                       if(notas[i]<menor)
             {
                       menor=notas[i];      
             }
      }
      media=media/tam;
      printf("\n\n A media das notas eh: %5.3f", media);
      printf("\n\n A maior nota eh: %5.3f", maior);
      printf("\n\n A menor nota eh: %5.3f", menor);     
} 
int main()
{
      int i, tam;
      float notas[alunos];     
      printf("Digite quantos alunos: ");
      scanf("%d",&tam);  
      for(i=0; i<tam; i++)
      {
               printf("Digite a nota do aluno %d : ", i+1);
               scanf("%f",&notas[i]);              
      }
      calcula(notas, tam);      
      getch();  
}

4.Escreva uma função que recebe três números inteiros(A, B e C) e ordena esses elementos, retornando esses elementos em ordem crescente (A <= B <= C).

#include <conio.h>
#include <stdio.h>
void ordenar(int a=0, int b=0, int c=0)
{
   int aa, bb, cc;
   if(a<b && a<c)
   {
          a=aa;
          if(b<c)
          {
                  b=bb;
                  c=cc;
          }
   }
   printf("\n%d", aa);
   printf("\n%d", bb);
   printf("\n%d", cc);
}
main()
{
    int a,b,c;
    printf("Informe o nr1: ");
    scanf("%d",& a);
    printf("\nInforme o nr2: ");
    scanf("%d",& b);
    printf("\nInforme o nr3: ");
    scanf("%d",& b);
    ordenar(a,b,c);
    getch();
}

5. Defina uma função que recebe o inteiro N e calcula a seguinte somatória : 1/ 2 + 1/ 4 + 1/ 8 + … + 1/ 2n

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
void calc (int x){
     int i;
     float soma=0;
     for(i=1;i<=x;i++)
     {
             soma=soma+(1.0/pow(2,i));
    }
    printf ("A soma e: %f", soma);
}
int main () {
      int n;
      printf ("Digite um numero: ");
      scanf ("%d",&n);
      calc(n);  
      getch();
}

6. Escreva uma função que imprime os N primeiros elementos da seguinte seqüência de progressão aritmética: 1 && 5 && 9 && 13 …

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void pa(int n)
{
     int i, j=1;
     for(i=0;i<n;i++)
     {                   
           printf("%d && ", j);
            j=j+4;    
    }   
}
main()
{
   int n;
   printf("Digite um número: ");
   scanf("%d",&n);
   pa(n);
   getch();           
}

7. Faça uma função que imprima n elementos de uma PG que inicia-se com 2 e a razão é 3, isto é, imprima a seqüência: 2, 6, 18, 54, …

#include<conio.h>
#include<stdio.h>
void pg(int n)
{
     int i;
     printf("2 ");
     for(i=3; i <n+2; i++)
     {
         printf(" %d ", i*3);         
     }
}
main(){
      int n;
      printf("Digite quantos elementos seram impressos: ");
      scanf("%d",&n);
      pg(n);   
      getch();
}

8. Construa uma função que recebe um número N e imprime a seqüência definida : 1 – 2 – 3 – 4 – … – n.

#include<conio.h>
#include<stdio.h>
void seq(int n)
{
    int i;
    for(i=1; i<n+1; i++)
    {
        printf("- %d ", i);       
    }    
}
main(){
  int n;
  printf("Digite os quantos numeros: ");
  scanf("%d",&n);
  seq(n);
  getch();     
}

9. Faça uma função que calcule o produtório dos elementos de um vetor. A função deve receber o vetor e seu tamanho como parâmetros.

#include<conio.h>
#include<stdio.h>
#define tam 100
float produto(int lista[], int n)
{
     int i;
     float prod=1;
     for(i=0; i<n; i++)
    {
          prod*= lista[i];
     } 
     return (prod);       
}
main(){
     int lista[tam], n, i;
     printf(" Digite o tamanho do seu vetor: \n");
     scanf("%d",&n);
     for(i=0; i<n; i++)
     {
          printf(" Digite o %d nr: ", i+1);
          scanf("%d",&lista[i]);     
     }  
     printf("\n\n O produto é: %5.2f",produto(lista, n));
     getch();      
}

 10. Escreva uma função que recebe um vetor de inteiros e ordena esses elementos em ordem crescente.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define tam 100
void ordena_cresc (int n, int cresc[] ){
    int aux,i,j;
    for(i=0;i<n;i++){
       for(j=i+1;j<n;j++){           
         if (cresc[i] > cresc[j]){
            aux= cresc[i];
            cresc[i] = cresc[j];
            cresc[j]=aux;
         }
     }
}
   for(i=0;i<n;i++){
       printf("%d", cresc [i]);
   }
}
int main () {
     int i, cresc[tam], n;
     do {
          printf ("Digite a quantidade de numeros:");
          scanf ("%d",&n);
     } while ((n<0) || (n>100));
     for(i=0;i<n;i++){
     printf ("\nDigite um numero: ");
     scanf ("%d",&cresc[i]);
}
ordena_cresc(n, cresc);
     getch();
}

11. Escreva uma função que receba 3 matrizes (A, B, C) e duas dimensões (numero de linhas e numero de colunas equivalentes para as três matrizes). Sua função deve somar as matrizes A e B e armazenar o resultado na matriz C.

#include<conio.h>
#include<stdio.h>
#define l 50
#define c 50
int somar (int matrizA[][col], int matrizB[][col],int matrizC[][col], int lin, int col)
{
    int i, j;
    for(i=0;i<lin;i++)
   {
         for(j=0;j<col;j++)
         {
                 matrizC[i][j]=matrizA[i][j]+matrizB[i][j];
                 printf("  %d",&matrizC[i][j]);
         }
   }  
}
main()
{
int matrizA[l][c], matrizB[l][c], matrizC[l][c], lin, col, i, j;
printf("Digite o numero de linhas: ");
scanf("%d",&lin);    
printf("\nDigite o numero de colunas: ");
scanf("%d",&col);
for(i=0;i<lin;i++)
{
         for(j=0;j<col;j++)
         {
                printf("\nDigite o valor para a matriz A (%dx%d): ", i,j);
                scanf("%d",&matrizA[i][j]);
         }
}
for(i=0;i<lin;i++)
{
         for(j=0;j<col;j++)
         {
                  printf("\nDigite o valor para a matriz B (%dx%d): ", i,j);
                 scanf("%d",&matrizB[i][j]);
          }
}
 for(i=0;i<lin;i++)
 {
         for(j=0;j<col;j++)
         {
                 printf("\nDigite o valor para a matriz C (%dx%d): ", i,j);
                 scanf("%d",&matrizC[i][j]);
         }
  }  
  somar(matrizA[col],matrizB[col],matrizC[col],lin,col); 
  getch();      
}

12. Escreva uma função que recebe uma string (str) e um caracter qualquer (car) e retorna a primeira posição da string onde este caracter está armazenado ou retorna -1 se o caracter não estiver na string.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
int cal (char palavra[], char car){
     int i;
     for(i=0;i<strlen(palavra);i++){
           if (palavra[i]==car)
           {
                 return (i);            
           }                        
     }
     return (-1);
}         
int main(){
     char palavra[101];
     char car;
     printf ("Digite uma palavra:");
     scanf ("%s",&palavra);
     printf ("Digite um caracter:");
     fflush (stdin);
     scanf ("%c",&car);
     printf ("A posicao eh:%d",cal(palavra,car));
     getch();
} 

Até o próximo post que terá  exercícios mais avançados, preparem-se.

Abraços

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 155 other followers