Ir ao conteúdo

Posts recomendados

Postado

Fala ae, to precisando de transformar este código java abaixo em C, porém até onde eu fui está dando um looping infinito. O java está funcionando.

 

Segue o código java:

import java.io.*;
import java.util.*;

public class HuxleyCode {
  public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int N, i, k, tamanho, soma;
        N = input.nextInt();
        String palavra;
        i = 0;
        while(i < N){
            palavra = input.next();
            i++;
            tamanho = palavra.length();
            k = 0;
            soma = 0;
            while(k < tamanho){
                
		char c = palavra.charAt(k);
		int z = Character.getNumericValue(c);
		if (z == 1) {
			soma = soma + 2;
		}
		else if ((z == 2) | (z == 3) | (z == 5)) {
			soma = soma + 5;
		}
		else if (z == 4) {
			soma = soma + 4;
		}
		else if ((z == 6) | (z == 9) | (z == 0)) {
			soma = soma + 6;
		}
		else if (z == 7) {
			soma = soma + 3;
		}
		else if (z == 8) {
			soma = soma + 7;
		}
                k++;
            }
            System.out.println(soma + " leds");
        }
    }
}

Código em C até agora 

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

int main() {
int led[10]={6, 2, 5, 5, 4, 5, 6, 3, 7, 6}, qtd, n, i, v, aux;
scanf("%d", &n);
while ((n <= 1) || (n >= 1000)) {
scanf("%d", &n);
}
for (i=0; i<n; i++) {
scanf("%d", &v);
while ((v <= 1) || (v >= 10^1000)) {
printf("\n");
scanf("%d", &v);
}
aux = v;
qtd = 0;
while (aux > 0) {
qtd += led[aux % 10];
aux /= 10;
}
printf("%d leds\n", qtd);
}
return 0;
}

O que se pede:

image.thumb.png.ee0e968b7a1e97e589feb8672b6af2e5.png

  • Obrigado 1
Postado

@Arthur Rodrigues Passos    ali no enunciado está pedindo para fazer uma função ,  mas no java não tal função , e também nessas linhas :

}
else if ((z == 6) | (z == 9) | (z == 0)) {/* o sinal do operador OU são dois pipe */
	soma = soma + 6;

está escrito errado esses códigos , pois o sinal para o operador  OU são dois pipe e ali só tem hum ,  e ali no int z seria assim :

char c = palavra[k];/* c igual caractere na posição k da palavra digitada                         */
int z = c - 48;     /* z igual ao valor ASCII do caractere - 48 , pois são números de zero a nove */
                    /* e o valor do carctere zero é 48                                            */

os if's estão certos , são do mesmo jeito que em java , e o printf no final está certo  .

Postado

@devair1010 opa, não consegui entender muito bem

adicionado 53 minutos depois

avancei até aqui, mas ainda tem alguma coisa que não está indo

 

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

int calcular_leds(int digito)
{
    int leds = 0,i, quantidade[10] = {6,2,5,5,4,5,6,3,7,6};


    for(i=0;i<10;i++)
    {
        if(digito == i)
        {
            leds = quantidade[i];
        }
    }

    return leds;
}

int main() {
    int casos = 0, i, j, tamanho = 0, soma=0, v=0, aux=0, tamanho_max;

    char numero[100];

    scanf("%d", &casos);
    if(casos<1 || casos >1000)
    {
        return 0;
    }

    for(i=0;i<casos;i++)
    {
        scanf("%s", numero);
        tamanho = strlen(numero);
        v= atol(numero);

        j=0;
        aux = v;
        while(j<tamanho)
        {
            soma+=calcular_leds(aux%10);
            aux = aux/10;
            j++;
        }
        printf("%d leds\n", soma);
        soma=0;
    }

	return 0;
}

 

  • Obrigado 1
Postado

@Arthur Rodrigues Passos       aqui do jeito que está no java :

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

int main(){
    int N, i=0, k, tamanho, soma;
    char palavra[50];
    scanf("%d",&N);
    while(i < N){
        scanf("%s", palavra);
        i++;
        tamanho = strlen(palavra);
        k = 0;
        soma = 0;
        while(k < tamanho ){
            char c = palavra[k];
            int z = c - 48;
            if(z == 1){
                soma = soma + 2;
            }
            else
                if(z == 2 || z == 3 || z == 5){
                    soma = soma + 5;
                }
                else
                    if(z == 4){
                        soma = soma + 4;
                    }
                    else
                        if(z == 6 || z == 9 || z == 0){
                            soma = soma + 6;
                        }
                        else
                            if(z == 7){
                                soma = soma + 3;
                            }
                            else
                                if(z == 8){
                                    soma = soma + 7;
                                }
            k++;
        }
        printf("\n%d leds\n",soma);
    }
    return 0;
}

 

Postado

@Arthur Rodrigues Passos @Arthur Rodrigues Passos    testei aqui no code blocks e também no Dev c++ e está funcinando bem :

 

java.thumb.JPG.f35becc15ee61e2221bd4c91899fcf4e.JPG

mas meu code blocks tem essa configuração extras  nele  ->  clique em      settings /  compiler... / linker setings    e coloque isso ->  -lgdi32    -> aqui entre outras coisas serve para desenhar pixeis na tela
                          -lconio    -> aqui serve para usar a função gotoxy e textcolor e textbackground  

 

934362689_codebokssetings.JPG.48d7c22eb03ca2a51bc6aa0f55382ea0.JPG

35914315_codebokssetings_2.JPG.3a1ac207cbf09eccc39f4defeb7b5d07.JPG

Postado
  Em 29/06/2019 às 23:09, Arthur Rodrigues Passos disse:

O java está funcionando

Expandir  

 

  Em 30/06/2019 às 01:57, devair1010 disse:

Arthur Rodrigues Passos    ali no enunciado está pedindo para fazer uma função ,  mas no java não tal função , e também nessas linhas :

Expandir  

 

Mesmo em java não está certo...

 

Pois é.. Não tem a função. E não pode usar um int para ler o valor V dos N testes: podem ser até 1000 testes, mas o painel tem entre 1 e CEM dígitos: não cabe em um int. deve usar bigdecimal ou usar strings... Mesmo caso em C

 

Veja:

190701-java-para-c.png.9caf275b70f5484802bf55d0d8f6ad95.png

 

É um jeito chique de dizer que o painel de LEDs tem até 100 dígitos. E uma pegadinha pra tomar uns pontos de todo aluno que usar um inteiro para ler os valores, em java, em C ou COBOL ;) . O maior valor inteiro não dá nem 10 dígitos, certo? Ficam faltando ... noventa

  • Curtir 2
Postado
  Em 30/06/2019 às 21:27, Arthur Rodrigues Passos disse:

@devair1010  opa, deu estes erros, no meu code blocks também não compilou, poderia ajudar?

image.png.ff43ff3e8af3c4ec2a11df00d9817094.pngimage.png.bed8c702ba7e9c4fb2db22bd960b8071.png

Expandir  

 

Olá! 

 

provavelmente você copiou o trecho de código de uma tela como a do navegador do forum para o editor e aí acabou inserindo uns caracteres estranhos... Experimente redigitar uma linha dessas e deve ver que o erro some..

  • Curtir 3
Postado

Olá

 

Vou deixar um solução aqui em C com uns palpites pessoais para quem está começando a programar e tem uma lista de problemas/programas como esse aqui. Isso pode ser útil como método de se aproximar de uma solução.  É apenas uma possível maneira, relativamente segura. Sequer vou dizer que é boa. Então...

Primeiro, evite fazer mais do que está escrito. Mas nunca menos. Considere cada linha como importante. Quase sempre o autor tem uma pegadinha.

Pegadinha

Nesse caso aqui, a primeira é a maneira de ler os valores: todo mudo tende a programar lendo o valor como inteiro, basta ver os códigos apresentados aqui. Mas o enunciado diz que você pode ter um número V entre 1 e 10E100, muito mais do que cabe em um int então via dar m. se usar um int ou bigint ou sei lá.

Pegadinha

O enunciado diz que a entrada contem uma linha com o total de testes entre 1 e 1000 seguido de ...

Uma linha para cada teste. Não fala em um programa interativo, em que o usuário fica digitando os valores um a um. Mas em geral as pessoas supõem sempre um programa interativo.  Mais uma vez, basta ver os códigos propostos acima, em C ou java :)

Tudo bem, só que quando você está testando o programa é um porre ter que redigitar cada teste e ficar esperando os valores e testando de novo e tal. Demora muito e é ruim de reproduzir até dar certo se a gente erra muito :(

Mesmo que seja para ser interativo, faça seus programas lendo de um arquivo para não perder tanto tempo testando, e depois coloque a parte interativa. Crie o arquivo de teste bem simples na própria pasta do programa e vai ver a diferença. Conforme vai progredindo com o programa crie mais arquivos de teste com valores mais complexos ou condições limite.

Formato de Entrada

Imagine um óbvio arquivo chamado entrada.txt com esse conteúdo:

3
115380
2819311
23456

Nada mal, certo? Direto do enunciado. Enquanto não der o resultado que está lá no enunciado, podemos usar só esse, Talvez com um painel de teste só, certo? É só editar mesmo

 

Formato de Saída

Bem simples, não tem sequer o valor lido. Mas não serve durante os testes: vamos querer saber o valor lido e mais algumas coisas. Imprima mais e depois retire quando estiver seguro.

 

 calcular_leds()

Está lá escrito lá que o programa tem que ter uma função com esse nome e objetivo. Nem pense em escrever sem isso porque vai perder muitos pontos mesmo que funcione. E nem teste se não tiver isso porque vai perder seu tempo. Use os dígitos que estão lá e conte os segmentos acesos, como foi feito nos códigos sugeridos. Pode escrever algo assim

 

190307-calcular-leds.png.83752a5c7e18dbf1bc7d79b988c6eae0.png

 

E chamando isso para cada dígito do valor a ser aceso tem o total de leds que precisa acender. E para o número todo? 

Se existisse e funcionasse uma função int total_de_LEDs(char V[ ], int n) onde n é o número de dígitos e V, como diz no enunciado, é o valor a ser aceso no painel, seria só ler o valor N de testes e depois um loop de N vezes chamando essa função e imprimindo o valor retornado e pronto, não é?

 

 É.

 

Veja uma possível função dessas:

 

total_de_LEDs.png.e214637705e911c82e45bd6435e34c58.png

 

Duas notas:

 

A declaração de V como char V[] é segura porque deixa a alocação de memória a cargo de quem chamou a função. E nem precisamos testar o tamanho do painel V porque o cara que chamou já enviou o tamanho n como parâmetro. Assim você transfere a responsabilidade. A beleza dos programas de teste e de curso: não precisa testar quase nada que não esteja lá no enunciado. A menos que seja melhor pra quem está programando...

 

A linha V - '0' --- Esse é um caso similar a função calcula_leds() --- os valores sendo lidos como texto permitem que você digite direto no arquivo texto o valor que quer testar, um valor por linha.  E deixam você livre de usar matemática como dividir por 10 pra ir pegando os dígitos um a um se leu um int, o que seria de todo modo errado como já foi visto. Mas então o zero será '0' e nove será '9' e os valores estarão entre 48 e 57, os códigos desses valores na tabela. Veja em uma tabela ASCII online Etão basta subtrair o valor de zero, '0' no caso e vai ter o número decimal...  A beleza dos programas de teste e de curso: não precisa testar quase nada que não esteja lá no enunciado ou que  seja melhor pra quem está programando... Então não precisa testar se vieram letras por exemplo. Ou se o arquivo não existe, ou... 

 

E como costura isso? Algo assim quase resolve:

 

121222023_mainresumido.png.15d5373be988aac20c7237637dd85773.png

 

Abre o arquivo entrada.txt, que pode ser inicialmente o descrito no enunciado, e chama a função que a gente escreveu para cada painel V lido do arquivo, e imprime o total como pedido. Nada mal.

A funçao strlen() devolve o número de dígitos no valor que foi lido do arquivo. char V[200] aloca a memória necessária para ler os dados do arquivo.

Vai mostrar o resultado certo, mas nesse caso alguma coisa temos que testar: o enunciado limita o número N de soluções e o tamanho de cada painel V a ser aceso. Então não testar não é opção.

Vamos incluir os testes então...

 

1364765622_maincompleto.png.166a349bd7dd5eb76b279579a9e5a5b4.png

 

Não aumentou muito: é preciso testar os limites de N e V, está escrito lá. E tem um teste a mais porque se ao tentar ler um item não vier nada é melhor para o programa parar por aí mesmo.

Nota: exit() é a função clássica para encerrar o programa imediatamente.  exit(0) em geral se usa para indicar sucesso e qualquer outro valor para erro.

 

O resultado: para a entrada prevista 

 

saida.png.3026cfbe0415a40833efe2083000f8c7.png

 

Espero que ajude alguém...

Não são meus alunos, penso. Não sou o professor, já se passaram vários dias desde que o tópico foi aberto então acho que não é tão errado postar ao final uma possível solução

 

// meu compilador reclama de tudo em C sem essa linha. ignore se nao usa VISUAL STUDIO 2019
// nao tenho tempo para instalar um outro mais gentil com codigo em C
#define _CRT_SECURE_NO_WARNINGS

#include "stdio.h"
#include "stdlib.h"
#include "string.h"



int calcular_leds(int digito)
{
	int led[10] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
	return led[digito];
}	// end calcular_leds()



int total_de_LEDs(char V[], int n)
{
	int digito;
	int soma = 0;
	for (int i = 0; i < n; i++)
	{
		digito = V[i] - '0';
		soma = soma + calcular_leds(digito);
	}	// end for
	return soma;
}	// end total_de_LEDs()



int main(int argc, char** argv)
{
	int i;
	int c;
	int N;
	char* arquivo = "entrada.txt";
	char V[200];
	FILE* Entrada;

	Entrada = fopen(arquivo, "r");
	c = fscanf(Entrada, "%d", &N);
	if ((N < 1) || (N > 1000))
	{
		printf("N = %d: fora dos limites\n", N);
		exit(1);
	}
	for (i = 1; i <= N; i++)
	{
		c = fscanf(Entrada, "%s", V);	// tenta ler um unico item. fscanf deve retornar 1
		if (c != 1)
		{
			printf("Nao leu nada. Encerrando.\n");
			exit(1);	// cancela
		}
		// Entao leu alguma coisa
		c = strlen(V);	// c passa a ter o numero de digitos de V, o painel de teste
		// se nao tiver entre 1 e 100 digitos, cancela com exit()
		if ((c < 1) || (c > 100))
		{
			printf("V = %d. Fora do especificado: ( 1<=V<=100). Encerrando.\n", c);
			exit(1);
		}
		// leu painel V com c digitos, faz o teste
		c = total_de_LEDs(V, c);
		printf("%d leds\n", c);
	}	// end for
	exit(0); // 0 = ok. podia ser return 0, claro, ja que ao retornar de main encerra mesmo	
}	// end main()

 

 

 

 

  • 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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...