Ir ao conteúdo
  • Cadastre-se

Lucca Rodrigues

Membro Pleno
  • Posts

    1.081
  • Cadastrado em

  • Última visita

Tudo que Lucca Rodrigues postou

  1. @joaoferraz10 Dê uma lida aí nos comentários: #include <stdio.h> // Nao precisa dos cabecalhos abaixo //#include <locale.h> //#include <math.h> int main(){ // Nao precisa dessa funcao //setlocale(LC_ALL, "Portuguese"); // Seria melhor declarar uma variavel por linha int a = 3; int b = 5; int c = 8; int y = 1; // Faltou os parenteses do if if ((a*b) > (c+b+6)){ // Faltou ; aqui y = y + ((c+1) / a); } else{ y = ((b*3) / (a+c+4)) + y; } // Por que esta imprimindo isso? //printf("FIM-SE"); printf("y = %d\n", y); return 0; }
  2. `nome` é uma string, não precisa do &, eu postei sobre isso ontem aqui: E é mais conveniente usar fgets() para ler strings.
  3. @Verniana Olá. Evite declarar variáveis globais, só vai te dar problemas... Nome_do_Filme é uma string, e com & você está passando o endereço de que? Se quiser usar &, use assim: scanf("%99[^\n]", &Cine[i].Nome_do_Filme[0]); Dessa forma, você passa o endereço do primeiro elemento da string, mas normalmente só usamos & quando queremos que a leitura seja efetuada a partir de um elemento cujo índice não seja 0, então você pode simplesmente omitir o &. Aliás, percebeu que tem um 99 depois do % lá? Justamente porque scanf() não tem como saber o tamanho da string, então você tem que dizer pra ela quantos caracteres podem ser lidos e armazenados, e você declarou uma string com espaço para 99 caracteres não-nulos + 1 caractere nulo. Por isso é mais conveniente usar fgets() para ler strings, eu postei sobre isso aqui: Não use fflush() dessa forma, use apenas para streams de saída. Se está usando na entrada é porque talvez notou que se não usar, a próxima chamada da scanf() fica zoada... E bem, quando você termina de inserir os dados, você pressiona a tecla Enter, portanto sobra um '\n' na stdin que poderá ser lido na próxima chamada da scanf(). Pra solucionar isso, você pode ler e ignorar esse caractere com um especificador da seguinte forma: %*c. Dessa forma você consome todos os dados, e é o que se espera em um programa assim.
  4. @skyneGKL Acho que tem um site cheio dessas artes feitas com caracteres da ASCII, se googlar trophy ascii art irá encontrar No mais, use cout para imprimir algo na saída, leia sobre. Alguns exemplos que encontrei: ---------------------------------------- ___________ '._==_==_=_.' .-\: /-. | (|:. |) | '-|:. |-' \::. / '::. .' ) ( _.' '._ `"""""""` ---------------------------------------- {} /__\ /| |\ (_| |_) \ / )( _|__|_ _|______|_ |__________| ---------------------------------------- .-=========-. \'-=======-'/ _| .=. |_ ((| {{1}} |)) \| /|\ |/ \__ '`' __/ _`) (`_ _/_______\_ /___________\ ----------------------------------------
  5. @Cynthia Moreira Se não precisa imprimir dados formatados, você não precisa necessariamente chamar printf(). Você pode chamar puts(): puts( "Uma string qualquer 1" "\nUma string qualquer 2" "\nUma string qualquer 3" ); Ela substitui o '\0' por um '\n' na saída. Se não quiser que isso ocorra, use fputs() ou printf(): fputs( "Uma string qualquer 1" "\nUma string qualquer 2" "\nUma string qualquer 3" , stdout ); Dessa forma, o compilador promove a concatenação dessas strings adjacentes. E se tiver 200 strings em mãos? Vai dar uma printf() de 1 quilômetro na vertical ou na horizontal Um laço simples resolveria o problema: char str[3][40] = { "Uma string qualquer 1", "Uma string qualquer 2", "Uma string qualquer 3" }; for(int i = 0; i < 3; i++) { puts(str[i]); } Note que não há '\n' nas strings, e mesmo assim puts() pulou uma linha por você
  6. @Cynthia Moreira O que quer dizer? Leia sobre printf() aqui.
  7. @Roberto.C Compilou o código? Deu uma olhada nos erros? O comando switch faz com que o controle seja transferido para um label, e usamos break para transferir o controle para fora do corpo, mas o último não precisa de break, certo? O corpo acaba ali. O código está extenso e deu vários erros... Dê uma olhada onde o break realmente é necessário, veja se não faltam chaves em algum switch, etc. Pra resumir: releia seu código Alguns outros problemas: iostream faz parte da biblioteca padrão do C++, e stdio.h, da biblioteca padrão do C, se está programando em C++, não precisa desta segunda; Evite declarar funções do tipo void e sem parâmetros, é um desperdício; A função principal deve sempre retornar um int; Chamou setlocale() sem incluir locale, e evite fazer isso; É difícil localizar a função principal dentro do seu código, ela está lá no final, então deixe apenas os protótipos das funções que criou antes da main e as funções em si depois da mesma.
  8. @LNW Eu substituí o laço da função por um if porque era desnecessário, embora funcionasse também. Se recarregar a página, poderá ver o código editado. O que está na função é o seguinte: Segundo a documentação: Eu não tenho como saber quantos caracteres devem ser gravados, então eu chamo realloc() caso a memória alocada anteriormente não seja suficiente, ou seja, caso res >= aloc. Eu também verifico se res >= 0, porque se for < 0, segundo a documentação:
  9. Boa noite, colegas. Fiz uma função para gravar dados formatados em uma string com base na função vsnprintf(), a usarei futuramente como parte de outra função. O problema é que quando executo o código no CodeBlocks o retorno é NULL, e no Visual Studio, tudo ocorre bem. O código é esse: #include <stdio.h> #include <stdlib.h> #include <stdarg.h> char* dadosf(const char* format, ...); int main() { printf("<%s>\n", dadosf("Essa string tem 120 caracteres desconsiderando o caractere nulo.........................................................")); return 0; } char* dadosf(const char* format, ...) { int aloc = 101; int res = 0; char* dados = (char*)malloc(aloc); va_list args; va_start(args, format); if((res = vsnprintf(dados, aloc, format, args)) >= aloc && res >= 0){ aloc = res + 1; dados = (char*)realloc(dados, aloc); res = vsnprintf(dados, aloc, format, args); } va_end(args); if(res < 0){ dados = NULL; } return dados; } Vejam os prints que tirei das janelas quando rodei nos IDE. CodeBlocks: Visual Studio: Alguém teria alguma ideia do motivo? Obrigado desde já.
  10. @Brian Motta Como o colega @mauro_b disse, você precisa deixar espaço para o caractere nulo quando for declarar a string. Com gets() você só terá problemas, como pôde observar. Não há uma forma de limitar a quantidade de caracteres para serem lidos. Eu já postei aqui no fórum sobre fgets(), você pode dar uma olhada: Aliás, não use system(), é perigosa e não vai aprender nada com ela.
  11. @arfneto Aqui me é mostrado o mesmo de antes: Exato, o importante é que funciona e está correto Me lembro de quando questionei meu professor a respeito de usar cast em malloc(), ele só ergueu o tom e disse que seu uso é imprescindível Talvez ele tenha lido a documentação e simplesmente aceitado E cá estou eu as usando... De qualquer forma, não pretendo fazer muito com isso, só queria visualizar o funcionamento mesmo
  12. Não sei o que dizer... Qual foi o código de erro? Chamou perror() pra ver? Isso aí é de uma postagem anterior, não funcionava porque não tem a fonte Courier New nas propriedades do CMD, e eu estava alterando e restaurando a fonte logo em seguida. Só fui perceber que funcionava quando fui executar o programa alterando a fonte pra Consolas, e ele demorou mais do que deveria pra restaurar, daí deu pra visualizar a mudança por 1 segundo Aqui são 300: Eu consigo alterar isso também com a API, creio eu. Mas sim, não deixa de ser um empecilho. Eu tinha lido o seguinte na documentação: Então o especificador que eu tinha usado na wprintf() era `s` mesmo, e o resultado é o mesmo usando `ws`. Com printf() dá no mesmo também. Quando chamo GetCurrentConsoleFontEx(), ele deveria armazenar em fonte.FaceName a string "Terminal", que é a fonte atual, mas nada aparece: E quando restauro, a fonte é a Terminal, mas ele imprime "Consolas". Fiz até o teste imprimindo alguns caracteres, a fonte é a Terminal mesmo. Nas propriedades do CMD, nada se altera depois do fim da execução, então a restauração é efetiva.
  13. @costa.rso Os colegas deram várias dicas aí pra que você pudesse começar a desenvolver algo... Tem dúvidas objetivas? O que já tentou fazer?
  14. @arfneto Tinha deixado esse assunto meio de lado, volto a reviver ele agora... Não sabia que SetCurrentConsoleFontEx() alterava as propriedades do texto que foi impresso antes da chamada da função também, e eu estava basicamente alterando e restaurando logo em seguida, então não dava pra visualizar a mudança Funciona rodando tanto no IDE quando no CMD. Nas propriedades do CMD, tenho o seguinte: Vejo que tenho acesso às fontes Consolas, Lucida Console e Terminal. Não consigo alterar para Courier New como estava fazendo anteriormente. Fica assim alterando pra Consolas: Só me resta uma dúvida mesmo... Na documentação: Mas não consigo imprimir fonte.FaceName por algum motivo.
  15. @Um mero usuário ´a´ é o identificador, a constante é 1. O que ocorre quando se usa a diretiva de pré-processador #define para definir constantes é uma substituição do identificador pela sua definição, não é type-safe e pode haver conflito de nomenclatura dependendo de como for declarado. O modificador const te permite declarar constantes que têm informações de tipo e valor, então prefiro usá-lo nesse contexto.
  16. @Wellington 19 Acho que seria mais correto dizer que a função não possui parâmetros, isso implica em não precisar de argumentos na chamada da mesma. Declarar funções sem parâmetros e que não retornam nada é uma prática ruim e um desperdício. Isso é o valor de retardo, segundo esse tal autor.
  17. @Bomfz Mas você não usou ponteiros A string codigo não será modificada se você não passar o endereço de algum elemento para a função, normalmente se faz isso do jeito que você fez mesmo, ou assim: &codigo[0], daria no mesmo, está passando o endereço do primeiro elemento. No parâmetro da função, declare um ponteiro do mesmo tipo de codigo, então seria um ponteiro pra char. Aliás, evite isso: Não tem razão em fazer dessa forma. Declare um ponteiro, chame malloc(), e se precisar de mais espaço, chame realloc(). Se é que precisa mesmo fazer assim. Se quiser modificar a string codigo, faça isso sem excede-la, então pode inserir até 999 caracteres não-nulos. Você pode retornar um ponteiro pra char em vez de deixar a função do tipo void. Uma função que não retorna nada é um desperdício. Pra que o & aí? Você tinha feito certo aqui: O fim da string se dá no primeiro caractere nulo, então a mesma será impressa até que um 0 seja encontrado.
  18. @MQTTH Basta ler a documentação: scanf() fgets() fgets() tem as vezes o inconveniente fato de ler o '\n' inserido ao se teclar Enter, então não podemos deixar isso passar, a menos que você queira esse caractere na sua string. char str[101]; fgets(str, sizeof(str), stdin); if(str[0] != 0){ if (str[strlen(str)-1] == '\n'){ // Caso haja um '\n' logo antes do '\0' str[strlen(str)-1] = 0; } } scanf() também tem as vezes um inconveniente, esta pode nem sempre consumir todos os dados inseridos via teclado, e para isso usamos um especificador da seguinte forma: %*c. Este lê e ignora um caractere, provavelmente o '\n' teclado. int x; scanf("%d%*c", &x); Isso não impede o usuário de teclar mais do que ele deveria. Em geral, scanf() não foi escrita pra isso, mas em programas assim, é esperado que você a use.
  19. Há quem diga que sim. Há quem diga que programas de console em modo texto são obsoletos e devem ser esquecidos. Há quem diga que a linguagem C é obsoleta e deve ser esquecida. A gente sempre começa aprendendo pelo obsoleto, avançando em direção ao novo, mas nem tudo é absolutamente obsoleto É difícil ver aqui no fórum uma postagem que não seja sobre programas interativos, desses que leem do teclado, e sim, são obsoletos, mas dizer isso não é muito encorajador. Eu em particular não tenho motivos para sair do básico, já que uso C só para programar microcontroladores. A API do Windows pode ser útil no contexto de pausar o programa, basta um par flush-wait. Pode substituir em poucas linhas a tal system() que você havia comentado. Te permite ler direto do buffer ao invés do teclado. E isso só com o básico. É útil, e não é nada complexo. Vai te garantir uma nota bacana Basta não inserir dados via teclado
  20. Se quem escreve o código não der um jeito de fazer com que os dados inseridos, por exemplo, via teclado sejam todos consumidos, então de nada serve getchar(), já que seu propósito não é pausar, e system() não deve nem ser usada, é perigosa, ela passa uma string para o sistema rodar. Já foi discutido aqui no fórum a respeito da função wait(), que pausa sem a necessidade de ler, vale a pena conferir a documentação.
  21. @MQTTH Você não pode passar um inteiro como argumento na chamada da gets(), e nem deve usar a mesma, é obsoleta, leia a documentação. Colete os dados com scanf(), use fgets() para ler strings.
  22. Na verdade não Na documentação: O propósito de getchar() não é esse, embora eu só veja pessoas a usando para isso... @Joel Martins Se basta obter o maior número, atribua à uma variável o primeiro elemento do vetor, e compare-a com os demais: #include <stdio.h> #include <stdlib.h> int main() { int x[] = {176, -256, 2, 59, 37, 316, -33, -9}; int sz = sizeof(x)/sizeof(x[0]); int maior = x[0]; for(int i = 1; i < sz; i++){ if(maior < x[i]){ maior = x[i]; } } printf("Maior: %d", maior); return 0; } Tem 1001 formas de fazer isso aliás... Escolha uma e bola pra frente
  23. @Moraes_27 Você precisa coletar dados, e a struct serviria de formulário. Ex: #include <stdio.h> #include <stdlib.h> typedef struct { int dia; int mes; int ano; } Data; int main() { Data hoje; hoje.dia = 23; hoje.mes = 4; hoje.ano = 2021; printf("Dia = %d\nMes = %d\nAno = %d", hoje.dia, hoje.mes, hoje.ano); return 0; } Então colete os dados preenchendo o formulário, é uma forma de deixar seu programa mais organizado
  24. Ah então é por isso? Nem tinha me dado conta Estava pensando em fazer algo assim mais tarde, pra não ter que passar 300 argumentos na chamada da função, mas antes eu teria que ver que parâmetros realmente eram necessários. Desse jeito ficou 100% melhor. Pois é, isso é um pesadelo, e meu professor gosta bastante de usar isso aí Tudo bem. Eu fiz esse programa aí porque vai fazer parte de outro, no qual eu iria plotar um gráfico da carga de um capacitor em função do tempo. Essas coisas são só pra passar o tempo mesmo. No mais, programo porque tem uma nota envolvida, daí quando tenho um tempinho livre eu tento fazer alguma coisa bacana com o pouco que sei sobre C De fato ficou 300% melhor o programa agora que você mexeu nele, certas coisas eu provavelmente não pensaria em fazer, faria no máximo o lance do formulário com struct. Rodei apenas no IDE.
  25. @arfneto Bom ponto. Não há diferença, pretendo retirar pntsQtd futuramente... Sim. Pra ter memória suficiente para armazenar todas as coordenadas, e a quantidade é representada por pntsQtd. Daí eu imagino que Y seja constante. Me recordo de ter testado isso uma vez somente... Porque eu preciso que Y receba algo que eu não consigo passar como argumento em uma função comum. Eu preciso de uma macro do tipo função. Nem eu As funções que desenham o gráfico são: E o problema seria: Mas não sei o motivo realmente... Pesquisei e não encontrei nada a respeito. Talvez um programa para desktop seja melhor.

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!