Ir ao conteúdo

Ansi C

Membro Pleno
  • Posts

    3.284
  • Cadastrado em

  • Última visita

Tudo que Ansi C postou

  1. Esse é um problema clássico dos livros da web, historicamente poderíamos ver soluções assim: { int Total; int Numero; char ret; Total= 0; Continue: switch(scanf("%d",&Numero)) { case 1: Total+= Numero;/*eh número*/ case 0: if( (ret = getchar()) == '\n' || ret == EOF ) goto Fim;/*não eh número e se ENTER: Termina*/ else goto Continue; default: puts("Doideira"); return 0; } Fim: if(Total)printf("Resultado: %d\n",Total); } O goto faz justiça a sua fama.
  2. veja bem aqui n1 = nome[2] - 48; /*transformei os dois numeros para interios*/ n2 = nome[3] - 48; Vamos estudar estas duas Vetor: n1 e Vetor: n2. são vetores respectivamente de 2, e 3 caracteres suponho, ou do tipo que foram declarados. Sinceramente eu não sei o porquê de você achar que subtrair 48 no primeiro elemento do vetores os converte para inteiros. Acabei não entendendo e nada, olha que sou um ser humano imagina a coitada da máquina adicionado 8 minutos depois Um dica: IsNumber= scanf(" %d",&Number);// A função scanf retona 0- se não número; Faz um teste aí. adicionado 12 minutos depois chr= getchar();// retorna qualquer 1 caractere do stream input; imagine você que scan := 0, então getchar vai e limpa até que scanf seja 1. Só isso já resolve. adicionado 47 minutos depois Não é a solução, porém experimento o programa abaixo Obs.: EOF no prompt é Ctrl+Z para Microsoft Windows. Ignore_resto_soma_int { int Total; int Numero; char ret; Total= 0; for(ret= 1;ret;/*não preciso incrementar*/)switch(scanf("%d",&Numero)) { case 1: Total+= Numero;/*eh número*/ case 0: if('\n' == getchar())ret= 0;/*não eh número e se ENTER: Termina*/break; case EOF: ret= 0;/*Fim-Do_aquivo*/break; default: puts("Doideira"); return 0; } if(Total)printf("Resultado: %d\n",Total); }
  3. Olá @diogo moura ! Use a função sprintf( ); Porém antes de chamar a função o argumento string deve ser 1+ que a quantidade de dígitos do inteiro. Entendeu ?
  4. @diogo moura Eu fiz a minha própria MyScanf usando fgetc( stdin ); Porém você pode usar qualquer uma dessas aí. Quando tiver de conta a quantidade de caracteres capturados, não conte os espaços em braco, nesta conta não vale os caracteres de espaço. Retire os espaços da string capturada, exemplo: ENTRE: o rato roeu a roupa de margarida GRAVE: oratoroeuaroupademargarida Spoiler: Código da Solução
  5. Bom dia pessoa, Esse problema de simples scan, porém quando envolve conceitos e principalmente quando distorce-os a coisa fica complicada depois de 5 falhas de 10% finalmente percebi a jogada. Dica: Caracteres em branco não conta! GG!
  6. Ansi C

    C Problema em C / STRING

    Caso não encontre 0 ou 1; preferencialmente -1. Já observamos erros no enunciado da questão.
  7. Agora consegui ver bem qual é a tarefa.
  8. Eu pouco entendi o que a tarefa faz seria um string com dobro string de entrada, depois a saída é essa nova string. Exp.: ENTRADA |SAÍDA Ola clube do hardware|Ola clube do hardware Ola clube do hardware
  9. Se consegui ver bem o problema, esse é ocorre no instante em que: A tarefa atingi o nó mais interno do nível e finaliza o programa! Porque se cada nó tem um par associado dele e com impressão como poderia finalizar toda arvora quando um folha é alcançada. else if(a->dir!=NULL && a->esq!=NULL){ printf("%d ",a->info); imprimeInterno(a->esq); imprimeInterno(a->dir); } Observe que a chamada para um nó é continua até atingir suas folhas, entretanto o nó esquerdo chega na sua folha antes do no direito e quando a folha é finalmente alcançada seu par é NULL if(a->dir==NULL && a->esq==NULL){ printf("%d ",a->info); exit(1); } o programa finaliza ignorando a existência ou não de mais galhos/folhas. Isso é realmente o que deve acontecer ??? Eu acho que quando um folha é alcançada o programa retorna 1; Dessa maneira progredirá com as chamadas esquerdas. //Função: Imprimirá a sequência de nodos até que a folha seja alcançada. //retorna: 0 se o nodo atual é inválido para impressão. // 1 se alcançou uma folha é o fim do galho. int imprimeInterno(Arv *a) { if(a!=NULL) { //SE o nodo for nulo então não faz nada. if(a->dir!=NULL) { //Se o nodo tem par direito então imprimir e desce. printf("%d ",a->info); imprimeInterno(a->dir); } if(a->esq!=NULL) { //Se o nodo tem par esquerdo então imprimir e desce. printf("%d ",a->info); imprimeInterno(a->esq); } if(a->dir==NULL && a->esq==NULL) { //Se o nodo não tem par direito e esquerto printf("%d ",a->info); //então Retorna 1 -é folha/fim do galho. return 1; } } return 0; //Se esse node é inválido para impressão. }
  10. O que o operador sizeof faz é medir em bytes o tamanho de uma variáveis short e retorna esse tamanho para o vetor de char, com 100% de garantia que o vetor char terá a grandeza para uma variável short. O operador sizeof retorna sempre o tanho das coisas em bytes.
  11. Site já aceitou a solução anterior e eu já estou em outra! Mesmo assim fica para quem não fez ainda.
  12. #include <stdio.h> int main(void) { int m= 1, a= 1; // LARGURA do vetor scanf(" %d%d",&a,&m); while(m || a) { {//<...>Bloco Anônimo int lista_ivet[m], j, repeticao, saida= 0, h= -1; while(++h < m) scanf(" %d",h+lista_ivet); j= -1; m= m + j; while(++j < m) { repeticao= h= j; while(++h < m || h == m) { if(lista_ivet[j] == lista_ivet[h]) { int t= lista_ivet[j + 1]; lista_ivet[++j]= lista_ivet[h]; lista_ivet[h]= t; } } if(repeticao != j) saida++; } printf("%d\n",saida); }//<...> // LARGURA do vetor scanf(" %d%d",&a,&m); } return 0; }
  13. Pessoal tem impressão de que nós estamos confusos ainda. Observe que nos exemplos da entrada e saída temos Acima o que@devair1010 Tirou do site, na primeira entrada vemos que apenas o número 3 repetiu, logo a saída: 1 Depois temos no segundo teste que os números 6, 1, 3, 2 repetem, logo a saída: 4 Então deve existir uma busca que conta as repetências e apague-as do vetor, depois que a tarefa de apagar ou excluir as repetências um clausula IF verifica se existiu repetências e incrementa o contador exemplo: j inicia com 0 e h com sempre j + 1; 6 1 3 6 6 4 2 3 1 2 Em dado instante j no vetor[j] é 6 No mesmo instante h no vetor[h] é 6 então incrementa repetição++ depois (enviar 6 para o lugar do 1 no vetor) ficando assim: 6 6 3 1 6 4 2 3 1 2, daí incrementa j++ depois será outra vez de h no vetor ser 6 outra vez daí troca com 3 fica assim: 6 6 6 1 3 4 2 3 1 2, de novo j++, e h atingirá o limite e por fim uma clausula IF verifica se repetição tem valor SE verdadeiro então saida++. Depois disso j não será j = 1, e sim j = 3 que no vetor[j] corresponde a 1. Retomando o mesma tarefa de antes com h fazendo o ciclo até que h seja o último valor na largura do vetor e j o penúltimo o que finaliza a busca logo depois.
  14. 4 2 3 4 4 5 2 2 4 9 Observe que na sequência existe o penúltimo valor que é igual a 4 e quatro está na 8ª posição do vetor, pois quando acorre a verificação esse valor é ignorado já que para verifica != 1; é FALSE. Contudo quando i = 4 já não existe o valor ser ignorado porque tanto verifica != 1; TRUE quanto verifica[j] != 1; TRUE. Lembra que verifica != 1; é FALSE quanto j = 8, agora neste ponto em que i = 4 não mais acontece daí o BUG.
  15. Por nada. Se transformas tudo em segundos tornarias as coisa mais longas e teríamos o mesmo resultado com mais operações de % e /. Que seria interessante também, porém nesta questão eu não consegui.
  16. Então vou compartilhar mais uma maneira de fazer esta tarefa no Windows e outros. Lendo DATA: #include <stdio.h> #include <time.h> int main(void) { struct tm agora_data= {0}; time_t tempo_data; time(&tempo_data); agora_data = *localtime(&tempo_data); puts("<?> Tempo agora"); printf("<!>Agora-Dia: %d\n",agora_data.tm_mday); printf("<!>Agora-Mes: %d\n",agora_data.tm_mon+1); printf("<!>Agora-Ano: %d\n\n",agora_data.tm_year+1900); printf("<!>Agora-Hora: %d\n",agora_data.tm_hour); printf("<!>Agora-Min: %d\n",agora_data.tm_min); printf("<!>Agora-Seg: %d\n\n",agora_data.tm_sec); return 0; }
  17. Sim, também acho. Ou então somente com sorte não travará o programa. Existem muitas garantias de que o modificador short tem efeito na variável inteira de 32bits reduzindo-a para 16 bits. Entretanto só por segurança quando declarar os vetor de char (1 byte por 1) fazei assim com sizeof: Exemplo: // Exemplo de uso de cast entre tipos: char[] to short #include <stdio.h> int main() { short sValor, *sPonto; char cVetor[sizeof(short)]; sValor= 32000; sPonto= &sValor; //<!> cast entre ponteiros deve ser *((short*)cVetor)= *sPonto;// sempre explicitado. printf("cVetor[] tem %d bytes.\n",sizeof(cVetor)); printf("sValor tem %d bytes.\n\n",sizeof(sValor)); printf("cVetor[] tem %hd no valor.\n",*((short*)cVetor));//<!>cast sempre... printf("sValor tem %hd no valor.\n\n",*sPonto); return 0; } adicionado 22 minutos depois Com base em tudo o seu programa terá seguinte formato +/-: Programa: #include <stdio.h> #include <stdlib.h> short soma_fn(short* a, short* b) { return(*a + *b); } int main(void) { char x[sizeof(short)]; //1 variáveis do tipo char char y[sizeof(short)]; //2 variáveis do tipo char printf("Informe um numero entre -32767 e 32767\n"); scanf("%hi",(short*)x); printf("Informe outro numero entre -32767 e 32767\n"); scanf("%hi",(short*)y); short soma= soma_fn((short*)x,(short*)y); printf("Primeiro numero eh: %hi\n",*((short*)x) ); printf("Segundo numero eh: %hi\n", *((short*)y) ); printf("A soma dos numeros eh: %hi\n",soma ); system ("pause"); return 0; }
  18. Pode constatar por si mesmo que isso: f(((noatual->comida)=="mexicana") Jamais acontece entre strings ou literais em C. É preciso função que faça a comparação um a um com cada caractere até que certa condição seja ou não satisfeita. Caso não queira você mesmo implementar tal rotina há função strcmp() que já faz isso e se encontra pronta para uso, basta pra tanto detalhar #include <string.h>. Para mais informações consulte função strcmp clicando no link. Neste link você lerá entre muitas coisa que se função retorna 0 é porque os strings são iguais, se >0 é por que o primeiro caractere que é diferente se encontra acima na relação alfabética, se 0< é respectivamente o inverso do segundos caso e relembrando quando igual a 0 é porque são iguais os strings comparados. Esse é o erro lógico mais evidente, não sabemos se revolverá a sua questão problemática, porém é certo ser parte dela.
  19. Sim, muitas vezes eu esqueço por conta da praticidade que um exemplo imediata traz. Eu achei que código estava correto então submeti mais uma vez, problema é que no código que postei aqui no fórum esqueci de colocar a igualdade na condição if, pois são ambos >=. if (A >= B && a >= b)
  20. Essa parte é só para exibir o resultado da soma," não ajuda muito no seu problema", contudo se gerou um dúvida melhor descomplicar. int i= -1; while( ++i < x- 1){ //x é o limite do loop, porém reduzido em 1 para que o último //valor no vetor seja ignorado. Tem outras formas de conseguir o mesmo resultado. //iniciar com -1 é um preferência pessoal, gosto de (++var)pre-incremento mais //que pos-incremento(var++) printf("%d+", Numero[i]); Soma+= Numero[i]; } //Aqui está o último laço o motivo de x - 1. Para que com isso ao invés de '+' depois do número tenhamos um ' '. printf("%d ", Numero[i]); Soma+= Numero[i]; x= -1;//Convertendo Tipos Char -> Short Int; while(EOF!= sscanf(str+x,"%1hhd", &Numero[++x])); O que acontece aqui é isto: x inicial com -1 será pre-incrementado no argumento &Numero[++x] assim se torna com valor 0 e depois serve de índice para o vetor: Numero[0] o mesmo x posiciona a str no incio do vetor. Desta forma apenas único caractere será gravado por vez, esse caractere se encontra na posição str[x], a cada loop continua, assim até que str+x é o mesmo para a função que '\0' que significa o fim dos dados portanto a função retorna EOF finalizando o loop. E x agora tem o valor de inteiros carregados no vetor Numero. Avaliação dos argumentos de um função acontece da direita para esquerda, ou seja, começa em &Numero[++x] e vai passando para "%1hhd" e por último até str+x, por isso quando a função pega o valor de str+x o x já foi incrementado. Logo digamos assim: Nos argumentos os últimos são os primeiros. Em diante a vetor Numero tem todo os dígitos antes caracteres agora em tipos inteiros, exemplo: ENTRE: 1985 -> no vetor str teremos: 1985\0 pós sscanf no vetor número fica: [0]= 1, [1]= 9, [2]= 8, [3]= 5. Digamos que eu repita as variáveis acima e tenha com uma segunda entrada de maneira a ter dois vetores números e do tipo padrão int, para isso basta mudar o formato do sscanf para "%1d" que significa d= inteiro decimal e 1= apenas um dígito decimal. Utilizei char para gravar inteiros por isso que a mascara de entrada do sscanf é 1hhd: 1 de apenas um dígito, hh de apenas 1 byte e o d de decimal. char primeiroValor[10], //Nove números segundoValor[10], //Nove números /* Já que a função atoi não converte vetor utilizarei a var aux para fazer a conversão*/ auxPrimeiro, auxSegundo; ... //Entrada gets(primeiroValor); gets(segundoValor); //Processamento for (i=0; i<2; i++){ /*Parece que atoi nao funciona com vetor, então tentarei pegar individualmente cada elemento*/ auxPrimeiro = primeiroValor[i]; auxSegundo = segundoValor[i]; convPrimeiro[i] = atoi(auxPrimeiro); convSegundo[i] = atoi(auxSegundo); resultado = convPrimeiro[i] + convSegundo[i] >= 10 ? carry++ : printf ("No carry operation.\n"); //primeiroValor[i] >= 5 ? carry++ : printf ("No carry operation.\n"); Uma logica que também pode funcionar... } ... A função atoi precisa de um ponteiro para muitos tipos (char*) Um vetor char é também um ponteiro de tipos char, logo só argumente vetores char. Neste caso auxPrimeiro e auxSegundo não servemporque foram declaradas como sendo do tipo um char. Por último inicialize tais vetores por exemplo: auxPrimeiro[2]= {0}; //Assim [0] serve de auxilio e [1]= '\0' o que caracteriza uma string. E para inicialização não importa o tamanho do vetor. O programa colocará 0 em toda a largura do vetor inicializado por {0}. adicionado 21 minutos depois #include <stdio.h> #include <string.h> int main() { char primeiroValor[10], //Nove números segundoValor[10], //Nove números auxPrimeiro[2]={0}, auxSegundo[2]={0}; int convPrimeiro[10], convSegundo[10]; //Entrada gets(primeiroValor); gets(segundoValor); //Processamento int i, resultado, carry= 0; for (i=0; i<2; i++){ auxPrimeiro[0] = primeiroValor[i]; auxSegundo[0] = segundoValor[i]; convPrimeiro[i] = atoi(auxPrimeiro); convSegundo[i] = atoi(auxSegundo); resultado = convPrimeiro[i] + convSegundo[i] >= 10 ? ++carry,printf("%d + %d YES carry operation.\n",convPrimeiro[i],convSegundo[i]) : printf ("No carry operation.\n"); //primeiroValor[i] >= 5 ? carry++ : printf ("No carry operation.\n"); Uma logica que também pode funcionar... } return 0; } Assim. adicionado 30 minutos depois Problema é que ainda esta avaliando das dezenas -> unidades, quando deveria ser o contrário. Ainda não cheguei neste problema, e estou seguindo a ordem da apresentação na lista, me encontro com 51% da lista inciante. adicionado 58 minutos depois Acc, já Add
  21. Essa é a minha resolução. Pergunte-me o que quiser. Tempo de jogo com minutos int A, a, B, b; //Inicio: A-horas a-minutos, e Fim: B-horas b-minutos scanf(" %d%d%d%d", &A, &a, &B, &b); if (A == B && a == b) B = 24, b = 0; else { if (A >= B && a > b) { A = 24 - A; B = B + A; } else B = B - A; if (a > b) { B = B - 1; b = 60 + b - a; } else b = b - a; } printf("O JOGO DUROU %d HORA(S) E %d MINUTO(S)\n", B, b);
  22. @Jamerson Walderson No início você tentou usar scanf, eu tentei também observe: Code: Convertendo_com_sscanf #include <stdio.h> int main() { char str[11]= {0}; //O string que vamos capturar pela função scanf char Numero[10]= {0}, x;//Os caracteres do tipo char str[11] -> shot int numero[10] int Soma= 0; //A soma de todos os inteiros em Numero[10]; scanf(" %s", str); x= -1;//Convertendo Tipos Char -> Short Int; while(EOF!= sscanf(str+x,"%1hhd", &Numero[++x])); int i= -1; while( ++i < x- 1){ printf("%d+", Numero[i]); Soma+= Numero[i]; }printf("%d ", Numero[i]); Soma+= Numero[i]; printf("A soma de todos os numeros eh:= %d\n", Soma); return 0; A função sscanf acredito que seja um exagero muito legal , porque faz a mesma coisa que scanf só que em string.
  23. Estou viciado no URI
  24. o <conio.h> tem um comando chamado textcolor(int color); Se essa função não esta disponível então você tem o mesmo copilador que eu. /* * conio.h * This file has no copyright assigned and is placed in the Public Domain. * This file is a part of the mingw-runtime package. * No warranty is given; refer to the file DISCLAIMER within the package. * * Low level console I/O functions. Pretty please try to use the ANSI * standard ones if you are writing new code. * */ #ifndef _CONIO_H_ #define _CONIO_H_ /* All the headers include this file. */ #include <_mingw.h> #ifndef RC_INVOKED #ifdef __cplusplus extern "C" { #endif _CRTIMP char* __cdecl __MINGW_NOTHROW _cgets (char*); _CRTIMP int __cdecl __MINGW_NOTHROW _cprintf (const char*, ...); _CRTIMP int __cdecl __MINGW_NOTHROW _cputs (const char*); _CRTIMP int __cdecl __MINGW_NOTHROW _cscanf (char*, ...); _CRTIMP int __cdecl __MINGW_NOTHROW _getch (void); _CRTIMP int __cdecl __MINGW_NOTHROW _getche (void); _CRTIMP int __cdecl __MINGW_NOTHROW _kbhit (void); _CRTIMP int __cdecl __MINGW_NOTHROW _putch (int); _CRTIMP int __cdecl __MINGW_NOTHROW _ungetch (int); #ifndef _NO_OLDNAMES _CRTIMP int __cdecl __MINGW_NOTHROW getch (void); _CRTIMP int __cdecl __MINGW_NOTHROW getche (void); _CRTIMP int __cdecl __MINGW_NOTHROW kbhit (void); _CRTIMP int __cdecl __MINGW_NOTHROW putch (int); _CRTIMP int __cdecl __MINGW_NOTHROW ungetch (int); #endif /* Not _NO_OLDNAMES */ #ifdef __cplusplus } #endif #endif /* Not RC_INVOKED */ #endif /* Not _CONIO_H_ */ Instale a versão com todas as funções gráfica, daí só buscando na web.
  25. Se guarda existe uso de lugares na stack, e a pilha não é dinâmica ou ilimitada os fatores que depende da linguagem de programação dizem quando e se haverá estouro, salvo os casos em que o compilador inteligente transcreve a recursividade para interação, é bem possível atingir o limite na maioria dos casos. Em C'ANSI isso acontece em poucos segundos, observe quantas chamadas no argumento da função presente na saída do prompt. PS. Tudo que acontece gasta ou ocupa espaços na memória de alguma forma quando não liberados dela, mesmo que seja pequena sue número.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!