MCTA028-15 - PROGRAMAÇÃO ESTRUTURADA
UFABC
2026-09-18
Agenda prevista de aulas está no site. Datas das provas:
Objeções?
Nos laboratórios, a partição Linux tem um único usuário…
COM MEMÓRIA PERSISTENTE
Próxima terça-feira não haverá aula. Venha participar do UFABC para todos e do CO’DA

Sexta-feira é aula normal!!
Horário: Terça-feira – 13hs


Queremos implementar o seguinte programa:
O programa le dois números e imprime o maio deles.
Solução em Python (sem usar a função max)
```python
Print("Digite dois números (1 por linha):")
a = int(input())
b = int(input())
if a > b:
print("Maior:", a)
else:
print("Maior:", b)
```
scanfPara ler valores, usamos a função scanf.
Diferença importante entre scanf() e printf()
printf recebe os valores a imprimir;scanf recebe os endereços das variáveis onde deve escrever.scanfContinuando o nosso exemplo do máximo de dois números:
#include <stdio.h>
int main() {
int a,b;
printf("Digite um numero inteiro (1 por linha):\n");
scanf("%d", &a);
scanf("%d", &b);
// (Continua em breve...)O operador & obtém o endereço da variável.
& no scanf#include <stdio.h>
int main() {
int a = 1;
printf("%d\n", a); // 1
printf("%p\n", &a); // 0x7fff6d661ad4
return 0;
}&a é o endereço na memória onde o valor de a está armazenado&a é diferente em diferentes execuçõesscanfO primeiro argumento do scanf nos diz como interpretar a linha que está sendo dada como entrada
if e elseSintaxe:
| Operador | Significado |
|---|---|
< |
menor que |
> |
maior que |
<= |
menor ou igual a |
>= |
maior ou igual a |
== |
igual a |
!= |
diferente de |
| Operador | Significado |
|---|---|
&& |
e |
|| |
ou |
! |
negação |
Por padrão, operadores lógicos/relacionais são avaliado como um int, sempre ou 0 (false) ou 1 (true)
= versus ==Qual é a saída?
= versus ==: respostaO código compila, e imprime “o que esperamos”, mas está errado.
n = 5 faz uma atribuição de valorCom warnings ativados, o compilador pode ajudar a detectar esse tipo de erro.
Concluindo
C
while| Operador | Significado |
|---|---|
a += b |
a = a + b |
a -= b |
a = a - b |
a *= b |
a = a * b |
| Operador | Significado |
|---|---|
a /= b |
a = a / b |
a %=b |
a = a % b |
Também temos notação de pós/pré-incremento unitário
| Pós-incremento | Pré-incremento | Significado |
|---|---|---|
a++ |
++a |
a += 1 |
a-- |
--a |
a -= 1 |
Qual é a saída?
Qual é a saída?
do whileSemelhante ao while(), mas a condição de saída é avaliada ao final do laço
forforExemplo:
Tarefa: um programa que recebe de entrada números \(a\) e \(b\), e imprime \(a^b\).
| Tipo | Tamanho típico | Faixa típica |
|---|---|---|
char |
1 byte | -128 a 127 |
short int |
2 bytes | \(-2^{15}\) a \(2^{15}-1\) |
int |
4 bytes | \(-2^{31}\) a \(2^{31}-1\) |
long int |
8 bytes | \(-2^{63}\) a \(2^{63}-1\) |
long long int |
8 bytes | \(-2^{63}\) a \(2^{63}-1\) |
float |
4 bytes | ~7 casas de precisão |
double |
8 bytes | ~15–16 casas precisão |
Tamanhos/faixas exatapas dependem do compilador/sistema. Valores acima são típicos para gcc em sistemas Linux de 64 bits.
Qual é a saída?
Qual é a saída?
Em C:
é uma divisão entre inteiros, cujo resultado inteiro é 2.
Em C podemos converter tipos explicitamente usando cast:
Qual é a saída?
Conversões de um tipo com maior faixa/precisão para um tipo com menor faixa/precisão podem perder informação.
O resultado depende dos limites do tipo short int na implementação.
No meu Ubuntu, 50000 não cabe em short int, e o programa imprime
-15536
unsignedOs tipos inteiros também possuem versões sem sinal (unsigned) que aceitam uma faia maior de valores não negativos.
| Tipo | Tamanho típico | Faixa típica |
|---|---|---|
unsigned char |
1 byte | \(0\) a \(2^8 - 1\) |
unsigned short int |
2 bytes | \(0\) a \(2^{16} - 1\) |
unsigned int |
4 bytes | \(0\) a \(2^{32} - 1\) |
unsigned long int |
8 bytes | \(0\) a \(2^{64} - 1\) |
unsigned long long int |
8 bytes | \(0\) a \(2^{64} - 1\) |
unsigned para a versão com sinalint main( ) {
int a = -1;
unsigned int b = a;
printf("a = %d\n", a);
printf("b = %u\n", b);
return 0;
}Saída:
a = -1
b = 4294967295
int para unsignedCuidado: em expressões, C pode converter implicitamente um valor int para unsigned int, produzindo resultados inesperados.
int main() {
int a = -1;
unsigned int b = 1;
if (a < b) {
printf("menor\n");
} else {
printf("maior ou igual\n");
}
}Saída: maior ou igual.
unsigned int, o valor -1 virou um positivo grande.Quando uma variável local é declarada, o programa reserva espaço de memória para ela.
Esse espaço não é necessariamente inicializado.
Compilando com warnings:
O compilador pode avisar sobre problemas como uso de variável não inicializada.
Durante o curso, tratem warnings como sinais importantes. Código que compila com warnings pode estar errado.
n elementos#include <stdio.h>
int main() {
int numero;
scanf("%d", &numero);
while (numero >= 0) {
// Faz alguma coisa com numero
printf("Leu numero!\n");
scanf("%d", &numero);
}
printf("Saiu!\n");
return 0;
}Aqui, um número negativo encerra a leitura.
Faça um programa que leia um inteiro e imprima todos os divisores desse número.
Neste exercício, um divisor é um número que divide o outro com resto zero.
Faça um programa que leia um número n.
Depois, o programa deve ler n números.
Ao final, considerando os n números, o programa deve imprimir:
Não use vetor neste exercício.
Modifique o programa anterior para não solicitar a quantidade n no início.
Agora, o programa deve ler números até que o usuário digite um número negativo.
Ao final, imprima:
Faça um programa que leia um número n.
Depois, o programa deve ler n números.
Ao final, considerando esses números, imprima:
Faça um programa com um menu de operações.
O programa deve ler um código:
1: soma dois números;2: soma três números;3: multiplica dois números;0: sair.Se o usuário escolher sair, o programa imprime o menor resultado obtido e encerra.
Caso contrário, lê os números necessários, imprime o resultado da operação e volta ao menu.