Ir para conteúdo
Fórum Script Brasil

Nefisto

Membros
  • Total de itens

    36
  • Registro em

  • Última visita

Sobre Nefisto

  • Data de Nascimento 22/07/1991

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

Nefisto's Achievements

0

Reputação

  1. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_ITENS 10 int main () { char fileName[50]; FILE* file; int i = 0; int j; for (i = 0; i < MAX_ITENS; i++) { sprintf (fileName, "arq%d.txt", i); file = fopen (fileName, "w"); j = 0; while (j < 1048576){ fprintf (file, "0"); j++; } fclose (file); } return (0); }
  2. A sim, desculpa, erro meu, nem tinha olhada a foto do seu problema, porem o erro q eu flei ainda é valido hehe Isso acontece porque o compilador le de cima para baixo, quando ele chega na funcao "MAIOR", ele ainda não sabe que ela existe, porque ela foi criado em baixo da main, você tem duas opcoes: 1: crie um cabecalho colocando em cima do main void maior(int *a, int *b); 2: Copia e cola a funcao maior pra cima do main
  3. Troca -> if (a > b) por if (*a > *b)
  4. Agora ta certinho 😜 Pega o habito de conferir o retorno da funcao, o atoi retorna um int e não um vetor de int, o vetor é desnecessario (como você mesmo percebeu) Dica: Uma boa maxima quando se esta programando é -> "Se você digitar mesmo codigo mais do que 2 vezes, pare e volte, a chance de estar errado é muito grande" Ota: Encontre um bom balanco entre "readability vs efficiency", não sei como traduz pro portugues, seria legivel? enfim, você esta verificando se a data esta no range de 48 a 57, que são as letras 0 e 9, só q a não ser q você se lembre da tabela ASCII você não vai lembrar o que isso faz daki um mes, e qualquer outra pessoa q for ler vai achar q isso é gambiarra: Deixe as coisas legiveis, para o seu proprio bem (data[9] > '9' || data[9] < '0') Acho q de grosso é isso, com o tempo o seu codigo vai enxugando, afinal, o melhor agoritmo é aquele que você sabe fazer =D Abracos
  5. @princknoby Vou deixar um código pronto lá embaixo, mas se quiser q a gente julgue o seu, coloque ele aqui q a gente confere os enganos Só uma dica: q eu acho valiosa, como você está começando, procura usar as funções prontas somente quando for algo muito cabeludo pra fazer na unha. Tente fazer as suas próprias funções sempre que possível. Outra dica: Essa talvez você queira ignorar e deva se achar que não ta certo, quando você for fazer exercícios para aprender, exercícios que você não precisa entregar nem mostrar pra ninguém, procure evitar fazer esses exercícios que peçam essas bobei rinhas de verificar entrada de usuário, eles não desafiam o seu intelecto, só são cansativos e chatos de serem feitos, claro quando é um professor que está pedindo, você faz e entrega pra ele mas quando está resolvendo na sua casa, PULE, ninguém aprende C verificando se o ursoario digitou "batata" quando você pediu a IDADE dele, uma regra legal q um professor me passava era "Suponha que a entrada sempre esteja correta", dessa forma você só se preocupa com o algoritmo, que é o que interessa 1- Apesar de estar em um loop, você não faz nenhuma relação entre o contador e algo dentro do código. O cabeçalho do atoi é: int atoi(const char *str) O que significa q ela recebe uma string e devolve um inteiro, supondo q data é a string que contem a data completa -> "12/02/1992", o que você esta fazendo é converter toda data duas vezes para a variavel dia, perceba q você esta tentando converter tdo, com barras e 8 algarismos. Resposta: Provavelmente tem erros, mas a ideia ta aew, espero ter ajudado, abracos e bons estudos /*Leia uma cadeia de caracteres no formato “DD/MM/AAAA” e copie o dia, mês e ano para 3 variáveis inteiras. Antes disso, verifique se as barras estão no lugar certo, e se DD, MM, e AAAA são numéricos. Caso algum deles não seja, ou alguma barra estiver fora do lugar ou faltando, informe para o usuário qual foi o erro e peça para repetir a operação. Faça isso até que ele forneça os dados corretamente. */ #include <stdio.h> #include <stdlib.h> enum Erros { BARRAS_ERRADAS = 2, NUMEROS_ERRADOS, PALAVRA_MAIOR }; //Comecamos criando 2 funcoes de suporte para solucionar //nosso exercicio //// ACHEI que a gente fosse usar o atoi, mas acabou que não usamos, de qualquer maneira //// a dica de você criar suas proprias funcoes ainda é valida, então vou deixar o MyAtoi //// para você dar uma olhada // Conversor de string para numero int MyAtoi (const char *a) { int i; int result = 0; // Você não precisa intender isso, mas seria legal // se o fizesse, não é muito complicado e é uma // solucao q eu acho bem sutil for (i = 0; a[i]; i++) result = result * 10 + (a[i] - '0'); return result; } //Valida a entrada do usuario //RETORNOS: // 1 -> A palavra esta no formato NN\\NN\\NNNN // 2 -> A barra esta no lugar errado // 3 -> Algum dos numeros foram colocados de maneiro erronia // 4 -> Foram digitados mais numeros do que o nescessario char VerificaEntrada (const char *data) { int i = 0; char limSup = 0; for (i = 0; data[i]; i++) { // As barras precisam estar nas posicoes 2 e 5 da string if (i == 2 || i == 5) { if (data[i] != '\\' && data[i] != '/') return 2; // ta errado } else //todo o resto tem q ser um digito de 0 a 9 { switch (i) { //Dezena do dia case 0: limSup = '3'; break; //Unidade do dia case 1: if (data[i-1] >= '0' && data[i-1] < '3') limSup = '9'; else limSup = '1'; break; //Dezena do mes case 3: limSup = '1'; break; //Unidade do mes case 4: if (data[i-1] == '0') limSup = '9'; else limSup = '2'; break; //Milhar do ano case 6: limSup = '2'; break; //Centena do ano case 7: if (data[i-1] < '2') limSup = '9'; else limSup = '0'; break; //Dezena do ano case 8: if (data[i-2] < '2') limSup = '9'; else limSup = '1'; break; // Unidade do ano case 9: if (data[i-3] < '2') limSup = '9'; else limSup = '8'; break; } if (data[i] < '0' || data[i] > limSup) return 3; } } //Caso a palavra seja maior do que deveria ser if (i != 10) return 4; return 1; } int main () { //Armazena a data que sera entrada char data[20]; int i = 0; int tmp = 0; while (1) { printf ("DD\\MM\\AAAA\n"); scanf ("%s", data); if ((tmp = VerificaEntrada (data)) == 1) break; switch (tmp) { case BARRAS_ERRADAS: printf ("Erro na barra\n"); break; case NUMEROS_ERRADOS: printf ("Algum numero ta errado\n"); break; case PALAVRA_MAIOR: printf ("A palavra esta maior do que era nescessario\n"); break; } } return (0); } Edit: ----------------------------------------------------------------------------------- Aqui uma maneira de fazer seguindo o raciocinio que você propos int main () { //Armazena a data que sera entrada char data[20]; int i = 0; int dia, mes, ano; int tmp = 0; while (1) { printf ("DD\\MM\\AAAA\n"); scanf ("%s", data); //Coloca \0 nas posicoes esperada de forma manual data[2] = '\0'; data[5] = '\0'; // Onde fica a primeira barra dia = MyAtoi (data); mes = MyAtoi (&data[3]); ano = MyAtoi (&data[6]); printf ("%d\t%d\t%d\n", dia, mes, ano); } return (0); }
  6. Ola @princknoby, vou tentar ajudar com o que for possivel. Não se preocupe, strings são confusas para todos que estão começando. COMENTARIOS: Antes de começar, gostaria de destacar alguns pontos do seu código. 1- Cuidado com essa função, apesar de estar funcionando, caso a primeira entrada não satisfaça o loop, o seu codigo fica presso nele já que o "ch" não é alterado. Caso seja do seu interesse abaixo vou deixar uma macro que um professor me passou para limpeza de buffer #define CLEAN_BUFF do{ int c; while((c = getchar()) != '\n' && c != EOF);}while(0) 2- Nunca tinha visto a entrada limitando quantidade de caracteres, aprendi essa agora hehe obrigado SOLUCAO: Agora sim, vamos ao codigo, optei por refazer e comentar, espero que dessa maneira seja o suficiente para sanar suas duvidas. #include <stdio.h> #define MAX_PESSOAS 10 #define MAX_NOME 100 #define CLEAN_BUFF do{ int c; while((c = getchar()) != '\n' && c != EOF);}while(0) int main () { // O limite de pessoas é 10, porém o codigo pode encerrar antes. // essa variavel controla situacoes onde ele acabe antes unsigned qtdPessoas = 0; /// Na situacao abaixo, ///o nome guardado em nomes[1] esta LOGICAMENTE ligado a idades[1] // Uma matriz de strings é como um lista de nomes char nomes[MAX_PESSOAS][MAX_NOME]; // E nós faremos uma ligacao logica¹ entra a matriz de nome e o vetor de idades int idades[MAX_PESSOAS]; // Vamos armazenar o indice do mais velho e mais novo aqui int velho = 0, novo = 0; //Contadores int i; // Inicialmente vamos supor que nosso codigo ira rodar da forma esperada // onde as 10 pessoas são inseridas for (i = 0; i < MAX_PESSOAS; i++) { printf ("Nome: "); scanf ("%99[^\n]", nomes[i]); CLEAN_BUFF; printf ("Idade: "); scanf ("%d", &idades[i]); CLEAN_BUFF; //Caso a idade entrada seja negativa, o loop se encerra if (idades[i] < 0) break; // Caso contrario uma pessoa foi adicionado e a nossa variavel de controle // deve ser incrementada else qtdPessoas++; } // As variaveiz velho e novo comecaram em 0, significa que inicialmente // a primeira pessoa é a mais velha e a mais nova ao mesmo tempo for (i = 1; i < qtdPessoas; i++) { // Se a pessoa atual for mais velha que o mais velho conhecido if (idades[i] > idades[velho]) velho = i; // Se a pessoa atual for mais nova que o mais novo conhecido if (idades[i] < idades[novo]) novo = i; } printf ("Velha:\n%s\t%d\n", nomes[velho], idades[velho]); printf ("Novo:\n%s\t%d\n", nomes[novo], idades[novo]); return (0); }
  7. Nefisto

    EOF, '\0' e '\n'

    @vangodp falei besteira?? hehe não intendi o emoticon, caso eu tenha falado bobeira, favor me corrija
  8. Nefisto

    EOF, '\0' e '\n'

    Olá @princknoby, Seria mais fácil perguntar se existe alguma semelhança hehe. Resposta rápida: EOF -> usada quando se trabalha com arquivos para verificar se ainda existe conteúdo para se consumir. '\0' -> indicador de final de palavra, usado em vetores de char '\n' -> caractere que indica quebra de linha (A resposta longa coloquei no final) Quanto a segunda dúvida, no seu caso as três são bem diferentes, supondo que string seja um vetor de caracteres: 1-Isso verifica se o ponteiro string é NULL (o que não faz sentido, logo é um erro semântico) 2-Isso também não faz sentido, você está verificando se o caractere em questão é igual a -1, porém não existem caracteres negativos, e mesmo que você estivesse lidando com arquivos ainda estaria errado pois você não pode usar indexadores em FILE* 3-Esse caso já está OK, supondo que você esteja procurando por quebras de linha em sua string, o que eu creio não ser o caso Os três são diferentes e creio eu que nenhum faz o que você gostaria, supondo que você queira caminhar por uma palavra uma maneira bacana seria: for (i = 0; string[i] != '\0'; i++) {...faz algo bem bacana...} Só como um detalhe, perceba que a expressão ... string != '\0' ... é opcional, como ela retorna 1 caso a letra seja e o '\0' e 0 caso contrário, então você poderia escrever for (i = 0; string[i]; i++) {...faz algo bem bacana...} Espero ter ajudado, abraços e bons estudos. Resposta longa: Vamos começar executando o código abaixo: printf ("%d\t%d\t%d\n", EOF, '\0', '\n'); Saída: -1 0 10 Bom, a associação entre EOF e '\0' faz sentido já que os dois indicam o final de algo, porem o '\n' é somente um caractere qualquer da tabela ASCII, se você procurar na tabela pelo valor 10: "Na computação, line feed é um caractere de controle que indica que uma linha deve ser acrescentada. Ele possui o código ASCII 10. " - wiki Portanto é só uma maneira de representar o "enter" do seu teclado, isso varia entre SO porem creio que o assunto foge do escopo da pergunta. Portanto já sabemos o que é o '\n', vamos adiante. Quando eu crio linhas de código como: char s[] = "Hello"; A variável "s" indica onde na memoria a minha palavra "Hello" começa, logo s é um ponteiro, porém s só me diz onde a palavra COMECA mas não onde ela acaba, portanto é necessário se ter um "caractere especial" para indicar o final de uma palavra, e o caractere escolhido foi '\0' q também é um char representado na tabela pelo numero 0, que é o mesmo valor usado para NULL. Se você fizer algo do tipo: char s[4] = "Ola"; s[3] = 'a'; printf ("%s", s); Vai perceber que a sua palavra vai mostrar mais coisas, provavelmente, do que os 4 caracteres que você reservou para s. Quanto ao EOF, acrônimo para End Of File, uma macro existente na stdio que representa o valor -1, a imagem abaixo foi tirada do site https://www.gnu.org/software/m68hc11/examples/stdio_8h-source.html que possui a implementacão das lib de c. O valor em questão é utilizado quando se trabalho com arquivo, é o indicador retornado quando funções, como fgetc(), não possuem mais informações para retornar do arquivo em questão. Seria como uma macro de controle para arquivos que já foram consumidos.
  9. você quer dizer q a entrada vai ser "01001111 01101001" e a saida vai ser "oi" ?
  10. Ola @Maria Luiza Demarco, da uma olhada no código abaixo, espero ter ajudado, qualquer coisa da um grito, abraços #include <stdio.h> #define SIZE 6 int fibo (int n) { if (!n) return 0; if (n <= 2) return 1; return fibo (n-1) + fibo (n-2); } int ehPrimo (int n) { int tmp = n; while (--n > 1) if ( !(tmp%n) ) break; if (n == 1) return 1; return 0; } void mostraMatriz (int m[SIZE][SIZE]) { int i, j; for (i = 0; i < SIZE; i++) { for (j = 0; j < SIZE; j++) printf("%02d ", m[i][j]); printf("\n"); } } int main() { int matriz[SIZE][SIZE] = {0}; int i, j, k; int tmpPrimo = 1; //Diagonal principal for (i = 0; i < SIZE; i++) matriz[i][i] = fibo (i+1); //Diagonal secundaria for (i = SIZE-1, j = 0; i >= 0; i--) { //enquanto o primo temporario não for um numero primo, continue procurando pelo proximo primo while ( !(ehPrimo (++tmpPrimo)) ) ; matriz[j++][i] = tmpPrimo; } //Pares k = 2; for (i = 0; i < SIZE; i++) for (j = i; j < SIZE; j++) if (!matriz[i][j]) { matriz[i][j] = k; k += 2; } //IMPARES k = 1; for (i = 0; i < SIZE; i++) for (j = 0; j <= i; j++) if (!matriz[i][j]) { matriz[i][j] = k; k += 2; } mostraMatriz (matriz); return 0; }
  11. #include <stdio.h> int digitosEmBaseDecimal (int n) { if (!n) return 0; int nDigitos = 1; while (n/=10) nDigitos++; return nDigitos; } void maneira1 (int n) { int size = sizeof (int) * 8 - 1;//tamanho do int vezes a quantia de bits int digBin = 0;//quantia de digitos binarios for (; size >= 0; size--) { printf("%d", (n >> size)&1); if ( ((n >> size)&1) && !digBin ) digBin = size+1; //Aparencia if ( !((size)%4) )//espaco de quatro em quatro digitos printf(" "); if ( !((size)%16) )//linha nova a cada 16 digitos printf("\n"); } printf("Possui %d digitos em decimal\n", digitosEmBaseDecimal (n)); printf("Possui %d digitos em binario\n", digBin); } void maneira2 (int n) { int v[32] = {0};//vetor que vai armazena os numeors em binarios int tmpN = n;//pra envia pro contador de digitos decimais int digBin = 0;//digitos binarios int i = 0; while (n) { v[i++] = n%2; n /= 2; } for (i = 31; i >= 0; i--) { printf ("%d", v[i]); if (v[i] && !digBin) digBin = i+1; //Aparencia if ( !((i)%4) )//espaco de quatro em quatro digitos printf(" "); if ( !(i%16) )//linha nova a cada 16 digitos printf("\n"); } printf("Possui %d digitos em decimal\n", digitosEmBaseDecimal (tmpN)); printf("Possui %d digitos em binario\n", digBin); } int main() { int n; //para encerrar pressione ctrl+c while (1) { scanf ("%d", &n); maneira2 (n); } return (0); }
  12. #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int vet[100],p,i; srand(time(NULL)); for(i=0;i<100;i++){ // aki tem q ser de 0 a 100 vet[i]=rand()%101; } int op; int max,min; float media = 0; int soma = 0; menu: printf("1- Maximo numero\n"); printf("2- Minimo numero\n"); printf("3- Soma\n"); printf("4- Media\n"); printf("5- Numeros acima da media\n"); printf("6- Pares\n"); printf("7- Impares\n"); printf("8- Sair\n"); scanf("%d",&op); switch(op){ case 1: max=vet[0]; int i; for(i=1; i < 100;i++) // não intendi porque você colocou vet[i] { if (vet[i] > max) max = vet[i]; } printf("O Numero maximo do vetor e: %d \n",max); goto menu; // não USE GOTO case 2: min=vet[0]; int c;//não é nescessario criar variaveis diferentes, podia ter reusado o 'i' for(c=1;c<100;c++) { if (vet[c] < max)//como você copiou da de cima e la é o 'i', aki ia da errado min = vet[c]; } printf("O Numero minimo do vetor e: %d \n",min); goto menu;// não USE GOTO case 3: for (i=0;i<100;i++) { soma = soma + vet[i]; // soma não é iniciada, então ela comeca com lixo de memoria printf("A soma dos numeros e: %d \n",soma); } soma = 0;//Reiniciar a soma quando acabar goto menu; // não USE GOTO case 4: for (i=0;i<100;i++)//inclui uma somatoria soma += vet[i]; media = soma/100.0;//sua media só funciona se você usar depois da SOMA, elas devem ser independentes //a divisao de um int(soma) com outro int (100), resulta em um int e você perde o decimal, transforme um deles em float printf("A media e: %.2f \n",media);// media é um float, e você ta printando com %d soma = 0; goto menu;// não USE GOTO case 5: { //essa parte você nem tentou... for (i=0;i<100;i++) soma += vet[i]; media = soma/100.0; for(i = 0, c = 0; i < 100; i++) if (vet[i] > (int)media) c++; printf("Estao %d numeros acima da media \n", c); soma = 0; media = 0; goto menu; // não USE GOTO case 6: //essa parte você também não tentou printf("Numeros Pares: \n"); for(i = 0; i < 100; i++) if(vet[i]%2==0) printf("%d \n",vet[i]); goto menu;// não USE GOTO case 7: //essa também não printf("Numeros Impares: \n"); for(i = 0; i < 100; i++) if(vet[i]%2==1) printf("%d \n",vet[i]); goto menu;// não USE GOTO case 8:break; default: printf("Valor introduzido não esta na lista\n"); goto menu;// não USE GOTO } } }
  13. assim? #include <stdio.h> void Soma(char *vec) { register int i; for(i = 1; vec[i]; i++) if(vec[i-1]-'0' > 1) { vec[i-1] = '0'; vec[i]++; } } int main() { register int i; int n; int qtdComb = 1;//quantia de combinacoes char *comb; while(1) { scanf("%d", &n); for(i = 0; i < n; i++) qtdComb <<= 1; //comb = calloc(sizeof *comb, n);//voce ate poder usar malloc ou calloc sem o stdlib, mas pode gerar erros que fogem do escopo do problema char comb[n]; comb[n] = '\0'; for(i = 0; i < n; i++) comb[i] = '0'; printf("Combinações:\n"); for(i = 0; i < qtdComb; i++) { printf("%d -> %s\t", i, comb); comb[0]++; Soma(comb); if(!((i+1)%2)) printf("\n"); } qtdComb = 1; } return (0); }
  14. Nefisto

    Ajuda com arrays

    #include <stdio.h> int main() { int n = 5; //quantia de numeros, no caso 5 int vetor[n]; int numerosAcimaDaMedia = 0; float mediaAritmetica = 0; int media = 5; int i; //Recebe os valores for(i = 0; i < n; i++) scanf("%d", &vetor[i]); //Quantos numeros estao acima da media for(i = 0; i < n; i++) if( vetor[i] > media ) numerosAcimaDaMedia++; //media aritmetica for(i = 0; i < n; i++) mediaAritmetica += vetor[i]; mediaAritmetica /= n; //printa os resultados printf("Vetor: "); for(i = 0; i < n; i++) printf("%d ", vetor[i]); printf("\n"); printf("Numeros acima da media: %d\n", numerosAcimaDaMedia); printf("Media aritmetica: %.2f\n", mediaAritmetica); return (0); }
×
×
  • Criar Novo...