Linguagem de Programação C: Introdução
Links relacionados: Sistemas Operacionais
Linguagem C
A linguagem de programação C foi criada em 1972 por Dennis Ritchie e é ainda uma das mais populares linguagens de programação. Ela é uma linguagem que pode ser compilada para diversas arquiteturas, é de propósito gera, estruturada, imperativa e procedural. Originalmente o C foi criada para desenvolver o sistema operacional Unix. Antes disso, o SO era escrito em Assembly.
Neste conteúdo será apresentado apenas um passo inicial para o conhecimento da linguagem. Observe que há muito conteúdo de auxílio na internet, principalmente por ser uma linguagem de programação bastante popular e antiga.
Um site bastante interessante e completo da linguagem C e C++ é o CPLUSPLUS. Há informações sobre as mais diversas funções da linguagem e forma de utilizá-la, com exemplos e comentários de usuários. Utilize-o como seu site de pesquisa.
Hello World
1/*
2 Este é nosso clássico programa Hello World.
3 Sua principal e única função é escrever um
4 exemplo básico de um programa que apenas
5 escreve algo na tela. Apenas contextualizando,
6 este é um comentário de múltiplas linhas.
7*/
8
9#include <stdio.h>
10#include <stdlib.h>
11
12// Este é um comentário de única linha.
13
14int main(int argc, char *argv[])
15{
16 printf("Hello World!\n"); // Escrever algo na tela.
17 // O "\n" indica nova linha.
18 return 0;
19}
Para compilar, basta executar a seguinte linha de comando:
1gcc helloworld.c -o helloworld
Para executar o programa no terminal (Linux, FreeBSD, MacOS, Unix-like), digite a seguinte linha de comando no diretório (pasta) corrente do programa:
1./helloworld
Entrada e Saída de Dados
Informações podem ser lidas (teclado) e escritas na linguagem C, de forma bastante simples, por meio das funções scanf e printf. Observe que a forma como as informações são lidas e escritas pode ser formatada com a utilização de caracteres especiais, seguidos do caractere "%".
Lendo Dados do Teclado
1#include <stdio.h>
2#include <stdlib.h>
3
4int main(int argc, char * argv[])
5{
6 // Declaracao de variaveis
7 char nome[255];
8 char cargo[255];
9 int idade;
10 float salario;
11
12 // Leitura dos dados
13 printf("Entre com suas informações:\n");
14 printf("Nome: ");
15 scanf("%s", nome);
16 printf("Idade: ");
17 scanf("%d", &idade);
18 printf("Cargo pretendido: ");
19 scanf("%s", cargo);
20 printf("Pretencao salarial: ");
21 scanf("%f", &salario);
22
23 // Escrevendo as informacos na tela.
24 printf("A pessoa de nome %s, candidata ao cargo de %s, ", nome, cargo);
25 printf("com %d anos de idade ", idade);
26 printf("possui uma pretencao salarial de R$ %.2f mensal.\n", salario);
27 // Observe acima que utilizamos a formatação de duas casas depois
28 // da virgula para o salario: %.2f
29 return 0;
30}
Lendo strings com múltiplas palavras
1#include <stdio.h>
2#include <stdlib.h>
3
4int main(int argc, char * argv[])
5{
6 char nome[MAX_SIZE];
7 int idade;
8
9 printf("Nome: ");
10 scanf("%[^\n]s", nome); // O scanf também permite formatação.
11 printf("idade: ");
12 scanf("%d", &idade);
13 printf("> %s (%d anos).\n", nome, idade);
14 return 0;
15}
Passagem de Parâmetros
1#include <stdio.h>
2#include <string.h>
3
4int main(int argc, char *argv[])
5{
6 int i;
7 printf("Este programa possui %d parametros, sao eles:\n", argc);
8 for (i = 0; i < argc; i++)
9 {
10 printf("%d: %s\n", i, argv[i]);
11 }
12 return 0;
13}
Vetores
Exemplo sem vetores.
1#include <stdio.h>
2#include <stdlib.h>
3
4int main()
5{
6 float n1, n2;
7 printf("Digite nota 1: ");
8 scanf("%f", &n1);
9 printf("Digite nota 2: ");
10 scanf("%f", &n2);
11
12 printf("Media = %.2f\n", ((n1 + n2) / 2));
13 return 0;
14}
Exemplo com vetores.
1#include <stdio.h>
2#include <stdlib.h>
3
4#define TAM 3 // Observe que isso é uma constante, usar maiusculo.
5
6int main()
7{
8 float notas[TAM];
9 int i;
10 for (i = 0; i < TAM; i++)
11 {
12 printf("Digite nota %d: ", i + 1);
13 scanf("%f", ¬as[i]);
14 }
15
16 float soma = 0;
17 for (i = 0; i < TAM; i++)
18 {
19 soma += notas[i];
20 }
21
22 printf("Media = %.2f\n", (soma / TAM));
23 return 0;
24}
Strings
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5int main()
6{
7 char nome[80]; // declaracao
8
9 printf("Digite seu nome completo: ");
10 scanf("%[^\n]s", nome); // leitura
11 printf("Oi %s, tamanho = %d\n", nome, (int) strlen(nome));
12
13 char titulo[] = ", Dr."; // inicializacao
14 strcat(nome, titulo); // contenacao
15 printf(": %s\n", nome);
16
17 strcpy(nome, "Ninguem mais."); // atribuindo valor
18 printf("> %s\n", nome);
19 return 0;
20}
Ponteiros
1#include <stdio.h>
2#include <stdlib.h>
3
4int main ()
5{
6 int a = 3;
7 int *p;
8
9 printf("valor(a) = %d\n", a);
10 printf("endereco(a) = %p\n\n", &a);
11
12 p = &a;
13
14 printf("valor(p) = %p\n", p);
15 printf("endereco(p) = %p\n", &p);
16 printf("valor apontado(p) = %d\n\n", *p);
17
18 *p = 5;
19
20 printf("valor(a) = %d\n", a);
21 printf("endereco(a) = %p\n", &a);
22 return 0;
23}
Funções
Passando e Retornando Informações
1#include <stdio.h>
2#include <stdlib.h>
3
4int soma(int a, int b)
5{
6 return a + b;
7}
8
9int main()
10{
11 int i, j;
12 printf("Digite valor de i e j : ");
13 scanf("%d %d", &i, &j);
14 printf("%d * %d = %d\n", i, j, soma(i, j));
15 return 0;
16}
Passagem de Parâmetros por Valor e por Referência
1#include <stdio.h>
2#include <stdlib.h>
3
4void por_valor(int num)
5{
6 num *= 2;
7 printf("por_valor: Valor X 2 = %d\n", num);
8}
9
10void por_referencia(int *num)
11{
12 *num += 2;
13 printf("por_referencia: Valor + 2 = %d\n", *num);
14}
15
16int main()
17{
18 int a = 5;
19 printf("Valor original de a = %d\n", a);
20 por_valor(a);
21 printf("Valor de atual de a = %d\n", a);
22 por_referencia(&a);
23 printf("Valor de atual de a = %d\n", a);
24 return 0;
25}
Arquivos
Escrevendo em Arquivos Texto
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5int main(int argc, char *argv[])
6{
7 if (argc != 2) return 0;
8
9 FILE *arq = fopen(argv[1], "w");
10 printf("Digite seu texto abaixo. Para sair, digite 'sair':\n");
11
12 char linha[100];
13 while (strstr(linha, "sair") == NULL)
14 {
15 printf(": ");
16 fgets(linha, 100, stdin);
17 if (strstr(linha, "sair") == NULL)
18 {
19 fputs(linha, arq);
20 }
21 }
22 fclose(arq);
23 return 0;
24}
Lendo Arquivos Texto
1#include <stdio.h>
2#include <stdlib.h>
3
4int main(int argc, char *argv[])
5{
6 if (argc != 2) return 0;
7
8 FILE *arq = fopen(argv[1], "w");
9 char linha[100];
10 while (fgets(linha, 100, arq) != NULL)
11 {
12 printf("%s", linha);
13 }
14 fclose(arq);
15 return 0;
16}
Estruturas
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5#define TOTAL_ALUNOS 3
6
7typedef struct
8{
9 char nome[80];
10 float nota;
11} Aluno;
12
13void imprimir(Aluno a)
14{
15 printf("> %s-> Nota: %.2f\n", a.nome, a.nota);
16}
17
18void ler(Aluno *a)
19{
20 printf("Nome: ");
21 fgets(a->nome, 80, stdin);
22 printf("Nota: ");
23 scanf("%f", &a->nota);
24 getc(stdin);
25}
26
27int main ()
28{
29 Aluno alunos[TOTAL_ALUNOS];
30 int i;
31 printf("Entre com os dados dos alunos:\n");
32 for (i = 0; i < TOTAL_ALUNOS; i++)
33 {
34 ler(&alunos[i]);
35 }
36 i = 0;
37 while (i < TOTAL_ALUNOS)
38 {
39 imprimir(alunos[i]);
40 i++;
41 }
42 return 0;
43}
Exercícios de Programação e C
Levar em consideração a seguinte metodologia:
- Compreender o problema
- Identificar entradas e saídas
- Compreender a transformação das entradas em saídas
- Elaborar um algoritmo
- Testar o algoritmo e corrigi-lo
- Implementar em C
Exercício 1
Uma loja vende seus produtos no sistema entrada mais duas prestações, sendo a entrada maior do que ou igual às duas prestações; estas devem ser iguais, inteiras e as maiores possíveis. Por exemplo, se o valor da mercadoria for R$ 270,00, a entrada e as duas prestações são iguais a R$ 90,00; se o valor da mercadoria for R$ 302,75, a entrada é de R$ 102,75 e as duas prestações são a iguais a R$ 100,00. Escreva um programa que receba o valor da mercadoria e forneça o valor da entrada e das duas prestações, de acordo com as regras acima. Observe que uma justificativa para a adoção desta regra é que ela facilita a confecção e o consequente pagamento dos boletos das duas prestações.
Exercício 2
Um intervalo de tempo pode ser dado em dias, horas, minutos, segundos ou sequências "decrescentes" destas unidades (em dias e horas; em horas e minutos; em horas, minutos e segundos), de acordo com o interesse de quem o está manipulando. Escreva um programa que converta um intervalo de tempo dado em segundos para horas, minutos e segundos. Por exemplo, se o tempo dado for 3 850 segundos, o programa deve fornecer 1 h 4 min 10 s.
Exercício 3
Um programa para gerenciar os saques de um caixa eletrônico deve possuir algum mecanismo para decidir o número de notas de cada valor que deve ser disponibilizado para o cliente que realizou o saque. Um possível critério seria o da "distribuição ótima" no sentido de que as notas de menor valor disponíveis fossem distribuídas em número mínimo possível. Por exemplo, se a máquina só dispõe de notas de R$ 50, de R$ 10, de R$ 5 e de R$ 1, para uma quantia solicitada de R$ 87, o programa deveria indicar uma nota de R$ 50, três notas de R$ 10, uma nota de R$ 5 e duas notas de R$ 1. Escreva um programa que receba o valor da quantia solicitada e retorne a distribuição das notas de acordo com o critério da distribuição ótima.
Exercício 4
Um número inteiro positivo é dito semiprimo se ele é igual ao produto de dois números primos. Por exemplo, 15 é semiprimo pois 15 = 3 x 5; 9 é semiprimo pois 9 = 3 x 3; 20 não é semiprimo pois 20 = 2 x 10 e 10 não é primo. Os números semiprimos são fundamentais para o sistema de criptografia RSA. Escreva um programa que verifique se um inteiro dado é semiprimo. Utilize funções na solução.
Exercício 5
Faça um programa em C que leia um arquivo texto com os códigos, nomes (onde o cada palavra que compõem o nome é separada pelo caractere "_", nota da 1a prova, 2a prova e 3a prova dos alunos de uma turma, conforme o exemplo abaixo.
20154099 Rei_Ayanami 9 7 10 20154992 Shinji_Ikari 4.5 0.5 1 20150584 Asuka_Langley_Soryu 7 8 9 20153030 Touji_Suzuhara 2.7 7 8.7 20153939 Kaworu_Nagisa 6.5 4.5 10 20159932 Misato_Katsuragi 8 8.5 9 20155332 Kensuke_Aida 4 5.5 3
O programa deve gerar um segundo arquivo com os mesmos dados do arquivo anterior mais a média das três provas, a média normalizada, o conceito, e um histograma dos conceitos. Um cabeçalho, contendo os dados de cada coluna, deve constar na primeira linha, conforme o exemplo abaixo.
CÓDIGO NOME N1 N2 N3 MÉDIA MÉDIA NOR. CONCEITO 20154099 Rei Ayanami 9.0 7.0 10.0 8.67 10.00 A 20154992 Shinji Ikari 4.5 0.5 1.0 2.00 2.31 D 20150584 Asuka Langley Soryu 7.0 8.0 9.0 8.00 9.23 A 20153030 Touji Suzuhara 2.7 7.0 8.7 6.13 7.08 C 20153939 Kaworu Nagisa 6.5 4.5 10.0 7.00 8.08 B 20159932 Misato Katsuragi 8.0 8.5 9.0 8.50 9.81 A 20155332 Kensuke Aida 4.0 5.5 3.0 4.17 4.81 D A ### B # C # D ##
A média normalizada é dada pela média multiplicada por 10 e dividida pela maior média. Ou seja,
Média Normalizadai = Médiai x 10 / Maior Média.
Os conceitos são atribuídos conforme abaixo:
- A Média Normalizada ∈ [10, 9]
- B Média Normalizada ∈ ]9, 8]
- C Média Normalizada ∈ ]8, 7]
- D Média Normalizada ∈ ]7, 0]