Ir ao conteúdo

Posts recomendados

Postado

Bom dia,

Sou iniciante em programação e preciso resolver o problema abaixo em C, porém não consigo encontrar uma forma, já tentei com vetores e não funcionou.

 

O cálculo da área superficial de um anel (S = π 2 (2r + d)d - onde d=diâmetro do anel e r o raio interno) deve ser realizado por uma função o do peso
do revestimento (P= y *S *t , onde y=17,7g/cm³, S a área superficial e t a
espessura) por uma segunda função.
O programa deve solicitar ao usuário o raio interno do anel, seu diâmetro, o intervalo de
valores de t ( t min e t max ), a quantidade de valores de t que ele deseja saber e o valor da grama do ouro.
O programa deve armazenar em um arquivo o nome do usuário, o custo da
grama de ouro e os valores de espessuras de camadas de ouro depositadas no anel e seus
respectivos custos para que depois sejam utilizados em uma planilha eletrônica.

 

alguém consegue me dar uma luz?

 

agradeço desde já.

  • Obrigado 1
Postado

@Luiz Luiz Por gentileza, mostre o que tentou fazer.

 

Como @devair1010 disse, use o fopen():

FILE *fopen (char *caminho,char *modo);

O modo talvez possa ser "a", para gravação de dados no final do arquivo. O arquivo é criado se não existir.

fputs() escreve uma string no arquivo e fclose() fecha o arquivo.

Exemplo:

#include "stdio.h"
#include "stdlib.h"
#include "locale.h"

int main()
{
	FILE *fp;
	double pi = 3.1415;

	setlocale(LC_ALL,"Portuguese");

	fp = fopen("C:\\...\\pi.txt", "w");
	fprintf(fp, "Eu sou o PI\n%0.4lf\n", pi);
	fclose(fp);
    return 0;
}

 

  • Curtir 1
  • Obrigado 1
Postado

Na verdade, meu problema não é só na abertura e escrita no arquivo, mas sim em como fazer a lógica para todo o programa, pois preciso perguntar ao usuário a faixa de espessuras, o raio interno, o diâmetro, realizar os cálculos e salvar no arquivo só as espessuras e os valores.....não tenho ideia de como fazer isso.

Tentei criar uma matriz e gravar cada faixa de valor em uma coluna especifica dela (ex: espessura na coluna 1 e valor na coluna dois) mas não rolou, e segundo o professor, com vetor também não da certo...ai fiquei sem saber como fazer...

adicionado 20 minutos depois

O que consegui fazer até o momento foi isso...

quando peço para imprimir o vetor vpeso na função quantidade, todos os valores saem 0.

estou testando com a impressão primeiro pra depois passar para a gravação no arquivo.

 

 

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

const float PI = 3.14;
const float y = 17.7;

char NOME[50], RA[8];
float s,r,d,q,valor,ptotal,custo,tmax, tmin;
int vpeso[100],vcusto[100],vesp[45],c,t,e,u,x;

int superficie ()
{
    
    s=PI*PI*(2*r+d)*d;
    return 0;
    
}

int quantidade ()
{
    int t=0;
    int c=0;
    
    for (t=tmin; t<=tmax; t++)
    {
    
        ptotal=vesp[x]*s*y;
    
        vpeso[t]=ptotal;
    }
    
    for (t=tmin; t<=tmax; t++)
    {
        printf("%d - ", vpeso[t]);
    }
         for(c=tmin; c<tmax; c++)
    {
         custo=vpeso[t]*valor;
    
         vcusto[c]=custo;
    }
      
        
    return 0;
}


int main()
{
    printf("Digite seu nome: ");
    scanf("%[^\n]s",NOME);
    
    printf("\n Digite seu RA: ");
    scanf("%s", RA);

    printf("\n Digite a espessura minima de ouro em µm: ");
    scanf("%f", &tmin);
    
    while(tmin<1)
    {
      printf("\n O valor minimo da espessura deve ser 5µm!");
      printf("\n Digite a espessura minima de ouro em µm: ");
      scanf("%f", &tmin);
    }
    
        printf("\n Digite a espessura maxima de ouro em µm: ");
        scanf("%f", &tmax);
        
        while(tmax<tmin||tmax>50)
        {
         printf("\n O valor maximo da espessura deve ser maior que o minimo e chegando ao maximo 50µm!");
         printf("\n Digite a espessura maxima de ouro em µm: ");
         scanf("%f", &tmax);
        }
            u=tmin-1;
            for(x=tmin;x<=tmax;x++) 
            { 
              vesp[x]=u+1; 
              u=u+1; 
            } 
            for(x=tmin;x<=tmax;x++)
            {
            printf("%d - ", vesp[x]);
            }
       
            printf("\n Digite o raio interno do anel em mm: ");
            scanf("%f", &r);
            
            while(r<1)
            {
                printf("\n O raio interno deve ser maior que 0! ");
                printf("\n Digite o raio interno do anel em mm: ");
                scanf("%f", &r);
            }
            
                printf("\n Digite o diametro do anel em mm: ");
                scanf("%f", &d);
                
                while (d<1||d>=r)
                {
                    printf("\n O diametro do anel deve ser maior que 0 e menor que o raio!");
                    printf("\n Digite o diametro do anel em mm: ");
                    scanf("%f", &d);
                }
                
                    printf("\n Digite o valor do grama de ouro em R$: ");
                    scanf("%f", &valor);
                    
                    while(valor<0)
                    {
                        printf("\n O valor do ouro deve ser no mínimo R$1");
                        printf("\n Digite o valor do grama de ouro em R$: ");
                        scanf("%f", &valor);
                    }
                    
    superficie();
                
    quantidade();
                
    return 0;
}

 

  • Curtir 1
  • Obrigado 1
Postado

@Luiz Luiz

Basta pedir todos os dados e usá-los nas funções...

Depois usar o fopen(), armazene tudo em um arquivo texto e feche depois.

Faça as mudanças que você quiser no programa a seguir, até porque eu não considerei nenhuma unidade de medida, apenas os valores puros. É interessante você dizer em qual unidade de medida os valores estão sendo pedidos (exemplo: insira o raio em centímetros).

Você basicamente pega r e d, calcula S = π 2 (2r + d)d com uma função, depois pega t mínimo, t máximo e a quantidade de valores que quer calcular, calcula o passo (exemplo: se t mínimo for 10, t máximo for 50 e quantidade for 10, passo é (tmax-tmin)/(qtd-1), ou seja, 40/9 que é 4.4, dessa forma, o valor inicial é 10, e o final é 10+(4.4*9) = 50, 10 valores serão impressos) e, por meio de um loop, vai calculando o peso do revestimento para o valor de t atual. Dentro mesmo da função do peso do revestimento, você pode calcular o preço do ouro para o peso atual, então ao invés de retornar P, retorna o custo.

Teste isso, mas mude antes o caminho, eu coloquei um caminho genérico ("C:\\desktop\\dados.txt"):

/*
O cálculo da área superficial de um anel (S = π 2 (2r + d)d - onde d=diâmetro do anel e r o raio interno) deve ser realizado por uma função o do peso
do revestimento (P= y *S *t , onde y=17,7g/cm³, S a área superficial e t a
espessura) por uma segunda função.
O programa deve solicitar ao usuário o raio interno do anel, seu diâmetro, o intervalo de
valores de t ( t min e t max ), a quantidade de valores de t que ele deseja saber e o valor da grama do ouro.
O programa deve armazenar em um arquivo o nome do usuário, o custo da
grama de ouro e os valores de espessuras de camadas de ouro depositadas no anel e seus
respectivos custos para que depois sejam utilizados em uma planilha eletrônica.
*/
#include "stdio.h"
#include "stdlib.h"
#include "locale.h"

#define y 17.7
#define pi 3.1415926

float areasuperficial(float r, float d){
    float S;
    S = pi*2*(2*r+d)*d;
    return S;
}

float pesorevestimento(float r, float d, float t, float ouro){
    float P;
    P = y*areasuperficial(r, d)*t;
    ouro *= P;
    return ouro;
}

int main()
{
    
    FILE *calculos;
	setlocale(LC_ALL,"Portuguese");
	
    float r, d, t = 0, tmin, tmax, qtd, ouro, i = 0, passo;
    char nome[51];
    
    printf("Insira seu nome: ");
    scanf("%50s", nome);
    
    printf("Insira o raio: ");
    scanf("%f", &r);
    
    printf("Insira o diâmetro: ");
    scanf("%f", &d);
    
    printf("Insira o valor mínimo da espessura: ");
    scanf("%f", &tmin);
    
    printf("Insira o valor máximo da espessura: ");
    scanf("%f", &tmax);
    
    printf("Insira a quantidade de valores da espessura que deseja saber: ");
    scanf("%f", &qtd);
    
    printf("Insira o valor da grama do ouro: ");
    scanf("%f", &ouro);
    
    passo = (tmax-tmin)/(qtd-1);
    tmin-=passo;
    
    calculos = fopen("C:\\desktop\\dados.txt", "a");
    fprintf(calculos, "\nDados calculados para o(a) senhor(a) %s:\n", nome);
    fprintf(calculos, "\nO valor da grama de ouro é: %.2f\n", ouro);
    
    do{
        tmin += passo;
        t = tmin;
    	fprintf(calculos, "\nPara uma espessura de %.4f cm, o custo é de: %.2f\n", t, pesorevestimento(r, d, t, ouro));
    	i++;
    }while(i<qtd);
    
    fclose(calculos);
    
    return 0;
}

 

  • Obrigado 1
Postado
1 hora atrás, Luiz Luiz disse:

preciso perguntar ao usuário a faixa de espessuras, o raio interno, o diâmetro, realizar os cálculos e salvar no arquivo só as espessuras e os valores.....não tenho ideia de como fazer isso

 

Se vai ler de um arquivo basta definir um formato.

 

Se vai ler a cada execução deixe isso fora das funções e simplesmente leia um a um e mostre em seguida para ficar mais seguro.

 

Chame as funções com os valores e mostre o resultado e grava no disco.

 

5 horas atrás, Luiz Luiz disse:

área superficial de um anel (S = π 2 (2r + d)d - onde d=diâmetro do anel e r o raio interno)

 

Isso claro sugere uma função

 

double area(double raio, double diametro);

 

5 horas atrás, Luiz Luiz disse:

(P= y *S *t , onde y=17,7g/cm³, S a área superficial e t a
espessura)

 

Para ter um resultado mais útil talvez devesse pedir o valor mínimo e máximo da espessura e um intervalo, e imprimir assim uma planilha de custos acompanhando a variação da espessura, certo?

E isso sugere

double peso(double area, double espessura);

 

E as fórmulas das funções você já escreveu.

 

Como a área aparentemente só é usada para calcular o peso talvez seja supérfluo usar duas funções.

 

 

  • Curtir 2
Postado
Em 16/05/2020 às 15:58, Lucca Rodrigues disse:

@Luiz Luiz

Basta pedir todos os dados e usá-los nas funções...

Depois usar o fopen(), armazene tudo em um arquivo texto e feche depois.

Faça as mudanças que você quiser no programa a seguir, até porque eu não considerei nenhuma unidade de medida, apenas os valores puros. É interessante você dizer em qual unidade de medida os valores estão sendo pedidos (exemplo: insira o raio em centímetros).

Você basicamente pega r e d, calcula S = π 2 (2r + d)d com uma função, depois pega t mínimo, t máximo e a quantidade de valores que quer calcular, calcula o passo (exemplo: se t mínimo for 10, t máximo for 50 e quantidade for 10, passo é (tmax-tmin)/(qtd-1), ou seja, 40/9 que é 4.4, dessa forma, o valor inicial é 10, e o final é 10+(4.4*9) = 50, 10 valores serão impressos) e, por meio de um loop, vai calculando o peso do revestimento para o valor de t atual. Dentro mesmo da função do peso do revestimento, você pode calcular o preço do ouro para o peso atual, então ao invés de retornar P, retorna o custo.

Teste isso, mas mude antes o caminho, eu coloquei um caminho genérico ("C:\\desktop\\dados.txt"):


/*
O cálculo da área superficial de um anel (S = π 2 (2r + d)d - onde d=diâmetro do anel e r o raio interno) deve ser realizado por uma função o do peso
do revestimento (P= y *S *t , onde y=17,7g/cm³, S a área superficial e t a
espessura) por uma segunda função.
O programa deve solicitar ao usuário o raio interno do anel, seu diâmetro, o intervalo de
valores de t ( t min e t max ), a quantidade de valores de t que ele deseja saber e o valor da grama do ouro.
O programa deve armazenar em um arquivo o nome do usuário, o custo da
grama de ouro e os valores de espessuras de camadas de ouro depositadas no anel e seus
respectivos custos para que depois sejam utilizados em uma planilha eletrônica.
*/
#include "stdio.h"
#include "stdlib.h"
#include "locale.h"

#define y 17.7
#define pi 3.1415926

float areasuperficial(float r, float d){
    float S;
    S = pi*2*(2*r+d)*d;
    return S;
}

float pesorevestimento(float r, float d, float t, float ouro){
    float P;
    P = y*areasuperficial(r, d)*t;
    ouro *= P;
    return ouro;
}

int main()
{
    
    FILE *calculos;
	setlocale(LC_ALL,"Portuguese");
	
    float r, d, t = 0, tmin, tmax, qtd, ouro, i = 0, passo;
    char nome[51];
    
    printf("Insira seu nome: ");
    scanf("%50s", nome);
    
    printf("Insira o raio: ");
    scanf("%f", &r);
    
    printf("Insira o diâmetro: ");
    scanf("%f", &d);
    
    printf("Insira o valor mínimo da espessura: ");
    scanf("%f", &tmin);
    
    printf("Insira o valor máximo da espessura: ");
    scanf("%f", &tmax);
    
    printf("Insira a quantidade de valores da espessura que deseja saber: ");
    scanf("%f", &qtd);
    
    printf("Insira o valor da grama do ouro: ");
    scanf("%f", &ouro);
    
    passo = (tmax-tmin)/(qtd-1);
    tmin-=passo;
    
    calculos = fopen("C:\\desktop\\dados.txt", "a");
    fprintf(calculos, "\nDados calculados para o(a) senhor(a) %s:\n", nome);
    fprintf(calculos, "\nO valor da grama de ouro é: %.2f\n", ouro);
    
    do{
        tmin += passo;
        t = tmin;
    	fprintf(calculos, "\nPara uma espessura de %.4f cm, o custo é de: %.2f\n", t, pesorevestimento(r, d, t, ouro));
    	i++;
    }while(i<qtd);
    
    fclose(calculos);
    
    return 0;
}

 

 

Em 16/05/2020 às 15:58, Lucca Rodrigues disse:

@Luiz Luiz

Basta pedir todos os dados e usá-los nas funções...

Depois usar o fopen(), armazene tudo em um arquivo texto e feche depois.

Faça as mudanças que você quiser no programa a seguir, até porque eu não considerei nenhuma unidade de medida, apenas os valores puros. É interessante você dizer em qual unidade de medida os valores estão sendo pedidos (exemplo: insira o raio em centímetros).

Você basicamente pega r e d, calcula S = π 2 (2r + d)d com uma função, depois pega t mínimo, t máximo e a quantidade de valores que quer calcular, calcula o passo (exemplo: se t mínimo for 10, t máximo for 50 e quantidade for 10, passo é (tmax-tmin)/(qtd-1), ou seja, 40/9 que é 4.4, dessa forma, o valor inicial é 10, e o final é 10+(4.4*9) = 50, 10 valores serão impressos) e, por meio de um loop, vai calculando o peso do revestimento para o valor de t atual. Dentro mesmo da função do peso do revestimento, você pode calcular o preço do ouro para o peso atual, então ao invés de retornar P, retorna o custo.

Teste isso, mas mude antes o caminho, eu coloquei um caminho genérico ("C:\\desktop\\dados.txt"):


/*
O cálculo da área superficial de um anel (S = π 2 (2r + d)d - onde d=diâmetro do anel e r o raio interno) deve ser realizado por uma função o do peso
do revestimento (P= y *S *t , onde y=17,7g/cm³, S a área superficial e t a
espessura) por uma segunda função.
O programa deve solicitar ao usuário o raio interno do anel, seu diâmetro, o intervalo de
valores de t ( t min e t max ), a quantidade de valores de t que ele deseja saber e o valor da grama do ouro.
O programa deve armazenar em um arquivo o nome do usuário, o custo da
grama de ouro e os valores de espessuras de camadas de ouro depositadas no anel e seus
respectivos custos para que depois sejam utilizados em uma planilha eletrônica.
*/
#include "stdio.h"
#include "stdlib.h"
#include "locale.h"

#define y 17.7
#define pi 3.1415926

float areasuperficial(float r, float d){
    float S;
    S = pi*2*(2*r+d)*d;
    return S;
}

float pesorevestimento(float r, float d, float t, float ouro){
    float P;
    P = y*areasuperficial(r, d)*t;
    ouro *= P;
    return ouro;
}

int main()
{
    
    FILE *calculos;
	setlocale(LC_ALL,"Portuguese");
	
    float r, d, t = 0, tmin, tmax, qtd, ouro, i = 0, passo;
    char nome[51];
    
    printf("Insira seu nome: ");
    scanf("%50s", nome);
    
    printf("Insira o raio: ");
    scanf("%f", &r);
    
    printf("Insira o diâmetro: ");
    scanf("%f", &d);
    
    printf("Insira o valor mínimo da espessura: ");
    scanf("%f", &tmin);
    
    printf("Insira o valor máximo da espessura: ");
    scanf("%f", &tmax);
    
    printf("Insira a quantidade de valores da espessura que deseja saber: ");
    scanf("%f", &qtd);
    
    printf("Insira o valor da grama do ouro: ");
    scanf("%f", &ouro);
    
    passo = (tmax-tmin)/(qtd-1);
    tmin-=passo;
    
    calculos = fopen("C:\\desktop\\dados.txt", "a");
    fprintf(calculos, "\nDados calculados para o(a) senhor(a) %s:\n", nome);
    fprintf(calculos, "\nO valor da grama de ouro é: %.2f\n", ouro);
    
    do{
        tmin += passo;
        t = tmin;
    	fprintf(calculos, "\nPara uma espessura de %.4f cm, o custo é de: %.2f\n", t, pesorevestimento(r, d, t, ouro));
    	i++;
    }while(i<qtd);
    
    fclose(calculos);
    
    return 0;
}

 

Cara, fiz as modificações e está rodando balinha, mas fiquei com uma duvida....depois da execução, quando abro o arquivo, o mesmo se encontra em branco.

Os valores não estão sendo gravados nele por esse código?

  • Curtir 1
Postado

@Luiz Luiz      testei aqui e está funcionando bem e gravou no arquivo txt , mas nessa pasta onde está gravando é difícil de localizar mesmo , então seria melhor você remover esse detalhe na linha onde abre o arquivo para gravação

 calculos = fopen("C:\\desktop\\dados.txt", "a");

e coloque isso 

 calculos = fopen("dados.txt", "a");

assim será gravado na mesma pasta onde você salvou o código .

e também precisa colocar o comando 

fflush(stdin);

uma linha antes de cada comando scanf , pois muda de tipo , e se não colocar isso o programa pula os outros scanf's .

  • Curtir 1
Postado

@Luiz Luiz Compilador online? No máximo vai simular uma gravação... Baixe o CodeBlocks.

Como @devair1010 disse, e como eu também havia dito anteriormente:

Em 16/05/2020 às 15:58, Lucca Rodrigues disse:

Teste isso, mas mude antes o caminho, eu coloquei um caminho genérico ("C:\\desktop\\dados.txt"):

Mude o diretório...

E também apague todo aquele comentário acima do algoritmo que eu fiz, que contém o enunciado do exercício... Ele tem caracteres especiais (π, ³, etc).

30 minutos atrás, devair1010 disse:

fflush(stdin);

uma linha antes de cada comando scanf , pois muda de tipo , e se não colocar isso o programa pula os outros scanf's .

Sim, é interessante usar.

Mas qualquer coisa, use \n antes dos identificadores.

adicionado 6 minutos depois

Se for testar em algum compilador online, teste nesse.

Ele pelo menos simula uma gravação.

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