Quem somos e como chegamos até aqui?
Poll
Um pouco de história
O que é um programa de computador
Como um computador processa dados
Arquitetura de uma CPU
Como funciona a memória de um computador
O que são variáveis
Experimento intrigante
import ctypes
bin(ctypes.c_uint32.from_buffer(ctypes.c_float(2.1)).value)
ctypes.c_float.from_buffer(ctypes.c_uint32(int('0b1000000000001100110011001100110', 2))).value
https://www.h-schmidt.net/FloatConverter/IEEE754.html
https://babbage.cs.qc.cuny.edu/ieee-754.old/decimal.html
Meu primeiro código em C
1 #include <stdio.h>
2 int main() {
3 printf("Hello World");
4 return 0;
5 }
O que é um programa de computador?
O que é uma variável?
Quais são os tipos de variáveis estudadas hoje?
Qual a diferença entre uma variável e uma constante?
Constantes são mais rápidas que variáveis?
Qual a diferença entre uma linguagem de baixo nível e uma de alto nível?
Um registrador de uma CPU pode ser considerada uma variável?
Por que tipos numéricos inteiro (naturais/inteiros) e ponto flutuante (racionais)?
Por que ponto flutuante não é exato na computação (IEEE 754)?
Estrutura de um código em C
Tipos primitivos
Input e output
Meu primeiro código em C
1 #include <stdio.h>
2 int main() {
3 printf("Hello World");
4 return 0;
5 }
Quais são os tipos de dados estudados hoje?
Qual a diferença entre um tipo char, int, unsigned int e long int?
O que caracteriza um input?
O que caracteriza um output?
Estrutura de um código em C
Input e output
Calculadora financeira 101
1 #include <stdio.h>
2 int main() {
3 // TODO
4 return 0;
5 }
O que caracteriza um input?
O que caracteriza um output?
Por que o double é o tipo adequado adequado para os estudos de hoje?
Exercícios
Estrutura de um código em C
Funções
// --------------------------------------
// Funcoes 101
#include <stdio.h>
int soma(int a, int b);
int main() {
int n1, n2, resultado;
printf("Digite dois numeros: ");
scanf("%d %d", &n1, &n2);
resultado = soma(n1, n2);
printf("resultado = %d", resultado);
return 0;
}
int soma(int a, int b) {
int resultado;
resultado = a + b;
return resultado;
}
O que é uma função?
Quais as vantagens de utilizar funções?
Quais as desvantagens de usar funções?
Exercícios:
Utilize o código acima e escreva uma calculadora de quatro operações.
Escreva uma função para calcular a sequência de fibonacci.
Escreva uma função para dizer se um número é par ou ímpar.
Escreva uma função para dizer se um número é primo.
Escreva uma função para converter Watts para Amperes (e inverso).
Escreva uma função para dizer qual seção (mm2) de um condutor elétrico, para uma determinada corrente (A).
Recursividade
// --------------------------------------
// Recursividade fatorial
#include <stdio.h>
unsigned long long int fatorial(unsigned int i) {
if(i <= 1) {
return 1;
}
return i * fatorial(i - 1);
}
int main() {
int i = 12;
printf("Fatorial de %d is %d\n", i, fatorial(i));
return 0;
}
// --------------------------------------
// Recursividade Fibonacci
#include <stdio.h>
int fib(int n) {
if (n == 1) return 1;
if (n == 2) return 1;
return fib(n - 1) + fib(n - 2);
}
int main(void) {
for(int i=1; i<=10; i++)
printf("%d\n", fib(i));
return 0;
}
O que é recursividade?
Quais as vantagens de utilizar recursividade?
Quais as desvantagens de usar recursividade?
Exercícios:
Escreva uma função recursiva para calcular a sequência de fibonacci.
Escreva uma função recursiva para somar uma sequência de números (1+2+3+4+5+6...).
Ponteiros
// --------------------------------------
// Ponteiros introducao
#include <stdio.h>
void pointers() {
int var = 20;
int* ptr;
ptr = &var;
printf("Valor de ptr = %p \n", ptr);
printf("Valor de var = %d \n", var);
printf("Valor de *ptr = %d \n", *ptr);
}
int main() {
pointers();
return 0;
}
// --------------------------------------
// Ponteiros para estruturas
#include <stdio.h>
#include <string.h>
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
void printBook( struct Books *book ) {
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
printf( "Book book_id : %d\n", book->book_id);
}
int main( ) {
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* book 2 specification */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* print Book1 info by passing address of Book1 */
printBook( &Book1 );
/* print Book2 info by passing address of Book2 */
printBook( &Book2 );
return 0;
}
// --------------------------------------
// Aritmetica de ponteiros
// e alocação dinâmica (heap)
#include <stdio.h>
#include <stdlib.h>
int main() {
int* pin = (int*) malloc(sizeof(int)*(1024));
printf("\n%p\n", pin);
*(pin+0) = 10;
*(pin+1) = 20;
*(pin+2) = 30;
for (int i=0; i<=2; i++) {
printf("\n%d", *(pin+i));
}
printf("\n");
return 0;
}
// --------------------------------------
// Ponteiros como referencia
#include <stdio.h>
int soma(int* a, int* b) {
*a = 1;
*b = 2;
return *a + *b;
}
int main() {
int n1, n2;
scanf("%d", &n1);
scanf("%d", &n2);
printf("\n%d\n", soma(&n1, &n2));
printf("\n%d %d\n", n1, n2);
return 0;
}
O que são ponteiros?
Quais as vantagens de utilizar ponteiros?
Quais as desvantagens de usar ponteiros?
O que é referência e valor?