Prazo de entrega:
Segunda chance:
Você deve aprender a utilizar um terminal de comandos, realizar operações básicas no controle de versão Git, compilar e testar um programa em C e submeter uma tarefa na disciplina. Esta tarefa serve para testar o sistema de submissão e não fará parte da média de notas.
Linha de comandos
Para fazer as tarefas que são solicitadas nesta disciplina, você deve se familiarizar com a interação com o computador através de linha de comando. No GNU/Linux, um dos interpretadores de comando mais utilizado é o Bash. Nessa tarefa, iremos ver como dar comandos básicos ao computador utilizando o Bash. Caso queira, você poderá utilizar outros interpretadores de comando.
Se você não tem uma distribuição GNU/Linux instalada em seu computador, consulte aqui como instalar o Ubuntu. Você também pode instalar o Ubuntu (ou outras distribuições GNU/Linux) diretamente no Windows usando WSL. Para saber mais detalhes sobre o processo de instalação, ou sempre que tiver dúvidas, consulte os tutoriais feitos especialmente para esta disciplina.
Para começar a nos ambientar com o terminal, vamos criar um diretório
e ver o seu conteúdo. Para isso, abra o terminal e digite
mkdir diretorio
. Seu terminal deve se parecer como o seguinte.
user@host:~$ mkdir diretorio
Para navegar para esse diretório, podemos utilizar o comando cd
.
user@host:~$ cd diretorio
Agora, liste o conteúdo desse diretório.
user@host:~/diretorio$ ls
user@host:~/diretorio$ ..
O nosso diretório contém apenas os diretórios padrões .
e ..
. O
primeiro corresponde ao diretório atual e o segundo ao diretório pai.
Esses arquivos (e quaisquer outros começando com .
) não são
mostrados por padrão. Para ver todos os arquivos, use a opção -a
e
para ver detalhes sobre os arquivos, a opção -l
.
user@host:~/diretorio$ ls -la
drwxrwxr-x 2 user user 4096 ago 28 14:32 .
drwxrwxr-x 5 user user 4096 ago 28 14:28 ..
Para aprendermos os comandos para copiar e mover arquivos, crie um
arquivo nesse diretório utilizando o comando touch
. Será criado um
arquivo sem conteúdo.
user@host:~/diretorio$ touch arquivo.txt
Se você listar o conteúdo desse diretório, deverá ver o arquivo que acabou de criar.
Agora, crie um subdiretório.
user@host:~/diretorio$ mkdir sub-dir
user@host:~/diretorio$ ls -l
-rw-rw-r-- 1 user user 0 ago 28 14:33 arquivo.txt
drwxrwxr-x 2 user user 4096 ago 28 14:33 sub-dir
Copie o arquivo arquivo.txt
para esse subdiretório com o comando cp
.
user@host:~/diretorio$ cp arquivo.txt sub-dir/
Crie um novo arquivo.
user@host:~/diretorio$ touch arquivo2.txt
Mova esse novo arquivo para o subdiretório com o comando mv
.
user@host:~/diretorio$ mv arquivo2.txt sub-dir/
Navegue para o subdiretório e liste o seu conteúdo.
user@host:~/diretorio$ cd sub-dir
user@host:~/diretorio/sub-dir$ ls
arquivo2.txt arquivo.txt
Para remover um arquivo, utilize o comando rm
.
user@host:~/diretorio/sub-dir$ rm arquivo.txt
Volte para o diretório pai e remova o subdiretório com todo o seu conteúdo.
user@host:~/diretorio/sub-dir$ cd ..
user@host:~/diretorio$ rm -r sub-dir
Instalando o compilador
Para compilar programas escritos em C no seu computador, é necessário ter uma série de programas responsáveis por traduzir os vários códigos-fontes em arquivos objetos com as instruções de linguagem de máquina e depois juntá-los (link) em um arquivo executável pelo sistema operacional. O conjunto desses programas é chamado de toolchain.
Além disso, as tarefas dessa disciplina virão acompanhadas de um
arquivo escrito em Python chamado testar.py
que ajuda a compilar e
testar cada uma das tarefas. Não é necessário utilizar esse arquivo
para realizar as tarefas, mas testar e aprender a criar testes
automatizados evita que você gaste um tempo enorme testando seus
programas de maneira manual.
No Ubuntu, ou em distribuições GNU/Linux baseadas em Debian, você pode instalar o toolchain padrão e um interpretador Python 3.x com os comandos abaixo.
user@host:~$ sudo apt update
user@host:~$ sudo apt install build-essential python3
Execute
user@host:~$ gcc --version
user@host:~$ python3 --version
pare ter certeza de que a instalação funcionou e verificar a versão dos programas instalados. Para instalar Python em outras distribuições GNU/Linux, você pode consultar o site oficial do Python, ou para o Windows, você pode seguir esse tutorial.
Usando o Git
Nesta disciplina, usaremos o Git para desenvolver e submeter as tarefas de programação. Git é uma ferramenta de controle de versão distribuída, que serve para manter o histórico de arquivos de maneira organizada e facilmente compartilhada por várias pessoas. Não é objetivo dessa disciplina nos aprofundarmos nessa ferramenta, mas é necessário saber realizar comandos básicos e utilizar o repositório efetivamente.
Antes de começar, é preciso instalar o Git para torná-lo disponível em seu computador. No Ubuntu, abra o terminal e execute o comando abaixo.
user@host:~$ sudo apt install git
Verifique se a instalação ocorreu com sucesso com o comando
git --version
.
Se você ainda não tem e não conhece o Git, você pode ler o seguinte tutorial de introdução, que explica como instalar o software em diferentes sistemas operacionais além dos comandos básicos.
No contexto da disciplina, o Git é uma ferramenta para o acompanhamento das tarefas feitas durante o semestre. A partir dele, @s estudantes terão acesso a uma série de tarefas que servirão de avaliação.
Clonando seu repositório pessoal
Nos primeiros dias, o professor irá criar um repositório no Gitlab do Instituto de Computação (IC) para cada estudante. Cada estudante do curso 34 ou 42 tem uma conta criada automaticamente nessa plataforma. Antes de ser possível criar o repositório, é necessário que cada estudante entre em https://gitlab.ic.unicamp.br e realize o login pela primeira vez utilizando a mesma senha do ambiente Linux. Se você não é desses cursos, o seu professor irá fornecer instruções separadamente sobre como obter sua senha.
Uma vez criado o repositório, é possível cloná-lo para a sua máquina, realizar alterações e depois sincronizá-lo com o repositório remoto. O endereço do seu repositório será
https://gitlab.ic.unicamp.br/mc202-2024/raXXXXXX.git
substituindo-se XXXXXX
por seu número de RA. Você pode conferir
entrando no link. Na página principal do seu repositório, clique no
botão Clone
e copie a URL sobre Clone with HTTPS
. Abra o terminal
dentro do diretório em que ficará guardado o repositório, digite
git clone
e em seguida cole a URL copiada:
user@host:~$ git clone https://gitlab.ic.unicamp.br/mc202-2024/raXXXXXX.git
Cloning into 'raXXXXXX'...
Username for 'https://gitlab.ic.unicamp.br': raXXXXXX
Password for 'https://raXXXXXX@gitlab.ic.unicamp.br':
Pressione enter e realize a autenticação com o mesmo nome de usuário e senha que utilizou para acessar https://gitlab.ic.unicamp.br.
Dentro da pasta que você acabou de criar, deve haver um diretório
tarefa00
. Se não, espere alguns minutos e digite git pull
dentro
do pasta raXXXXXX
recém criada.
Submissão de tarefas
Durante o semestre, serão realizadas diversas tarefas. A maioria delas consiste em escrever um ou mais programas em C que resolvem determinados problemas. Vamos ver um exemplo:
Escreva um programa chamado bomdia.c
que lê um nome no terminal e dá
bom dia.
Entrada
A entrada do programa é o que o usuário irá digitar quando executa o programa. Nesse exemplo, é apenas um nome de uma pessoa.
José
Saída
A saída o programa é o que o programa irá imprimir na tela após o usuário digitar a entrada. Nesse exemplo, para a entrada acima queremos que o programa tenha a saída:
Bom dia, José.
Resolvendo o exercício
Para resolver essa tarefa, precisamos criar um arquivo em C faz o
solicitado. Para isso, você pode utilizar qualquer editor de texto.
Uma sugestão é utilizar o VS Code.
Vamos abrir o editor do texto e criar um arquivo bomdia.c
dentro da pasta raXXXXXX/tarefa00
.
Em tarefas futuras, você deverá criar todo o programa. Nesse primeiro
dia, vamos apenas copiar código abaixo e salvar um arquivo bomdia.c
.
#include <stdio.h>
int main() {
char nome[30];
scanf("%s", nome);
printf("Bom dia, %s.\n", nome);
}
Testando o exercício
Vamos verificar se o arquivo realmente foi criado no diretório correto. Vá até a linha de comandos e digite
user@host:~$ cd raXXXXXX/tarefa00
user@host:~/raXXXXXX/tarefa00$ ls -l
total 16
-rw-rw-r-- 1 user user 113 ago 28 14:48 bomdia.c
-rw-rw-r-- 1 user user 6209 ago 28 14:47 testar.py
drwxrwxr-x 2 user user 4096 ago 28 14:47 testes
Antes de executar o programa que você criou, é necessário compilá-lo.
user@host:~/raXXXXXX/tarefa00$ gcc -std=c99 -Wall -Werror bomdia.c -o bomdia
Isso irá compilar o arquivo bomdia.c
em um arquivo executável
bomdia
. Podemos verificar isso listando o diretório. Depois,
executamos o programa recém criado.
user@host:~/raXXXXXX/tarefa00$ ls -l
-rwxrwxr-x 1 user user 16792 ago 28 14:48 bomdia
-rw-rw-r-- 1 user user 113 ago 28 14:48 bomdia.c
-rw-rw-r-- 1 user user 6209 ago 28 14:47 testar.py
drwxrwxr-x 2 user user 4096 ago 28 14:47 testes
user@host:~/raXXXXXX/tarefa00$ ./bomdia
O console vai ficar piscando esperando que você digite algo. Digite seu nome e aperte Enter.
user@host:~/raXXXXXX/tarefa00$ ./bomdia
Simone de Beauvoir
Bom dia, Simone.
Deve ter aparecido uma mensagem de bom dia! Se não, verifique se não fez todos os passos acima.
Você acabou de testar manualmente o seu programa. No mundo real, é
importante criar testes automatizados. Na nossa disciplina, em cada
tarefa, haverá um arquivo testar.py
que serve para você testar a sua
tarefa localmente. Esse arquivo é incluído no diretório da tarefa.
Para testar usando o script, abra o terminal dentro do diretório que
contém o arquivo Python e digite
user@host:~/raXXXXXX/tarefa00$ python3 testar.py
Executando teste_1_bomdia...
-> testes/bomdia.in passou
teste_1_bomdia: OK
...
Ele deve dar uma mensagem falando que um teste correspondente ao
primeiro exercício bomdia.c
passou. Esse é um bom momento para você
guardar as suas alterações!
Registrando alterações
As alterações realizadas anteriormente foram no diretório de trabalho. Agora é necessário registrá-las no repositório local. No jargão git, queremos realizar um commit, que serve para documentar o desenvolvimento de sua tarefa. Primeiro, vamos revisar as modificações que acabamos de realizar.
user@host:~/raXXXXXX/tarefa00$ git status
No ramo main
Your branch is up to date with 'origin/main'.
Arquivos não monitorados:
(utilize "git add <arquivo>..." para incluir o que será submetido)
bomdia.c
nada adicionado ao envio mas arquivos não registrados
estão presentes (use "git add" to registrar)
A mensagem acima explica que há um arquivo novo bomdia.c
que ainda
não está sendo monitorado pelo repositório de trabalho. No terminal,
digite git add .
para adicionar todos as alterações no diretório de
trabalho à área de preparação (staging). Isso irá adicionar
qualquer arquivo que estiver no diretório atual, por isso, sempre
verifique o status antes e depois.
user@host:~/raXXXXXX/tarefa00$ git add .
user@host:~/raXXXXXX/tarefa00$ git status
No ramo main
Your branch is up to date with 'origin/main'.
Mudanças a serem submetidas:
(use "git restore --staged <file>..." to unstage)
new file: bomdia.c
user@host:~/raXXXXXX/tarefa00$ git diff
Agora podemos registrar essas alterações. Antes de realizar o primeiro
commit
em uma máquina com uma instalação nova do git, é necessário
definir seu endereço de e-mail e nome de usuário conforme o exemplo a
seguir. O endereço de e-mail é utilizado para identificar quais
alterações foram realizadas por cada autor. Por isso, certifique-se de
usar sempre o mesmo endereço de e-mail. Nesta disciplina, recomendamos
que você utilize o seu email institucional, como no exemplo.
user@host:~$ git config --global user.email "XXXXXX@dac.unicamp.br"
user@host:~$ git config --global user.name "Fulana da Silva"
Se você já utiliza outros repositórios git no mesmo computador e não deseja alterar sua configuração globalmente, execute os comandos acima a partir de seu repositório sem a opção global.
O próximo passo é confirmar as alterações, ou seja, fazer um commit.
Será necessário adicionar uma mensagem de alterações, o que pode ser feito
adicionando o texto entre aspas após o comando commit com a flag -m
. Certifique-se de
incluir uma mensagem que realmente seja descritiva das alterações
realizadas nesse commit.
user@host:~/raXXXXXX/tarefa00$ git commit -m "cria exercício bomdia.c"
[main f91b22d] cria exercício bomdia.c
1 file changed, 7 insertions(+)
create mode 100644 tarefa00/bomdia.c
Sincronizando repositórios
Tudo que você fez até agora está registrado apenas no seu repositório
local. As alterações ainda não foram enviadas para o repositório
remoto. Por último, é necessário executar o comando git push
no
terminal e realizar a autenticação.
user@host:~/raXXXXXX/tarefa00$ git push
Username for 'https://gitlab.ic.unicamp.br': raXXXXXX
Password for 'https://raXXXXXX@gitlab.ic.unicamp.br':
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 457 bytes | 457.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0)
To https://gitlab.ic.unicamp.br/mc202-2020/raXXXXXX.git
6018803..f91b22d main -> main
Verificando o resultado de suas tarefas
Vocês devem ter recebido um e-mail com uma senha para acessar o site https://mc202.ic.unicamp.br. Essa site registra todas as correções recebidas no repositório remoto, feedback dos monitores e relatórios de erros. Tome cuidado com sua senha, ela não pode ser alterada. Por isso, não perca nem compartilhe sua senha com ninguém. Se você não recebeu a senha no seu e-mail institucional, então converse com o professor ou monitor.
Boa noite
Quando você executou o programa testar.py
ou viu o site de notas,
deve ter percebido que algum teste falhou. Isso é porque pode haver
mais de um exercício por tarefa. Para concluir tarefa00
, faça um
programa boanoite.c
que lê vários nomes e dá boa noite, conforme
entrada e saída a seguir.
Entrada
3
José
Maria
Manuela
Saída
Boa noite, José.
Boa noite, Maria.
Boa noite, Manuela.
Crie um arquivo boanoite.c
conforme o modelo abaixo. Depois compile
usando o gcc
e teste manualmente seu programa.
#include <stdio.h>
int main() {
char nome[30];
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s", nome);
printf("Boa noite, %s.\n", nome);
}
}
Depois de testado manualmente, vamos tentar com o script de teste automático.
Para testar apenas o teste de boa noite, passamos um parâmetro para o
arquivo testar.py
, especificando o nome da unidade
de teste escolhida.
user@host:~/raXXXXXX/tarefa00$ python3 testar.py boanoite
Executando teste_2_boanoite...
teste_2_boanoite: FALHOU
-> você deve criar um arquivo Makefile
Ele está reclamando de que não há um arquivo Makefile
. Para esse
exercício, vamos exemplificar também como criar um arquivo Makefile
.
Esse tipo de arquivo serve para guardar um conjunto de regras para
compilar seu programa automaticamente, ao invés de ter que digitar o
comando de compilação manualmente toda vez. Para isso, abra seu editor
e crie um arquivo Makefile
conforme o modelo abaixo. É muito
importante que esse arquivo seja indentado usando tabs ao invés de
espaços.
CFLAGS = -std=c99 -Wall -Werror -Wvla -g
LDFLAGS = -lm
.PHONY: all clean
all: bomdia boanoite
bomdia: bomdia.c
gcc $(CFLAGS) bomdia.c -o bomdia $(LDFLAGS)
boanoite: boanoite.c
gcc $(CFLAGS) boanoite.c -o boanoite $(LDFLAGS)
clean:
rm -f bomdia boanoite
Agora, para compilar todos os programas, basta digitar make
.
user@host:~/raXXXXXX/tarefa00$ make
gcc -std=c99 -Wall -Werror -Wvla -g bomdia.c -o bomdia -lm
gcc -std=c99 -Wall -Werror -Wvla -g boanoite.c -o boanoite -lm
Pronto, agora você já pode testar, registrar e enviar suas alterações para o repositório remoto.