Jump to content

Programa Em C


Moranguito
 Share

Recommended Posts

Bem , estou completamente encravado num programa em C :dumb: ,

O programa reza assim :D

Para um dado número inteiro positivo, o programa deve apresentar as somas de 3 parcelas diferentes cujo total é esse número, e descartar as repetições.

Ex.

Número introduzido: 21

Resultado:

1+2+18

1+3+17

1+4+16

Deve descartar por exemplo 1+18+2 pk é igual a 1+2+18.

Eu não sei se bem, mas estou a fazer assim (ainda não compilei ptt nem sei se isto vai dar algo de jeito)

int a=1, b=2, c, d;
c= n-3
d = a + b + c
if (d==n)
printf ("%d + %d + %d\n", a, b, c);
c--;
else
b++;

n é o número introduzido para se calcular as somas

Agora eu acho que isto não tá nada bem, alguém me pode dar umas luzes sobre se estou a ir no bom caminho ou se devo apagar isto e começar de novo (qual o caminho correcto a seguir?)

E não tou nada a ver como dizer ao programa para entre "1+2+18" e "1+18+2" e "18+1+2" e "18+2+1" escolher só uma para output visto serem todas "iguais".

Any help please? :shy:

Edited by Moranguito
Link to comment
Share on other sites

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){

	int num = atoi(argv[1]);
	int a = 1,b=2,c=num - 3,res = a + b + c;
	while(res==num && c > 0 && c >= b){
		printf("%d + %d + %d\n",a,b,c);
		c--;
		b++;
	}
	return -1;
}

EDIT: Toma lá ^^

Edited by KilL_MaSTeR
Link to comment
Share on other sites

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){

	int num = atoi(argv[1]);
	int a = 1,b=2,c=num - 3,res = a + b + c;
	while(res==num && c > 0 && c >= b){
		printf("%d + %d + %d\n",a,b,c);
		c--;
		b++;
	}
	return -1;
}

EDIT: Toma lá ^^

Penso que o valor "a" também é suposto mudar, ou não?

E não tou nada a ver como dizer ao programa para entre "1+2+18" e "1+18+2" e "18+1+2" e "18+2+1" escolher só uma para output visto serem todas "iguais".

Any help please? :shy:

Até tenho uma solução para isso mas gasta mais memória porque guarda todos os resultados que já saíram, é uma solução um bocado dumb

Edited by dark_shadow_rules
Link to comment
Share on other sites

1º - Precisas de usares ciclos (for /while /..) para gerares todas as combinações.

2º - É relativamente fácil evitares repetições, este é um algoritmo básico (deixo para ti usares a linguagem que quiseres):

for (a = 1; a < n / 2; a++) {
  b = a;
  c = n - a - b;
  while (c >= b ) {
	 write (a b c);
	 b++;
	 c--;
  }
}

Isto gera:

1+1+19 (n sei se pode ter repetidos)

1+2+18

1+3+17

1+4+16

1+5+15

1+6+14

1+7+13

1+8+12

1+9+11

1+10+10

2+2+17

2+3+16

2+4+15

2+5+14

2+6+13

2+7+12

2+8+11

2+9+10

3+3+15

...

Normalmente neste tipo de algoritmos deves procurar entender a sua lógica, vais ver que é aí que está o segredo ;)

PS: Alterado para poupar uma variável :P e ficar mais bonito

Edited by PJP
Link to comment
Share on other sites

Bem desde já obrigado pelas respostas,

@Kill_Master

Bem alterei um pouquito o teu programa, porque tens aí coisas que eu ainda não aprendi :shy: e ficou assim:

int main(){

	int a, b, c, res, num;	
	
	printf("Escreva um numero?");	 
	scanf("%d",&num);				  

   
	a = 1;
	b = 2;   
	c = num - 3;
	res = a + b + c;
	
	
	while(res==num && c > b){
		printf("%d + %d + %d\n",a,b,c,);
		c--;
		b++;
		
	}
	system ("pause");
	return 0;
}

Comecei por tirar o "&& c>0" porque eu quero colocar uma mensagem caso não seja possível construir somas com o número dado como por exemplo "2,3,4,5" (pois as 3 parcelas têm de ser diferentes), e tirei o "=" de "c>=b", exactamente pelo mesmo motivo do anterior, por exemplo com o número 21 ia dar-me a soma "1+10+10".

Isto funciona muito bem, eu estava quase lá :D, agora só falta mesmo mudar isto de forma a que a também mude o a por exemplo:

Com o número 21 dá-me as seguintes somas:

1+2+18
1+3+17
1+4+16
1+5+15
1+6+14
1+7+13
1+8+12
1+9+11

faltam as somas:

2+3+16
2+4+15
2+5+14
....
3+4+14
3+5+13
...

@PJP

Usei o teu algoritmo para chegar à minha solução:

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

int main()
{
 int a, b, n, c;
 
printf("Escreva um numero?");
scanf("%d",&n);

for (a = 1; a < n / 2;) {
  b = a + 1;
  c = n - a - b;
  while (c > b ) {
  printf("%d + %d + %d\n",a,b,c);
  b++;
  c--;
  }
for (a = 2; a < n / 2; a++) {
  b = a + 1;
  c = n - a - b;
  while (c > b ) {
  printf("%d + %d + %d\n",a,b,c);
  b++;
  c--;
  }
}  
	  system ("pause");
	  return 0;
	  }
}

Só que fiquei sem perceber uma coisa, antes de colocar o segundo "for" ele apenas me mostrava as somas para quando "a=1" e nunca ia incrementar "a", com o segundo for ele dá-me todas as somas, mas se tirar o "a++" ele entra num loop sem fim, com o "a++" no primeiro for ou sem o "a++" o resultado está sempre correcto. Não percebi porquê :dumb:

Link to comment
Share on other sites

dois "for"s e resolves isso :P

Pois isso já eu percebi, só não percebi porque é que só funciona com o 2º for, e porque tirando o "a++" do segundo for aquilo fica ad eternum a passar números no ecran!

É que convém que eu perceba o porquê da solução se não, não me vale de nada não é?

:P

Link to comment
Share on other sites

Desculpa mas não percebi o que fizeste ao meu algoritmo. Já percebi que não querias números repetidos mas para que é que tens os dois For??

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

int main()
{
int a, b, n, c;

printf("Escreva um numero?");
scanf("%d",&n);

for (a = 1; a < n / 2; a++) {
  b = a + 1;
  c = n - a - b;
  while (c > b ) {
	 printf("%d + %d + %d\n",a,b,c);
	 b++;
	 c--;
  }
}  
 system ("pause");
 return 0;
}

Tens a certeza que isto assim não chega? Ele só fazia o 'a' igual a 1 porque não tem o "a++" dentro do "for (a = 1; a < n / 2; a++)"

É óbvio que se tirares o a++ ele vai entrar em ciclo infinito. Imagino que já tenhas aprendido como funciona a instrução for mas cá vai:

- O for é constituido por três partes:

1ª - Inicialização de valores nas variáveis;

2ª - Condição de terminação. Podes lêr da seguinte forma - "Enquanto a for menor que N /2 executa instruções dentro do for"

3ª - Instruções de fim de ciclo. Neste caso, no final do ciclo incrementa 'a' de uma unidade.

Não tendo mais nenhum sítio onde incrementas o 'a', a 2ª parte do for: "Enquanto a for menor que N /2 executa instruções dentro do for" vai retornar sempre verdadeiro e daí nunca sair do ciclo.

Imagino que estejas no início, vais ver que daqui a algum tempo estes conceitos vão ser básicos.

Edited by PJP
Link to comment
Share on other sites

Tens a certeza que isto assim não chega? Ele só fazia o 'a' igual a 1 porque não tem o "a++" dentro do "for (a = 1; a < n / 2; a++)"

É óbvio que se tirares o a++ ele vai entrar em ciclo infinito. Imagino que já tenhas aprendido como funciona a instrução for mas cá vai:

- O for é constituido por três partes:

1ª - Inicialização de valores nas variáveis;

2ª - Condição de terminação. Podes lêr da seguinte forma - "Enquanto a for menor que N /2 executa instruções dentro do for"

3ª - Instruções de fim de ciclo. Neste caso, no final do ciclo incrementa 'a' de uma unidade.

Não tendo mais nenhum sítio onde incrementas o 'a', a 2ª parte do for: "Enquanto a for menor que N /2 executa instruções dentro do for" vai retornar sempre verdadeiro e daí nunca sair do ciclo.

Imagino que estejas no início, vais ver que daqui a algum tempo estes conceitos vão ser básicos.

Eu peguei no teu algoritmo, e sem alterar nada, ele só me dava a lista das somas para a=1, mesmo com o a++ no for, quando coloquei o segundo for é que o programa me começou a dar o resultado que queria, mas amanhã vou dar uma nova vista de olhos, agora é caminha que amanhã trabalha-se :P

Thank's pelas ajudas e explicações :), eu ainda estou no início :shy:

@PJP

Jovem, como te disse fui experimentar o programa de novo e não é que funciona só com um for, não sei o que se passou mas ontem em casa eu juro que quando corri o programa para o número 21, só com o primeiro for ele só me dava as somas:

1+2+18
1+3+17
1+4+16
1+5+15
1+6+14
1+7+13
1+8+12
1+9+11

:shy:

Muito obrigado pela ajuda e pela explicação.

Peço há equipa moderativa para manter este tópico aberto porque quando tiver mais dúvidas escuso de estar a abrir mais tópicos :P

Link to comment
Share on other sites

  • 1 month later...

Bem cá volto eu com outro problema, tenho estado a estudar a parte de strings e vectores, no livro que uso (Fundamentos de Programação em C) o 1º exercício reza assim:

Pretende-se codificar a informação contida num vector de inteiros da seguinte forma: sempre que um número x é repetido n vezes, a sequência de repetições é substituída por nx. Por exemplo é introduzido o número 277733444 que deve ser substituído por 12372334. Escreva uma rotina que faça também a descodificação.

Ora eu mentalmente já consegui ver o que se pretende, se não estou errado consoante se escolha codificar ou descodificar, ele deve ler número a número e fazer o que se pretende. Isto é tudo muito bonito na cabeça, mas num programa em C a coisa pia mais fino :P.

E como o livro não têm os exercícios propostos resolvidos eu estou um pouco encravado, alguém consegue ajudar a que se faça luz nesta cabecita :P

Thank's

@PJP depois de muito bater com a córnea na parede, o meu segundo for não estava lá a fazer nada, eu é que quando comecei a trabalhar o teu algoritmo, fazendo alterações para ver o que acontecia quando mexia aqui e ali, coloquei uma chaveta fora do sítio, e por isso o programa só me dava o resultado que eu pretendia com um segundo for. Mas é assim que se aprende :P

Link to comment
Share on other sites

Bem cá volto eu com outro problema, tenho estado a estudar a parte de strings e vectores, no livro que uso (Fundamentos de Programação em C) o 1º exercício reza assim:

Pretende-se codificar a informação contida num vector de inteiros da seguinte forma: sempre que um número x é repetido n vezes, a sequência de repetições é substituída por nx. Por exemplo é introduzido o número 277733444 que deve ser substituído por 12372334. Escreva uma rotina que faça também a descodificação.

Ora eu mentalmente já consegui ver o que se pretende, se não estou errado consoante se escolha codificar ou descodificar, ele deve ler número a número e fazer o que se pretende. Isto é tudo muito bonito na cabeça, mas num programa em C a coisa pia mais fino :P.

E como o livro não têm os exercícios propostos resolvidos eu estou um pouco encravado, alguém consegue ajudar a que se faça luz nesta cabecita :P

Thank's

@PJP depois de muito bater com a córnea na parede, o meu segundo for não estava lá a fazer nada, eu é que quando comecei a trabalhar o teu algoritmo, fazendo alterações para ver o que acontecia quando mexia aqui e ali, coloquei uma chaveta fora do sítio, e por isso o programa só me dava o resultado que eu pretendia com um segundo for. Mas é assim que se aprende :P

Segundo o que li, tens que "traduzir" o que te vou dizer para C.

Crias um vector chamado final, por exemplo.

Crias um contador.

Percorres o vector que te dão e guardas o valor do índice actual e o do índice seguinte (se ainda não chegaste ao final do vector).

Enquanto o seguinte == actual -> incrementas o contador e os índices.

Quando saíres do while ainda estás dentro do for que percorre o índice.

Colocas no vector final o valor de actual e o valor do contador.

É mais ou menos isto, feito de cabeça. O mais difícil é a "tradução", mas o algorítmo é, mais ou menos, este. ;)

Link to comment
Share on other sites

Estou com a cabeça a deitar fumo....

Antes de mais com o faço que ele leia o vector 22233344 como 8 caracteres distintos ele só lê se for introduzido 2 2 2 3 3 3 4 4.

Para ver se dava algo de jeito comecei por fazer este pedaço de código, mas ele dá-me sempre i como 0:

i=0;

vini=v[0];

vseg=v[1];

while (vini == vseg)

{

i++;

vseg++;

}

:dumb:

Link to comment
Share on other sites

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

int main () {
  char str1[100], str2[100], last, temp[10];
  int n, i, cnt;

  scanf("%d", &n);
  sprintf(str1, "%d", n);
  last = str1[0];
  for(cnt = 1, i = 1; str1[i] != '\0'; i++) {
	if(str1[i] == last) {
	  cnt++;
	} else {
	  sprintf(temp, "%d%c", cnt, last);
	  strcat(str2, temp);
	  last = str1[i];
	  cnt = 1;
	}
  }
  sprintf(temp, "%d%c", cnt, last);
  strcat(str2, temp);
  printf("output: %s\n", str2);
  return 0;
}
Não está bonito mas funciona.
Link to comment
Share on other sites

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

int main () {
  char str1[100], str2[100], last, temp[10];
  int n, i, cnt;

  scanf("%d", &n);
  sprintf(str1, "%d", n);
  last = str1[0];
  for(cnt = 1, i = 1; str1[i] != '\0'; i++) {
	if(str1[i] == last) {
	  cnt++;
	} else {
	  sprintf(temp, "%d%c", cnt, last);
	  strcat(str2, temp);
	  last = str1[i];
	  cnt = 1;
	}
  }
  sprintf(temp, "%d%c", cnt, last);
  strcat(str2, temp);
  printf("output: %s\n", str2);
  return 0;
}
Não está bonito mas funciona.

Boas, se colocar um inteiro superior a 9 "casas" ele retorna um valor estranhissimo.

E descodificar? Alguém com alguma ajudita :P?

Link to comment
Share on other sites

Descodificar é o mesmo processo. Tendo em conta que o número ímpar é o nº de vezes que o número par se repete, então:

char res[200];
char str1[100];
scanf("%d", &n);
sprintf(str1, "%d", n);

int numVezes;
int numAnalisado;
int i, y;

for (i = 0; str1[i] != '\0'; i++)
{
   if(i%2)
		numVezes = strt1[i];
   else
   {
		numAnalisado = str1[i];
		for(y = 0; y < numVezes; y++)
		{
			  res = res + numAnalisado
		}
   }
}

Algo assim :-..

Link to comment
Share on other sites

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

int main () {
  char str1[100], str2[100], last, temp[10];
  int i, cnt;

  scanf("%s", &str1);
  last = str1[0];
  for(cnt = 1, i = 1; str1[i] != '\0'; i++) {
	if(str1[i] == last) {
	  cnt++;
	} else {
	  sprintf(temp, "%d%c", cnt, last);
	  strcat(str2, temp);
	  last = str1[i];
	  cnt = 1;
	}
  }
  sprintf(temp, "%d%c", cnt, last);
  strcat(str2, temp);
  printf("output: %s\n", str2);
  return 0;
}
Epá deves estar a usar uma máquina onde um inteiro são 32bits e estás a inserir um valor superior a 2^32. Tb estava a ser "parvo", pode-se logo sacar o número em forma de array de caracteres.
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.