Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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
Postado
#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
Postado
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
Postado

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
Postado

@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
Postado

@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

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!