Ir ao conteúdo
  • Cadastre-se

isrnick

Membro Pleno
  • Posts

    1.550
  • Cadastrado em

  • Última visita

Tudo que isrnick postou

  1. Coloque um espaço antes do %c para descartar o caractere '\n' que ficou sobrando do scanf anterior na entrada padrão (stdin): scanf(" %c", &le );
  2. 'f' e 'k' são caracteres e devem ser armazenados em uma variável do tipo char. No seu programa a variável le é do tipo float, corrija isto. E para ler caractere no scanf precisa usar o especificador %c (o especificador %f é para ler números float).
  3. Não testei, mas lendo o código por alto notei esse problema: Você usou gets na hora de pedir para o usuário digitar o nome do jogador, então o usuário pode digitar nome e sobrenome da pessoa, e isso significa que terá 1 espaço no meio do nome, como em "Joao Santos". Então você salva o nome no arquivo fazendo: fprintf(p," %s %s %c %f %i ",i->nome,i->posicao,i->escalacao,i->salario,i->numero); Só que na hora de ler você faz: fscanf(p,"%s %s %c %f %i",name,position,&lineup,&salary,&num) Usando %s para ler o nome, mas como o nome tinha espaço entre Joao e Santos, o nome lido será apenas "Joao", e aí bagunça todo o resto da leitura do scanf pois a posição agora virou "Santos", a escalação agora é a primeira letra da posição, e nem vai ler o salário e o número. Então minha sugestão é: No fprintf escrever os dados no arquivo, use outro caractere para separar os dados que não seja espaço, por exemplo pode usar ponto-e-vírgula ( ; ) para separar, ficando assim: fprintf(p,"%s;%s;%c;%f;%i\n",i->nome,i->posicao,i->escalacao,i->salario,i->numero); (Obs: Arquivos com extensão .CSV usam ponto-e-vírgula (ou então vírgula) como separador de colunas da tabela, então você poderia até abrir seu arquivo no excel ou libreoffice e os dados ficariam separados nas colunas da tabela). Fazendo isto você pode trocar especificador de string %s pelo outro especificador de string %[ no fscanf, limitando para ler todos os caracteres até encontrar um ; , ou seja ficando assim %[^;] (ler e guardar todo caractere que for diferente de ; ). fscanf(p," %[^;];%[^;];%c;%f;%i%*c",name,position,&lineup,&salary,&num) Assim vai ler a string inteira entre os ponto-e-vírgula, incluindo os espaços que existirem.
  4. Os nomes das bibliotecas padrão da linguagem C dão dicas do que elas fazem: stdio.h -> "STD I/O" é abreviação de "Standard Input and Output" , que significa "Entrada e Saída Padrão", logo essa biblioteca disponibiliza várias recursos para lidar com os métodos mais comuns de entrada e saída de dados do programa, por exemplo funções para ler dados digitados pelo usuário (scanf) ou para imprimir texto na tela (printf), e também funções para lidar com leitura e escrita de arquivos (fread e fwrite), entre outras. stdlib.h -> "STD LIB" é abreviação de "Standard Library", que significa "Biblioteca Padrão", é uma biblioteca bem genérica que fornece vários recursos diferentes mas que são usados relativamente frequentemente, por exemplo conversão de string contendo digitos para um número, alocação/reserva de espaço na memória, geração de números aleatórios, finalização forçada do programa, entre outros. conio.h -> "CON I/O" é abreviação de "Console Input and Output", que significa "Entrada e Saída do/para Console", mas essa biblioteca não é uma biblioteca padrão da linguagem C, ela é específica para o sistema operacional Windows, ou seja em outros SOs ela não existe, logo usando ela seu programa será restrito ao ambiente Windows. E esta biblioteca fornece recursos extras específicos para o console "Prompt de Comando" (cmd.exe) do Windows, por exemplo detecção de quando o usuário apertou uma tecla, limpeza da tela, entre outros. (Em geral recomendamos não usar conio.h a menos que seja uma aplicação bem específica.)
  5. isrnick

    C digite uma data valida

    "Entre com a data no seguinte formato DD/MM/AAAA: "
  6. Fui arrumando os erros conforme as mensagens de erro apareciam e agora está compilando: https://onlinegdb.com/H1uMvux9L Mas não chequei nada da lógica e do funcionamento do programa. As mudanças que fiz basicamente foram: - A class lista_itens_vendas estava no fim do header, mas as classes declaradas antes dela já usam essa classe, então tive que move-la para cima para ser declarada antes de ser usada. - No main eu mudei b.novaVenda(cV,b,d); para b.novaVenda(cV,&a,&d); (Não verifiquei como isso altera a lógica, mas a é a única lista_produto declarada no main .) - Nas chamadas de métodos dos objetos eu troquei alguns . por -> quando o objeto é passado por ponteiro.
  7. http://www.cplusplus.com/doc/tutorial/introduction/devcpp/
  8. Link já com o código: http://cpp.sh/53ptd Basta rodar. adicionado 24 minutos depois @Izaac Baptista O erro aconteceu por que seu compilador está configurado para usar a antiga versão C++98 da linguagem C++. (No site cpp.sh dá esse erro quando escolhe essa versão.) Mude para a versão C++11 ou mais recente (C++14, C++17, C++20). No console/terminal a flag de compilação do compilador GCC/Mingw é -std=c++11 colocando o número da versão que quer usar.
  9. https://www.onlinegdb.com/online_c++_compiler Para testar c++ esse é o link.
  10. @herbertbahia Se é para abreviar basta remover as chaves { }: for (auto c : texto) if(vogais.find(c) != string::npos) contador++;
  11. #include <iostream> #include <string> using namespace std; int main() { string vogais = "aeiouAEIOU"; string texto = "Ola Mundo"; int contador = 0; for (auto c : texto){ //Para cada caractere c na string texto faça: if(vogais.find(c) != string::npos){ //Se encontrou o caractere na lista de vogais: contador++; //Incrementa contador de vogais } } cout <<"'" << texto << "' tem " << contador << " vogais." << endl; return 0; }
  12. #include <stdio.h> int KaprekarRoutine3digits(int n){ int count, i, digit[3], temp, biggest, smallest; temp = n; for (count = 1; n != 495 && n != 0; count++){ //zera os digitos digit[0] = 0; digit[1] = 0; digit[2] = 0; //separa os digitos do numero for (i=0; n > 0; i++){ if(i >= 3) { printf("Erro: O numero %d tem mais de 3 digitos.\n", temp); return -1; } digit[i] = n % 10; n /= 10; } //ordena os digitos em ordem crescente for (i=0; i<2; i++){ if (digit[i] > digit[i+1]){ temp = digit[i]; digit[i] = digit[i+1]; digit[i+1] = temp; } } if (digit[0] > digit[1]){ temp = digit[0]; digit[0] = digit[1]; digit[1] = temp; } //maior e menor numero com os digitos biggest = digit[2]*100 + digit[1]*10 + digit[0]; smallest = digit[0]*100 + digit[1]*10 + digit[2]; n = biggest - smallest; } if (n == 495) return count; return 0; } int main() { int a, iteracoes; FILE *f = fopen("saidakaprekar.txt", "w"); for (a=1; a<1000; a++){ iteracoes = KaprekarRoutine3digits(a); if (iteracoes > 0){ fprintf(f, "%03d -> %d iteracoes\n", a, iteracoes); } else if (iteracoes == 0){ fprintf(f, "%03d -> TODOS OS DIGITOS SAO IGUAIS\n", a); } } fclose(f); return 0; }
  13. O fórum está aqui para ajudar os usuários a aprender, e resolver exercícios para outras pessoas é contra as regras do fórum. Somente tiramos dúvidas ou fazemos correções e melhorias em um código que o usuário postar. Então poste sua tentativa para que possamos te ajudar. Obs: Um código sem nada relacionado ao enunciado do exercício não conta como uma tentativa de resolver este exercício. adicionado 20 minutos depois @Izaac Baptista O menor e o maior peso podem ser obtidos no próprio loop da leitura dos dados: for(i=0;i<TAM;i++) { cout<<"\n Informe o "<<i+1<<"ª peso: "; cin>>pesos[i]; if (i == 0){ //inicialmente tanto menor e maior pesos sao iguais ao primeiro peso digitado menor_peso = pesos[i]; maior_peso = pesos[i]; } if (pesos[i] < menor_peso){ menor_peso = pesos[i]; } if (pesos[i] > maior_peso){ maior_peso = pesos[i]; } acumula_pesos = acumula_pesos+pesos[i]; } Esses 2 fors: for(i=0;i<TAM;i++) { if(pesos[i]<media) menos_pesados++; } for(i=0;i<TAM;i++) { if(pesos[i]>media) mais_pesados++; } Podem ser combinados em 1: for(i=0;i<TAM;i++) { if(pesos[i]<media) menos_pesados++; if(pesos[i]>media) mais_pesados++; }
  14. O fórum está aqui para ajudar os usuários a aprender, e resolver exercícios para outras pessoas é contra as regras do fórum. Somente tiramos dúvidas ou fazemos correções e melhorias em um código que o usuário postar. Então poste sua tentativa para que possamos te ajudar. Obs: Um código sem nada relacionado ao enunciado do exercício não conta como uma tentativa de resolver este exercício.
  15. Tem vários sites de exercícios de programação online onde você resolve exercícios e depois pode ver e discutir soluções de outros usuários. Alguns em inglês para C++: - codewars - codingame.com - codechef - exercism.io Em português só conheço este: - URI Online Judge Se pesquisar vai achar outros.
  16. No seu código, quando você tenta usar fseek o arquivo f não está mais aberto, pois já usou fclose para fechar o arquivo antes disto.
  17. Código postado pelo @wellingtonv1n1 foi copiado desse post: E o motivo porque o código não funciona é que o fórum sumiu com os [ i ] do código original, que tinha depois de cada str na função, isso aconteceu pois o felipepotato não usou o botão < > para postar o código, e para o fórum [ i ] sem espaços é a tag para deixar o texto em itálico (note que metade do texto do post do felipepotato ficou em itálico). E você copiou o código que já estava incompleto. Não é difícil de detectar onde esta o problema no código se tentar entender ele. Se vai copiar a solução pronta, pelo menos estude e entenda o que o código copiado está fazendo, assim pelo menos você aprende algo.
  18. Agora isto: static int i = 0; int y = n + i; if ( y > 99 ) menu ( funcionario, n ); E isto: menu(funcionario, y); Dentro da função InserirFuncionario são aberrações que não deveriam existir. Isso está criando recursividade desnecessária e descontrolada, e pior ainda, em ambos os casos chama a função menu sem fechar o arquivo que foi aberto com fopen, aí de dentro do menu pode chamar novamente a função InserirFuncionario, que vai tentar abrir com fopen novamente o arquivo que já está aberto! Mude a lógica para retornar o valor de n seja como retorno da função (muda o tipo da função de void para int), ou então muda a variável n para um ponteiro para que alterações dentro da função também mudem o valor fora dela, ou então faz pedir pra digitar o número de funcionários a serem inseridos fora da InserirFuncionario, na própria menu(), e a InserirFuncionario apenas retornar se teve sucesso ou se falhou (e soma ao total se teve sucesso), em fim tem muitos métodos melhores.
  19. Entendi. Bom, dá pra fazer com fprintf e fscanf. Não entendi porque o usuário precisaria escrever algo mais de uma vez se não estiver formatado bonitinho. De qualquer maneira se pretende manter assim então tem que corrigir a função ImprimirFuncionarios, pois do modo que está agora ele vai tentar dar fscanf nas 2 linhas com títulos como se fossem dados dos funcionários, e bagunçar toda a leitura, então tem que fazer fscanf ou fgets específico para ler essas 2 linhas que não contém dados.
  20. Neste tipo de programa eu considero que pode haver dois tipos de arquivos onde devem ser escritos dados/informações: Um tipo seria o tipo "relatório" que contém algo para ser lido por um humano, logo deve estar formatado e organizado de forma a facilitar o entendimento pela pessoa que vai ler. O outro tipo seria o tipo "banco de dados" que só será lido pelo programa, logo não há necessidade de formatação pois nenhuma pessoa deve ler este tipo de arquivo diretamente, o que importa para este tipo de arquivo é facilitar que o programa armazene e recupere os dados do arquivo, logo quão mais simples e direto for melhor, e não há necessidade de "embelezar". Digo isso porque tenho perguntas sobre esse enunciado e como você implementou... Veja: Digamos que use o programa 1 vez e cadastre alguns funcionários, se o programa for finalizado quando ele for aberto novamente os funcionários cadastrados anteriormente persistem, ou deve recomeçar a cadastrar do zero toda vez? Acredito que deva recuperar os dados salvos ao abrir o programa, certo? Então isso me diz que o arquivo funcionarios.txt deveria fazer o papel de "banco de dados" e armazenar a lista de funcionários da forma que for mais fácil de acessar e recuperar os dados. Na função IncerirFuncionario (obs: inserir se escreve com s não com c ) por que você está formatando o texto dentro do arquivo funcionarios.txt? fprintf ( file, "\n\n\t----- LISTA DOS FUNCIONÁRIOS ----\n\n" ); fprintf ( file, "\tNome NIF Salário Categoria Horas\n\n" ); E fprintf ( file, "\t%s \t %s \t %.1f \t %s\t %d\n", funcionario[i].nome, funcionario[i].NIF, funcionario[i].salario, funcionario[i].categoria, funcionario[i].Hora_Trabalhados ); Ou seja, para que está incluindo os títulos e as tabulações para deixar "bonito" dentro do arquivo? Isso é requisito ou você adicionou por conta própria? Por que se não for requisito isso só vai complicar para recuperar os dados do arquivo para a memória com o fscanf, pois note que primeiro vai ter que ignorar as 2 primeiras linhas, que contém os títulos, para depois começar a ler os dados separados por tabulação. Claro, não é muito difícil fazer isso, mas a questão é se existe a necessidade quando pode fazer algo mais simples que tornaria fazer o código mais fácil e daria mais opções. Por exemplo, poderia separar cada dado do funcionário 1 cada linha (ou seja um '\n' separa cada dado do funcionário), permitindo usar fgets para ler as strings. (Ou até usar o meu método favorito que é, ao invés de fprintf() e fscanf(), usar fwrite() e fread() para escrever e ler do arquivo a struct inteira contendo todos os dados do funcionário de uma vez.) O modo que eu faria esse código (se for usar o método com fprintf e fscanf) a primeira linha do arquivo funcionarios.txt teria a quantidade total de funcionários já armazenadas no arquivo, seguido imediatamente pelos dados de cada funcionário, para facilitar a fazer a função que recupera os dados para a memória na próxima execução do programa. Obs: De acordo com a minha distinção de tipos de arquivos o arquivo ordenar_funcionarios.txt poderia ser tanto do tipo "relatório" quanto do tipo "banco de dados", mas como não há nenhuma outra indicação eu usaria como um "relatório" formatando para poder ser lido pelo usuário diretamente.
  21. Poste sua tentativa, e/ou suas dúvidas de em que está tendo problemas. O objetivo do fórum é ajudar os usuários a aprender, não resolver no lugar dos outros, pois assim não se aprende nada. Aproveite para entender o código do @devair1010 , e ver se entendendo o que ele fez fica mais fácil resolver o restante. Se não consegue fazer nada, então precisa voltar e rever o material de estudos. Pois explicar tudo que seria necessário para resolver esse exercício seria muita coisa para alguém ficar explicando pelo forum, e já existe bastante material disponível online, e provavelmente também disponibilizado pelo seu curso.
  22. Usar setbuf(stdin, buffer) cria o problema de impossibilitar redirecionar a entrada de dados. Por exemplo se quiser redirecionar a saída de texto de um programa como entrada do programa que está programando (isso é algo muito útil e poderoso, muito usado em programas de terminal, no Linux principalmente tem vários programas de terminal que podem ser usados para fazer coisas bem complexas quando combinados). Outro exemplo de redirecionamento seria para passar os dados de entrada do programa através de um arquivo de texto com os dados a serem digitados, ao invés de digitar manualmente durante a execução do programa, fazendo algo como: programa.exe < arquivo_entrada_de_dados.txt Nesses casos o setbuf(stdin, buffer) vai resetar a stdin inteira, perdendo todo o restante da informação que foi passada como entrada através do arquivo. Então eu diria que o método usando a função abaixo ainda é a melhor opção: void flush(){ int c; /*Lê todos os caracteres até encontrar '\n' ou EOF:*/ while( (c = getchar()) != '\n' && c != EOF ); } Só precisa saber usar corretamente nos locais certos.
  23. O espaço antes do %c informa a função scanf() que todos os caracteres 'vazios' (espaço, tabulação '\t', nova linha '\n', etc) devem ser ignorados, então só será capturado pelo %c o primeiro caractere "não vazio". (@AdrianoSiqueira Note que isso não "limpa buffer" que tiver caracteres "não vazios".) E o %*c informa ao scanf que 1 caractere deve ser lido, mas o * indica que esse caractere não será guardado em nenhum variável, logo é descartado, ou seja isso vai descartar o caractere '\n' inserido na entrada padrão (stdin) quando o usuário aperta Enter, esvaziando a stdin (isto é, supondo que o usuário apenas digite 1 letra e pressione Enter como é esperado, senão vai ficar sobrando caracteres na stdin).
  24. @Leoonardoos Aspas duplas indica string (sequencia com vários caracteres finalizada pelo caractere nulo '\0' ), então "f" na verdade tem 2 caracteres 'f' e '\0'. (E para comparar strings deve usar a função strcmp() mas talvez você ainda não aprendeu isso.) Para escrever 1 único caractere deve usar aspas simples para englobar o caractere como em 'f' .
  25. Deve checar se o char le é igual a 'f' ou igual a 'k'. Segue um exemplo: if (le == 'f') {

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!