Ir ao conteúdo
  • Cadastre-se

C Programa na linguagem c


Posts recomendados

Não estou conseguindo fazer esse exercicio proposto pelo professor, já que minha media está dando erro e eu ainda não entendi direto o que é realloc (alguém pode me ajudar? Sou nova 


*Meu programa até o momento*

 

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

int main(void) {
    
    setlocale(LC_ALL,"");
    float *salario, soma=0, media=0.0;
    int quantidadef = 1 , i, pessoas = 0;
    
    printf("\nQuantos funcionarios são: ");
    scanf("%d", &quantidadef);
    
  salario =calloc (quantidadef, sizeof(float));

    for(i=0;i<quantidadef;i++){
        printf("\nEntre com o salario %i: ", i+1);
        scanf("%f", &*salario);
        
        media = (pessoas + *salario)/ quantidadef;
     
    }
    printf("\nA média dos salário é: %.2f", media);

    free(salario);
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Larissa Firmino      para usar o realloc , antes use o malloc , e seu código com algumas modificações poderia ser assim  :

#define _WIN32_WINNT 0x500
#define H GetStdHandle(STD_OUTPUT_HANDLE)
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
void textcolor_2(int l, int f){SetConsoleTextAttribute(H,l+(f<<4));}
int main(){
    setlocale(LC_ALL,"");
    float *salario, soma=0, media=0.0;
    int quantidadef = 1 ,j, i, pessoas = 0,cont=0,aux;
    salario = malloc (1000 * sizeof (float));   /* reserva mil posições na memória */
    salario = (float *) realloc(salario,2500);  /* realoca para duas mil e quinhentas posições */
    do{
        textcolor_2(14,0);
        printf("Entre com o %d salario : ",cont+1);
        textcolor_2(11,0);
        scanf("%f",&salario[cont]);
        media += salario[cont];
        cont++;
        textcolor_2(12,15);
        printf("  Outro Salário S/N  ");
        printf("\n");
    }while( toupper( (char)getch()) != 'N' );
    textcolor_2(14,0);
    printf("\nImprimindo Todos Os Salários :\n\n");
    textcolor_2(11,0);
    for(j=0; j<cont; j++)
        printf("%d Salário -> %.2f\n",j+1,salario[j]);
    textcolor_2(12,15);
    printf("\n\n  A média dos salário é : %.2f  \n",media/cont);
    for(i=0; i<cont; i++)                    /* Organiza em Ordem Crescente */
        for(j=i+1; j<cont; j++)
            if( salario[i] > salario[j]){
                aux        = salario[i ];
                salario[i] = salario[j ];
                salario[j] =         aux;
            }
    textcolor_2(14,0);
    cont--;
    printf("\nO Maior Salário é : %.2f",salario[cont]);
    printf("\nO Menor Salário é : %.2f",salario[  0 ]);
    free(salario);
    printf("\n\n\n");
    textcolor_2(10,12);
    return 0;
}

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
#include <stdlib.h> //necessário para usar as funções malloc() e free()
int main(){
  int i=0, j=0;
  float total,media,maior=0,menor=50000;
  
  //definindo o ponteiro   //definindo alocação
  float *v = (float *) malloc(1 * sizeof(float));
  
  //Armazenando os dados em um vetor
  
  while(v[i]!=0){
  	i++;
  	//realoca mais memoria em cada ciclo
  	v = (float *) realloc(v,1 * sizeof(float));
  	printf("\nDigite o salarios %d ou 0 para sair: ", i);
    scanf("%f",&v[i]);
    j++;
  }
   j-=1;
  // ------ Percorrendo o vetor e imprimindo os valores ----------
  printf("Todos os Salarios:\n");
  for (i = 0;i <= j; i++){
    printf(" valor %d : %.2f \n ",i,v[i]);
     total = total + v[i];
     if (v[i]>maior)
     maior=v[i];
     if (v[i]<menor)
     menor=v[i];
  }
  printf("\ntotal :%.2f ",total);
  media = (total/j);
  printf("\nMedia: %.2f ",media);
  printf("\MAior: %.2f ",maior);
  printf("\Menor: %.2f ",menor);
  
  //liberando o espaço de memória alocado
  free(v);
  
  
}

 

adicionado 20 minutos depois
37 minutos atrás, devair1010 disse:

para usar o realloc , antes use o malloc

não necessariamente

#include <stdio.h>
#include <stdlib.h> //necessário para usar as funções malloc() e free()
int main(){
	//definindo ponteiro
  int *p;
  
  //allocando
  
  //para começar com realoc basta deixar null
   p = (int *) realloc(NULL,1 * sizeof(int));
  //sao equivalentes
  p = (int *) malloc(1 * sizeof(int));
}

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

4 horas atrás, Larissa Firmino disse:

scanf("%f", &*salario);

 

Isso é redundante, como seria escrever

        scanf("%f", &*&*&*&*&*&*salario);

& e * são operadores inversos então usar os dois assim é a mesma coisa que escrever

        x = x + 1 - 1 + 1 - 1;

Não vai fazer nada. Ou melhor, vai fazer e desfazer e fazer e desfazer...

 

realloc() faz o simples: pega um bloco de memória que você alocou antes e reajusta o tamanho, para mais ou para menos, e devolve o endereço no novo bloco. 

 

Se for menor é garantido que será o mesmo, se for maior não há garantias:

  • Se você tinha 30000 alocados em x e realoca para 10000 os 10000 vão ficar em x e o resto vai ser liberado
  • Se você tinha 10000 em x e realocou para 30000 é garantido que os 10000 vão ser copiados igualzinho, mas não há garantia que o endereço de x não vá mudar.

Esse enunciado é uma bobagem. Não faz sentido usar malloc() ou realloc() para isso. Mas se é para fazer simplesmente aloque os salários a partir de 1: 1, 2, 3...

 

  • Curtir 2
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Poderia ser feito assim:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int quantidade = 0;

    double media = 0.0;
    double *salario = malloc(sizeof(double));

    printf("Quantidade de pessoas: ");
    scanf(" %i%*c", &quantidade);

    salario = realloc(salario, quantidade * sizeof(double));

    for(int i = 0; i < quantidade; i++) {
        printf("Digite o salario: R$ ");
        scanf(" %lf%*c", &salario[i]);
        media += salario[i];
    }

    if(quantidade != 0) {
        media /= quantidade;
    }

    printf("Media: R$ %.2f \n", media);
    return EXIT_SUCCESS;
}

 

  • Amei 2
Link para o comentário
Compartilhar em outros sites

@AdrianoSiqueira      no enunciado dizia para ler uma quantidade indeterminada de salários .  e ali você está determinando essa quantidade ao pegar um valor inserido pelo usuário , e então o loop for não seria o adequado nessa situação , creio que o do / while seria melhor , pois vai repetir até que se queira parar , e seu código está bom , para mostrar a média de salário , e faltou então mostrar o maior e o menor salário .

  • Curtir 2
  • Amei 1
Link para o comentário
Compartilhar em outros sites

@AdrianoSiqueira  Pensei que se eu determinasse a quantidade no começo seria válido também, mas como o @devair1010 falou a quantidade é indeterminada, nesse caso determinar uma condição de saída é o melhor a se fazer.

adicionado 2 minutos depois

@arfneto Sim, inclusive no último exercício proposto fiz sem o realloc e funcionou o que me deixou muito confusa, mas adorei a explicação, valeu me ajudou muito.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!