Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
O C nasceu na dcada de 70. Seu inventor, Dennis Ritchie, implementou-o pela primeira vez
usando um DEC PDP-11 rodando o sistema operacional UNIX. O C derivado de uma outra
linguagem: o B, criado por Ken Thompson. O B, por sua vez, veio da linguagem BCPL, inventada
por Martin Richards. O ANSI C o C padronizado pela ANSI.
Obs: Hoje sistemas de 64bits tem 4bytes para int ou float, diferem apenas na preciso.
1
Barras: \n nova linha ... \0 nulo ... \t tab. ... \a beep etc ...
Operadores Relacionais :
Sada: 0 = falso ; 1 = verdadeiro
> Maior,
>= Maior ou igual
< Menor
<= Menor ou igual,
== igual (nota q 1 = atribuio)
! = Diferente
Operadores Lgicos:
Bibliotecas de Cabealho:
2
Exemplo bsico de entrada e sada de dados (I/O) :
#include <stdio.h>
#include <conio.h> /* Este programa usa conio.h e no funciona no Unix */
int main ()
{
char letra;
letra=getch(); // No Unix usar: scanf("%c", & letra). Desvantagem; tem q pressionar <ENTER>
printf ("Voce pressionou a tecla %c",letra);
}
Condio:
if (condio) {
}
else {
}
switch (op) { // repete blocos (case) conforme opo (op tem q ser char ou int)
case 1:
####
break; // quebra loop
case 2:
####
break;
default:
####
}
Repetio:
for (cont=0; cont < 20; cont ++) { // ( incio ; condio ; incremento )
}
goto use apenas em ltimo caso Ex.: REFAZ: ###; goto REFAZ;
3
Vetores: So variveis compostas homogneas unidimensionais (seu nome seu end) . Ex:
for (i=0; i<5; i++){ printf ("Digite um valor:"); scanf ("%d", &valores[i]); }
# include <stdio.h>
main()
{
int L,C,matriz[2][3];
for (L=0;L<2;L++){
for (C=0;C<3;C++){
printf ("Digite um valor:");
scanf ("%d",& matriz[L][C]);}}
for (L=0;L<2;L++){
for (C=0;C<3;C++){
printf ("%d ", matriz[L][C]);}printf ("\n");}
}
# include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
char string[100];
printf ("\nDigite um nome completo: ");
scanf ("%s", string);
printf ("\nImprimindo com scanf ==> %s ",string);
__fpurge(stdin); // LIMPAR O BUFFER; para windows use: fflush(stdin);
printf ("\n\nDigite outro nome completo: ");
fgets (string,100,stdin); // simplesmente: gets (string); para windows
printf ("\nImprimindo com fgets ==> %s",string); }
Obs.: scanf no admite espaos ; gets e fgets admitem espaos e fazem a contagem at \0
Principais funes de manipulao definidas em string.h
Biblioteca string.h
4
Struct : So variveis compostas heterogneas (com : int, char, float... e outra struct).
Struct aluno {
char nome [30];
int idade;
};
struct aluno dados; //ou diretamente: struct aluno dados = {Fulano,38};
OBS: So pode atribuir dados1 = dados se for estrutura igual, isto : struct aluno
# include <stdio.h>
# include <stdlib.h>
# define MAX 2 // vetor com MAX campos
main() {
struct aluno dado[MAX]; // declarando varivel dado[MAX] do TIPO struct aluno
int i;
for (i=0;i<MAX;i++){
fflush(stdin);
printf ("\nDigite o nome do aluno %d : ", i+1);
gets (dado[i].nome);
printf ("\nDigite a idade do aluno %d : ", i+1);
scanf ("%d", & dado[i].idade); }
printf ("\n\nLISTA DE ALUNOS\n\n");
for (i=0;i<MAX;i++){
printf ("%s : %d anos\n", dado[i].nome,dado[i].idade); }
printf ("\n");
system ("pause");
return 0; }
typedef: Define apelidos aos tipos (struct, int, char, float, etc). Ex
enum: Lista de identificadores q transformam quaquer coisa pra ser atribuido Ex.
Ex.:
# include <stdio.h>
enum escapes {retrocesso='\b',tabulacao='\t',novalinha='\n'};
main(){
enum escapes e = novalinha;
printf ("Everton%cMendes%cMessias%c",e,e,e);
system ("pause");return 0;}
5
Funes: tipo nome (parametros) { conj de declaraes e comandos }
Pode-se declarar antes ou depois do main() utilizando prottipos antes.
Pode-se passar parametros ou no: () ou (void).
Recurso: Uma funco dentro da outra, como o printf dentro do main() ...
Ex1: // funo recursiva (empilhar chamadas e desempilhar resultados) pausa uma e exec outra
# include <stdio.h>
int fatorial (int n) {
if (n == 0)return 1;
else return n*fatorial(n-1);}
main(){
int numero,resposta;
printf ("\nDigite um numero: ");
scanf ("%d", & numero);
resposta=fatorial(numero);
printf ("\nA resposta eh: %d: \n\n",resposta);
system ("pause");return 0;}
Ex4: // passagem de vetores == scanf sem & (como na string pois o nome do vetor o end dele)
#include <stdio.h>
void imprime (int *v, int tamanho) { // tem q indicar o tamanho do vetor
int i;
for (i=0;i<tamanho;i++)
printf ("%d \n",v[i]);} // nao precisa do * pois o vetor ja ponteiro
int main () {
int v[5] = {1,2,3,4,5};
imprime (v,5); // nao precisa do & mas indicar o tamanho do vetor
system ("pause");
return 0;}
//OBS: matriz (int m[L] [C] , int Linhas) // tem q indicar as colunas, as Linhas so passadas = vetor
6
Ex6: // passagem da struct inteira tem q ser por referncia.
#include <stdio.h>
struct ponto{int x,y;};
void atribui (struct ponto *p) { // passada a struct inteira
(*p).x = 10; p->y = 20;} // tem q ser (*p).x ou p->x pois s agora est acessando os campos
int main () {
struct ponto p1;
atribui(&p1); // passa a struct inteira pela variavel
printf ("x = %d ; y = %d\n",p1.x,p1.y);
system ("pause");
return 0;}
Inicializando
int *p = NULL; // ponteiro vazio
int *p; // ponteiro para int
char *pc; // ponteiro para char
void *g; // ponteiro genrico aponta para qualquer coisa
Ex1: Contedos
#include <stdio.h>
int main() {
int x=10,*p=NULL;
p = &x;
printf ("x = %d\n",x); // 10, o valor em x
printf ("*p = %d\n",*p); // 10 , aponta para o end de x que contem 10
printf ("&x = %d\n",&x); // 2293532, o end de x
printf ("p = %d\n",p); // 2293532, o end de x pois ele recebeu o end de x
printf ("&p = %d\n",&p); } // 2293528 o end do ponteiro ==> 4 bytes menos pois inteiro
Ex2: Operaes (+ ou -)
#include <stdio.h>
main() {
float x = 10 , *p;
p = &x;
printf ("p = %d\n",p); // 2293528
p++; // somou 4bytes, como no inteiros, veja :
printf ("p = %d\n",p); // 2293532
}// hoje, sistemas de 64bits tem 4bytes para int ou float, difere apenas na preciso.
7
Ex4: Ponteiros e vetores.
#include <stdio.h>
main() {
int i, *p, vet[5] = {1,2,3,4,5};
p = vet; // nao precisa colocar & pois o nome do vetor seu end
for (i=0;i<5;i++){
printf ("%d\n", p[i]); // ou
printf ("%d\n", *(p+i));}}
//Obs.: *v = 33; o mesmo que v[0] = 33; *(v+2) = 44; o mesmo que v[2] = 44;
//Obs2.: int *vet[x] um vetor de ponteiros
Ex1.:
# include <stdio.h>
int main() {
int x = sizeof (int);
printf ("x = %d\n",x);} // x = 4bytes
Forma 1: int *v = (int*) malloc (200); - cria um vetor de inteiros de 50 posies pois 200/4=50
Forma 2: int v = (int*) malloc (50 * sizeof(int)); - aqui o sizeof conta os bytes do tipo
Ex3.:
# include <stdio.h>
main() {
char *c = (char*) malloc(50 * sizeof(char)); // 50 * tamanho char = 50bytes
int *i = (int*) malloc(50 * sizeof(int));} // 50 * tamanho int = 200bytes
8
Ex4.:
# include <stdio.h>
# define T 5 // esse valor pode ser pedido em scanf
main() {
int *p , i;
p = (int*) malloc(T * sizeof(int)); // criando um vetor de T posies
if (p==NULL){printf ("ERRO");exit(1);} // se der erro sai fora
for (i=0;i<T;i++){printf ("Digite o num %d : ", i+1); scanf ("%d", &p[i]);} // tratando o vetor
free(p);} // liberando memoriano final
OBS.: O CALLOC tambm aloca colocando zeros nas posies, MALLOC coloca lixo de mem.
int *i = calloc (50,4); 50 posies de 4bytes cada (porque decorei q int 4bytes)
char *c = calloc (30,1); 30 posies de 1byte cada (porque decorei q char 1byte)
ou
int *i = calloc (50,sizeof(int)); sem decorar - 50 posies de 4bytes cada
char *c = calloc (30,sizeof(char)); sem decorar - 30 posies de 1byte cada
Ex5.:
# include <stdio.h>
# define T 5 // esse valor pode ser pedido em scanf
main() {
int i;
int *p = calloc(T,sizeof(int)); // criando um vetor de T posies
if (p==NULL){printf ("ERRO");exit(1);} // se der erro sai fora
for (i=0;i<T;i++){printf ("Digite o num %d : ", i+1); scanf ("%d", &p[i]);} // tratando o vetor
free(p);} // liberando memoriano final
OBS:
int *p = malloc(50*sizeof(int)) == int p = calloc(50,sizeof(int)) == int *p = realloc(null, 50*sizeof(int));
int *p = realloc (p,0) == free (p)
MATRIZES:
Ex.: int **p = malloc (N * sizeof(int*));
for (i=0;i<N;i++) { p[i] = malloc(N * sizeof(int)); // matriz quadrada pois N== C e L
Ex1: teste.c
# include <stdio.h>
main(int argc, char *argv[])
{ printf ("%d - %s\n", argc, argv[1]); }// argv[0] prprio programa ...
No terminal do linux :
> gcc teste.c -o teste // compila
> ./teste everton // executa o programa com o argumento everton
> 2 everton // resultados: argc=2 e argv[1]=everton pois argv[0]=teste
9
Ex. 2:
# include <stdio.h>
main(int argc, char *argv[]){
int mes;
char*nomemes[]={"Janeiro","Fevereiro","Marco","Abril","Maio","Junho","Julho","Agosto","Setembro
","Outubro","Novembro","Dezembro"};
if (argc == 4){ // testa a qdade de parametros esta OK ,, o 1o o proprio programa
mes=atoi(argv[2]); // transforma a string argv em int
if (mes<1 || mes>12){ printf ("Mes invalido");}
else { printf ("\n\n%s de %s de 19%s\n\n", argv[1], nomemes[mes-1],argv[3]);}
}else { printf ("Erro devido a qdade de argumentos"); }}
TESTE > gcc arquivo.c -o programa > ./programa 25 5 76 > 25 de Maio de 1976
FILE *ponteiro;
ponteiro = fopen (nome_do_arquivo, modo)
Ex 1 .:
#include <stdio.h>
int main(){
FILE *ponteiro; // declara um ponteiro do tipo FILE
ponteiro = fopen ("lista_alunos.txt", "wt"); // CRIA um arquivo txt para gravao.
ponteiro = fopen ("lista_alunos.txt", "at"); // Abre um arquivo para gravar no final.
char aluno[]={"Everton RA xxxxxx\n"};
fprintf (ponteiro, "%s", aluno); // escreve a string no ponteiro
fputs (aluno,ponteiro); // escreve a string aluno no ponteiro.
fclose (ponteiro); // fecha}
10