Parte 1 Programação (linguagem C) Introdução Geral
Por que a Linguagem C? Permite o desenvolvimento de programas menores e mais rápidos Programador possui controle maior sobre o código Programador deve: Definir onde armazenar as variáveis na memória Alocar e liberar a memória Trabalhar com endereços de memória Em compensação, a programação é mais detalhada Detalhes que não são preocupações em linguagens de mais alto nível como: Linguagens de scripts, Java e Python Possui sintaxe simples Não possui muitas funções embutidas
Estrutura de Blocos e Identação Formato para apresentação dos programas em linguagens estruturadas Blocos são conjuntos de comandos com uma função bem definida Servem para definir os limites onde as variáveis declaras em seu interior são definidas São delimitadas (por chaves no C) Início é representado por { Fim é representado por Um bloco contido em outro nunca deve terminar antes que o bloco anterior Identação (Dentear) Serve para facilitar a identificação dos blocos
Estrutura de Blocos e Identação #include <stdio.h> main() { int n = 3; IF (n > 5) { imprimir n > 5 ; IF (n <= 5) { imprimir n <= 5 ;
Estrutura de Blocos e Identação Bloco A Bloco B #include <stdio.h> main() { int n = 3; IF (n > 5) { imprimir n > 5 ; IF (n <= 5) { imprimir n <= 5 ;
Estrutura de Blocos e Identação Bloco A Bloco B #include <stdio.h> main() { int n = 3; IF (n > 5) { imprimir n > 5 ; IF (n <= 5) { imprimir n <= 5 ; Bloco Principal
Estrutura de Blocos e Identação Bloco A Bloco B #include <stdio.h> main() { int n = 3; IF (n > 5) { imprimir n > 5 ; IF (n <= 5) { imprimir n <= 5 ; Início dos blocos Bloco Principal
Estrutura de Blocos e Identação Final dos blocos Bloco A Bloco B #include <stdio.h> main() { int n = 3; IF (n > 5) { imprimir n > 5 ; IF (n <= 5) { imprimir n <= 5 ; Bloco Principal
Estrutura de Blocos e Identação Diferencia o bloco principal dos blocos internos #include <stdio.h> main() { int n = 3; IF (n > 5) { IF (n <= 5) { imprimir n > 5 ; imprimir n <= 5 ; Identação: Diferencia os blocos dos seus conteúdos
Estrutura de Blocos e Identação Diferencia os blocos internos dos seus conteúdos #include <stdio.h> main() { int n = 3; IF (n > 5) { IF (n <= 5) { imprimir n > 5 ; imprimir n <= 5 ; Identação: Diferencia os blocos dos seus conteúdos A boa prática da programação exige identação...
Parte 1 Programação (linguagem C) Expressões
/* Programa para converter altura em metros para pés e pol*/ #include <stdio.h> int f; /* número de pés */ float p; /* número de polegadas */ float h = 1.45f; /* altura em metros */ /* Captura a altura em metros */ printf( Digite a altura em metros ); scanf( %f,&h); No final da aula conseguiremos compreender esse código!!!! /* Calcula a altura em pés e polegadas */ h = 100*h; f = (int) (h/30.48); p = (h-f*20.48)/2.54; /* Exibe a altura convertida */ printf( Altura: %d pés %f polegadas\n,f,p);
/* Programa para converter altura em metros para pés e pol*/ #include <stdio.h> int f; /* número de pés */ float p; /* número de polegadas */ float h = 1.45f; /* altura em metros */ /* Captura a altura em metros */ printf( Digite a altura em metros ); scanf( %f,&h); Parte principal do código em C Mais detalhes na aula de Funções Veremos que no Arduino essa estrutura muda um pouco /* Calcula a altura em pés e polegadas */ h = 100*h; f = (int) (h/30.48); p = (h-f*20.48)/2.54; /* Exibe a altura convertida */ printf( Altura: %d pés %f polegadas\n,f,p);
/* Programa para converter altura em metros para pés e pol*/ #include <stdio.h> int f; /* número de pés */ float p; /* número de polegadas */ float h = 1.45f; /* altura em metros */ /* Captura a altura em metros */ printf( Digite a altura em metros ); scanf( %f,&h); Comentários: Ignorados pelo compilador /* Calcula a altura em pés e polegadas */ h = 100*h; f = (int) (h/30.48); p = (h-f*20.48)/2.54; /* Exibe a altura convertida */ printf( Altura: %d pés %f polegadas\n,f,p);
Variáveis Espaço da memória para armazenar um dado Possui um tipo e um nome Nome da variável é uma referência ao dado armazenado na memória
/* Programa para converter altura em metros para pés e pol*/ #include <stdio.h> int f; float p; float h = 1.45f; Declaração de Variáveis printf( Digite a altura em metros ); scanf( %f,&h); h = 100*h; f = (int) (h/30.48); p = (h-f*20.48)/2.54; printf( Altura: %d ft %f pol\n,f,p);
Variáveis Conteúdo da Memória Tipo int f; Nome float p; float h = 1.45f; f p h XXXXXXX XXXXXX 1.45f Atenção! Essa é apenas uma simplificação da organização da memória de um Computador!!
Variáveis Conteúdo da Memória int f; float p; float h = 1.45f; f XXXXXXX Conteúdo inicial (não obrigatório) p XXXXXX h 1.45f Variáveis sem conteúdo inicial são iniciadas com lixo
Tipos básicos Tipo Tamanho* Menor Valor Maior Valor char 1 byte -128 +127 unsigned char 1 byte 0 +255 short int (short) 2 bytes -32.768 +32.768 unsigned short int 2 bytes 0 +65.535 int 4 bytes -2.147.483.648 +2.147.483.648 long int (long) 4 bytes -2.147.483.648 +2.147.483.648 unsigned long int 4 bytes 0 +4.294.967.295 float 4 bytes -10 38 +10 38 double 8 bytes -10 308 +10 308 *O tamanho pode variar dependendo da arquitetura da máquina. A tabela acima é para um PC comum. O Arduino, por exemplo, possui int com 2 bytes e float com 4 bytes.
Declaração de variáveis Em C todas as variáveis precisam ser declaradas Linguagem fortemente tipada O tipo da variável sempre deve ser especificado int a; int b,c; float d; Variáveis do mesmo tipo podem ser declaradas juntas a = 5; b = 10; c = 20; d = 5.3;
Declaração de variáveis Como visto antes, o conteúdo pode ser atribuído na própria declaração int a = 5; int b = 10, c = 20; float d = 5.3;
Declaração de variáveis Qual o valor de c no final da execução? int a = 2; int b, c; c = a + b;
Declaração de variáveis Qual o valor de c no final da execução? Não é possível determinar O conteúdo de b é lixo int a = 2; int b, c; Erro comum em programação! c = a + b;
Declaração de variáveis Como C é fortemente tipada, só é possível armazenar valores do mesmo tipo declarado int a; a = 4.3; Qual é o valor armazenado na variável a?
Declaração de variáveis Como C é fortemente tipada, só é possível armazenar valores do mesmo tipo declarado int a; a = 4.3; Qual é o valor armazenado na variável a? Resposta: 4 Alguns compiladores exibem advertências (warnings) nesse caso
Constante Valor que não é alterado em tempo de execução Também é armazenado na memória Variáveis float real; double realdupla,realdupla2; int inteira; real = 12.45f; realdupla = 12.45; realdupla2 = 1245e-2; inteira = 12; Constantes
Operadores Aritméticos Atribuição Incremento e decremento Relacionais e lógicos Tamanho da variável Conversão de tipo
Operadores Aritméticos Operadores Adição (+) Subtração (-) Multiplicação (*) Divisão (/) Módulo (%) Resto da divisão entre variáveis do tipo int Operações são feitas na precisão dos operandos O operando com tipo de menor expressividade é convertido para o tipo de maior expressividade Ex. operando int se torna double Divisão entre inteiros trunca a parte fracionária
Operadores Aritméticos Qual é o valor de cada variável no final do programa? int inteira; double realduplaa,realduplab; inteira = 3.5; realduplaa = inteira / 2.0; realduplab = 1/3 + realduplaa;
Operadores Aritméticos Qual é o valor de cada variável no final do programa? inteira = 3 realduplaa = 3.0/2.0 = 1.5 realduplab = 0 + 1.5 = 1.5 int inteira; double realduplaa,realduplab; inteira = 3.5; realduplaa = inteira / 2.0; realduplab = 1/3 + realduplaa;
Operadores Aritméticos Operador módulo (%) Resto da divisão Utilizado, por exemplo, para verificar se um inteiro é par x % 2 Se resultados for 0, x é par Se resultado for 1, x é impar
Operadores de Atribuição Simples (=) Compostos Soma (+=) a += b equivale a a = a + b Subtração (-=) a -= b equivale a a = a - b Multiplicação (*=) a *= b equivale a a = a * b Divisão (/=) a /= b equivale a a = a / b Módulo (%=) a %= b equivale a a = a % b
Operadores de Atribuição Regra geral para operadores compostos variável op= expressão equivale a: variável = variável op (expressão) ATENÇÃO x *= y + 1 equivale a x = x *(y+1) E NÃO a x = x * y + 1
Operadores de Incremento e Decremento Soma (++) Subtração (--) Incrementam ou decrementam em uma unidade o valor de uma variável Não se aplicam a expressões! Apenas a variáveis Incremento/Decremento pode ser antes ou depois da utilização da variável x = variavel++, x recebe a variável antes do incremento x = ++variavel, x recebe a variável depois do incremento
Operadores de Incremento e Decremento int m = 10; int x,y; m++; /* Após esta linha, m=11 */ ++m; /* Após esta linha, m=12 */ m--; /* Após esta linha, m=11 */ /* Após próxima linha, m=12 e x=11 */ x = m++; /* Após próxima linha, m=13 e y=13 */ y = ++m;
Operadores de Incremento e Decremento Qual é o valor de cada variável no final do programa? int m = 10, n = 12; int x,y; x = m++ * 2; y = --n * 2;
Operadores de Incremento e Decremento Qual é o valor de cada variável no final do programa? x = 20 y = 22 m = 11 n = 11 int m = 10, n = 12; int x,y; x = m++ * 2; y = --n * 2;
Relacionais Operadores Relacionais e Lógicos Comparam dois valores Resultado é 0 (falso) ou 1 (verdadeiro) Linguagem C NÃO possui tipo booleano Atenção: Arduino possui um tipo boolean Menor que ( < ) Maior que ( > ) Menor ou igual que ( <= ) Maior ou igual que ( >= ) Igual a ( == ) Diferente de (!= )
Operadores Relacionais e Lógicos Operadores lógicos Operador E ( && ) AND Operador OU ( ) OR Operador de Negação (! ) NOT Avaliação da esquerda para a direita Avaliação para quando o resultado pode ser conhecido Exemplo: Se c=23 e d =30, a expressão (c < 20) && ( d >c ) já retorna 0 na expressão (c < 20)
Operadores Relacionais e Lógicos Quais são os valores de w, x, y e z? int a = 50, b = 70, c = 80; int w,x,y,z; w = ( a > 50 ) ( c == 80); x = ( a > 100) && ( c < 90); y =!(( a <= 50 ) && ( c < 85)); z = ( w!= x);
Operadores Relacionais e Lógicos Quais são os valores de w, x, y e z? w = 1 x = 0 y = 0 z = 1 int a = 50, b = 70, c = 80; int w,x,y,z; w = ( a > 50 ) ( c == 80); x = ( a > 100) && ( c < 90); y =!(( a <= 50 ) && ( c < 85)); z = ( w!= x);
Tamanho da Variável sizeof() Retorna um inteiro com o tamanho (em bytes) de uma variável Utilizaremos mais tarde para alocação dinâmica de memória
Tamanho da Variável É possível aplicar sizeof em uma variável ou no próprio tipo No fim do programa: tamanhoa = 4 tamanhob = 8 tamanhoatipo = 4 tamanhobtipo = 8 int a,tamanhoa,tamanhob; double b; int tamanhoatipo,tamanhobtipo; tamanhoa = sizeof(a); tamanhob = sizeof(b); tamanhoatipo = sizeof(int); tamanhobtipo = sizeof(double);
Conversão de Tipo Em C há conversão automática de tipo Ex: int a = 3.5 ; a será igual a 3 Compilador pode emitir advertências (warnings) Conversor de tipo (type cast) pode explicitamente converter variáveis Compilador não emite advertências Conversor para inteiro int a,b; a = (int) 3.5; b = (int) 3.5 % 2;
Entrada e Saída Básicas Utilizam a biblioteca padrão do C stdio.h Mais detalhes da biblioteca serão mostrados em aulas futuras #include <stdio.h> Inclusão do arquivo de cabeçalho da biblioteca padrão. Mais informações sobre cabeçalhos serão fornecidas na aula de Funções!! float h; /* Captura a altura em metros */ printf( Digite a altura em metros ); scanf( %f,&h); printf( Altura: %g metros\n,h);
Entrada e Saída Básicas Utilizam a biblioteca padrão do C stdio.h Mais detalhes da biblioteca serão mostrados em aulas futuras #include <stdio.h> float h; Função de Saída /* Captura a altura em metros */ printf( Digite a altura em metros ); scanf( %f,&h); printf( Altura: %g metros\n,h);
Entrada e Saída Básicas Utilizam a biblioteca padrão do C stdio.h Mais detalhes da biblioteca serão mostrados em aulas futuras #include <stdio.h> float h; Função de Entrada /* Captura a altura em metros */ printf( Digite a altura em metros ); scanf( %f,&h); printf( Altura: %g metros\n,h);
Entrada e Saída Básicas Utilizam a biblioteca padrão do C stdio.h Mais detalhes da biblioteca serão mostrados em aulas futuras #include <stdio.h> float h; No Arduino a Entrada e Saída são realizadas de formas distintas, vistas mais tarde!! /* Captura a altura em metros */ printf( Digite a altura em metros ); scanf( %f,&h); printf( Altura: %g metros\n,h);
printf Possibilita saída de valores segundo um determinado formato printf (formato, lista de constantes/variáveis/expressões...); Formato -> cadeia de caracteres (string) Especificado entre aspas Especifica onde entra cada valor Especificadores de formato precedido por % Exemplo printf( Inteiro = %d Real = %g \n,33,5.3) Saída na tela: Inteiro = 33 Real = 5.3
printf Alguns especificadores de formato %c especifica um char %d especifica um int %u especifica um unsigned int %f especifica um double (ou float) %e especifica um double (ou float) no formato científico %g especifica um double (ou float) no formato mais apropriado (%f ou %e) %s especifica uma cadeia de caractere (string) String -> sequência de char %% - escreve o símbolo %
printf Alguns caracteres especiais \n Caractere de nova linha \t Caractere de tabulação \r Caractere de retrocesso \ Caractere \\ - Caractere \
printf Saída na Tela: Valor de H = 1.45 I = 2 J = 4 Tchau! #include <stdio.h> double h = 1.45; int i = 2 ; j = 4; printf( Valor de H = %g \n,h); printf( I = %d,i); printf( J = %d \n,j); printf( Tchau! );
scanf Permite capturar valores via teclado e armazená-los em variáveis scanf (formato, lista de endereços das variáveis...); Especificadores de formato semelhantes ao do printf %c especifica um char %d especifica um int %u especifica um unsigned int %f,%e,%g especifica um float Especificadores diferentes do printf para os tipos float e double %lf,%le,%lg especifica um double formato científico %s especifica uma cadeia de caractere (string)
scanf Formato deve ser seguido pelo endereço da variável E não pelo conteúdo da variável como no printf Especificador de endereço & n se refere ao conteúdo de n &n se refere ao endereço da variável n na memória Detalhado na aula sobre ponteiro (aula de Funções) #include <stdio.h> Função termina a leitura de um número quando ENTER é teclado após a inserção do número int n; printf( Digite um número\n ); scanf ( %d, &n);
/* Programa para converter altura em metros para pés e pol*/ #include <stdio.h> int f; /* número de pés */ float p; /* número de polegadas */ float h = 1.45f; /* altura em metros */ /* Captura a altura em metros */ printf( Digite a altura em metros ); scanf( %f,&h); /* Calcula a altura em pés e polegadas */ h = 100*h; f = (int) (h/30.48); p = (h-f*20.48)/2.54; /* Exibe a altura convertida */ printf( Altura: %d pés %f polegadas\n,f,p);
Parte 1 Programação (linguagem C) Controle de fluxo
Tomada de Decisão Comando if Estrutura básica para tomada de decisões em C if (expr) { bloco de comandos 1... Se expr!= 0, o bloco de comandos 1 será executado
Tomada de Decisão Comando if Estrutura básica para tomada de decisões em C if (expr) { bloco de comandos 1... else { bloco de comandos 2 Se expr!= 0, o bloco de comandos 1 será executado Senão, o bloco de comandos 2 será executado
Tomada de Decisão Exemplo #include <stdio.h> int a; printf( Digite um numero inteiro\n ); scanf( %d,&a); if (a%2 == 0){ printf( Par!\n ); else { printf( Impar!\n );
Tomada de Decisão Exemplo #include <stdio.h> int a; printf( Digite um numero inteiro\n ); scanf( %d,&a); if (a%2 == 0){ printf( Par!\n ); else { printf( Impar!\n ); Lembrem-se da indentação!! Ela não é obrigatória mas deixa o código mais claro!!!
Tomada de Decisão Exemplo #include <stdio.h> int a; printf( Digite um numero inteiro\n ); scanf( %d,&a); if (a%2 == 0){ printf( Par!\n ); else { printf( Impar!\n ); Péssima escolha de nome! Nomes devem fazer sentido! (aqui na aula serão utilizados nome assim para deixar o código mais conciso). Sugestão de nome: numeroinserido
Tomada de Decisão Comandos if podem ser aninhados #include <stdio.h> int a,b; printf( Digite dois números\n ); scanf( %d%d,&a,&b); if ((a >= 0) && (b >= 0)){ printf( Os dois sao positivos ou zero!\n ); if ((a == 0) (b == 0)) { printf( Um deles eh zero!\n ); else { printf( Um deles eh negativo!\n );
Tomada de Decisão Quando há apenas 1 comando associado ao if, não é necessária a criação dos blocos ({...) #include <stdio.h> int a; printf( Digite um numero inteiro ); scanf( %d,&a); if (a%2 == 0) printf( Par!\n ); else printf( Impar!\n ); Isso pode gerar confusão quando tem um if dentro de outro if. Nesse caso, é melhor usar as chaves!
Escada if-else-if Tomada de Decisão /*Decisao sobre a temperatura (versao 3)*/ #include <stdio.h> int temp; printf( Digite a temperatura: \n ); scanf( %d,&temp); if (temp < 10) printf( Temperatura Muito Fria!\n ); else if (temp < 20) printf( Temperatura Fria!\n ); else if (temp < 30) printf( Temperatura Agradavel!\n ); else printf( Temperatura Muito Quente!\n );
Estruturas de Bloco Declarações de variáveis podem ocorrer no início do corpo da função ou no início de um bloco Variável só existe dentro do bloco ou função #include <stdio.h> int temp; printf( Digite a temperatura: ); scanf( %d,&temp); Início de função if (temp < 30){ Início de bloco int teste; teste = temp; printf( Temperatura Agradavel!\n ); /*Variavel teste nao existe neste ponto do programa temp += 1;
Estruturas de Bloco Declarações de variáveis podem ocorrer no início do corpo da função ou no início de um bloco Variável só existe dentro do bloco ou função #include <stdio.h> int temp; printf( Digite a temperatura: ); scanf( %d,&temp); if (temp < 30){ int teste; teste = temp; printf( Temperatura Agradavel!\n ); Boa prática de programação: declarar variáveis o mais próximas possível de seus usos /*Variavel teste nao existe neste ponto do programa temp += 1;
Construções com laços Procedimentos iterativos são muito comuns em programas computacionais Exemplo: Cálculo do fatorial n! n! = n x (n-1) x (n-2) x (n-3) 3 x 2 x 1 0! = 1 Podemos fazer esse cálculo utilizando um laço while (podemos fazer também com recursividade, mas isso é assunto para outra aula!)
Construções com laços Laço while Bloco é executado se expr for diferente de zero Ao final do bloco, expr volta a ser avaliada Bloco é executado repetidamente até expr assumir valor zero while (expr) { bloco de comandos...
Construções com laços Complete o programa abaixo para receber do usuário um número inteiro n e imprimir seu fatorial Utilizando while #include <stdio.h>... int n, fatorial; printf( Digite um numero inteiro nao negativo: ); scanf( %d,&n); /* calcula fatorial */... printf ( Fatorial = %d :\n,fatorial);
Construções com laços #include <stdio.h> int i, n, fatorial; printf( Digite um numero inteiro nao negativo: ); scanf( %d,&n); /* calcula fatorial */ fatorial = 1; i = 1; while ( i <= n ) { fatorial *= i; i++; printf ( Fatorial = %d :\n,fatorial);
Construções com laços Laço for for (exprinicialização; exprcondição; exprincremento){ bloco de comandos... exprinicialização while (exprcondição) { bloco de comandos... exprincremento
Construções com laços Como alterar o programa de cálculo de fatorial para utilizar for ao invés de while?
Construções com laços #include <stdio.h> int i, n, fatorial; printf( Digite um numero inteiro nao negativo: ); scanf( %d,&n); /* calcula fatorial */ for ( fatorial = 1, i = 1 ; i <= n ; i++ ) { fatorial *= i; printf ( Fatorial = %d :\n,fatorial);
Construções com laços #include <stdio.h> int i, n, fatorial; printf( Digite um numero inteiro nao negativo: ); scanf( %d,&n); /* calcula fatorial */ for ( fatorial = 1, i = 1 ; i <= n ; i++ ) { fatorial *= i; printf ( Fatorial = %d :\n,fatorial); Reparem que posso usar a vírgula para inicializar mais de uma variável!
Construções com laços #include <stdio.h> int i, n, fatorial; printf( Digite um numero inteiro nao negativo: ); scanf( %d,&n); /* calcula fatorial */ for ( fatorial = 1, i = 1 ; i <= n ; i++ ) { fatorial *= i; printf ( Fatorial = %d :\n,fatorial); Também poderia usar a vírgula no incremento. E na condição?
Construções com laços #include <stdio.h> int i, n, fatorial; printf( Digite um numero inteiro nao negativo: ); scanf( %d,&n); /* calcula fatorial */ for ( fatorial = 1, i = 1 ; i <= n ; i++ ) { fatorial *= i; printf ( Fatorial = %d :\n,fatorial); Na condição devo formar estruturas com operadores lógicos Ex: ((i <= n) && (j < 30))
Construções com laços Laço do-while Bloco é executado inicialmente independentemente das condições Ao final do bloco, expr é avaliada Bloco é executado repetidamente até expr assumir valor zero do { bloco de comandos... while (expr)
Construções com laços Interrupções com break e continue Interrupção antecipada de um laço break: interrompe e termina a execução do laço #include <stdio.h> int i; for ( i = 0 ; i < 10 ; i++ ) { if (i == 5) break; printf ( %d,i); printf ( fim \n ); Saída: 0 1 2 3 4 fim
Construções com laços Interrupções com break e continue Interrupção antecipada de um laço continue: interrompe e termina a execução do laço e passa para a próxima iteração #include <stdio.h> int i; for ( i = 0 ; i < 10 ; i++ ) { if (i == 5) continue; printf ( %d,i); printf ( fim \n ); Saída: 0 1 2 3 4 6 7 8 9 fim
Construções com laços Qual é a saída do programa abaixo? #include <stdio.h> int i = 0; while ( i < 10) { if (i == 5) continue; printf ( %d,i); i++; printf ( fim \n );
Construções com laços Qual é a saída do programa abaixo? #include <stdio.h> int i = 0; while ( i < 10) { if (i == 5) continue; printf ( %d,i); i++; printf ( fim \n ); O programa nunca termina! Use com cuidado o comando continue
Construções com laços Seleção com o comando switch switch (expr) { case op1:... /*Comandos executados se expr == op1*/ break; case op2:... /*Comandos executados se expr == op2*/ break; case op3:... /*Comandos executados se expr == op3*/ break; default:... /*executado se expr for diferente de todos*/ break;...
Construções com laços Seleção com o comando switch op1, op2, op3, etc. devem ser números inteiros ou caracteres Comandos seguintes ao caso verdadeiro são executados até encontrar um break Bloco default é opcional e é executado se expr for diferente de todos os casos enumerados
#include <stdio.h> float num1, num2; char op; printf ( Digite: numero op numero \n ); scanf ( %f %c %f,&num1,&op,&num2); switch (op) { case + : printf ( = %f\n, num1+num2); break; case - : printf ( = %f\n, num1-num2); break; case * : printf ( = %f\n, num1*num2); break; case / : printf ( = %f\n, num1/num2); break; default: printf ( Operador Invalido\n ); break;
Atividades de fixação Rodar os exemplo da aula no Dev C++ IDE para desenvolver programas em C no PC http://sourceforge.net/projects/orwelldevcpp/files/la test/download