Programação para Redes de Computadores (técnico) (diário 2013-1)
Aulas
01/04
Problema: saber o valor final de parcelamento (1 +3) a 2% de juros.
inicio
// Problema: pagamento de uma geladeira, comprada a prazo em
// 1 + 3 x com juros de 2% ao mês.
escrever "Por favor, informe o valor da geladeira: "
real valorGeladeira
ler valorGeladeira
// 1) Saber quanto é o valor de entrada.
escrever "Agora, informe o valor da entrada: "
real entrada
ler entrada
// 2) Deduzir o valor de entrada do valor total, e depois dividir por 3. Isso
// dará o valor da parcela sem juro. Aplicar, no segundo mês, já o juro de 2%.
real parcela
parcela <- (((valorGeladeira - entrada) / 3) * 1.02)
// 3) No terceiro mês, aplicar o mesmo juro sobre o valor do mês anterior;
// ou seja, juro composto.
real parcela2
parcela2 <- (parcela * 1.02)
// 4) Repetir o processo no quarto mês.
real parcela3
parcela3 <- (parcela2 * 1.02)
// 5) Somar tudo e ver o prejuízo.
real somatorio
somatorio <- entrada + parcela + parcela2 + parcela3
escrever "Ao final, a geladeira custou ", somatorio, "."
fim
08/04
E se todas as opções forem variáveis?
inicio
escrever "Por favor, informe o valor da geladeira: "
real valorGeladeira
ler valorGeladeira
escrever "Deseja pagar a entrada? S ou N"
texto pagarEntrada
ler pagarEntrada
real entrada
se (pagarEntrada = "N" ou pagarEntrada = "n") entao
entrada<-0
senao
escrever "Agora, informe o valor da entrada: "
ler entrada
fimse
escrever "Valor de juros: "
real valorJuros
ler valorJuros
escrever "Quantidade de parcelas: "
real qtdParcelas
ler qtdParcelas
real somatorio
real parcela
parcela <- (valorGeladeira - entrada) / qtdParcelas
inteiro mes
para mes de 1 ate qtdParcelas passo 1
parcela <- parcela * (1 + valorJuros * 0.01)
somatorio <- somatorio + parcela
proximo
escrever "Ao final, a geladeira custou ", entrada + somatorio, "."
escrever "\nForam ", qtdParcelas, " parcelas de ", somatorio / qtdParcelas, " cada."
fim
15/04
Problema do dia: Dado um dia e mês neste ano de 2013, em que semana estamos?
inicio
inteiro dias
inteiro mês
inteiro semanas
inteiro resto
inteiro quociente
//Pedir ao usuário:
//- dia
//- mês
escrever "Informe o dia: "
ler dias
escrever "Agora, informe o mês (número): "
ler mês
//Dependendo do mês, deve-se somar à quantidade de dias, de acordo com o calendário juliano.
//Ao final, teremos a quantidade de dias no ano.
escolhe mês
caso 1: // Janeiro
dias <- dias
caso 2: // Fevereiro
dias <- dias + 31
caso 3: // Março
dias <- dias + 31 + 28
caso 4: // Abril
dias <- dias + 31 + 28 + 31
caso 5: // Maio
dias <- dias + 31 + 28 + 31 + 30
caso 6: // Junho
dias <- dias + 31 + 28 + 31 + 30 + 31
caso 7: // Julho
dias <- dias + 31 + 28 + 31 + 30 + 31 + 30
caso 8: // Agosto
dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31
caso 9: // Setembro
dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31
caso 10: // Outubro
dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30
caso 11: // Novembro
dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31
caso 12: // Dezembro
dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30
fimEscolhe
//Como a primeira semana tem apenas 5 dias (começa na terça), se a soma estiver entre 1 e 5 então
// estamos ainda na primeira semana. Caso contrário, apenas subtraimos esse valor (5) da soma.
se dias >=1 e dias <= 5 então
semanas <- 1
senão
dias <- dias - 5
//Com o valor que sobrou, faz-se uma divisão por 7. Se o resto for 0, o resultado é o próprio
// quociente mais um (a primeira semana); caso contrário (o resto está entre 1 e 6), então
// somamos: primeira semana (1) + quociente + 1 semana.
resto <- dias % 7
se resto = 0 então
semanas <- (dias / 7) + 1
senão
semanas <- 1 + (dias / 7) + 1
fimSe
fimSe
escrever "É a semana número ", semanas, "."
fim
22/04
O clássico problema: um número é primo quando...?
inicio
// Declaração de variáveis.
inteiro número
inteiro divisor
inteiro resto
inteiro divisores
// Interação com o usuário: número a ser testado como primo.
escrever "Por favor, digite um número inteiro entre 1 e 10000: "
ler número
// Como 1 e o próprio número sempre serão divisores, interessa saber se os valores
// intermediários conseguem dividir, com resto inteiro, o número solicitado.
divisor <- 2
divisores <- 0
enquanto divisor < número faz
resto <- número % divisor
se resto = 0 então
escrever "[", divisor, "]"
divisores <- divisores + divisor
senão
escrever "."
fimSe
divisor <- divisor + 1
fimEnquanto
se divisores = 0 então
escrever "\nO número ", número, " é primo."
senão
escrever "\nO número ", número, " NÃO é primo."
fimSe
fim
Ou mais características: se é primo, se é perfeito e sua soma cabalística (soma dos algarismos até resultar em um único dígito):
inicio
inteiro número
inteiro divisores
inteiro divisor
inteiro resto
inteiro centena
inteiro dezena
inteiro unidade
inteiro algarismos
para número de 1 até 999 passo 1
escrever "[",número
divisores <- 0
divisor <- 1
enquanto divisor <= (número / 2) faz
resto <- número % divisor
se resto = 0 então
divisores <- divisores + divisor
fimSe
divisor <- divisor + 1
fimEnquanto
se divisores = 1 então
escrever "p"
senão
escrever "."
fimSe
se divisores = número então
escrever "P"
senão
escrever "."
fimSe
centena <- número / 100
dezena <- (número % 100) / 10
unidade <- número % 10
algarismos <- centena + dezena + unidade
se algarismos > 9 então
dezena <- algarismos / 10
unidade <- algarismos % 10
fimSe
se algarismos > 9 então
dezena <- algarismos / 10
unidade <- algarismos % 10
fimSe
algarismos <- dezena + unidade
escrever algarismos,"]"
escrever " - "
próximo
fim
29/04
- Primeiro dia de shell script com bash. Primeiro código de exemplo: caixa decorativa:
#!/bin/bash
linha_de_hifens(){
echo -n "·"
for caracter in $(seq 1 ${1})
do
echo -n "-"
done
echo "·"
}
# Pedir ao usuário que digite um texto.
echo -n "Por favor, digite um texto singelo: "
read texto
# Calcula a quantidade de hífens nas linhas superior e inferior
HIFENS=$(expr $(echo -n ${texto} | wc -c) + 2)
# Escrever o resultado final
linha_de_hifens ${HIFENS}
echo "| ${texto} |"
linha_de_hifens ${HIFENS}
06/05
Um primeiro programa em shell script: criar usuário (e grupo).
#!/bin/bash
# Entrada
# - Criar usuário:
# - Nome completo
echo -n "Por favor, digite o nome completo do usuário: "
read nomeCompleto
# - Nome da conta
nomeDaConta=""
while [ "${nomeDaConta}" = "" ]
do
echo -n "Agora, digite o nome da conta: "
read nomeDaConta
REPETIDOS=$(cat /etc/passwd|cut -d : -f 1|grep ^${nomeDaConta}$|wc -l)
if [ "${REPETIDOS}" -ge "1" ]
then
echo "Usuário já existe. Tente novamente."
nomeDaConta=""
fi
done
# - Grupo
grupo=""
while [ "${grupo}" = "" ]
do
echo -n "Digite o nome do grupo principal: "
read grupo
done
# - Interpretador (shell script)
echo -n "Agora, digite o interpretador de comandos: "
read interpretador
# - Senha
#
# Processamento
# - Criar grupo, se necessário
groupadd ${grupo}
# - Criar usuário com os valores pessoais e incluir o usuário no grupo
useradd -g ${grupo} -c "${nomeCompleto}" -s ${interpretador} \
-d /home/${grupo}/${nomeDaConta} ${nomeDaConta}
passwd ${nomeDaConta}
# - Criar diretório pessoal
mkdir -p /home/${grupo}/${nomeDaConta}
# - Atribuir as propriedade e permissões do diretório
chown root /home
chgrp root /home
chmod 755 /home
chown root /home/${grupo}
chgrp ${grupo} /home/${grupo}
chmod 750 /home/${grupo}
chown ${nomeDaConta} /home/${grupo}/${nomeDaConta}
chgrp ${grupo} /home/${grupo}/${nomeDaConta}
chmod 700 /home/${grupo}/${nomeDaConta}
#
# Saída
# - Mostrar o grupo criado E mostrar o usuário criado
echo "Informações da conta (incluindo grupo):"
id ${nomeDaConta}
# - Mostrar o diretório criado com as permissões
echo "Propriedade e permissões dos arquivos e diretórios:"
ls -la /home/${grupo}
27/05
Formas de pagamento?
#!/bin/bash
calcula_parcela()
{
if [ "${2}" = "" ]
then
echo -n "Por favor, informe o valor do produto: "
read valor
echo -n "Agora, a quantidade de parcelas: "
read parcelas
else
valor=${1}
parcelas=${2}
fi
if [ "${parcelas}" = "1" ]
then
echo Valor final: $(echo "scale=2; ${valor} * 0.9"|bc)
fi
if [ "${parcelas}" -ge "2" -a "${parcelas}" -le "3" ]
then
echo Valores: 1 + $(echo "${parcelas} - 1"|bc) de $(echo "scale=2;${valor}/${parcelas}"|bc)
fi
if [ "${parcelas}" -ge "4" -a "${parcelas}" -le "36" ]
then
somatorio="0"
parcelaCorrente=$(echo "scale=2; ${valor} / ${parcelas}"|bc)
for mes in $(seq 1 ${parcelas})
do
parcelaCorrente=$(echo "scale=2; ${parcelaCorrente} * 1.0215"|bc)
somatorio=$(echo "scale=2; ${somatorio} + ${parcelaCorrente}"|bc)
echo "[${mes}: ${parcelaCorrente} - ${somatorio}]"
done
echo Parcela média é $(echo "scale=2; ${somatorio} / ${parcelas}"|bc)
fi
}
calcula_parcela ${1} ${2}
03/06
- Arquivo variaveis:
DOMINIO="tecnico.sj.ifsc.edu.br"
REDE_PREFIXO="192.168.1"
REDE="${REDE_PREFIXO}.0"
MASCARA="255.255.255.0"
ROTA_PADRAO="${REDE_PREFIXO}.1"
SERVIDOR1_NOME="mestre"
SERVIDOR1_IP="${REDE_PREFIXO}.100"
Arquivo configurador:
#!/bin/bash
. variaveis
interfaces(){
echo "auto lo"
echo "iface lo inet loopback"
echo "auto eth0"
echo "iface eth0 inet static"
echo " address ${SERVIDOR1_IP}"
echo " netmask ${MASCARA}"
echo " gateway ${ROTA_PADRAO}"
}
postfix(){
echo "myhostname=${SERVIDOR1_NOME}"
echo "mydomain=${DOMINIO}"
echo "myorigin=${DOMINIO}"
echo "mynetworks=${REDE}/${MASCARA}"
echo "mydestination=localhost, ${SERVIDOR1_NOME}, ${SERVIDOR1_NOME}.${DOMINIO}, ${DOMINIO}"
}
bind9(){
echo ""
}
echo "Configuração da rede: deseja apresentar na tela ou escrever no arquivo?"
echo "1) Tela"
echo "2) Arquivo"
read opcao
case ${opcao} in
"1")
interfaces
postfix
;;
"2")
interfaces > /etc/network/interfaces
postfix > /etc/postfix/main.cf
;;
*)
echo "Querido, escolha uma opção válida."
;;
esac
10/06
- Expansão dos serviços com DHCP. Arquivo variaveis:
DOMINIO="tecnico.sj.ifsc.edu.br"
REDE_PREFIXO="192.168.1"
REDE="${REDE_PREFIXO}.0"
MASCARA="255.255.255.0"
BROADCAST="${REDE_PREFIXO}.255"
ROTA_PADRAO="${REDE_PREFIXO}.1"
SERVIDOR1_NOME="mestre"
SERVIDOR1_IP="${REDE_PREFIXO}.100"
DHCP_INICIO="50"
DHCP_FIM="99"
- Arquivo configurador:
#!/bin/bash
. variaveis
interfaces(){
echo "auto lo"
echo "iface lo inet loopback"
echo "auto eth0"
echo "iface eth0 inet static"
echo " address ${SERVIDOR1_IP}"
echo " netmask ${MASCARA}"
echo " gateway ${ROTA_PADRAO}"
}
postfix(){
echo "myhostname=${SERVIDOR1_NOME}"
echo "mydomain=${DOMINIO}"
echo "myorigin=${DOMINIO}"
echo "mynetworks=${REDE}/${MASCARA}"
echo "mydestination=localhost, ${SERVIDOR1_NOME}, ${SERVIDOR1_NOME}.${DOMINIO}, ${DOMINIO}"
}
bind9(){
echo ""
}
dhcp(){
echo "subnet ${REDE} netmask ${MASCARA} {"
echo " range ${REDE_PREFIXO}.${DHCP_INICIO} ${REDE_PREFIXO}.${DHCP_FIM};"
echo " option subnet-mask ${MASCARA};"
echo " option broadcast-address ${BROADCAST};"
echo " option routers ${ROTA_PADRAO};"
echo " option domain-name-servers ${ROTA_PADRAO};"
echo " option domain-name ${DOMINIO};"
echo " default-lease-time 3600;"
echo " max-lease-time 14400;"
echo "}"
}
echo "Configuração da rede: deseja apresentar na tela ou escrever no arquivo?"
echo "1) Tela"
echo "2) Arquivo"
read opcao
case ${opcao} in
"1")
interfaces
postfix
dhcp
;;
"2")
interfaces > /etc/network/interfaces
postfix > /etc/postfix/main.cf
dhcp > /etc/dhcp/dhcpd.conf
;;
*)
echo "Escolha uma opção válida."
;;
esac
17/06
- Para esta aula, um problema interessante a resolver para a configuração de DNS: se a rede for classe cheia (classful network, A, B ou C), deve-se configurar também a zona reversa, caso contrário (classless network) emitir apenas um alerta de que se trata de CIDR.