Ir ao conteúdo
  • Cadastre-se

C Calculo com chamada com programa em C


eduheavy
Ir à solução Resolvido por arfneto,

Posts recomendados

O programa deverá solicitar a entrada de uma string (máximo de 30 caracteres) com caracteres decimais, a string pode possuir caracteres utilizados para formatação do valor como: .(ponto), -(traço), virgula e outros;

FEITO

 solicitação da entrada de strings será finalizada apenas quando o usuário digitar “FIM” em qualquer padrão. Mensagem: "Digite 'FIM' para encerrar o programa.”;

ACHO QUE ESTÁ CORRETO

Caso o usuário digite uma string onde não seja possível calcular o dígito verificador, emitir a mensagem: "Atenção!!! Valor informado inválido."

O cálculo do dígito verificador de ser realizado por uma função com nome “calcula_dv”

FEITO

A string informada pelo usuário deve ser passada para a função calcula_dv() através de chamada por valor;

FEITO PARCIALMENTE

A função calcula_dv() deve retornar um valor inteiro, ou seja, se o cálculo for bem sucedido retornar DV, caso contrário retornar valor -1;

Se cálculo do DV for bem sucedido enviar mensagem para o usuário: DV calculado com sucesso: + string digitada + “-“ + DV calculado.

TRAVEI NESSA PARTE

Regras para cálculo do dígito verificador módulo 11.

Para obter o DV da string digitada pelo usuário, multiplica-se cada caracter da string sem o DV pelos multiplicadores 9,8,7,6,5,4,3,2 nesta ordem (repetir está sequência quantas vezes for necessário), soma-se as unidades das dezenas.


/********************************************************
Programa:
Objetivo:
Autor: Luiz Eduardo E. de souza
Data:
**********************************************************/

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


void calcula_dv (void);


int main()
{
	
	char texto[30], aux_conv[2] = {'\0','\0'};
	int i, peso = 2, valor;
	
	setlocale(LC_ALL, "Portuguese");
	
	printf("Desenvolvido por: \n");
	printf("Luiz");
	printf("\n\n\nEntre com uma string com valores decimais (máximo 30 caracteres):\n");
	printf(            "Digite FIM para encerrar o programa:\n"                 );
	
	fgets(texto, 30, stdin);
	texto[strlen(texto)-1]='\0';
	strupr(texto); //coloca todo texto em maiúscula
	
	if(texto == "fim")
	{
		return 0;
	}
	
	valor = atoi(texto); // converte em int
	calcula_dv();
	printf("DV calculado com sucesso: " "%c", texto, "-" ,"%d" valor);
	
	

}

	void calcula_dv (void)
	{
		for(i=strlen(texto)-1; i >=0; i--)
			{
				aux_conv[0] = texto[i];
				soma = atoi(aux_conv) * peso;
			}
	}
	

 

Link para o comentário
Compartilhar em outros sites

43 minutos atrás, eduheavy disse:

A função calcula_dv() deve retornar um valor inteiro, ou seja, se o cálculo for bem sucedido retornar DV, caso contrário retornar valor -1; Se cálculo do DV for bem sucedido enviar mensagem para o usuário: DV calculado com sucesso: + string digitada + “-“ + DV calculado.

TRAVEI NESSA PARTE

 

Regras para cálculo do dígito verificador módulo 11.

Para obter o DV da string digitada pelo usuário, multiplica-se cada caracter da string sem o DV pelos multiplicadores 9,8,7,6,5,4,3,2 nesta ordem (repetir está sequência quantas vezes for necessário), soma-se as unidades das dezenas.

 

É justo! Porque essa parte penso ser a principal do seu exercício. Ela é o exercício!

 

Eu posso notar que não encontrou o significado de: "A função calcula_dv() deve retornar um valor inteiro"

Se é uma função seu retorno vem com valor.

 

Se fosse procedimento seu retorno vem sem valor.

Void é tipo que represente tipo algum, uma sub-rotina que retorna   void   não é função, é procedimento.

43 minutos atrás, eduheavy disse:

void calcula_dv(void){
		for(i=strlen(texto)-1; i >=0; i--){
				aux_conv[0] = texto[i];
				soma = atoi(aux_conv) * peso;
		}
}

 

Essa sub-rotina é do tipo (void) procedimento com retorno sem valor que...

 

 

Escreva uma função, e que seu retorno vem com valor do tipo inteiro.

Citação

A função calcula_dv() deve retornar um valor inteiro, ou seja, se o cálculo for bem sucedido retornar DV, caso contrário retornar valor -1; ... (continua)

 

 

Destaque as dúvidas com perguntas objetivas OU

Os outros vão ter que advir para te ajudar.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, eduheavy disse:

Regras para cálculo do dígito verificador módulo 11.

Para obter o DV da string digitada pelo usuário, multiplica-se cada caracter da string sem o DV pelos multiplicadores 9,8,7,6,5,4,3,2 nesta ordem (repetir está sequência quantas vezes for necessário), soma-se as unidades das dezenas.

 

Esse programa

 

#include <stdio.h>

int DV( const char*);

int main(void)
{
    const char string[] = { "\
para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"
    };

    printf( "Exemplo de entrada: \"%s\"\n", string);
    int valor = DV(string);
    printf( "DV() retornou %d\n", valor );
    return 0;
}

int DV(const char* linha)
{
    return -1;
}

// fim do grande programa

 

Que eu te mostrei dias atrás quando postou o MESMO problema parece que não te deu nenhuma luz, nem nada do que eu e outros publicamos lá em
 

E o programa até compila e roda. Tentou escrever a função e colocar lá dentro?

 

E também não respondeu à pergunta sobre onde está o resto da definição do cálculo do DV em seu enunciado, já que parece incompleto....
 

EXEMPLO de cálculo para o DV módulo 11

 

Usando 1541253, o número do tópico aqui....

 

São 7 dígitos, de um total de possíveis 30. E os multiplicadores são OITO: 9 8 7 6 5 4 3 2

 

Então alinhe os valores e faça as contas. Trata-se de multiplicar o dígito pelo "peso"...
 

    1    5    4    1    2    5    3  : o valor
    9    8    7    6    5    4    3  : os pesos

    9   40   28    6   10   20    9  : as parcelas

 

 

2 horas atrás, eduheavy disse:

soma-se as unidades das dezenas.

 

Medíocre a redação do cara que escreveu seu enunciado.  O que eu imagino que ele queria dizer é que se somam os dígitos de cada parcela e não os valores: 40 soma 4, 28 soma 10, 20 soma 2 mais 0 e acho que deu pra entender, certo?

 

    1    5    4    1    2    5    3  : o valor
    9    8    7    6    5    4    3  : os pesos

    9   40   28    6   10   20    9  : as parcelas

    9  + 4 + 10  + 6  + 1  + 2  +  9  : a soma da soma dos digitos
    9   13   23   29   30   32    41

Eis o total: 41 = 3 x 11 + 8. Esse é o tal módulo 11: o resto da divisão por 11. 
Então o DV nesse caso é 11 - 8 = 3. 

 

O resto da divisão por 11 fica entre 0 e 10 e então cada entidade tem que resolver o que fazer quando o resto for 10.

 

Foi por isso que eu te perguntei 2 vezes sobre o resto da definição.

 

Mas o cálculo é esse. 

 

@eduheavyAcha que agora sabe escrever a função que eu te mostrei, DV(), lá declarada em um programa completo no tópico #6?

 

Tente escrever, afinal é só o que está aqui acima. Se não conseguir escreva de novo e preencho um exemplo no programa que te mostrei semanas atrás.

 

1 hora atrás, mauro_b disse:

Se fosse procedimento seu retorno vem sem valor.

Void é tipo que represente tipo algum, uma sub-rotina que retorna   void   não é função, é procedimento

 

Não, isso foi ideia do prof. Wirth, ao criar Pascal nos anos 70: procedure não retorna valor, function retorna valor. E isso  ficou em Visual Basic com Function e Sub. E foi um progresso porque o Basic só tinha Sub. :D e não era Visual! 

 

image.png.f276213e53095572fb7d6ebbae1dd11c.pngA razão era, no caso do Pascal, porque o prof. Niklaus tinha idéias muito pessoais sobre correção e filosofia de como escrever programas e de como FORTRAN podia destruir o mundo e Algol (de onde ele inspirou Pascal) nunca foi justamente valorizado. 

 

:D Eu tenho o livro. Não é a primeira edição :( mas sim a segunda, de '78 

 

Isso não aparece em C em lugar algum. Logo ficou claro, ainda nos 70, que de nada servia essa distinção e 50 anos depois parece não ter ainda.

 

 

 

 

Link para o comentário
Compartilhar em outros sites

9 horas atrás, arfneto disse:

Isso não aparece em C em lugar algum.

kkkkkkkkkkk Nós sabemos.

 

https://en.m.wikibooks.org/wiki/C_Programming/Procedures_and_functions

https://stackoverflow.com/questions/26719339/procedures-and-functions-in-c

Existem muitas outras mais "discussões"

 

Essa distinção às vezes ajuda quando o objetivo é ensinar e não atrapalha.

No caso temos uma função que retorna com 'status' no fim do método

                                                                            Se tem DV retorna seu número

                                                                            Senão: retorna -1

 

Vou deixa-los em sua conversa @eduheavy 

Link para o comentário
Compartilhar em outros sites

11 horas atrás, arfneto disse:

Que eu te mostrei dias atrás quando postou o MESMO problema parece que não te deu nenhuma luz, nem nada do que eu e outros publicamos lá em
 

E o programa até compila e roda. Tentou escrever a função e colocar lá dentro?

 

E também não respondeu à pergunta sobre onde está o resto da definição do cálculo do DV em seu enunciado, já que parece incompleto....
 

Eu fui agora mesmo ver essa discussão, existem 2 membros: @arfneto @eduheavy

O conteúdo é igual e o autor marcou  solução.

w1n7yi.jpg?w=300&h=212

 

 

 

 

Enfim, tem esse assunto na Wikipedia.

https://pt.wikipedia.org/wiki/Dígito_verificador#:~:text=Considerando o número 2615336%2C onde,verificador gerado pelo módulo 11.

Link para o comentário
Compartilhar em outros sites

Em 12/05/2021 às 01:32, arfneto disse:

 

Esse programa

 


#include <stdio.h>

int DV( const char*);

int main(void)
{
    const char string[] = { "\
para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"
    };

    printf( "Exemplo de entrada: \"%s\"\n", string);
    int valor = DV(string);
    printf( "DV() retornou %d\n", valor );
    return 0;
}

int DV(const char* linha)
{
    return -1;
}

// fim do grande programa

 

Que eu te mostrei dias atrás quando postou o MESMO problema parece que não te deu nenhuma luz, nem nada do que eu e outros publicamos lá em
 

E o programa até compila e roda. Tentou escrever a função e colocar lá dentro?

 

E também não respondeu à pergunta sobre onde está o resto da definição do cálculo do DV em seu enunciado, já que parece incompleto....
 

EXEMPLO de cálculo para o DV módulo 11

 

Usando 1541253, o número do tópico aqui....

 

São 7 dígitos, de um total de possíveis 30. E os multiplicadores são OITO: 9 8 7 6 5 4 3 2

 

Então alinhe os valores e faça as contas. Trata-se de multiplicar o dígito pelo "peso"...
 


    1    5    4    1    2    5    3  : o valor
    9    8    7    6    5    4    3  : os pesos

    9   40   28    6   10   20    9  : as parcelas

 

 

 

Medíocre a redação do cara que escreveu seu enunciado.  O que eu imagino que ele queria dizer é que se somam os dígitos de cada parcela e não os valores: 40 soma 4, 28 soma 10, 20 soma 2 mais 0 e acho que deu pra entender, certo?

 


    1    5    4    1    2    5    3  : o valor
    9    8    7    6    5    4    3  : os pesos

    9   40   28    6   10   20    9  : as parcelas

    9  + 4 + 10  + 6  + 1  + 2  +  9  : a soma da soma dos digitos
    9   13   23   29   30   32    41

Eis o total: 41 = 3 x 11 + 8. Esse é o tal módulo 11: o resto da divisão por 11. 
Então o DV nesse caso é 11 - 8 = 3. 

 

O resto da divisão por 11 fica entre 0 e 10 e então cada entidade tem que resolver o que fazer quando o resto for 10.

 

Foi por isso que eu te perguntei 2 vezes sobre o resto da definição.

 

Mas o cálculo é esse. 

 

@eduheavyAcha que agora sabe escrever a função que eu te mostrei, DV(), lá declarada em um programa completo no tópico #6?

 

Tente escrever, afinal é só o que está aqui acima. Se não conseguir escreva de novo e preencho um exemplo no programa que te mostrei semanas atrás.

 

 

Não, isso foi ideia do prof. Wirth, ao criar Pascal nos anos 70: procedure não retorna valor, function retorna valor. E isso  ficou em Visual Basic com Function e Sub. E foi um progresso porque o Basic só tinha Sub. :D e não era Visual! 

 

image.png.f276213e53095572fb7d6ebbae1dd11c.pngA razão era, no caso do Pascal, porque o prof. Niklaus tinha idéias muito pessoais sobre correção e filosofia de como escrever programas e de como FORTRAN podia destruir o mundo e Algol (de onde ele inspirou Pascal) nunca foi justamente valorizado. 

 

:D Eu tenho o livro. Não é a primeira edição :( mas sim a segunda, de '78 

 

Isso não aparece em C em lugar algum. Logo ficou claro, ainda nos 70, que de nada servia essa distinção e 50 anos depois parece não ter ainda.

 

 

 

 

Consegui resolver depois de muita luta, mas ainda não consegui fazer a chamada da função isso que não entendo.

 


/********************************************************
Programa:
Objetivo:
Autor: Luiz Eduardo E. de souza
Data:
**********************************************************/

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


int calcula_dv(int soma_main)
{
	int mult_mod, mod_divmult, mod11;
	mult_mod = soma_main * 10;
	mod_divmult = mult_mod/11 * 11;
	mod11 = mult_mod -mod_divmult;	
	return(mod11);
	
}

int main()
{
	
	char texto [30], aux_conv[2] = {'\0','\0'};
	int result_dv, i, peso, mult, soma;
	
	setlocale(LC_ALL, "Portuguese"); // incluindo a linguagem PT-BR
	
	printf("Desenvolvido por: \n");
	printf("Luiz");
	printf("\n\n\nEntre com uma string com valores decimais (máximo 30 caracteres):\n");
	printf(            "Digite FIM para encerrar o programa:\n"                 );
	
	fgets(texto, 30, stdin);
	texto[strlen(texto)-1]='\0';
	strupr(texto); //coloca todo texto em maiúscula
	
	if(strcmp(texto,"FIM") == 0)
	{
		return 0;
	}
	
	peso=2;
	for(i=strlen(texto)-1; i>=0; i--)
	{
		aux_conv[0] = texto[i];
		if(peso>9)
		{
			peso=2;
		}
		mult = atoi(aux_conv) * peso;
		printf("numero %d peso %d mult %d\n",atoi(aux_conv),peso,mult);
		peso++;
		soma = soma + mult;
	}
	printf("O valor de soma é: %d", soma);
	result_dv = calcula_dv(soma); //chamada da função
	printf("O digito verificado é: %d", result_dv);
	
	getch();
 	return 0;
}

 

A função ai está dentro do "main", pela descrição do problema ela deve ficar fora

Link para o comentário
Compartilhar em outros sites

  • Solução
1 hora atrás, eduheavy disse:

Consegui resolver depois de muita luta, mas ainda não consegui fazer a chamada da função isso que não entendo

Não entendo qual a sua dúvida. Pode explicar de outro modo?

 

Entendeu o programa que te mostrei? Rodou em sua máquina? Viu a explicação passo a passo do cálculo que te mostrei? Não perguntou nada...

 

Porque não faz o que te mostrei e passa a string para a função e a função devolve o tal DV? Não é mais simples?

 

Qual  a razão de fazer uma parte em main(0 e uma parte em calcula_dv() ???

 

Porque está lendo a string do teclado se ainda não sabe fazer o cálculo? Porque não usa constantes depois de saber o resultado???????

 

Citação

Usando 1541253, o número do tópico aqui....

 

Eu te mostrei o cálculo aqui e o DV é 3.

 

 

Então porque não testa seu cálculo assim?

 

declare o que já te mostrei:
 

Em 12/05/2021 às 01:32, arfneto disse:

int DV( const char*);

 

e chame assim
 


	int teste_do_digito = calcula_dv("1541253"):
	printf("Quanto acha que vale o DV? %d\n", teste_do_digito );

 

e testa sua função até ela imprimir 3. E aí testa com outros números. E aí coloca a p0rr@ da leitura do teclado que só vai te atrasar ao ficar digitando durante os testes....

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!