Ir ao conteúdo
  • Cadastre-se

kgin

Membro Pleno
  • Posts

    380
  • Cadastrado em

  • Última visita

Tudo que kgin postou

  1. @Gabriel Barbosa Brandao De uma olhada também no livro "como o linux funciona", ele aborda vários aspectos do shell e da própria programação em C, e do sistema linux e claro.
  2. Redirecionamento de entrada e saída de dados, neste vídeo tem uma explicação melhor de como funciona. https://youtu.be/bAa0BNB-fcE Vários, tomando o linux como exemplo tem o grep, diff, less, file, find, locate, sort e os caracteres caracteres especiais. Essa eu não sei responder, mas a muitos anos atrás quando eu usava windows (XP) a maior parte funcionava (Só que a maioria tinha outro nome, ou funcionava de uma forma semelhante).
  3. Os que eu já li, é posso afirmar que e bom são. Black Art of 3D Game Programming: Writing Your Own High-Speed 3D Polygon Video Games in C tricks of the windows, game programming gurus. autor andré lamother. Esses que eu citei são muito velhos, e eu não sei o quanto directx mudou de lá pra cá. Esses outros são mais novos, mas eu nunca li. Introduction to 3D Game Programming with DirectX 9. autor frank d. luna. Introduction to 3D Game Programming with DirectX 11. do mesmo autor. Se me lembro bem no próprio site da microsoft ela disponibiliza a documentação do directx. Eu não recomendo você começar pelo directx, porque ele é muito extenso e não muito intuitivo se você estiver começando. Bibliotecas boas para começar a desenvolver jogos são a allegro e sdl.
  4. @DanielTenCaten Você só pode declarar a função main uma vez, depois disso você pode declarar qualquer função que não tenha o nome main nem que seja um identificador reservado da linguagem. Exemplo de funções. #include <stdio.h> /* Declara as funções */ void primeiraFuncao(void) { printf("\nPassou na primeira funcao!\n"); } void segundaFuncao(void) { printf("\nPassou na segunda funcao!\n"); } void pressioneEnter(void) { printf("\nPressione enter para continuar!"); getchar(); /* Pausa o programa */ } int main(void) { /* Chama a primeira função */ primeiraFuncao(); /* Mostra a mensagem na tela */ pressioneEnter(); /* Chama a segunda função */ segundaFuncao(); /* Mostra a mensagem na tela */ pressioneEnter(); return(0); } recomendo você dar uma lida no livro C completo e total no capitulo de funções, e na pagina 91 sobre blocos de comando.
  5. Nós mostre o que você já fez para então nós o ajudarmos.
  6. @paulopimenta6 O problema é que você está reservando memória e não está usando-a para nada, preste atenção que quando você retorna o ponteiro ele não está indo a lugar algum. ele é passado pelo return da função, é quando o programa vai fazer o próximo printf ele ainda não está inicializado. Exemplo de uma lista #include <stdio.h> #include <stdlib.h> struct no { int valor; struct no *proximo; }; int main(int argc, char *argv[]) { struct no *inicio_lista = NULL, *fim_lista = NULL, *aux; /* Cria o primeiro nó na lista */ inicio_lista = malloc(sizeof(*inicio_lista)); /* Checa se foi possível reservar memoria */ if (inicio_lista == NULL) { perror("Erro nao foi possivel reservar memoria "); return(1); /* Encerra o programa */ } /* Coloca um valor na lista */ inicio_lista->valor = 35; /* Inicia o final da lista */ inicio_lista->proximo = NULL; fim_lista = inicio_lista; /* Cria o segundo nó na lista */ fim_lista->proximo = malloc(sizeof(*fim_lista)); /* Checa se foi possível reservar memoria */ if (fim_lista->proximo == NULL) { perror("Erro nao foi possivel reservar memoria "); return(1); /* Encerra o programa */ } /* coloca o final na lista */ fim_lista = fim_lista->proximo; fim_lista->proximo = NULL; /* Coloca um valor na lista */ fim_lista->valor = 44; /* Mostra a lista */ aux = inicio_lista; while (aux != NULL) { printf("\n%i", aux->valor); aux = aux->proximo; } /* Apaga a lista */ aux = inicio_lista; while (aux != NULL) { struct no *tmp = aux->proximo; free(aux); aux = tmp; } /* Tira a referencia dos ponteiros */ inicio_lista = fim_lista = aux = NULL; getchar(); /* pausa o programa */ return(0); } Recomendo você aprender a usar o gdb caso esteja usando o compilador gcc.
  7. @rafael carvalho melo Qual seria a sua duvida agora?
  8. @rafael carvalho melo Você tem que utilizar streams, eu não sei C++ mas aqui tem um link de como utilizar que parece ser fácil de entender. Entrada/Saída com Streams Exemplo de como seria. #include <iostream> #include <string> using namespace std; int main() { string aluno; int idade = 0; cout << "Digite o nome do aluno\n"; cin >> aluno; cout << "Digite a idade do aluno\n"; cin >> idade; cout << "Nome do aluno:" << aluno << "\n"; cout << "Idade do aluno:" << idade << "\n"; return 0; }
  9. @rafael carvalho melo Mas você está fazendo em qual linguagem de programação?
  10. @PT_Richard_Assis Qual sistema operacional você está usando? É normal algumas detecções de vírus nos arquivos compilados com a configuração padrão do codeblocks, mas essas suas aí estão meio estranhas. De uma olhada no meu. Pode ser que o seu sistema esteja com algum tipo de malware.
  11. kgin

    C erro na alocação em c

    É como o @mauro_b explicou, a maneira digamos assim "correta" seria assim. #include <stdio.h> #include <stdlib.h> void aloca(float **p, int tam); void apaga(float **p); int main(void) { int cont; float *numeros; aloca(&numeros, 10); if (numeros == NULL) { return(1); /* Erro! */ } for (cont = 0; cont < 10; cont++) { numeros[cont] = cont+1; } for (cont = 0; cont < 10; cont++) { printf("\n%.2f", numeros[cont]); } getchar(); apaga(&numeros); return(0); } void aloca(float **p, int tam) { *p = malloc(sizeof(*p)*tam); } void apaga(float **p) { if (*p != NULL) { free(*p); } *p = NULL; } aprenda a usar o gdb (ou o debug disponível do seu compilador) que ele será uma mão na roda nesse tipo de situação.
  12. Me restringir ao máximo em só usar elementos da propria linguagem C, são conceitos que no geral você ver nas primeiras paginas de um livro de C.
  13. A solução seria você colocar a números aleatórios com a função rand(). a linha 8 e 9 estão erradas, observe bem aqui O vetor só vai de 0 a 9, é cadê os outros 90 números?
  14. @catherineprokhorov Não é possível você fazer um shift right (rolar a direita) em vetores, você teria que implementar isso. #include <stdio.h> #define T_STR 256 enum direcao { ESQUERDA, DIREITA }; void rolaString(char *str, enum direcao direcao, unsigned short quantidade); int main(void) { char str[256] = "Imposto e roubo!"; rolaString(str, DIREITA, 7); printf("\n%s", str); getchar(); return(0); } void rolaString(char *str, enum direcao direcao, unsigned short quantidade) { char tmp[T_STR]; unsigned short tamanho_str, cont, aux; for (tamanho_str = 0; str[tamanho_str]; tamanho_str++); switch (direcao) { case ESQUERDA: break; case DIREITA: if (quantidade < tamanho_str) { /* Copia a primeira parte */ for (cont = tamanho_str-quantidade, aux = 0; str[cont]; cont++, aux++) { tmp[aux] = str[cont]; } /* Copia a segunda parte */ for (cont = 0; cont < tamanho_str-quantidade; cont++, aux++) { tmp[aux] = str[cont]; } tmp[tamanho_str] = '\0'; for (cont = 0; tmp[cont]; cont++) { str[cont] = tmp[cont]; } } break; } } Eu fiz esse exemplo de como seria para a rolar a direita.
  15. Uma maneira seria assim. #include <stdio.h> int main(void) { char str[256] = "Imposto", final[256]; sprintf(final, "%s e roubo!", str); printf("\n%s", final); getchar(); return(0); } Mas se for um trabalho de faculdade creio eu que o certo seria manipular as letras no vetor.
  16. Eu fiz um reduzido para ajudar em um dever escolar aqui, não sei se está tudo correto, mas eu acho que seria uma boa base para você. #include <stdio.h> #include <stdlib.h> #include <string.h> #define Q_ESTADOS 5 #define T_STR 256 const char *sigla_estados[Q_ESTADOS] = {"DF", "PB", "RJ", "RS", "PA"}; const unsigned short distancia_estados[Q_ESTADOS][Q_ESTADOS] = {{0, 2245, 1148, 2027, 2110}, {2245, 0, 2448, 3889, 2161}, {1148, 2448, 0, 1553, 3250}, {2027, 3884, 1553, 0, 3852}, {2120, 2161, 3250, 3852,0}}; int main(int argc, char *argv[]) { char ds1[T_STR], ds2[T_STR]; int sair, cont, est1, est2; do { int estados_encontrados = 0; sair = 0; printf("\nDigite uma capital:\t"); fgets(ds1, T_STR, stdin); printf("\nDigite outra capital:\t"); fgets(ds1, T_STR, stdin); /* Retira o newline das strings */ ds1[strlen(ds1)-1] = '\0'; ds2[strlen(ds2)-1] = '\0'; /* Passa a string para mauiscula */ for (cont = 0; cont < strlen(ds1); cont++) { if (ds1[cont] > 97) { ds1[cont] -= 32; } } for (cont = 0; cont < strlen(ds2); cont++) { if (ds2[cont] > 97) { ds2[cont] -= 32; } } /* acha o estado */ est1 = 0; for (cont = 0; cont < Q_ESTADOS; cont++) { if (strcmp(sigla_estados[cont], ds1) == 0) { est1 = cont; estados_encontrados = 1; break; } } est2 = 0; for (cont = 0; cont < Q_ESTADOS; cont++) { if (strcmp(sigla_estados[cont], ds2) == 0) { est2 = cont; estados_encontrados = 1; break; } } if (estados_encontrados) { printf("\nA distancia entre %s e %s e:\t%hu", sigla_estados[est1], sigla_estados[est2], distancia_estados[est1][est2]); } else { printf("\nEstados nao encontrados!"); } if (estados_encontrados) { char opcao; printf("\nProcurar outro estado?\nS\\N:\t"); scanf("%c%*c", &opcao); if (opcao == 's' || opcao == 'S') sair = 1; } else { char opcao; printf("\nEstados disponiveis.\n"); for (cont = 0; cont < Q_ESTADOS; cont++) { printf("%s,", sigla_estados[cont]); } printf("\nTentar novamente com algum estado difirente?\nS\\N:\t"); scanf("%c%*c", &opcao); if (opcao == 's' || opcao == 'S') sair = 1; } } while (sair); return(0); } Tirei os dados do livro teláris 6 serie 2015, pagina 70.
  17. @Joel Martins Não se pode compara strings dessa maneira em C, a "melhor maneira" seria assim. #include <stdio.h> #include <string.h> #define T_STR 256 int contaOcorrencia(char *str, char *oc); int main(int argv, char *argc[]) { char str[T_STR], palavra[T_STR]; if (argv > 1) { strcpy(str, argc[1]); strcpy(palavra, argc[2]); } else { printf("\nDigite uma palavra:\t"); fgets(str, T_STR, stdin); printf("\nDigite a ocorrencia na palavra:\t"); fgets(palavra, T_STR, stdin); /* Retira o newline */ str[strlen(str)-1] = palavra[strlen(palavra)-1] = '\0'; } printf("\nQuantidade de ocorrencias da palavra %s na palavra %s:%i", palavra, str, contaOcorrencia(str, palavra)); getchar(); /* pausa o programa */ return(0); } int contaOcorrencia(char *str, char *oc) { unsigned short t_str = strlen(str), t_oc = strlen(oc)-1, ocorrencias = 0; char tmp[T_STR]; if (t_str > 0 && t_oc > 0) { unsigned short cont = 0; do { if (cont < t_str) { strcpy(tmp, &str[cont]); tmp[t_oc+1] = '\0'; if (strcmp(tmp, oc) == 0) { cont+=t_oc; ocorrencias++; } else { cont++; } } } while (cont < t_str); return(ocorrencias); } return(0); }
  18. @paulo luz magalhaes Me desculpe eu acabei não prestando atenção no seu programa, eu fiz um de exemplo para você. #include <stdio.h> #define T_PALAVRA 256 int checaPalindromo(char *p); /* * Devolve 1 se for palindromo e 0 se não for. */ int main(int argc, char *argv[]) { char palavra[T_PALAVRA]; int cont; /* Checa se foi passada alguma palavra para o programa */ if (argc > 1) { /* Mostra as palavras */ for (cont = 1; cont < argc; cont++) { printf("\n%s", argv[cont]); /* Checa palindromo */ if (checaPalindromo(argv[cont])) { printf(":E palindromo!"); } else { printf(":Nao e palindromo"); } } } else { printf("\nDigite uma palavra:"); fgets(palavra, T_PALAVRA, stdin); /* Retira o newline da palavra */ for (cont = 0; palavra[cont]; cont++); palavra[cont-1] = '\0'; /* Checa palindromo */ if (checaPalindromo(palavra)) { printf(":E palindromo!"); } else { printf(":Nao e palindromo"); } } getchar(); /* Faz uma pausa */ return(0); } int checaPalindromo(char *p) { char str[256]; int q_caracteres_palavra, q_caracteres_iguais = 0, cont, aux; /* Conta a quantidade de caracteres e passa a palavra para mauiscula para outro vetor */ for (q_caracteres_palavra = 0; p[q_caracteres_palavra]; q_caracteres_palavra++) { if (p[q_caracteres_palavra] > 97) { /* Passa a letra para mauiscula e copia para outro vetor */ str[q_caracteres_palavra] = p[q_caracteres_palavra]+32; } str[q_caracteres_palavra] = p[q_caracteres_palavra]; } /* Coloca o indicador \0 na string */ str[q_caracteres_palavra] = '\0'; /* Checa palindromo */ aux = q_caracteres_palavra-1; for (cont = 0; str[cont]; cont++) { if (str[cont] == str[aux]) { q_caracteres_iguais++; } aux--; } if (q_caracteres_iguais == q_caracteres_palavra) { return(1); } return(0); }
  19. mas qual seria o propósito do seu programa?
  20. @paulo luz magalhaes Creio eu que o que você está tentando fazer é isso. #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int main(void) { char nome[40]; int i,x,acertos; printf("Entre com uma palavra "); scanf("%s%*c", nome); /*for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++) { if (nome[x] == nome) { acertos++; } } if(acertos==strlen(nome)) { printf("A palavra e um palindromo"); } else { printf("A palavra nao e um palindromo"); }*/ /* Passa a palavra para mauiscula */ for (i = 0; nome[i] != 0; i++) { nome[i] = toupper(nome[i]); /* toupper() e da biblioteca ctype.h */ } /* strcmp() e da biblioteca string.h */ if (strcmp(nome, "PALINDROMO") == 0) /* Compara as duas palavras */ { printf("\nA palavra e palindromo."); } else { printf("\nA palavra nao e palindromo."); } getchar(); /* Faz uma pausa */ return 0; } Use espaços ao invés de tabs para indentar, tente também copiar do jeito que eu deixei a indentação. Do modo que eu fiz fica mais fácil de visualizar o código.
  21. Aí vem a pergunta, que tipo de programas você já desenvolveu em C (lembrando que C não tem nada a ver com C++)? Eu recomendaria você fazer um programa igual ao dir (do windows) ou ls (do linux) e um programa simples que mostra todas as pastas e arquivos da pasta atual.
  22. @paulo luz magalhaes Não sei se isso é um "dever de casa", mas o seu código não tem uma função main fora que o C e sensível à caixa das letras (case sensitive). então eu acho que não posso ajudar além disso.
  23. @devair1010 Você tem que trocar a extensão do arquivo para C, é depois ir nas configurações do visual studio e trocar a codificação do arquivo para utf-8 com BOOM. adicione essa linha ao programa que talvez resolva o problema. _setmode(_fileno(stdout), _O_U16TEXT); fonte:Microsoft documentation _setmode. Eu daria uma resposta mais elaborada sobre o problema, mas isso já é questão do compilador.
  24. @Épsilon para usar a acentuação gráfica a maneira mais simples é utilizar a biblioteca wchar. exemplo: #include <stdio.h> #include <locale.h> #include <wchar.h> int main(void) { wchar_t str[256] = L"Olá como vai!"; setlocale(LC_ALL, ""); wprintf(L"\n%ls", str); wprintf(L"\nDigite seu primeiro nome:"); wscanf(L"%ls%*c", str); wprintf(L"\n%ls", str); getchar(); return(0); } Mas se você estiver iniciando nos seus estudos de C eu recomendo só esquecer isso por hora.
  25. O 'f' em fflush e de arquivo (file) isso vem do antigo unix em que tudo era um arquivo, então em poucas palavras ela funciona em qualquer arquivo aberto. Isso depende de quão perto você está do kernel, um programa rodando em user space (espaço de usuário) não afetaria muito o sistema, mas um programa rodando em kernel space (espaço do kernel) travaria a maquina ao fazer um flush em todos os buffers. No ponto de vista da linguagem C um flush em todos os buffers só é útil em caso de falha grave onde um processo secundário trava, é o primário fica sendo responsável por limpar toda a bagunça do secundário (isso só seria aceitável no user space). todas as outras funções como _flushall e _fflush_nolock são funções do windows, fugindo do padrão do C, isso que dizer que não são portáveis.

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!