Linguagem de Programação C: Introdução

De Aulas

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", &notas[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]