Ir ao conteúdo
  • Cadastre-se

isrnick

Membro Pleno
  • Posts

    1.543
  • Cadastrado em

  • Última visita

Tudo que isrnick postou

  1. Segue um exemplo para até 10 frases com até 99 caracteres cada: FILE *file = fopen("string.txt", "r"); char frase[10][100]; int i; for (i=0; i<10 && fgets(frase[i], 100, file) != NULL; i++) printf("%s", frase[i]);
  2. O único problema no seu programa está na inicialização da variável "s", que armazena a multiplicação, onde você colocou que s=vet[0], e deveria ser inicializado em 1 (s=1). Fazendo essa modificação o programa funciona corretamente. Obs: Note que ali no inicio do programa vet[0] ainda não recebeu nenhum valor, apenas foi reservado o local na memória, mas ainda não foi atribuído nenhum valor, então s=vet[0] vai pegar qualquer valor lixo (deixado por algum outro programa usado anteriormente) que está lá nessa posição da memória. Então seu programa pega isso e multiplica pelos algarismos gerando um resultado aleatório/imprevisível.
  3. O termo correto é algarismo ou dígito. E o programa é simples, seria algo assim: #include <stdio.h> int main(){ int num, mult; printf("Digite o numero: "); scanf("%d%*c", &num); for (mult=1; num != 0; num=num/10) mult = mult*(num%10); printf("Resultado: %d\n", mult); return 0; } Mas talvez assim seja mais fácil de entender: #include <stdio.h> int main(){ int num, mult; printf("Digite o numero: "); scanf("%d%*c", &num); mult=1; while (num != 0){ mult = mult*(num%10); num=num/10; } printf("Resultado: %d\n", mult); return 0; }
  4. A variável %DATE% já é definida nativamente, então basta compará-la a data que você quer, tente algo assim: IF %DATE%==18/01/2017 start calc.exe
  5. Eu diria que inglês é requisito. Sim, aprender a programar é possível sem saber bem o inglês, pois cursos de Lógica de Programação podem usar português estruturado ao invés de uma linguagem de programação propriamente, e até mesmo aprender uma linguagem é possível desde que encontre bons cursos e/ou materiais de estudo em português. Mas, primeiramente saber inglês torna o aprendizado muito mais fácil, pois não apenas a sintaxe das linguagens de programação usa o inglês, como também é muito mais fácil encontrar bons cursos, guias, tutoriais, material para estudo, etc, em inglês, e através da internet você têm acesso a uma comunidade muito maior, com pessoas no mundo inteiro que falam inglês, para tirar suas dúvidas e obter ajuda no que quer seja. De fato, normalmente apenas fazer a busca da sua dúvida em inglês no Google já te levará diretamente a algum fórum onde a mesma pergunta já foi postada e respondida. E ainda mais importante se o objetivo é se profissionalizar como programador, é o fato de que a documentação das linguagens de programação e suas bibliotecas sempre terão versão em inglês, mas ter uma versão em português e atualizada será muito mais raro, então você vai precisar saber inglês para aprender a usar estas bibliotecas.
  6. Aqui eu fiz uma solução e comentei para explicar o que faz: #include <stdlib.h> #include <stdio.h> int main(){ int contador[26] = {0}, //Contadores para as 26 letras do alfabeto incializados em 0 i, j; char frase[1000], c; frase[0] = '\0'; fgets(frase, 1000, stdin); for(i=0; frase[i] != '\0' && i<1000; i++){ // Se o caractere for uma letra: if ( tolower(frase[i])>='a' && tolower(frase[i])<='z' ){ //Transforma a letra num número j de 0 a 25: j = (int) (tolower(frase[i]) - 'a'); //Incrementa o contador da j-ésima letra do alfabeto: contador[j]++; } } for(i=0; i<26; i++){ //Se a letra foi encontrada 1 ou mais vezes na frase: if(contador[i] != 0){ //Obtém o caractere da i-ésima letra do alfabeto: c = 'a' + (char)i; //Imprime a letra e o número de vezes em que foi encontrada na frase: printf("%c: %d\n", c, contador[i]); } } return 0; } Observe o uso da função tolower() que serve para transformar um caractere de letra maiúscula em letra minúscula, assim só é preciso checar letras minúsculas. Seria possível fazer o oposto usando a função toupper() para transformar em letras maiúsculas.
  7. Para obter os dígitos do número você pode usar o operador % para calcular o resto da divisão inteira por 10 para obter o último digito, e depois fazer a divisão inteira por 10 pra eliminar o último dígito, e repetir o processo, ex: 753 % 10 = 3 753 / 10 = 75 75 % 10 = 5 75 / 10 = 7 7 % 10 = 7 7 / 10 = 0
  8. Essa seria minha solução para a função: void telhado(int n, int matriz[n][n]){ int linha, coluna, coldiag1 = 0, coldiag2 = n-1; for (linha=0; linha < n; linha++){ for(coluna=0; coluna < n; coluna++) { if (abs(coluna - coldiag1) <= abs(coluna - coldiag2)) matriz[linha][coluna] = abs(coluna - coldiag1); else matriz[linha][coluna] = abs(coluna - coldiag2); } coldiag1++; coldiag2--; } }
  9. Teste incluindo isto: char c; . . . case 1: while((c = getchar()) != '\n' && c != EOF); //limpa a stdin printf("Digite a string :\n"); fgets( calc, 100, stdin ); tam=strlen(calc); printf("A string tem %d caracteres", tam); break; Se isto funcionar significa que provavelmente houve um scanf anterior que deixou algum "lixo" no stdin, e seu fgets está pegando o isto como entrada, se quiser entender melhor veja esse post abaixo onde postei uma explicação mais detalhada:
  10. Se entendi direito o padrão segue o desenho de um telhado, onde as 2 diagonais principais recebem 0, e as posições imediatamente próximas as diagonais recebem 1, e as posições próximas as estas recebem 2, e assim por diante aumentando o número conforme se afasta das diagonais principais: 0 1 2 3 2 1 0 1 0 1 2 1 0 1 2 1 0 1 0 1 2 3 2 1 0 1 2 3 2 1 0 1 0 1 2 1 0 1 2 1 0 1 0 1 2 3 2 1 0 O valor armazenado na casa da matriz é igual a distância desta casa até a casa que pertence a diagonal principal mais próxima. Não importa se na vertical ou na horizontal isso é válido, então vamos considerar apenas a direção horizontal. Do exemplo acima podemos observar que na primeira linha as casas que pertencem a diagonal principal estão na coluna 0 e na coluna N-1, vamos então chamar coldiag1 = 0 e coldiag2 = N-1 na primeira linha, mas na linha seguinte coldiag1 = 1 e coldiag2 = N-2, e esse padrão segue a cada linha... Daí podemos tirar que a cada linha a posição da coluna que pertence a primeira diagonal principal (coldiag1) é incrementada de 1, e o oposto acontece na segunda diagonal, coldiag2 é subtraído de 1 a cada linha. Ok, agora sabemos as posições das colunas na respectiva linha que pertencem as diagonais principais, então para obter o valor a ser armazenado na casa basta calcular as distâncias da coluna atual até estas colunas, e armazenar o menor dos 2 valores. Ou seja, o mínimo entre |coluna - coldiag1| e |coluna - coldiag2| (onde | | indica o módulo ou valor absoluto). Agora tente implementar a lógica/código...
  11. Se numerarmos as linhas, temos que o número de espaços em branco em cada linha é igual a altura h menos o número da linha, e os números na linha vão contando de 1 até o número da linha, e depois vai conta regressivamente de volta até 1. Então a lógica fica algo desse tipo: para linhas indo de 1 até h: para conta_espaços indo de 1 até (h - linha): imprime espaço em branco fim_do_para para números indo de 1 até linha: imprime número fim_do_para para números indo de (linha-1) até 1: imprime número fim_do_para fim_do_para
  12. Cadê a figura? E sempre use o a tag CODE para postar códigos, apertando o botão <> no topo do campo de resposta do fórum, pois assim você mantém a formatação e evita que o autocorretor do fórum faça alterações no texto do seu código.
  13. isrnick

    C para C++ Run Length

    Pra colocar os 2 valores fica assim: cout << "$" << count[i] << str[i];
  14. Visual C# é uma implementação feita pela Microsoft da linguagem C#, ou seja se refere a implementação do compilador que é usado no Visual Studio. Tecnicamente você pode usar outro compilador de C#, como o compilador Mono do MonoDevelop, e não estaria usando Visual C#. Entretanto, a linguagem é chamada apenas C#. Quanto a porque existem livros de Visual C#, imagino que eles ensinem C# dando ênfase ao ambiente Windows, usando bibliotecas que podem depender do SO usado, e que faça referências especificamente ao Visual Studio e suas ferramentas...
  15. Você está certo, eu errei, para descartar um caractere deve-se usar %*c no scanf (onde o * é usado para indicar que o valor lido não é armazenado em nenhuma variável, ou seja, é lido e descartado). Ficando assim: scanf("%i%*c", &i); (Editei e corrigi meu post original para colocar a forma correta.) E no fim do seu programa o valor a ser impresso é o valor da variável s, que é onde está armazenada a soma, não da variável i.
  16. Sempre use a tag CODE, apertando o botão <> no topo do campo de resposta, para postar códigos, pois assim você mantém a formatação do código, e evita que o autocorretor do fórum faça alterações no texto do seu código... Quanto a sua pergunta, o problema está na entrada dos dados, quando você digita por exemplo o número 123 e aperta ENTER, o que está sendo passado para a entrada padrão (stdin) é a string "123\n", onde '\n' representa o caractere nova linha em C, e esse caractere foi inserido quando você apertou o botão ENTER. O scanf por sua vez que obter dessa entrada um número inteiro inteiro (scanf("%i", &i);), então ele pega da entrada a parte relevante "123" e deixa na entrada o que sobrou, nesse caso o caractere '\n'. Por sua vez, o próximo scanf no seu programa que obter um caractere (scanf("%c", &l);), mas já existe um caractere digitado na entrada padrão, o caractere '\n', então esse caractere é armazenado na variável l, e como l agora é diferente de 's' o programa sai do ciclo while e o programa é concluído. Uma maneira de tratar isto seria fazer o primeiro scanf descartar o '\n', modificando-o para esperar um número inteiro seguido de um caractere nova linha, como: scanf("%i%*c", &i); Isso excluiria o caractere nova linha da entrada padrão, e resolve o problema, mas observe que isso apenas trata a hipótese do usuário entrar um valor adequado, ou seja o usuário é bem comportado, mas se ao invés disto forem digitados o número e outros caracteres na entrada e só então for dado ENTER (ex: "123 blablabla\n"), ou for digitado algo que não seja um número, o programa se comportará de forma inesperada, pois o programa não lida com estas hipóteses. Um programa mais avançado precisaria analisar a validar a entrada antes de usá-la, e tratar os possíveis erros, mas isso ainda não é algo com que você precisa lidar. Outra solução seria excluir qualquer coisa que reste na entrada padrão depois que você obteve o dado relevante, com algo desse tipo: scanf("%i", &i); /*Lê e descarta todos os caracteres que ainda estiverem na entrada padrão até encontrar '\n' ou encontrar o fim do arquivo/stream/fila: */ while((c = getchar()) != '\n' && c != EOF); (Isso resolve o problema do usuário digitar algo além do esperado, mas ainda não trata a hipótese do usuário digitar algo completamente inválido. Para mais informações sobre isso pesquise sobre validação de entrada (input validation) em C.) EDIT: Correção no scanf para descartar o caractere '\n'.
  17. Desculpe mas não sei C#, e não faço ideia de como fazer isso de bloquear até acesso ao gerenciador de tarefas ou impedir que a tarefa seja finalizada, mesmo nas linguagens que conheço, então isso está fora do meu alcance... Usar o próprio bloqueio do Windows seria simples, e até tem códigos de como ativá-lo postados na internet, o que você quer entretanto é algo bem mais complicado... Obs.: Sugiro não divulgar número de celular no fórum...
  18. Não bastaria fazer bloquear o Windows? Aí a pessoa só consegue entrar novamente se digitar a senha do Windows...
  19. Pra converter de graus pra radianos basta multiplicar por PI (3,14159...) e dividir por 180... Essa série de taylor quando expandida para k termos fica: cos(x) = 1 - (x^2)/2! + (x^4)/4! - (x^6)/6! + ... + { [(-1)^k] * (x^2k) } / (2k)! Mas note que: (x^2k) / (2k)! = [x * x^(2k-1)] / [2k * (2k-1)!] = (x / 2k) * [x^(2k-1) / (2k-1)!] => (eq. 1) E segue igualmente que: x^(2k-1) / (2k-1)! = [x / (2k-1)] * [x^(2k-2) / (2k-2)!] = [x / (2k-1)] * { x^[2(k-1)] / [2(k-1)]! } => (eq. 2) Substituindo eq.2 em eq.1 temos que: (x^2k) / (2k)! = (x / 2k) * [x / (2k-1)] * { x^[2(k-1)] / [2(k-1)]! } (x^2k) / (2k)! = {x^2 / [2k * (2k-1)] } * { x^[2(k-1)] / [2(k-1)]! } (x^2k) / (2k)! = [ x^2 / (4k^2 -2k) ] * { x^[2(k-1)] / [2(k-1)]! } Logo se chamarmos (x^2k) / (2k)! = f(x, k), temos que: f(x, k) = [ x^2 / (4k^2 -2k) ] * f(x, k-1) Então para obter o próximo termo da série basta multiplicar o último termo obtido por [ x^2 / (4k^2 -2k) ]. E a série de taylor fica: cos(x) = 1 - f(x, 1) + f(x, 2) - f(x, 3) + ... + [(-1)^k] * f(x, k) Agora tente implementar o algoritmo para calcular cos(x) sabendo disto.
  20. Quando você coloca o número entre aspas simples, como '1', '2', '3', etc, está indicando o caractere (char) que representa o número em questão, não o número inteiro (int) em si... Logo nos cases do switch do seu programa deve-se usar o número sem as aspas, pois a e b são números inteiros, não chars... Ex: int numero; //Lógica para atribuir valores a variavel numero switch (numero){ case 1: //Lógica se numero == 1 break; case 2: //Lógica se numero == 2 break; default: //Lógica se numero não for igual a nenhum dos valores }
  21. fflush(stdin) tem comportamento indefinido, ou seja pode não se comportar como o esperado, isso porque fflush() é para ser usado com streams de saída, não de entrada. Dependendo de como foi implementado no seu compilador/biblioteca ele pode até funcionar para limpar a stream, mas se usar um compilador diferente pode não funcionar, então não se deve usá-lo para esta função. flush_in() é uma função que o @vangodp postou/criou para fazer o que você pretendia ao usar fflush(stdin) no seu código, ou seja limpar os caracteres que ainda estiverem na entrada padrão stdin, para que não sejam interpretados como dados digitados pelo próximo comando de captura de entrada...
  22. print('Velocidade média: {0:.2f} m/s'.format(v))
  23. Sim, essa não é a questão, eu me referia a discussão sobre usar formato TXT ou CSV, e sobre como o caractere nova linha é representado na memória, não se aplicam no caso sendo discutido nesse tópico.
  24. #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <locale.h> typedef struct contato CONTATO; struct contato { int ativo; char nome[50]; char cpf[30]; }; void flush_in(); void cadastrar(); void listar(); void editar(); //VARIAVEL UNIVERSAL FILE *arquivo; CONTATO ctt; int op; int main(void) { setlocale(LC_ALL, "Portuguese"); do { system("cls"); printf("\n1 - Cadastrar"); printf("\n2 - Listar"); printf("\n3 - Editar"); printf("\n0 - Sair\n\n"); printf("Digite uma opção: "); scanf("%d", &op); //flush_in(); switch(op) { case 1: cadastrar(); break; case 2: listar(); break; case 3: editar(); break; case 0: break; default: printf("\nOpção Inválida!\n"); getch(); break; } }while(op!=0); } void flush_in() { int ch; while ( ( ch = fgetc ( stdin ) ) != '\n' && ch != EOF) {} } void cadastrar() { flush_in(); do { arquivo = fopen("base.txt","a+b"); system("cls"); printf("Nome: "); gets(ctt.nome); printf("CPF: "); gets(ctt.cpf); ctt.ativo = 1; fwrite(&ctt, sizeof(CONTATO),1,arquivo); fclose(arquivo); printf("Deseja realizar novo Cadastro (s/n)?"); }while(getche()=='s'); } void listar() { system("cls"); arquivo = fopen("base.txt","rb"); while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1) { printf("Status: %d\n", ctt.ativo); printf("Nome: %s\n",ctt.nome); printf("CPF: %s\n",ctt.cpf); printf("--------------------\n\n"); } fclose(arquivo); getch(); } void editar() { int posicao = 0; // Inicio do Arquivo; int achou = 0; char AltCpf[30]; char AltNome[50]; flush_in(); printf("Digite o CPF: "); gets(AltCpf); arquivo = fopen("base.txt","r+b"); system("cls"); op = -1; while(fread(&ctt, sizeof(CONTATO), 1, arquivo)==1 && op!=0) { if(strcmp(AltCpf,ctt.cpf)==0) { printf("\n1 - Nome: %s",ctt.nome); printf("\n2 - CPF: %s",ctt.cpf); printf("\n0 - Voltar"); printf("\n-------------\n\n"); printf("\n\nEscolha uma opção: "); scanf("%d", &op); flush_in(); switch(op) { case 1: printf("Digite o Novo nome: "); gets(ctt.nome); fseek(arquivo, posicao, SEEK_SET); achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO); break; case 2: printf("Digite o novo CPF: "); gets(ctt.cpf); fseek(arquivo, posicao, SEEK_SET); achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO); break; case 0: /*Não se deve chamar main() de dentro da função, isso criar uma recursividade com comportamento imprevisivel*/ //main(); break; default: printf("\nOpção Inválida!\n"); getch(); break; } } /*É aqui que a posição deve ser atualizada, no final do ciclo WHILE, sendo descolocado de +sizeof(CONTATO) a cada iteração do ciclo*/ posicao = posicao + sizeof(CONTATO); /*Move posição de leitura/escrita de volta para a posição original*/ fseek(arquivo, posicao, SEEK_SET); } op=-1; fclose(arquivo); } Só faltavam alguns detalhes, adicionei um fseek() no final pra voltar a posição original após fazer a edição, e aproveitei pra retirar os fflush(stdin) e substituir pela função flush_in() conforme sugerido pelo @vangodp . Mas o problema maior era que o tinha um "case" no "switch" da função onde a função main() era chamada, e isso gerava uma recursividade sem comportamento previsto, retirei isso e ao invés fiz o ciclo while checar o valor da variável "op" e acabar quanto igual a 0... (Outra opção seria dentro do "case" usar "fclose()" pra fechar o arquivo, e "return;" pra sair da função)
  25. @vangodp @Gustavo.Loggin Os exemplos usados aqui lidam com arquivos armazenando informações em modo binário, não modo texto, logo nada disso se aplica. @Intruder18 Fiz algumas alterações no código, e comentários do motivo, mas não testei já que compiladores online não aceitam a biblioteca <conio.h>, e não estou em casa... Testa e veja se funcionou. #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <locale.h> typedef struct contato CONTATO; struct contato { int ativo; char nome[50]; char cpf[30] }; void cadastrar(); void listar(); void editar(); //VARIAVEL UNIVERSAL FILE *arquivo; CONTATO ctt; int op; int main(void) { setlocale(LC_ALL, "Portuguese"); do { system("cls"); printf("\n1 - Cadastrar"); printf("\n2 - Listar"); printf("\n3 - Editar"); printf("\n0 - Sair\n\n"); printf("Digite uma opção: "); scanf("%d", &op); switch(op) { case 1: cadastrar(); break; case 2: listar(); break; case 3: editar(); break; case 0: break; default: printf("Opção Inválida!"); break; } }while(op!=0); } void cadastrar() { do { arquivo = fopen("base.txt","a+b"); system("cls"); fflush(stdin); printf("Nome: "); gets(ctt.nome); fflush(stdin); printf("CPF: "); gets(ctt.cpf); ctt.ativo = 1; fwrite(&ctt, sizeof(CONTATO),1,arquivo); fclose(arquivo); printf("Deseja realizar novo Cadastro (s/n)?"); }while(getche()=='s'); } void listar() { system("cls"); arquivo = fopen("base.txt","rb"); while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1) { printf("Status: %d\n", ctt.ativo); printf("Nome: %s\n",ctt.nome); printf("CPF: %s\n",ctt.cpf); printf("--------------------\n\n"); } fclose(arquivo); getch(); } void editar() { int posicao = 0; // Inicio do Arquivo; int achou = 0; char AltCpf[30]; char AltNome[50]; fflush(stdin); printf("Digite o CPF"); gets(AltCpf); arquivo = fopen("base.txt","r+b"); /*Não sei porque você está reposicionando a leitura aqui, visto que já está no começo do arquivo, afinal você acabou de abri-lo*/ // fseek(arquivo, posicao, SEEK_SET); system("cls"); while(fread(&ctt, sizeof(CONTATO), 1, arquivo)==1) { if(strcmp(AltCpf,ctt.cpf)==0) { printf("\n1 - Nome: %s",ctt.nome); printf("\n2 - CPF: %s",ctt.cpf); printf("\n0 - Voltar"); printf("\n-------------\n\n"); printf("\n\nEscolha uma opção: "); scanf("%d", &op); switch(op) { case 1: fflush(stdin); printf("Digite o Novo nome: "); gets(ctt.nome); fseek(arquivo, posicao, SEEK_SET); achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO); /*Esse ajuste da posição é desnecessário*/ // ajustar posicao em relação ao inicio do arquivo //posicao = posicao + sizeof(CONTATO); break; case 2: fflush(stdin); printf("Digite o novo CPF: "); gets(ctt.cpf); fseek(arquivo, posicao, SEEK_SET); achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO); /*Novamente, esse ajuste da posição é desnecessário*/ // ajustar posicao em relação ao inicio do arquivo //posicao = posicao + sizeof(CONTATO); break; case 0: main(); break; default: printf("\nOpção Inválida!"); break; } } /*É aqui que a posição deve ser atualizada, no final do ciclo WHILE, sendo descolocado de +sizeof(CONTATO) a cada iteração do ciclo*/ posicao = posicao + sizeof(CONTATO); } fclose(arquivo); } A variável "posicao" está armazenando a posição de leitura/escrita no arquivo antes do próximo fread() ser executado (que logicamente desloca a posição a cada leitura).

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!