Fonte: invasao.com
Texto de mkswd
Vamos lá
Pessoal,
Aqui vai um 'mini-curso' sobre C/C++. Para todos que ainda não sabem programar. Ele estará dividas em aulas: estrutura seqüencial, condicional, repetição, etc... Não irei abordar os princípios da lógica de programação porque já existe um tópico sobre isto. Espero que gostem.
.:Conceitos Básicos:.
Idea Compilador
Programa que compila nosso programa. Sugiro Bloodshed Dev C++
Idea Conceito de Variável
Variavel é um número não determinado. Exemplo: x+5=10. No exemplo usamos a variavel x porque não sabemos o número, mas podemos calculá-lo.
Idea Tipos de dados
Numérico: Podem ser fracionários(float) ou inteiros(int)
Lógico: Do tipo booleano(or, and, not)
Literal: Podem ser caracteres(char) ou texto(strings)
Ps.: A linguagem C/C++ é case sensitive, ou seja, CASA é diferente de casa. Usamos sempre ;(ponto e vírgula) depois de cada argumento.
.:Aula 1 - Estrutura Sequencial em C/C++:.
Estruturas seqüencias são estruturas que seguem uma seqüencia. Ex.: 1. Leia 2. Calcule 3. Escreva
Idea Bibliotecas
Bibliotecas são arquivos que contém várias funções para sermos usadas. As chamamos no começo do programa através da diretiva #include. Usaremos muitas a stdio.h que contem funções de entrada e saida e conio.h para manipulação. Ex.: #include
Idea Declaração de variaveis
As variáveis são declaradas após a especificação de seus tipos. Tipos: int, float, boolean e strings. Cada tipo tem o seu tamanho, que podem variar com o processador ou compilador.Ex.: int soma;
Idea Comando de atribuição
É utilizado para atribuir valores ou operações a variáveis, representado por = (sinal de igualdade).Ex.: x = 2+4;
Idea Comandos de Entrada
É utilizado para receber os dados que foram digitados pelo usuário. Os dados recebidos são armazenados em variáveis. Em C/C++ usamos os comandos scanf, gets e cin. Em nossos exemplos usaremos o scanf. Ex.: scanf("%d", &dados); Isso significa. Computado, leia(scanf) a variavel do tipo inteiro(%d) e coloque-a no endereço(&) da variavel dados.
Idea Comando de Saída
Utilizado para mostrar dados na tela ou impressora. Comando: cout e printf. Usaremos o printf. Exemplo.: printf("O valor da soma: %d", soma); Significa: Computador, escreva(printf) "o valor da soma é" e mostre o valor que é inteiro(%d) da variával soma .
Idea Comentários
Textos que podem ser inserido que o usuário não irá ver, somente nós. Comandos: /* texto */ ou // texto.
Idea Operadores e funções pré definidas
São destinadas a cálculos e manipulação de caracteres. Só irei colocar os básicos. Alguns:
Idea Operador de Atribuição
Operador Ex.
= x =y
Idea Operadores Matemáticos
operador Comentário
+, -,*,/ Para somar, subtrair, multiplicar e dividir
Outros: %,++,--,+=, -=,*=,/=,%=,==,!=,<,>,<=,>=, etc...
Exemplo de um programa para ler 2 numeros, soma-los e mostrar(Usando os conhecimentos da aula)
#include //Blioteca com funções de entrada e saida
#include //Biblioteca que contem o getch()
main(){ //Abre o nosso programa
int a, b, soma; //Declaração
printf("Digite a: ");//Saida
scanf("%d", &a); //Entrada
printf("Digite b: ");
scanf("%d", &b);
soma = a+b; //Atribuição
printf("A soma é %d", soma);
getch(); //Faz o programa esperar uma tecla ser prescionada
}
Pessoal,
Aqui vai a próxima aula: estrutura Condicional
.:Aula 2 - Estrutura Condicional:.
Uma condição é uma comparação que possui dois estados: verdeiro ou falso.
Estrutura COndicional Simples
Adicionado uma estrura de condição, o comando só será executado se a condição foi verdadeira.
Exemplo: if condição
comando;
Lembrando que, se houver mais de um comando, há necessidade de {}(Conceito de Blocos de comandos*).
Exemplo: if condição {
comando1;
comando2;
}
Estrutura Condicional Composta
Utilizando o conceito acima. Se a condição foi verdadeira, executa o comando 1, se falsa, executa o comando 2.
Exemplo: if condição
comando1;
else
comando2;
Entendendo: se condiçao verdadeira, comando1, senão, comando2.
Estrutura CASE
Em alguns programas há necessidade de exclusividade de comandos, ou seja, se um comando for executado, os demais não serão. Usamos uma estrutura mais seletiva chama CASE.
switch(seletor) //Para definir a variavel
case opcao1: //'Caso opcao1 faça..rs
comando1;
break; //Para para e não executar os outros
case opcao2:
comando2
break;
default:
cin >> "Opcao Invalida" //Caso nenhum for usado
Entendendo: Se o seletor for igual a opção 1 somente o comando 1 será executado. Se o seletor for igual a opção 2, somente o comando 2 será executado. Se nenhum deles ou uma outra opção for digitada, escreverá na tela Opação Invalida.
Exemplo de programa com a aula de hoje: Programa para verificar se A é maior ou menor que B.
#include
#include
main() {
int a, b;
a=2;
b=4;
if(a>b)
printf("A é maior que B");
else
printf("A é menor que B");
getch();
}
Pessoal,
Aqui vai a 3ª aula. Estrutura de Repetição
.:Aula 3 - Estrutura de Repetição:.
Estrutura de Repetição for
Utilizada quando se sabe o número de vezes que o trecho do programa irá ser repetido.
for(i=valor inicial; condição; adição ou subtração de i)
Exemplo:
for(i=0; i<=5; i++)
comando;
Entendendo: A 1 parte atribui um valor a i. A 2 determinará o final da repetição. E 3 irá alterar o valor de i. Assim nosso programa ira repetir 6 vezes, pois começa do 0 e vai até 5 aumentando de um em um(i++)
Estrutura de Repetição while
Usado quando o número de repetição não é fixo. Os comandos serão repetidos até a condição assumir valor falso. Exemplo:
while(condição){
comando1;
comando2;
}
Estrutura de Repetição do-while
A mesma coisa que o while, so que agora o teste de condição acontecerá no fim. Exemplo:
do {
comando1;
comando2;
}while(condição);
Exemplo de um programa com estruta de repetição: Programa para somar o intervalo de 1 a 100.
#include
#include
main() {
int i, soma;
soma=0;
for (i=1; i<=100; i++)
soma+=i;
}
.:Aula 4 - Vetores:.
Um vetor são variáveis compostas homogêneas unidimencionalmente. NOssa, o que é isso?!?Analogamente seria uma string que contém mais de um valor. Por exemplo: Um vetor de tamanho 5, possui 5 posições dentro dele. Visualização:
----------------------
Vetor[5] | 2 | 4 | 7 | 3 | 9 |
----------------------
Posição 0 1 2 3 4
Declarando um vetor
O número de posições fica entre colchetes. Declaramos com uma variavel comum, podendo ser int, char..etc
Ex.:
int vet[5];
char vetor[32];
P.S. "OLA" é um vetor d tipo char com 3 posições: vet[3]={"O", "L", "A"};
Atribuindo valores
Quando atribuimos um valor ao vetor, o número de posições entre os colchetes vira agora endereço. Por exemplo: tenho um vetor de 5 posições(Lembrando que começa do 0 ficando assim: 0, 1, 2, 3, 4) e quero atribuir o valor 1 á 4 posição: vet[3]=1;
Para texto:
strcpy(vetor,"Markos");
Carregando um vetor
for (i=0; i<=4; i++)
cin >> vetor;
Imprimindo um vetor na tela
for (i=0; i<=4; i++)
cout << vetor;
.: Aula 5 - Matrizes:.
É um conjunto de variavés de mesmo tipo e identificação pelo mesmo nome. Acho todo mundo viu matriz na escola, não? Se divide pelo número de linhas e colunas, entre colchetes. matriz[linha][coluna]
Exemplo:
m[3][3];
0 1 2
----------
| | | | 0
----------
| | | | 1
----------
| | | | 2
----------
Declarando uma matriz
Ex.:
int m[2][3]; números inteiros
float x[4][2]; números fracionários
char y[4][4]; caracteres
Atribuindo valores
Lembrando que, assim como em vetor, o qe antes erá dimensão([l][c]) agora vira endereço.
Ex.: Atrui o valor 5 referente à linha 1 coluna 4
x[1][4]=5;
Carregando uma matriz
Ex.: Matriz 3 por 3
for (i=0; i<=2; i++) { //percorre a linha
for (j=-0; j<-3; j++) //percorre a coluna
cin >> matriz[j];
}
Imprimindo uma matriz na tela
for (i=0; i<=2; i++) {
for (j=-0; j<-3; j++)
cout << matriz[j];
}
.: Aula 6 - Principais funções de tratamento de caracteres em C/C++:.
Tratar de textos(string!) com C/C++ é delicado, pois não possuimos um tipo de dado para isso. Assim, utilizamos vetores do tipo char. È importante saber que a linguagem C/C++ só reconhece o fim de uma cadeia de caracteres(texto!) por meio do '\0' (barra zero). Mas não se preocupe, o próprio compilador faz isso, você só tem que declarar uma posição a mais. Exemplo: um vetor com a palavra OLA, tem que ser assim: vetor[4];
------------
|O|L|A|\0|
------------
.0 1 2 3
Idea Manipulando cadeias de caracteres
*para utilizar as funções que irei apresentar agora, teremos que declarar a biblioteca string.h
strcat(str1, str2)
Concatena(junta) str2 à str1
strchr(str1, ch)
Retorna um ponteiro(irei explicar isso mais para frente) para a posição da cadeia str1, onde o caractere ch é encontrado pela 1º vez.
strcpy(str1, str2)
Copia str2 para a cadeia str1
strcmp(str1, str2)
Compara as duas e, volta o valor 0 se iguais, menor que zero se str1 é alfabeticamente menor que str2, e maior que zero se str1 for maior.
strlen(str)
Obtem o tamanho de str1
strstr(str1, str2)
Retorna um ponteiro para a posição de str1 onde str2 é encotrada pela 1º vez.
Idea Inicializando cadeias de caracteres
1.na declaração
char nome[]={'M', 'a', 'r', 'k', 'o', 's', '\0'};
2.na atribuição
char vet[4];
strcpy(vet, "Ola");
3.pelo teclado
char vet[8];
gets(vet);
Obs.: Utilizei o gets() que pega string, porque se colocase cin >>, no primeiro espaço nossa cadeira seria terminada.
.: Aula 7 - Registros:.
Registros são variáveis compostas heterogêneamente. Pode agregar diferentes informações. Pode ser definida também como uma coleção de campos, onde cada um pode ser de tipo de dado diferente.
Idea Declaração de registros
É utilizado a sintaxe struct.Exemplo:
struct dados {
char id;
int passwd;
}
Assim definimos que nosso registro dados pode armazenar um id e um passwd(campos da estrutura!).
Idea Declaração de variáveis do tipo registro
Quando queremos declarar uma variável do tipo inteiro, usamos int var. Como vamos declarar do tipo da nossa estrutura(Exemplo acima) irá ficar assim:
dados var;
dados vetor[3];
dados matriz[4][5];
P.S.: Quando mechemos com vetores e matrizes em registro quer dizer que: vetor - cada posição irá conter um id e um passwd; matriz - cada célula irá conter um id e um passwd.
Idea Acesso a membros de estrutura
Bom, depois de declará=los iremos manipular. Para manipular precisamos dizer a qual campo se refere. Vou usar exemplos. Estarei utilizando a estrtura dados lá de cima.
vou definir um id 'm' e passwd 3:
dados var;
var.id='m';
var.passwd=3;(obs: quando mexemos com caracteres usamos '', com texto "")
inserir a senha 1234 na 3º posição(lembre que começa da posição 0) do vetor:
dados vetor[5];
vetor[2].passwd=1234;
Pessoal,
A aula que irá vir agora é sobre arquivos. Como o assunto é extenso, irei dividir a aula em 8 em partes.
.: Aula 8 Arquivos:.
..::8.1 Conceitos básicos::..
Arquivos são todas as estruturas de dados manipuladas fora do ambiente do programa que estamos trabalhando. Vou utilizar de exemplo: Suponhamos que eu crie um programa que cadastra clientes. Para ler e armazenar usei os conhecimentos da aula passada. Mas eu quero que os clientes sejam gravados no meu computador. Ai eu farei meu programa gravar os clientes cadastrados em um 'arquivo' do tipo .dat
Declaração de arquivos
Um dado arquivo na linguagem de C/C++ pode ser de vários tipos: arquivos em disco, uma impressora, um teclado, afinal, qualquer dispositivo de entrada ou saida. Irei passar agora somente os arquivos em disco. Mas todo o resto é a mesma coisa.
A biblioteca utilizada seá stdlib.h. É nela que está as funções de manipulação de arquivos.
Utilizaremos para declarar a função FILE. Nos nossos estudos utilizaremos ponteiros. O que é isto? Ponteiro irá posicionar-nos dentro da "memória". Exemplo. Meu programa irá gravar somentes 5 clientes. Logo, tenho 5 posições de memoria disponíveis. Començando do 0, logo após de eu inserir o cliente na posição 0 o nosso ponteiro irá nos colocar na posição 1, pois senão eu iria sobescrever a posição 0. Assim também, se eu apagar o registro da posição 1, nosso ponteiro em vez de ir para a posição 2, irá voltar para 1.
Para de declarar colocamos a função FILE e antes da variavel *(asterisco).
Vamos declarar um ponteiro que mais tarde irá receber as funções do nosso arquivo.
FILE *variavel;
No próxima aula irei passar os comando.
Abraços,
Arrow
.: Aula 8 - Arquivos:.
.::8.2 Comando Parte 1::..
fopen()
Abre um arquivo, retornando o ponteiro associado a esse arquivo.Sintaxe:
FILE *fopen(nome_arquivo, mode_de abertura);
Onde: nome do arquivo(sem comentários)
e modo de abertura é como ele vai ser aberto(as opções estão embaixo).
r = arquivo texto. Somente leitura.
w = arquivo texto. Somente escrita.
a = anexa dados a arquivo de texto.
rb = arquivo binário. Só Leitura.
wb = arquivo binário. Só Escrita.
ab = anexa dados a arquivo binário.
r+ = arquivo texto. Leitura e escrita.
w+ = cria um aquivo texto. Leitura e escrita.
Estes são os mais importantes. Existem mais.
fclose()
Fecha um arquivo. Se acontecer um problema na execução poderá ocorrer a perda dos dados e até mesmo do arquivo. Sitaxe:
int fclose(FILE *ponteiro_que_declaramos);
ferror()
Detecta se ocorreu algum erro durante uma operação com arquivos. Retorna um número inteiro: Se diferente de 0, aconteceu um erro, senão, tud certinho. Sintaxe:
int ferror(FILE *ponteiro_que_declaramos);
fputc()
Escreve um caracter no arquivo.Sintaxe:
int fputc(char seu_caracter, FILE *ponteiro_que_declaramos);
fgetc()
lê um carctere em um arquivo. Sintaxe:
int fgetc(FILE *ponteiro_que_declaramos);
.: Aula 8 - Arquivos:.
.::8.3 Comandos Parte 2::..
A respeito das funções fputc() e fgetc() da aula anterior: Se a execução der certo retornará o valor do caractere, senão voltará EOF.
fputs()
Escreve uma cadeia de caracteres(vetor) em um arquivo. Sintaxe:
char *fputs(char *vetor, FILE *ponteiro_que_declaramos);
fgets()
Lê uma cadeia de caracteres(vetor) em um arquivos. Sintaxe:
char *fgets(char *vetor,int tamanha_do_vetor, FILE *ponteiro_que_declaramos);
fwrite()
Pode escrever QUALQUER tipo de dado no arquivo. Sintaxe:
size_t fwrite(void *variavel, size_t qnt_de_bytes_dos_dados, size_t nº_espaço_memória, FILE *ponteiro_que_declaramos);
fread()
LÊ QUALQUER tipo de dado no arquivo. Se a execução der certo voltará o valor igual ao nº_espaço_memória, senão, menor.Sintaxe:
size_t fread(void *variavel, size_t qnt_de_bytes_dos_dados, size_t nº_espaço_memória, FILE *ponteiro_que_declaramos);
Bônus: Aqui o código fonte em C/C++ de um pequeno prompt de DOS.
Desafio: Termine ele e deixe igual ao prompt do DOS do windows
#include
#include
#include
main() {
char comando[10], op;
printf("\t\t Prompt de Comandos para RUINDOWS\n\n");
printf("\t\t by mkswd")
do {
printf("\n$ ");
gets(comando);
system(comando);
}while(true);
}
Pessoal,
O zeaquinense me fez uma pergunta sobre Método de Pesquisa Sequencial e Método de ordenação Bolha. Achei muito interessante a pergunta e vou postar aqui a resposta.
Método da bolha
Este método consiste em você fazer o computador perguntar ao vetor se o número que está na posição da frente é menor que na posição que se encontra, se for ele pega o número da frente e passa para a posição que se encontra e joga o que se encontra na posição que estamos para a posição da frente. Embaralhou?!? rsrs Vamos ao exemplo que fica mais fácil:
vetor[]={'1','3','2'}
O computador vai chegar na posição do 1 e vai perguntar se o 3 é menor, como não é ele passa para o próximo. Agora ele pergunta se o 2 é menor que 3, como e verdadeiro ele faz o seguinte:
Ele pega o valor 2 e joga em uma variável auxiliar, depois pega o 3 e coloca no lugar do 2 e por último pega a variável auxiliar e colocar no lugar do 3.
Ficando assim:
int vetor[]={'1','3','2'};
int aux, i;
for(i=0; i<=1; i++)
if (vetor>vetor[i+1]) {
aux=vetor;
vetor=vetor[i+1];
vetor[i+1]=aux;
}
Isso como método simples, quando o vetor é maior há a necessidade de dois for().
Método de Pesquisa Sequencial
Nada mais é do que você procurar no "endereço" do seu vetor ou matriz o caracter ou a cadeia de caracteres utilizando um for() para percorrer e if() para testar se existe. Ficando assim:
int vetor[]={'1','3','2'};
int i, num;
printf("digite o numero para procurar");
scanf("%d", )
for(i=0; i<=2; i++)
if (vetor==num) {
printf("Número encontrado");
getch();
exit(0);
}
printf("Número não encontrado");
.: Aula 8 - Arquivos :.
.::8.4 Comandos Ultima Parte::..
fseek()
Posiciona o ponteiro em um endereço específico para leitura e escrita aleatória. Sintaxe:
int fseek(FILE *ponteiro_que_declaramos, long qnt_de_bytes_dos_dados, int posição);
Onde a posição indica ond começar a busca ou atribuir os 3 valores:
SEEK_SET = movimenta o qnt_de_bytes_dos_dados a partir inicial do arquivos
SEEK_CUR = movimenta o qnt_de_bytes_dos_dados a partir atual do arquivos
SEEK_END = movimenta o qnt_de_bytes_dos_dados a partir final do arquivos
feof()
Determina se o final do arquivo foi encontrado retornando um número inteiro igual a zero se o fim não foi encontrado e outro valor se encontrado. Sintaxe:
feof(ponteiro_que_declaramos);
rewind()
Coloca o ponteiro no inicio do arquivo. Sintaxe:
void rewind(File *ponteiro_que_declaramos);
remove()
Adivinhem? Apaga um arquivo. Sintaxe:
int remove(char *nome_do_arquivo);
fflush()
Escreve o conteudo armazenado no buffer no arquivo. Sintaxe:
inf fflush(FILE *ponteiro_que_declaramos);
.: Aula 9 - Sub-Rotinas:.
Também chamados de subprogramas, são codigos que podem ser carregado várias vezes. Uma meneira fácil de explicar é usando um exemplo. Vou contruir um programa que possue uma interface gráfica. Toda hora que limpo a tela, eu preciso digitar a GUI toda de novo. Para me poupar trabalho, eu simplesmente faço um subprograma que faz a GUI, e toda fez que preciso "desenha-la" eu só chamo a meu subprograma dentro dele. Os subprogramas são de dois tipos: procedimentos e funções. Um procedimento é um subprograma que não retorna um valor para nós, ou seja, ele não gera nenhum valor. O exemplo acima é um procedimento, pois não nos retorna nenhum valor. Uma função já nos retorna um valor. Com uma funçao geralmente usamos parâmetros. Parâmetro é quando nós(ou o usuário!) informamos um determinado valor que será usado em nossa função.
Idea Procedimento
Como havia comentado acima, procedimento é uma rotina criada separadamente do nosso programa principal(main) que não nos retorna um valor. Para utilizarmos um procedimento há duas maneiras: ou podemos criá-la no inicio, ou podemos colocar no final (eu faço assim, pois deixa meu programa mais organizado!), mas para colocá-lo no final precisamos colocar o protótipo antes para sabermos que ele existe. Utilizamos o comando void para indicar um procedimento. Exemplo:
No inicio:
#include
void procedimento() {
instrucao1;
instrucao2;
}
main() {
instrucao1;
procedimento();
instrucao2;
}
No final:
#include
void procedimento(); // Protótipo
main() {
instrucao1;
procedimento();
instrucao2;
}
void procedimento() {
instrucao1;
instrucao2;
}
Pessoal,
Esta será a nossa última aula sobre C/C++. Logo após irei postar alguns aprofundamentos e códigos-fontes para estudos. Lembrando que o objetivo destas aulas não era explicar tudo sobre C/C++, mas apenas dar um gostinho para alimentar a curiosidade sobre o assunto, também porque dar uma explicação inteira via texto, geraria um texto muito grande e cansativo. Conto com o apoio de vocês com as aulas de PASCAL (Nosso próximo módulo).
Abraços,
Arrow
.: Continuação - aula 9 - Sub-rotinas :.
Funções
Geralemente, na nossa sub-rotina, não só precisamos de seguir algumas instruções como também precisamos retornar alguns valores. Como na aula seguinte, os procediemtos não retornam valores, para usarmos uma sub-rotina que retorna um valor usaremos uma funçao. Para matar dois coelhos com uma cajadada só irei explicar a funçao usando parâmetros. Lembrando que podemos passar parâmetros em procedimentos também, desde que não retornem valores. Mas o que é passar um parâmetro? Quando temos um programa que usa uma sub-rotina para fazer uma cálculo (como calcular idade, por exemplo!), precisamos passar os valores para ele usar no cálculo. Desse modo, passamos os valores por parâmetro. Para "retornarmos" o valor usamos a sintaxe return. E para se declarar a função usamos o tipo que trabalhamos com ele. Por exemplo, se faremos cálculos com inteiros, nossa funçaõ será inteira. Se calcularemos números quebradosm então nossa função será do tipo float. Exemplo de função:
#include
int soma(int, int); //protótipo
main() {
int a, b, resultado;
printf("Entre com o valor de a: ");
scanf("%d", &a);
printf("Entre com o valor de b: ");
scanf("%d", &b);
resultado = soma(a, b); //passando os parâmetros
printf("O resultado é: %d", resultado);
getch();
}
int soma (int a, int b) {
int r;
r = a + b;
return r;
}
Vamos entender:
No prótipo eu coloque com que tipo eu irei trabalhar e quantidade "(int, int)" Como irei trabalhar com dois, coloquei dois int. Na minha função eu declarei as variaveis "(int a, int b)" e chamei-as de a e b, mas não precisam ser as mesmas do main, poderia dar outros nomes. Declarei um variavel r para receber a soma e mandei retornar o valor dessa variável.
Pessoal,
Agora irei postar alguns macetes. Um consideração: irei postar todos como procedimento. Assim, além de ficar mais fácil, você pode copiar e colocar em qualquer um dos seus programa e é só chama-lo no programa principal(main!).
Lembrando que, você deve colocar o protótipo em cima.
Exemplo: Macete da cor
cor();
main() {
nonono;
nono;
cor();
}
cor() {
nono;
}
Aqui vão os macetes...
1. Para posicionar o cursor na tela
void gotoxy(int x, int y)
{
COORD c;
c.X = x - 1;
c.Y = y - 1;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
VOcê terá que passar como parâmetro a posiçao: x,y
2.Para limpar a tela (È o cls do DOS)
void clrscr ()
{
DWORD written;
COORD c = {0, 0};
WORD cor;
cor = TColor + (BColor << 4);
FillConsoleOutputAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
cor, 2000, c, &written);
FillConsoleOutputCharacter (GetStdHandle(STD_OUTPUT_HANDLE), ' ',
2000, c, &written);
gotoxy (1, 1);
}
3. Aqui vai dois: um para desativar o cursor e outro para ativar
void cursor_off ()
{
CONSOLE_CURSOR_INFO Info;
Info.bVisible = FALSE;
Info.dwSize = 1;
SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &Info);
}
void cursor_on ()
{
CONSOLE_CURSOR_INFO Info;
Info.bVisible = TRUE;
Info.dwSize = 25;
SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &Info);
}
4. Este é para mudar a cor da letra e do background
typedef enum
{
BLACK,
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY,
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
} COLORS;
WORD TColor = LIGHTGRAY;
WORD BColor = BLACK;
void textcolor (int color)
{
WORD cor;
TColor = color;
cor = color + (BColor << 4);
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), cor);
}
void textbackground (int color)
{
WORD cor;
BColor = color;
cor = TColor + (color << 4);
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), cor);
}
Pessoal, como eu escrevo isso no trabalho, faço correndo se tiver algum erro me avisem para eu corrigir. E se precisar que eu explique o que cada comando que eu usei em qualquer um dos procedimentos é só falar.
Abraços
Pessoal aqui vai o código fonte de um joguinho da cobra em c.
Olha: lembra das dicas que eu passei? Então eu coloquei elas dentro de um cabeçalho(Crie um biblioteca .h!) com elas dentro chamada funçoes.h vocês irão perceber. Basta apenas pegar as dicas colocar e salvar como funçoes.h
Abraços,
#include
#include
#include
#include
#include "funcoes.h"
#define CODCORPO 178
#define CODBORDA 219
struct scobra {
short col, lin;
};
struct salimento {
short col, lin, valor;
};
struct srecorde {
char nome[11];
short pontos;
};
FILE *parq;
short tamcobra;
//Protótipos dos procedimentos e funções
void desenha_borda();
void espera(short tempo);
void gera_alimento(salimento *al);
void escreve_alimento(salimento al);
void desenha_cobra(scobra cobra[]);
bool colidiu(scobra cobra[]);
void fim_jogo(short pontos);
main() {
short aumento, i, pontos, tespera, smcol, smlin;
char tc;
bool turbo;
scobra c[500];
salimento alim;
srecorde r;
//Verifica se o arquivo de recordes existe antes de criá-lo
parq = fopen("rec.dat", "rb");
if (parq == NULL) {
parq = fopen("rec.dat", "wb");
r.pontos = 0;
strcpy(r.nome, "nononono");
fwrite(&r, sizeof(r), 1, parq); //escreve o recorde no arquivo
}
fclose(parq);
SetCursorPos(1, 1);
srand(time(NULL));
cursor_off();
do {
c[0].col = 20;
c[0].lin = 12;
c[1].col = 19;
c[1].lin = 12;
tamcobra = 1;
aumento = 0;
smcol = 1;
smlin = 0;
pontos = 0;
tespera = 100;
turbo = false;
clrscr();
textcolor(WHITE);
gotoxy(24, 11);
printf("Controles: SETAS | Sair: ESC");
gotoxy(21, 13);
printf("Pressione ENTER para iniciar o jogo...");
do {
tc = getch();
if (tc == 27)
exit(0);
} while (tc != 13);
clrscr();
desenha_borda();
gera_alimento(&alim);
textcolor(WHITE);
gotoxy(3, 25);
printf("Pontos: 0");
parq = fopen("rec.dat", "rb"); //abre o arquivo para leitura
fread(&r, sizeof(r), 1, parq); //lê o nome e os pontos do recordista
fclose(parq);
gotoxy(55, 25);
printf("Recorde: %d [%s]", r.pontos, r.nome);
while (tc != 27) {
if (turbo) //Verifica se está em alta velocidade
espera(20);
else
espera(tespera);
escreve_alimento(alim);
desenha_cobra(c);
if (kbhit()) { //Verifica se uma tecla foi pressionada
tc = getch();
if (tc == -32)
tc = getch();
switch (tc) {
case 72: //Seta para cima
smcol = 0;
smlin = -1;
break;
case 80: //Seta para baixo
smcol = 0;
smlin = 1;
break;
case 75: //Seta para esquerda
smcol = -1;
smlin = 0;
break;
case 77: //Seta para direita
smcol = 1;
smlin = 0;
break;
case 32: //Espaço para ligar/desligar o turbo
turbo = !turbo;
} //fim switch
} //fim if
//Verifica colisão
if (colidiu(c)) { //Se a função colidiu retornar true o jogo terminou
fim_jogo(pontos);
break;
}
//Verifica se a cobra pegou um número (alimento)
if (c[0].col == alim.col && c[0].lin == alim.lin) {
pontos += alim.valor;
textcolor(WHITE);
gotoxy(3, 25);
printf("Pontos: %d", pontos);
for (i = 400; i < 550; i+=15)
Beep(i, 1);
aumento += alim.valor;
tespera -= 2;
gera_alimento(&alim);
}
//Aumenta o tamanho da cobra
if (aumento > 0) {
tamcobra++;
aumento--;
}
//Movimenta as partes da cobra
for (i = tamcobra; i >= 1; i--)
c = c[i - 1];
c[0].col = c[0].col + smcol;
c[0].lin = c[0].lin + smlin;
//Verifica se está passando por uma das 4 passagens laterais
if (c[0].col == 81 && c[0].lin == 12)
c[0].col = 1;
else if (c[0].col == 0 && c[0].lin == 12)
c[0].col = 80;
else if (c[0].lin == 0 && c[0].col == 40)
c[0].lin = 24;
else if (c[0].lin == 25 && c[0].col == 40)
c[0].lin = 1;
} //fim while
} while (true);
}
//
// Desenha as bordas da área de movimento da cobra
//
void desenha_borda() {
int i;
textcolor(LIGHTRED);
for (i = 1; i <= 80; i++) {
gotoxy(i, 1);
printf("%c", CODBORDA);
gotoxy(i, 24);
printf("%c", CODBORDA);
}
for (i = 1; i <= 24; i++) {
gotoxy(1, i);
printf("%c", CODBORDA);
gotoxy(80, i);
printf("%c", CODBORDA);
}
gotoxy(1, 12);
printf(" ");
gotoxy(80, 12);
printf(" ");
gotoxy(40, 1);
printf(" ");
gotoxy(40, 24);
printf(" ");
}
//
//Paralisa o programa por um determinado tempo (milesegundos)
//
void espera(short tempo) {
long t;
t = clock();
while (clock() <= t + tempo);
}
//
//Procedimento para gerar o alimento
//
void gera_alimento(salimento *al) {
al->col = rand() % 78 + 2;
al->lin = rand() % 22 + 2;
al->valor = rand() % 9 + 1;
}
//
//Verifica se a cobra colidiu com as bordas ou contra o próprio corpo
//Retorna: false (não colidiu) ou true (colidiu)
//
bool colidiu(scobra cobra[]) {
int i;
bool R = false;
//Verifica se colidiu com as bordas
if (((cobra[0].col < 2 || cobra[0].col > 79) && cobra[0].lin != 12) ||
((cobra[0].lin < 2 || cobra[0].lin > 23) && cobra[0].col != 40)) {
R = true;
} else //Verifica se colidiu com o próprio corpo
for (i = 1; i <= tamcobra - 1; i++)
if (cobra[0].col == cobra.col && cobra[0].lin == cobra.lin) {
R = true;
break;
}
return R;
}
void escreve_alimento(salimento al) {
textcolor(LIGHTCYAN);
gotoxy(al.col, al.lin);
printf("%d", al.valor);
}
//
//Desenha a cobra na tela
//
void desenha_cobra(scobra cobra[]) {
int i;
//Escreve o corpo da cobra
textcolor(LIGHTGREEN);
for (i = 1; i <= tamcobra - 1; i++) {
gotoxy(cobra.col, cobra.lin);
printf("%c", CODCORPO);
}
//Escreve a cabeça separadamente
textcolor(YELLOW);
gotoxy(cobra[0].col, cobra[0].lin);
printf("%c", CODCORPO);
//Escreve o espaço vazio no final para apagar o rastro
gotoxy(cobra[tamcobra].col, cobra[tamcobra].lin);
printf(" ");
}
//
//Escreve a msg de fim de jogo e grava o recorde
//
void fim_jogo(short pontos) {
srecorde r;
int i;
textcolor(WHITE);
gotoxy(35, 12);
printf("FIM DE JOGO");
for (i = 5000; i > 50; i-=25)
Beep(i, 1);
gotoxy(28, 13);
printf("Pressione qualquer tecla...");
getch();
parq = fopen("rec.dat", "rb"); //abre o arquivo para leitura
fread(&r, sizeof(r), 1, parq);
fclose(parq);
if (pontos > r.pontos) {
cursor_on();
do {
clrscr();
printf("Novo recorde!!!\n\n");
printf("Digite seu Nome (10 letras): ");
gets(r.nome);
} while (strlen(r.nome) > 10);
r.pontos = pontos;
parq = fopen("rec.dat", "wb"); //abre o arquivo para escrita
fwrite(&r, sizeof(r), 1, parq);
fclose(parq);
cursor_off();
}
}
Bom material... Mas, na minha opinião, não havia necessidade de tantos posts... Isso deveria ser feito apenas se a quantidade máxima de caracteres do post fosse excedida!!!
msm assim, bons post's*
Quote from: "DarkSpawn"Bom material... Mas, na minha opinião, não havia necessidade de tantos posts... Isso deveria ser feito apenas se a quantidade máxima de caracteres do post fosse excedida!!! 
é por que as aulas o mkswd foi mi passando de pouco em pouco e não tdo de uma vez ai fui juntando os txt's e fui colocano kda txt em um.. pra não cortar aulas no meio etc..
Puts pessoal mi desculpem..
http://www.darkers.com.br/smf/index.php ... 421.0.html (http://www.darkers.com.br/smf/index.php/topic,2421.0.html)
não tinha visto que o Deamon Cheat já tinha começado a postar as aulas..
foi mal ae Deamon
se algum modera ou adm puder excluir o dele pq o meu eu já coloquei todas as aulas..