CPP
-
Total de itens
117 -
Registro em
-
Última visita
Posts postados por CPP
-
-
Quando você escreve um numero comecando com o (zero) está dizendo ao compilador que a base desse numero é octal, ou seja, pode representar numeros de 0 a 7.
Então você não pode fazer 08 porque vai dar erro.
Quando quiser representar numeros na base decimal apenas escreva sem o zero na frente, exemplo: 1,2,3...etc
Em alguns pontos do seu programa você escreveu if terminando com ';' isso causa erro nos blocos de decisão.
você pode terminar um if com ';', isso não é problema desde que a logica esteja correta.
Por exemplo:
Esse if esta errado:
if ( d==31) (d=01, m++); printf("A data do proximo dia é: %d/%d/%d", d, m, a); else (d++); printf("A data do proximo dia é: %d/%d/%d", d, m, a);
O correto seriaif ( d==31) { d=01; m++; printf("A data do proximo dia é: %d/%d/%d", d, m, a); } else { (d++); printf("A data do proximo dia é: %d/%d/%d", d, m, a); }
Tenta encontrar os outros erros e se precisar de ajuda é só falar.
-
Pra não aceitar o enter sem ter digitado um numero antes:
while (tecla != '\r' )
{
tecla = getch();
if (tecla == '\r' && i == 0)
tecla = 0;
if (isdigit(tecla) || tecla=='-')
numero[i++] = tecla;
}
}while(atoi(numero) < 0 || atoi(numero) > 100);
[/codebox]numero é um array do tipo char, supondo que o conteudo dela seja "Teste 123" se fizer:
numero[5] = '-'; você muda o conteudo para "Teste-123" porque escreveu na posição 6 da string;
Um array em C sempre começa em 0, então a indexação seria:
0 1 2 3 4 5 6 7 8 9 10 (indice)
T e s t e - 1 2 4 (conteudo)
Quando você faz numero[i++] está indicando a posição pelo valor de i.
Deu pra entender?
-
Os dois códigos estão bons e funcionam, mas se alguém usar um programa pra gerar o assembly do seu executavel vai pegar a senha facilmente.
Uma maneira de dificultar a ação de um hacker e não colocar pistas.
Se eu procurar mensagem (Senha Correta) no codigo vou achar o if e o valor da senha.
Mas se eu usar variaveis e dificultar o ponto onde vão encontrar as mensagens o invasor vai ter mais dificuldade pra quebrar a segurança.
Alguns algoritmos de criptografia também podem ajudar a aumentar a segurança, alem de um contador limite de tentativas.
O codigo abaixo pode ser melhorado em muito.
Abs
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int resposta = 954;
char *msg[] = {"Senha Correta!\n\n", "Senha Incorreta\n\n"};
int status;
clrscr();
resposta = 123;
int senha;
printf("Entre com a senha:");
scanf("%d", &senha);
printf("\nVerificando...\n");
status = (senha==resposta);
printf(msg[!status]);
getch();
return status;
}
[/codebox] -
AthosLive,
Tem mais duas coisas erradas no seu codigo
pg é um char e você ta usando scanf("%s", &pg);
Quando você usa %s o scanf vai te retornar a tecla que você pressionou mais o terminar de string (\ 0) e como você alocou apenas um byte (char) está corrompendo a memoria do seu programa.
O correto é usar scanf("%c", &pg) que vai te retornar apenas um byte.
O outro erro é que comissão é com dois "s" e não com ç (rs)
Abs
-
já respondi
-
Posta o código ou manda pra mim por email: osantos@smartnet.com.br
-
Cara, eu nunca vi essa expressão antes: v = (0, i);
Você pode me dizer o que ela faz?
Grato
-
Athoslive,
Seu código tá bem confuso cara.
Tem goto dentro de while e if que não vai fazer exatamente o que você quer.
Alem do que printf(" o \r", seta + passo); está errado, já que você passou um parametro (seta + passo) sem nenhuma indicação de substituição na string.
Ou seja tá faltando algum "%<tipo>" dentro da string " o \r";
O problema acho que tá mais na lógica do que no uso da linguagem.
Mas vamos lá.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <ctype.h>
void main()
{
char a;
int col = 10;
clrscr();
printf("joguinho lecal , digite D pra > e A pra <");
printf("\n ");
printf(" >- ");
inicio:
if (kbhit())
a=tolower(getch());
if(a=='d')
{
gotoxy(col--, 2);
printf(" o \r");
if (col == 8)
a = ' ';
}
if(a=='a')
{
gotoxy(col++, 2);
printf(" o \r");
if (col == 30)
a = ' ';
}
if (a=='e')
{
// escreva aqui seu codigo para o tiro
}
if(a=='s')
{
exit(0);
}
delay(50);
goto inicio;
}
[/codebox] -
do{
memset(numero, 0, sizeof(numero));
i = 0;
printf("Digite um numero de 0 a 100\n");
while (tecla != '\r' )
{
tecla = getch();
if (isdigit(tecla))
numero[i++] = tecla;
}
}while(atoi(numero) < 0 || atoi(numero) > 100);
-
Bom, eu particularmente discordo da questão de usar apenas o que se aprende no curso.
Desde que você saiba o porque das coisas acho valido usar tudo.
Mas, sem arrays você pode fazer um scanf("%d", &numero); e depois chamar clrscr(); pra limpar a tela e deixar seguir o fluxo.
O problema é que os dois usuarios não podem estar na frete do micro nesse momento.
A funcao isdigit() apenas testa se um caracter é um digito entre 0 e 9, ela não faz nenhuma conversão.
-
Olá Eduardo.
Tem um problema no seu codigo.
while ((ch != '\r'))
{
ch = getch();
}
Supondo que ch seja do tipo char quando você faz ch = getch() está recebendo o codigo ASCII da tecla pressionada, por exemplo:
Se digitar 123 o ch vai ter apenas o valor 0x33 (51 decimal) que corresponde ao codigo ASCII (em hexa) do caracter '3'.
E quando pressionar o ENTER ch vai ter o valor 0x0D ou 13 em decimal que corresponde ao codigo ASCII do ENTER.
Quando ch for igual ENTER ('\r') ele encerra o whille.
Ai você faz um scanf("%d", &chute) e compara com ch, nesse ponto você está comparando o seguinte:
Supondo que o usuario digitou 45 seu if será: if (45 == 13) que resultará em FALSO.
Vou enviar um codigo pra você analisar.
Qualquer dúvida é só postar.
Abs
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <mem.h>
void main()
{
char numero[10];
char tecla;
int chute;
int i = 0;
// preenche o array numero com zeros
memset(numero, 0, sizeof(numero));
tecla = 0;
printf("Digite um numero e pressione <ENTER> para finalizar\n");
while (tecla != '\r')
{
tecla = getch();
if (isdigit(tecla)) // verifica se a tecla digitada é um numero (0 a 9)
numero[i++] = tecla; // salva o valor digitado em numero na posicao indicada por i eincrementa i
}
printf("Digite um valor: ");
scanf("%d", &chute);
if (chute == atoi(numero)) // atoi converte uma string para int
printf("Confere\n");
else
printf("não Confere\n");
getch();
}
[/codebox] -
Tenta estudar esse código.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <ctype.h>
void main()
{
char a;
int col = 10;
clrscr();
printf("joguinho lecal :D, digite D pra > e A pra <");
printf("\n ");
printf(" >- ");
inicio:
if (kbhit())
a=tolower(getch());
if(a=='d')
{
gotoxy(col--, 2);
printf(" o \r");
if (col == 8)
a = ' ';
}
if(a=='a')
{
gotoxy(col++, 2);
printf(" o \r");
if (col == 30)
a = ' ';
}
if(a=='s')
{
exit(0);
}
delay(50);
goto inicio;
}
[/codebox] -
Pequeno engano.
a sequencia deve ser
col = 1;
gotoxy(col, 10); // pra posicionar na coluna 1 da linha 10
printf(" o"); // pra exibir nas coordenas estabelecidas pelo gotoxy
col++; // col passa a ser 2...3...4...e etc
Quando quiser retroceder é só fazer col--
Tenta ai, se não conseguir eu modifico seu codigo pra você ver como faz.
Abs
-
Olá Binder,
Concordo com você quando diz que não se compara strings com ==, mas no codigo athoslive ele está comparando bytes quando se usa o ' apostrofe.
Isso é perfeitamente valido ainda mais porque a variavel (a) é um char.
AthosLive, o problema do seu codigo é o seguinte.
Quando você simplesmente usa o printf ele vai exibir a informação na posição corrente da tela.
O \ n faz o cursor se move para a coluna 1 da proxima linha.
Se você quer fazer o seu ojbeto se mover você precisa indicar as coordernadas de impressao usando o gotoxy(col, linha) e ir mudando o valor de col;
Assim o printf vai respeitar as coordenadas que você definiu.
Pra andar pra frente é só fazer col++ e pra andar pra tras col-- dentro dos limites que você estabelecer.
Se ainda tiver duvidas é só falar.
Fica atento ao que o Binder falou, isso é importante pra se manipular texto. Inclusive você pode usar o toupper() ou tolower() pra tratar as letras digitadas independente de ser (s) ou (S).
Abs
-
Dependendo do compilador e do que você quer fazer num .h/.hpp pode mesmo dar erro.
Pode ser que tenha solução, mas a melhor opção ainda é usar funções definidas em outros modulos.
Qualquer problema é só falar.
Abs
-
Olá Eric,
É possivel fazer um #include em qualquer parte do codigo, mas não é muito comum.
O ideal é você criar um projeto com varios modulo e chamar as funções que eles disponibilizam.
Nesse modelo (não muito comum) você pode usar o #include onde quiser.
O problema é que o código é replicado no ponto onde o #include foi realizado e dessa forma consome memoria aumentando o tamanho da sua aplicacao.
Para teste crie os arquivos teste.cpp e main.cpp
//==============================
// Arquivo teste.cpp
//==============================
printf("Texto contido em teste.cpp\n");
//==============================
// Arquivo main.cpp
//==============================
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
printf("Texto contido em main.cpp\n");
#include "teste.cpp"
printf("Novamente texto contido em main.cpp\n");
for(int n = 0; n < 10; n++)
#include "teste.cpp"
system("pause");
}
[/codebox]O ideal é criar funções em modulos separados e chama-las onde desejar.
Assim, você só tem uma função que pode ser executada em qualquer ponto sem consumir memoria de codigo desenecessariamente.
Para teste crie os arquivos teste.cpp, teste.hpp e main.cpp
[codebox]
//==============================
// Arquivo teste.cpp
//==============================
void ExibeMensagem(void)
{
printf("Texto contido em teste.cpp\n");
}
//==============================
// Arquivo teste.hpp
//==============================
void ExibeMensagem(void);
//==============================
// Arquivo main.cpp
//==============================
#include <stdio.h>
#include <stdlib.h>
#include "teste.hpp"
void main(void)
{
printf("Texto contido em main.cpp\n");
ExibeMensagem();
printf("Novamente texto contido em main.cpp\n");
for(int n = 0; n < 10; n++)
ExibeMensagem();
system("pause");
} -
já que você ta usando borlando não me preocupei com portabilidade pra Linux.
Vê se esse codigo te da alguma luz.
Abs
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
void main(void)
{
unsigned char col = 10; // atribui o valor da coluna inicial
char passo = 1; // atribui o valor inicial para o passo
char seta = '>' - 1; // atribui o caracter para exibicao usando o codigo ascii
while(1)
{
if (kbhit()) // se alguma tecla for pressionada encerra o programa
break; // encerra o laco
gotoxy(col, 10); // indica a posicao de impressao na tela
printf(" %c \r", seta + passo); // exibe a seta > ou <
col += passo; // muda a coluna de impressao somando 1 para avancar ou -1 para retroceder
if (col == 70 || col == 10) // se atingiu os limites estabelecidos muda o passo para -1 ou 1
passo *= -1; // com uma multiplicao simples por (-1)
// exibe o percentual com base na posicao de impressao dentro de 80 colunas
// usando uma regra de 3 simples
gotoxy(1,15);
printf("Percentual: %.2f\% ", (float)(col * 100.0 / 80.0));
delay(50); // aguarda 50 milisegundos antes de executar o laco novamente
}
}
[/codebox] -
Só ta faltando alguns pequenos detalhes no seu programa:
Na funcao inclusao() falta a linha
ult->s=s;
Na opçao 6 você chama ContarFunc() que devolver a quantidade de registros mas você não salva em lugar nenhum quando o correto é:
cont=ContarFunc();
-
Olá arandoble,
Acho que não estou entendendo o que você realmente precisa.
O codigo que eu postei faz a leitura do arquivo lista.txt independente da quantidade de linhas que ele possua e gera o lista_inv.txt com as palavras invertidas.
A funcao que o renatosantos17 postou faz a inversão que você deseja.
Mas, o que é a lista que você quer inverter?
Por exemplo, você inverter listas em memoria ou inverter linhas do arquivo usando a funcao Inverte()
Se você usar o exemplo que trata arquivos precisa ter uma arquivo chamado "lista.txt" com o conteudo para inversão.
O resultado será gravado no arquvo "lista_inv.txt"
// opcao 1 --------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *inverte(char *string)
{
static char temp[100];
int inc;
int dec = strlen(string)-1;
strcpy(temp, string);
for(inc = 0; inc < strlen(string); inc++, dec--)
temp[inc] = string[dec];
temp[inc] = 0;
return (temp);
}
void main(void)
{
char *nomes[ ] = {"pedro", "paulo", "anita", "rosana", "joao", 0};
int n = 0;
while(nomes[n])
{
printf("nome: %s\t%s\n", nomes[n], inverte(nomes[n]));
n++;
}
}
[/codebox][codebox]
/ opcao 2 --------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *inverte(char *string)
{
static char temp[100];
int inc;
int dec = strlen(string)-1;
strcpy(temp, string);
for(inc = 0; inc < strlen(string); inc++, dec--)
temp[inc] = string[dec];
temp[inc] = 0;
return (temp);
}
int main()
{
// cria os ponteiros para os arquivos
FILE *fpEntrada, *fpSaida;
// abre os arquivos de entrada e saida
fpEntrada = fopen("lista.txt", "r+t");
fpSaida = fopen("lista_inv.txt", "w+t");
if (fpEntrada == NULL || fpSaida == NULL)
return 1;
char buffer[256];
int n;
while (feof(fpEntrada) == 0)
{
n = 0;
if (fgets(buffer, 250, fpEntrada) != NULL)
{
// grava já invertido
fputs(inverte(buffer), fpSaida);
}
}
fclose(fpEntrada);
fclose(fpSaida);
system("pause");
return (0);
} -
Olá.
Esse codigo deve funcionar em qualquer compilador, basta algumas mudanças (de coisas que não deveriam estar ai)
Obrigado e parabens pela iniciativa de compartilhar codigo.
Abs
#include <stdio.h> // #include <dos.h> // essa linha esta a mais #include <stdlib.h> void main(void) { union { unsigned char byte; struct { unsigned char bit0 : 1; unsigned char bit1 : 1; unsigned char bit2 : 1; unsigned char bit3 : 1; unsigned char bit4 : 1; unsigned char bit5 : 1; unsigned char bit6 : 1; unsigned char bit7 : 1; } unsigned binario; // retirar o unsigned dessa linha e pronto, compila em Windows ou Linux } dado; dado.byte = 127; printf("Decimal: %d\n", dado.byte); printf("Binario: %d%d%d%d-%d%d%d%d\n", dado.binario.bit7, dado.binario.bit6, dado.binario.bit5, dado.binario.bit4, dado.binario.bit3, dado.binario.bit2, dado.binario.bit1, dado.binario.bit0); printf("Hexa...: %02X\n", dado.byte); printf("\n\n"); dado.binario.bit7 = 1; dado.binario.bit6 = 0; dado.binario.bit5 = 1; dado.binario.bit4 = 0; dado.binario.bit3 = 1; dado.binario.bit2 = 0; dado.binario.bit1 = 1; dado.binario.bit0 = 0; printf("Binario: %d%d%d%d-%d%d%d%d\n", dado.binario.bit7, dado.binario.bit6, dado.binario.bit5, dado.binario.bit4, dado.binario.bit3, dado.binario.bit2, dado.binario.bit1, dado.binario.bit0); printf("Decimal: %d\n", dado.byte); printf("Hexa...: %02X\n", dado.byte); system("pause"); }
-
Para efeitos didáticos.
Abs
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
void main(void)
{
union
{
unsigned char byte;
struct
{
unsigned char bit0 : 1;
unsigned char bit1 : 1;
unsigned char bit2 : 1;
unsigned char bit3 : 1;
unsigned char bit4 : 1;
unsigned char bit5 : 1;
unsigned char bit6 : 1;
unsigned char bit7 : 1;
} unsigned binario;
} dado;
dado.byte = 127;
printf("Decimal: %d\n", dado.byte);
printf("Binario: %d%d%d%d-%d%d%d%d\n", dado.binario.bit7, dado.binario.bit6, dado.binario.bit5, dado.binario.bit4,
dado.binario.bit3, dado.binario.bit2, dado.binario.bit1, dado.binario.bit0);
printf("Hexa...: %02X\n", dado.byte);
printf("\n\n");
dado.binario.bit7 = 1;
dado.binario.bit6 = 0;
dado.binario.bit5 = 1;
dado.binario.bit4 = 0;
dado.binario.bit3 = 1;
dado.binario.bit2 = 0;
dado.binario.bit1 = 1;
dado.binario.bit0 = 0;
printf("Binario: %d%d%d%d-%d%d%d%d\n", dado.binario.bit7, dado.binario.bit6, dado.binario.bit5, dado.binario.bit4,
dado.binario.bit3, dado.binario.bit2, dado.binario.bit1, dado.binario.bit0);
printf("Decimal: %d\n", dado.byte);
printf("Hexa...: %02X\n", dado.byte);
system("pause");
}
[/codebox] -
Bom, estuda esse código e se tiver dúvidas posta ai que a galera ajuda.
Abs
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
// cria os ponteiros para os arquivos
FILE *fpEntrada, *fpSaida;
// abre os arquivos de entrada e saida
fpEntrada = fopen("lista.txt", "r+t");
fpSaida = fopen("lista_inv.txt", "w+t");
if (fpEntrada == NULL || fpSaida == NULL)
return 1;
char buffer[256];
int n;
while (feof(fpEntrada) == 0)
{
n = 0;
if (fgets(buffer, 250, fpEntrada) != NULL)
{
// grava já invertido
while (buffer[n]) // anda pelo array até encontrar o terminar ''
{
// strlen devolve o numero de bytes numa string.
// Exemplo: strlen("João") devolve 5, mas tem que lembrar que um array em C começa em 0
fputc(buffer[(strlen(buffer)-1)-n], fpSaida);
n++;
}
}
}
fclose(fpEntrada);
fclose(fpSaida);
system("pause");
return (0);
}
[/codebox] -
Opa, desculpa ai então.
Tenta esse código como base.
#include <stdio.h>
#include <mem.h>
void main(void)
{
FILE *fp = fopen("teste.txt", "rt");
unsigned char ch;
unsigned char tabela[256];
memset(&tabela, 0, sizeof(tabela));
while (feof(fp) == 0)
if (ch = fgetc(fp))
tabela[ch]++;
printf("Fim\n");
for(int n = 0; n < 256; n++)
printf("%03d ", tabela[n]);
fclose(fp);
}
[/codebox] -
Olá Victor Martins,
Consertar seu programa até que não é muito dificil, mas tem alguns conceitos de programação, pelo menos em C/C++, que eu acho interessante passar pra você.
Mas podemos ver isso por email e depois postar o resultado aqui, se você quiser é claro.
Abs
CONVERSOR DE BINÁRIO PARA DECIMAL
em C, C++
Postado
Parabens pra você RoccoC/C++.