Ir ao conteúdo

Exercício em C


CarolPM

Posts recomendados

Postado

Bem, estava tentando fazer a seguinte questão:

"Será dada uma sequencia de 0 e 1 de tamanho indeterminado. voce deve ler esta sequencia ate aparecer um valor diferente de 0 ou 1, e , ao final, deve imprimir o menor e o maior numero de 1 que aparecerem consecutivos. Ex.:

Entrada:

000000110000001000000011112001111111110300111002010

Saída:

Menor sequencia de 1: 1

Maior sequencia de 1: 4 "

Minha tentativa (que colocarei abaixo) não realiza o desejado! Poderia alguem me ajudar? PS.: Não há espaço entre os numeros da sequencia... E pensei em usar vetor mas sem o tamanho limite ficou difícil... Caso haja algum erro muito gritante, pf minhas desculpas!

Meu Codigo:


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

int main()
{
int n=0,c=0
int c1=0; //Para pegar a maior sequencia
double c2=90000; //Para pegar a menor sequencia
printf("Digite a sequencia:\n");
while (n==0 || n==1)
{
scanf(" %d",&n);
while (n==1)
{
if (n==1)
{
c=c+1;
}
}
if (c>c1)
{
c1=c;
}
else if (c<c2)
{
c2=c;
}
c=0;
}
printf("%d\n",c1);
printf("%lf\n",c2);
return 0;
}

Postado

Bom, de erro mesmo acho que só tem o doube c2=90000; acho que deveria ser int e não double.. você não precisaria iniciar o n, já que você o alteraria de imediato.. você poderia ter colocado da seguinte forma:


while(n==0 || n==1)
{
scanf("%d", &n);
if(n==0)
contador_de_zeros++;
if(n==1)
contador_de_ums++;
}

ps: como estamos falando de varios numeros um, acho que o certo seria UMs, mas se eu estiver errado, bom.. não sou bom em pt lol

Olha, estou começando a ver alocação de memoria dinamica agora, então não sou especialista (acho que tem erros, mas o compilado rnão acusou nenhum hehe). Mas acho que usando isso, você pode dar um jeito... fiz um programa que faz o que você quer, mas usa a função getch() para pegar o caracter e já mandar para a sequencia, descartando o enter


#include <stdio.h>
#include <stdlib.h> /*para as funções system("pause"), */
/*void* malloc(size_t tamanho)*/
/* e realloc(void *ptr, size_t new_size)*/
#include <conio.h> /*para a função getch()*/
#include <ctype.h> /*para o isdigit(char c)*/
#include <string.h> /*para strlen(char *s)*/

main()
{
int c, i, ctdr_zero, ctdr_um, tamanho=5;
char *x;

printf("Digite a sequencia de numeros (aperte x para terminar): ");


for(i=ctdr_zero=ctdr_um=0, x=(char*)malloc(tamanho*sizeof(char)); isdigit(c=getch()); i++)
{
putchar(c);
if(i<(tamanho*sizeof(char)))
{
x[i]=c;
}
else
{
realloc(x, (++tamanho)*sizeof(char));
x[i]=c;
}
}
x[i]='\0';

for(i=0; x[i]=='0' || x[i]=='1'; i++)
{
if(x[i]=='0')
{
ctdr_zero++;
}
if(x[i]=='1')
{
ctdr_um++;
}
}
if(strlen(x)!=0)
printf("\n%s\n", x);
if(ctdr_zero!=0)
printf("Tinha %d Zeros\n", ctdr_zero);
if(ctdr_um!=0)
printf("Tinha %d UMs", ctdr_um);
system("pause");
}

espero que dê pra entender e que lhe ajude.. mas, qualquer coisa.. ;)

Postado

Bem, eu esqueci de mencionar que meu prof pediu para não usar alocação dinâmica! Apenas é permitido vetor estático! Ele me garantiu que era possível fazer dessa forma.. Eu dei uma olhada na sua sugestão e compreendi. Agradeço a ajuda! PS.: Eu iniciei c2 com um numero grande qualquer (nesse caso 90000), para que ele entrasse pelo menos uma vez no laço e contasse a menor sequencia, entendes? ;P

Postado

haha entendi agora :)

bom, mas da mesma forma que dá pra fazer com alocação dinamica dá pra fazer com vetor estático. A ideia, final, vai ser a mesma. E pensei em algo que talvez lhe ajude.. a sequencia só irá poder ser introduzida em int, certo? tipo 0.001 não vai ser considerado, apenas 0001, por exemplo, certo?

Bom, int tem um valor limite, que não lembro qual é. Você pode colocar o valor mais alto possivel para que seja contado no programa o valor limite, e com isso você conta a quantidade de casas possiveis, talvez passando por itoa (certifique-se de que o vetor terá espaço o suficiente.. faça algo como char vetor[1000]; para ter certeza..) e depois usando strlen.. bom.. são ideias. Tem melhores mas é o que consegui pensar até agora :S..

Postado

Bem, consegui fazer mas com uma condição: entre cada numero deve haver um espaço para funcionar! Não usei vetor nem nada especial. Não ficou o ideal mas... ^^''

Meu código ficou assim:

int main()
{
int n=0,c=0;//Inicializo o 'n' para ele entrar pelo menos uma vez no primeiro laço
int c1=0;//Contador da menor sequencia
int c2=9000;//Contador da maior sequencia

printf("Digite a sequencia:\n");//Repare que nesse caso o usuario precisa colocar um espaço ( ) entre cada numero
while (n==0 || n==1)
{
scanf(" %d",&n);
if (n==1)
{
while (n==1)
{
c=c+1;
scanf(" %d",&n);
}
}
if (c>0)//Se c for 0 significa q n==0 , nesse caso, sem o laço ele iria entrar e botar c2=0. O q seria errado!(p/ ficar mais fácil de entender, tire esse laço e veja o q acontece pelo debug)
{
if (c>c1)
{
c1=c;
}
if (c<c2)
{
c2=c;
}
c=0;
}
}
printf("\nMaior sequencia de 1s: %d\n",c1);
printf("\nMenor sequencia de 1s: %d\n",c2);
return 0;
}

Ah e! valeu pela reabertura dif! (y)

Postado

Meu algoritmo funcionou, usei um vetor estático como entrada supondo:

1011011120 como um vetor[10];

onde tenho que validar a entrada ou seja tem que ser só de um digito.

if(vetor < 0 || vetor >9)//Se tiver dois digitos ou seja negativo

não atribua ao vetor;

use um laço para atribuir a cada posição do vetor assim: Onde TAM_MAX é o tamanho do vetor

for(int i = 0; i < TAM_MAX; i++)
{
printf("Entre com um numero (0 a 9): ");
scanf(" %d", &num);
if(num < 0 || num >9) //Para os usuários digitar um numero de um digito só
{
printf("Entrada inválida!\n");
i--;//decrementa do contador
}
vet[i] = num;
}
//imprime a sequencia completa
printf("Sequencia: ");
for(int i = 0; i < TAM_MAX; i++)
printf("%d", vet[i]);

Postado

Gostei da sua ideia, Dani! De fato era, só ter definido um "TAM_MAX" para usar no vetor! também recebi suas MP e compreendi sua ideia! Agradeço pela ajuda/paciência! ^^

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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!