Ir ao conteúdo

C Alguém pra me ajudar?


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Eu tenho um exercício pra resolver mas tô sofrendo, é esse da imagem.

Só preciso de ajuda na lógica do cálculo mesmo, qualquer "luz" pra resolver é bem vinda.

 

Os algarismos são os mesmos de numerais romanos, ou "seja":

 

I = 1

V = 5

X = 10

L = 50

 

 

Vocês quem quer que resolva terá a minha eterna gratidão!


Screenshot_12.png.9e27f18d0e12eea5d2ff2bde0ee23757.png
 

Postado
55 minutos atrás, gugunegro disse:

Eu tenho um exercício pra resolver mas tô sofrendo, é esse da imagem.

Só preciso de ajuda na lógica do cálculo mesmo, qualquer "luz" pra resolver é bem vinda.

 

Os algarismos são os mesmos de numerais romanos, ou "seja":

 

I = 1

V = 5

X = 10

L = 50

 

 

Vocês quem quer que resolva terá a minha eterna gratidão!


Screenshot_12.png.9e27f18d0e12eea5d2ff2bde0ee23757.png
 

 

É uma gramática simples para ler e computar valores em duas "moedas" distintas: valor numérico e valor em créditos.

 

Precisa analisar o texto e pegar as palavras chave e depois tabelar os valores.


chaves:

  • representa (entrada)
  • vale (entrada)
  • créditos (entrada)
  • quantos (saida)
  • quanto (saida)

Basta ler as frases da entrada e agir de acordo com os termos

  • Curtir 2
Postado

@arfneto sim, isso eu entendi, o meu problema é na hora do cálculo, eu tava pensando em separar cada palavra dentro de um array pra conseguir ordenar direito, mas eu não lembro como faz isso, acabei perdendo o material que eu tinha que eu tinha usado esse método.

adicionado 30 minutos depois

Bem, consegui separar a string como queria, o problema é que só tem funcionado com a "vírgula", não com o "espaço" como eu queria, agora imagino que eu tenha que usar um for pra percorrer o array e "catalogar os valores", ficou assim o trecho do código que testei;

 

		//eu declarei uma variável char com nome de numeros no início do código

	case 1:
              system ("cls");
              printf("QUANTO VALE:\n");
              scanf("%s", &numeros);
              char* sep;
              sep = strtok(numeros, ",");
              while (sep != NULL){
                  printf("%s\n", sep);
                  sep = strtok(NULL, ",");
              }
	break;

 

  • Solução
Postado
14 minutos atrás, gugunegro disse:

sim, isso eu entendi, o meu problema é na hora do cálculo, eu tava pensando em separar cada palavra dentro de um array pra conseguir ordenar direito, mas eu não lembro como faz isso, acabei perdendo o material que eu tinha que eu tinha usado esse método

 

Você disse que nem tinha ideia do que significava 🤔

 

Você tem dois tipos de entrada

  • as que entram com um valor
  • as que pedem uma resposta

Se vier na ordem errada pode ser que não tenha dados suficientes e precise desprezar algo

 

Tem muitas maneiras de implementar isso. Uma seria usar uma tabela simples acumular os valores logo no inicio, algo tipo

typedef struct
{
	char*	token;
	int	v_credito;
	int	v_unidade;
}	Token;

typedef struct
{
	int	N;
	Token	T[300];
}	Tabela;

int main(int argc, char** argv)
{
	Tabela	T;
	T.N = 0;

	// ...

};

E aí você vai preenchendo conforme receba dados, mais ou menos como o compilador faz com as variáveis.

E quando vem uma consulta você pesquisa na tabela e vai somando os valores conforme a unidade pedida.

 

Pode ler uma linha inteira com fgets() e separar os tokens com :) strtok(), pode usar fscanf() ou mesmo usar fgetc(). Eu postei um programa em C ontem que usa essa última opção, pode ser um exemplo porque ele faz exatamente isso: um parser. É mais complicado lá porque é um algoritmo recursivo, mas mude a rotina insere() lá e ela vai montar sua tabela sem gastar mais que uns minutos pra alterar...

 

Claro, as outras opções também funcionam.

 

 

 

 

  • Obrigado 1
Postado
4 horas atrás, gugunegro disse:

Bem, consegui separar a string como queria, o problema é que só tem funcionado com a "vírgula", não com o "espaço" como eu queria, agora imagino que eu tenha que usar um for pra percorrer o array e "catalogar os valores"

 

Pois é... 

strtok() não é o caminho que eu seguiria. Como eu te disse a primeira opção é fgetc(), mais simples. O compilador faz isso, o sistema faz isso, strtok() e fscanf() fazem isso...

 

Mas pode conseguir assim. Um problema óbvio você já viu: usando scanf() você pelo menos tem um especificador %[xyzt] onde pode colocar qualquer coisa. Em strtok() tem apenas um char.

 

Seria muito mais fácil modificar a rotina que te mostrei. E mais flexível.

 

Evite editar seus posts a menos de alguma correção ortográfica ou algo assim. Dificulta para quem lê ou acompanha. 

 

Mais ainda: o software do forum não notifica o leitor de alguma alteração então você não vai conseguir respostas do que postar a partir de alguém que já tenha lido o post que alterou. Pense nisso...

 

image.png.2c0fe40e96f0ed2d200b5dc301b3ab8c.png

 

De volta ao seu programa

 

Não entendo a razão de ter um printf() em seu programa.

Muito menos uma chamada a system()


Pra que isso?

 

NUNCA faça isso a menos que faça parte do enunciado. E se fizer parte faça o menu ou a parte que imprime por último

 

Outro caminho

 

Usando OCR na imagem que postou o arquivo volta sozinho a ser texto:

Snob representa I 
krok representa V 
squid representa X 
leij representa L 
snob snob Prata valen 34 créditcs 
snob krok Ouro valem 57800 créditos 
squid squid Iron valem 3900 créditos 
quanta vale squid leij snob snob ? 
quantos créditos säo sncb krok Silver ? 
guantos créditos säo sncb krok Gold ? 
quantos créditos Sao sncb krok Iron ? 
quanta wood Could wood chuk mood ? 

Porque não colocar isso em um arquivo e simplesmente usar para fazer o programa, talvez uma linha por vez?

 

Escrever uma função para mostrar a tabela na tabela ajudaria também

	int mostra_tabela(Tabela*);

 

e pronto.

 

Está mesmo perdendo tempo com um menu e coisas assim? lendo dados da tela? Sério? Isso só vai te atrasar...

 

 

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!