Mostrando postagens com marcador Programação. Mostrar todas as postagens
Mostrando postagens com marcador Programação. Mostrar todas as postagens

O que é Engenharia de Software

  

O que é Engenharia de Software e sua aplicação na praitca

Segundo Lobo (2008), a Engenharia de Software é uma ciência que estuda metodologias e padrões de desenvolvimento de softwares, onde define os métodos sistemáticos para o desenvolvimento de software, buscando melhorar e amadurecer técnicas e ferramentas no ambiente de desenvolvimento.

Já Pressman (2006) diz que a Engenharia de Software é uma abordagem sistemática e disciplinada para o desenvolvimento do software. A preocupação com todas as fases de produção do software é sempre presente, desde o estágio inicial de desenvolvimento, como a especificação do sistema, até a manutenção realizada logo após o software entrar em funcionamento.

Sommerville (2003) afirma que a Engenharia de Software é uma

disciplina da engenharia que ocupa de todos os aspectos da produção de software, desde os estágios iniciais

da especificação do sistema até a sua manutenção, depois que ele iniciou sua operação de funcionamento.

A principal diferença entre a Ciência da Computação e a Engenharia de Software é que a Ciência da Computação preocupa-se com métodos básicos ligados aos computadores e aos sistemas de software, já a Engenharia de Software preocupa-se com os problemas práticos do desenvolvimento do software. É fundamental para o engenheiro de software ter um conhecimento sobre Ciências da Computação.

Sistemas Computacionais

Sistemas Computacionais com enfoque simplificado


Conceitos básicos


Nos anos 40, iniciou-se a evolução dos sistemas   computadorizados.   Os   custos eram concentrados no desenvolvimento do hardware, devido às limitações encontradas na época. Já nos anos 50, à medida que a tecnologia de hardware foi sendo dominada, passaram a se concentrar no desenvolvimento dos sistemas operacionais, onde surgiram os primeiros sistemas e as linguagens de alto nível, como FORTRAN, COBOL e de seus respectivos compiladores. Na época, a ideia era poupar o usuário cada vez mais de se preocupar com o funcionamento interno da máquina, podendo assim concentrar todos seus esforços na resolução de problemas computacionais ao invés de preocupar-se com os problemas de

funcionamento de hardware, ficando esse para uma pessoa especializada.

No início dos anos 60, os sistemas com características de multiprogramação surgiram e a eficiência e utilidade dos sistemas computacionais tiveram um grande avanço, contribuindo de forma significativa para as constantes quedas de preço do Hardware. Esse avanço se deu pela necessidade cada vez maior de desenvolver sistemas de software de grande porte para substituir os pequenos programas aplicativos utilizados até então. Desta necessidade, surgiu um grande problema, decorrente da falta de experiência e à não adequação dos métodos de desenvolvimento existente para pequenos programas, a “crise do software”, dando início ao processo de nascimento do termo “Engenharia de Software”.

O que é Software?

Quando se pensa em software, vem logo o pensamento de que é um programa de computador. No entanto, software envolve além do programa, toda documentação e configuração para que o software funcione corretamente.

O software consiste de vários programas separados como:

Arquivos de configurações de programas;

A descrição da estrutura do sistema em uma documentação clara;

A descrição que explica a utilização do sistema ao usuário.

Os produtos de Software se dividem em dois:

Produtos Genéricos: São sistemas do tipo Stand-Alone onde os programas não precisam de interpretador e uma vez compilado gera um executável. São produzidos por uma empresa especializada em softwares e vendidos no mercado. Muitos desses produtos podem ser chamados de Pacote de Software e temos como exemplo as Planilhas Eletrônicas, os processadores de texto, ferramenta de gerenciamento de projeto, entre outras.

Produtos sob encomenda ou personalizados: Na visão de Sommerville (2009), os produtos sob encomenda são sistemas encomendados pelo cliente e desenvolvido por uma empresa especialmente para aquele cliente.

Uma das diferenças entre os produtos genéricos e sob encomenda é que nos genéricos quem define a especificação do software é a própria empresa que desenvolve.

O software sob encomenda e a especificação do produto é definido por quem está comprando o software. Segundo Pressman (2006), existem sete categorias de software de computadores que apresentam desafios

para os Engenheiros de Software:

Software de Sistemas: Conjunto de programas feito para servir a outros programas. Alguns exemplos são os editores, compiladores, entre outros.

Software de Aplicação: São programas isolados, voltados para uma tarefa específica do negócio. É

utilizado para processar dados comerciais ou técnicos e também para controlar funções de tempo real.

Software científico e de Engenharia: Antes esses eram caracterizados por Algoritmos “Number Crunching” onde processam números. Vão da Astronomia à Vulcanologia, da Biologia Molecular à Manufatura Automatizada.

Software Embutido: Encontra-se dentro de um sistema feito para implementar e controlar características e funções para o usuário final e para o próprio sistema. Este tipo de software pode ser utilizado para realizar funções limitadas, como por exemplo, o controle do teclado de uma geladeira, ou fornecer uma função significativa, como por exemplo as funções digitais em um automóvel (controle de combustível).

Software para linhas de produtos: Software específico, utilizado por diversos clientes, podendo ser utilizado num mercado limitado, como o controle de estoque, ou direcionado para os usuários em massa, como planilhas, processadores de textos, gestão de banco de dados, entre outros.

Aplicações Web: Cobrem várias aplicações. Um exemplo são as aplicações de comércio eletrônico. Podem

ou não ser interligados a banco de dados de empresas e às aplicações de negócios.

Software para Inteligência Artificial: Usa-se algoritmos não-numéricos para resolver problemas complexos. Alguns exemplos são a robótica, reconhecimento de padrões (de voz e imagem), jogos e provas de teoremas.

 Mitos e Realidade

Um mito é uma construção de algo que foi idealizado anteriormente e que não tenha nenhuma comprovação prática. Diversos mitos serão citados, tanto para gerência responsável, dos clientes que encomendam e compram o software, como também dos desenvolvedores dos softwares.

Os mitos são crenças sobre os softwares e sobre o processo usado para construí-los. Essas crenças são uma construção mental de algo que foi idealizado, porém não se tem comprovação prática. Hoje a maioria dos profissionais especializados em Engenharia de Software reconhece os mitos pelo que eles são, atitudes enganosas que causam sérios problemas tanto para os gerentes quanto para o pessoal técnico.

Os gerentes responsáveis pelos softwares, como também de outras áreas, trabalham diariamente sobre pressão para seguir orçamentos, manter cronogramas dentro do prazo e melhorar a qualidade.

Para diminuir a pressão, esses gerentes se agarram a mitos existentes que são descritos por Pressman (2006). São eles:

Mito

Já temos um livro que está cheio de padrões e procedimentos para elaborar o software, isso não fornece ao meu pessoal tudo o que ele precisa saber?

Realidade

Os livros com os padrões pode até existir, mas ele é utilizado pelos profissionais? Eles sabem da existência

dessa documentação? Estão incluídas as práticas modernas da Engenharia de Software? É adaptável?

Completo? É desenvolvido para melhorar o prazo de entrega, mantendo a qualidade do software? Na maioria das vezes a resposta é não.

Mito

Caso atrase a entrega, pode-se adicionar mais programadores e ficar em dia com o projeto?

Realidade

Caso isso ocorra o projeto atrasará ainda mais, sobretudo devido a necessidade de haver um treinamento especializado e com isso tendo que parar o seu desenvolvimento.

Um cliente pode ser uma empresa ou então uma pessoa que encomendou o software sob um contrato definido. Normalmente, alguns mitos são levados em consideração pelo cliente, pois há falta de informações mais claras sobre o desenvolvimento do software por parte do gerente ou dos profissionais de software. Esses mitos levam o cliente a ter expectativas falsas quanto ao desenvolvimento gerando insatisfação. Dentre os mitos e realidade do cliente conheça alguns:

Mito

Definir um objetivo geral para a criação de um software é o suficiente. Os detalhes poderão ser mostrados

posteriormente.

Realidade

A definição inicial do projeto quando não é bem definida, acaba levando o projeto ao fracasso. É de grande importância que a descrição do projeto seja elaborada e bem definida logo no início. Suas funcionalidades, o comportamento, as restrições do projeto os critérios de validação são de extrema importância para o desenvolvimento.

Já dentre os mitos e realidade dos profissionais, alguns são citados a seguir:

Mito

Depois de toda a edição do programa e o início de seu funcionamento, o trabalho está concluído.

Realidade

De 50% a 70% do esforço de desenvolvimento de um software é realizado após a sua entrega ao cliente, onde é conhecido como manutenção do mesmo.

Mito

Não é possível ter uma avaliação sobre o software antes de seu funcionamento.

Realidade

A preocupação com a garantia do software está ligada a todas as fases do desenvolvimento. Antes do produto chegar ao seu estado funcional, os testes já podem ser iniciados com o planejamento dos casos de teste.

Mito

Ao final do projeto o produto a ser entregue é o programa funcionando.

Realidade

Um dos componentes de software é o programa em funcionamento. Um bom projeto é realizado pela produção de um conjunto de importantes documentos. Um software sem uma boa documentação pode ser tão ruim quanto um que não seja não funcional.

Fonte: Bellaguarda, Marcelo Figueiredo. Princípios de engenharia de software / Marcelo Belaguarda. – Mossoró : EdUFERSA, 2015.

Manual Geral Jogo tal

 

jogos

Conceito: O jogador deve examinar objetos espalhados pelos cenários para encontrar pistas e/ou conhecer a fundo a história, deve fugir e se esconder dos inimigos, pois a protagonista se trata de uma pessoa simples e sem habilidades de combate.

Propósito: Descobrir o que está acontecendo com a cidade, porque a protagonista se encontra em local desconhecido e porque criaturas vagam pelo local.

Aspectos Gerais

Um jogo de terror de sobrevivência em primeira pessoa, onde o jogador deve sobreviver até desvendar os acontecimentos nos locais do jogo.

Panorama principal:

O jogo fundamenta-se em vários cenários, no estilo terror, suspense e drama, cenários que consistem em casas, ruas, florestas, cabanas, praia, edifícios, enfim, locais que se fundamenta em um protótipo de uma cidade e terá dicas para ajudar o jogador no momento em que joga IMU.

A protagonista chama-se Fulano, uma pessoa comum, profissão atendente de loja, , filha de Antônio, profissão motorista e Olga, profissão aposentada, tem muito medo do desconhecido e coisas fora do normal, inteligente, bem humorada, determinada e organizada.

Os inimigos consistem em criaturas deformadas que se movimentam lentamente ou rapidamente quer percebe a presença da protagonista, as criaturas atacam quando se aproximam da personagem causando assim dano de vida e se chegar a 0 é o fim de jogo e você recomeça do último ponto de salvamento.

O tempo médio do jogo é de 00:00min

Trama do jogo

Enredo:

Jogo tal: Se passa em tempo moderno (ano 2017), começa na casa da protagonista, o jogador passará por vários locais comuns a uma cidade

Protagonista: Tem um passado conturbado por causa da sua mãe que vive mau tratando ela, muitas vezes por nada ou com ciúmes do próprio pai, mas que devido aos maus tratos da sua família precisou abandonar os estudos para manter seu próprio sustento.

Objetos do jogo

Personagens:

Fulano tal: Extremamente frágil, tem medo do escuro e do desconhecido, inteligente, brincalhona, determinada e organizada.

Objetos inanimados:

Lanterna: Serve para iluminar áreas muito escuras, não possui função de descarregar, luz branca, o jogador pode desligar e ligar, possui sons.

Objetos secundários: Espalhados pelos cenários com intuito de dificultar o progresso do jogador ou não, o jogador pode interagir bem como movimentar estes objetos para descobrir pistas e/ou objetos ocultos necessários para continuação do jogo, bem como descobrir sua história.

Inteligência artificial

O jogo tem inteligência artificial limitada, com os seguintes parâmetros:

As criaturas sentem a presença da protagonista e o mesmo a perseguirá com objetivo de matá-la.

Fluxo do jogo

O jogador controla um personagem FPS com características semelhantes à de um ser humano do mundo real.

Controles

Controles do teclado

Pressione as teclas W,S,A,D para movimentar o personagem;

Pressione a BARRA DE SPAÇO para pular;

Pressione a tecla SHIFT ESQUERDA para correr;

Pressione a tecla E para dar zoom na visão do protagonista;

Pressione a tecla F para ligar e desligar a lanterna;

Pressione a tecla H para salvar automaticamente seu jogo;

Pressione a tecla L para carregar seu jogo desde o último ponto de salvamento;

Pressione a tecla P para tocar ou parar a trilha sonora do jogo;

Controles do mouse

Movimente o mouse ou pressione o botão esquerdo do mouse para selecionar as opções do “menu principal” e menu de “jogo parado”

Pressione o botão esquerdo do mouse para interagir com objetos;

Pressione o botão direito do mouse para se agachar;

Pressione e segure o botão esquerdo do mouse em um objeto que possa interagir para movimentá-lo;

Pressione o botão do meio do mouse para lançar um objeto;

Deslize o botão do central do mouse para cima e/ou para baixo para aplicar zoom no objeto;

Pressione e segure a tecla R enquanto segura um objeto para rotacionar;

Modos de jogo

Apenas 1 jogador

Qualidade Gráfica

a. Max. fluidez:

Número máximo de pixels de luz que ascende: 0

Qualidade da textura: Metade da resolução

Texturas anisitrópicas: Desativadas

Anti-serrilhado: OBS.: Não há necessidade

Resolução da sombra: Desativada

Projeção da sombra: Desativada

Cascata da sombra: Desativada

Distância da sombra: 0

Sombra, plano, deslocamento: 0

Pesos de mistura: 1

Contagem VSync: Desativada

LOD Bias: 50

Nível máximo de LOD: 0

Raycast da partícula: 1

Envio da Async: 1

Tamanho do envio Async: 2

Muita fluidez:

Número máximo de pixels de luz que ascende: 0

Qualidade da textura: Metade da resolução

Texturas anisitrópicas: Desativadas

Anti-serrilhado: OBS.: Não há necessidade

Resolução da sombra: Desativada

Projeção da sombra: Desativada

Cascata da sombra: Desativada

Distância da sombra: 0

Sombra, plano, deslocamento: 0

Pesos de mistura: 1

Contagem VSync: Desativada

LOD Bias: 50

Nível máximo de LOD: 0

Raycast da partícula: 30

Envio da Async: 1

Tamanho do envio Async: 2

Fluido:

Número máximo de pixels de luz que ascende: 0

Qualidade da textura: Metade da resolução

Texturas anisitrópicas: Desativadas

Anti-serrilhado: OBS.: Não há necessidade

Resolução da sombra: Baixa resolução

Projeção da sombra: Ajuste estável

Cascata da sombra: Desativada

Distância da sombra: 6

Sombra, plano, deslocamento: 1

Pesos de mistura: 2

Contagem VSync: Desativada

LOD Bias: 50

Nível máximo de LOD: 0

Raycast da partícula: 100

Envio da Async: 1

Tamanho do envio Async: 2

Razoável:

Número máximo de pixels de luz que ascende: 1

Qualidade da textura: Resolução total

Texturas anisitrópicas: Forçada

Anti-serrilhado: OBS.: Não há necessidade

Resolução da sombra: Resolução média

Projeção da sombra: Ajuste estável

Cascata da sombra: 2

Distância da sombra: 15

Sombra, plano, deslocamento: 1

Pesos de mistura: 2

Contagem VSync: Cada segundo e vBlank

LOD Bias: 50

Nível máximo de LOD: 0

Raycast da partícula: 500

Envio da Async: 2

Tamanho do envio Async: 2

Excelente:

Número máximo de pixels de luz que ascende: 2

Qualidade da textura: Resolução total

Texturas anisitrópicas: Forçada

Anti-serrilhado: OBS.: Não há necessidade

Resolução da sombra: Resolução Alta

Projeção da sombra: Ajuste estável

Cascata da sombra: 2

Distância da sombra: 20

Sombra, plano, deslocamento: 1

Pesos de mistura: 4

Contagem VSync: Cada segundo e vBlank

LOD Bias: 50

Nível máximo de LOD: 0

Raycast da partícula: 1000

Envio da Async: 2

Tamanho do envio Async: 2

Melhor:

Número máximo de pixels de luz que ascende: 4

Qualidade da textura: Resolução total

Texturas anisitrópicas: Forçada

Anti-serrilhado: OBS.: Não há necessidade

Resolução da sombra: Resolução muito alta

Projeção da sombra: Ajuste estável

Cascata da sombra: 4

Distância da sombra: 20

Sombra, plano, deslocamento: 1

Pesos de mistura: 4

Contagem VSync: Cada segundo e vBlank

LOD Bias: 50

Nível máximo de LOD: 0

Raycast da partícula: 3000

Envio da Async: 2

Tamanho do envio Async: 2


Fonte: Unidade I - Programação de Jogos UFERSA.

Fatores de qualidade ISO 9126

 

Fatores de qualidade ISO 9126

A norma ISO/IEC 9126 é uma referência mundial para qualidade de Software, onde:

• ISO: A Organização Internacional de Normalização, foi fundada em 1947 e coordena o trabalho de 127 países para promover a padronização das normas técnicas em âmbito mundial.

• IEC: A Comissão Internacional de Eletrotécnica, fundada em 1906, é composto por mais de 50 países e publica normas internacionais relacionadas com eletricidade, Eletrônica e áreas relacionadas.

Segundo Pressman (2006) a norma ISSO/IEC 9126 foi desenvolvida para uma tentativa de identificar os atributos para software de computador, que são:

Funcionalidade – O grau em que o software satisfaz as necessidades declaradas, pelos atributos de adequabilidade, interoperabilidade, precisão, atendibilidade e segurança.

Confiabilidade – Período em que o software está disponível para utilização, conforme os atributos de maturidade, recuperabilidade e tolerância a falhas.

Usabilidade – Grau em que o software é fácil de usar pelos subatributos de operabilidade, inteligibilidade e facilidade de aprendizado.

Eficiência – Grau em que o software faz uso otimizado dos recursos de sistema indicado nos Subatributos de comportamento em relação ao tempo e aos recursos.

Manutenibilidade – Facilidade com que os reparos de software podem ser realizados, conforme os subatributos de analisabilidade, estabilidade, mutabilidade e testabilidade.

Portabilidade – Facilidade que o software tem de ser transportado de um ambiente para outro, indicado pelos subatributos de instabilidade, adaptabilidade, conformidade e permutabilidade.

Fatores de qualidade de McCall

Fatores de qualidade de McCall

 

Segundo Pressman (2006) os fatores que comprometem a qualidade de um software são divididos em 2 grupos:

• Os fatores que podem ser medidos dir etamente, como os defeitos por ponto por função.

• Fatores que são medidos apenas indiretamente como a manutenibilidade e a usabilidade. Deve-se

ocorrer medições e comparar o software a um valor e chegar a uma conclusão da qualidade.

Fatores de qualidade de McCall

I - INTRODUÇÃO À ENGENHARIA DE SOFTWARE

Os fatores de qualidade são mostrados na figura X, e são descritos em cima dos três aspectos importantes do produto de software, como as suas características operacionais, a habilidade de passar por alterações e a adaptabilidade a novos ambientes.

Segundo McCall as descrições para a figura 9 quanto a operação do produto, são:

• Correção – O quanto um programa atende a sua especificação e cumpre os objetivos traçados pelo cliente;

• Confiabilidade – Quanto um programa executa a função definida com a precisão exigida pelo software;

• Usabilidade – O esforço que é necessário para entender e aprender, preparar a entrada e interpretar a saída de um programa;

• Integridade – O quanto pode ser controlado o acesso ao software ou aos dados não autorizados;

• Eficiência – A quantidade de código e recursos computacionais exigidos para que um programa execute sua função;

Já as descrições quanto a revisão e transição do produto, são:

• Manutenibilidade – O esforço utilizado para localizar e concertar os err os em um programa;

• Flexibilidade – O esforço utilizado para alterar um programa operacional;

• Testabilidade – O esforço utilizado para que se teste o software e garanta que ele realize a função esperada;

• Portabilidade – O quanto de esforço necessita-se para mudar um programa de uma plataforma para outra;

• Reutilização – Quanto um programa ou partes dele pode ser reutilizado em outro programa;

• Interoperabilidade – O quanto de esforço necessita-se para que um programa seja inserido em outro.


Fonte: Princípios de engenharia de software / Marcelo Belaguarda. – Mossoró : EdUFERSA, 2015.

Operadores linguagem C

 

Operadores linguagem C

Os operadores na Linguagem C dão suporte àas operações aritméticas, incrementais e relacionais. São eles:

Aritméticos:

=             Atribuição

+             Soma

-              Subtração

*             Multiplicação

/              Divisão

%            Módulo(devolve o resto da divisão)

O sinal de igualdade “=” é na realidade o sinal de atribuição na Linguagem C. Vejamos o exemplo:

#include <stdio.h> int main(){

int n; n=5;

printf(" n=%d \n");

}

Neste simples exemplo, temos que na quarnta linha o valor 5 é adicionado a variável “n” demonstrando assim o uso do operador de atribuição.

Vejamos agora um exemplo de um programa em C que executa todas as operações com números inteiros: #include<stdio.h>

int main(){

int num1, num2, som, sub, mult, div, rest; printf("entre com o 1 numero: \n"); scanf ("%d", &num1);

printf("entre com o 2 numero: \n");

scanf ("%d", &num2);

 

som= num1+num2;

 

sub= num1-num2; mult= num1*num2; div= num1/num2; rest= num1%num2;

printf("A soma dos numeros e: %d\n", som); printf("A subtraçao dos numeros e: %d\n", sub); printf("A multiplicacao dos numeros e: %d\n", mult); printf("A divisao dos numeros e: %d\n", div); printf("O resto da divisao e: %d\n", rest);

}

 

Ao entrarmos com os números 6 e 3 obtemos os seguintes resultados:

Os operadores de Incremento e decremento são utilizados para simplificar operações. Temos os seguintes

operadores:

++ Que adiciona 1 ao operando

-- Diminui 1 ao operando.

Exemplo:

int n=5; n++;

printf(" n=%d \n", n);

n--;

printf(" n=%d \n", n);

Os valores impressos serão 6 e 5.

Em conjunto com o operador de atribuição, os operadores de incremento e decremento podem ter outros

significados, Vejamos outro exemplo:

#include<stdio.h> int main(){

int y, n=5; y=n++;

printf(" n=%d, y=%d, \n", n, y); y=++n;

printf(" n=%d, y=%d, \n", n, y);

}

O resultado será:

Isso porque quando temos o operador ++ a direita do operando significa que temos de adicionar +1 ao operando. Como na Linguagem C temos a ordem das operações da esquerda para a direita, primeiro atribuímos o valor de “n” a “y”, que no caso n tem valor 5 e consequentemente y terá também o valor 5, e após a operação de atribuição é feita a operação de incremento de n, que passa a valer 6.

Já na operação “y=++n”, como n vale 6 ele é incrementado com +1, passando ao valor 7, e este valor é então atribuído a y, que passará a valer 7 também.

O mesmo é válido para o operador "- - ".

Quanto aos operadores relacionais, temos os seguintes operadores:

>             Maior

>=          Maior ou Igual

<             Menor

<=          Menor ou Igual

==          Igualdade

!=           Não Igual

Trabalharemos as aplicações dos operadores relacionais no próximo assunto, desvios condicionais.

}

O uso da função getch() sozinho tem o poder de parar a execução do programa até que alguma tecla seja pressionada. O que poderá substituir a função system(“pause”) quando a finalidade for parar a execução do programa.

Uma variante do getch() é a função getche(), que consegue mostrar o valor que foi digitado na tela.

Fonte: Linguagem da programação I, UFERSA, Macedo, Luiz

Comandos Decisão

Comandos Decisão


Os comandos de decisão na Linguagem C servem para desviar o fluxo da execução do programa, dando

possibilidades de decisão a partir de uma condição prévia.

Normalmente, os comandos de decisões baseiam-se em uma comparação lógica e, para isso, usamos os operadores lógicos. Abaixo mostraremos novamente os principais operadores relacionais que podem ser usados na Linguagem C:

>             Maior

>=          Maior ou Igual

<             Menor

<=          Menor ou Igual

==          Igualdade

!=           Não Igual

Além dos operadores relacionais, temos os conectivos lógicos, que servem para podermos criar as expressões de relações. São eles:

||           Ou Lógico

&&         E Lógico

 

!              Negação

 Com esses operadores é possível fazer mais de uma comparação lógica e usarmos as expressões para tomarmos decisões mais complexas em nossos programas, como por exemplo:

a)            (3>2) && (5>3): como temos a primeira expressão verdade e a segunda também verdade. O resultado da sentença é verdade.

b)           (3>4) || (5>3): como temos a primeira expressão falsa e a segunda verdade. O resultado da sentença é verdade.

As tabelas dos conectores lógicos são as seguintes: Para o Ou (||)

EXPRESSÃO 1    EXPRESSÃO 2    RESULTADO

Verdade              Verdade              Verdade

Verdade              Falso     Verdade

Falso     Verdade              Verdade

Falso     Falso     Falso

 

Para o E (&&)

 

EXPRESSÃO 1    EXPRESSÃO 2    RESULTADO

Verdade              Verdade              Verdade

Verdade              Falso     Falso

Falso     Verdade              Falso

Falso     Falso     Falso

 

Para o Não (! )

 

EXPRESSÃO 1    RESULTADO

! Verdade           Falso

! Falso   Verdade

 

Os conectores das expressões lógicas são bastante utilizados para os comandos de decisões e repetições, os quais são usados como comparações para as decisões e repetições necessárias em um programa.

Sobre os comandos de decisões na Linguagem C, temos:

-              Comando if

-              Comando switch

-              Operador Ternário

 

Comando if

O comando “if” é o conhecido “se” que já foi trabalhado no caderno de algoritmos e estrutura de dados. Sua sintaxe mais simples é:

if (condição Lógica)


instrução;

 

Exemplo:

Vejamos um programa em C que recebe dois números e diz se o primeiro é maior que o segundo. #include <stdio.h>

void main(){

int num1, num2;

printf ("entre com o primeiro numero"); scanf ("%d", &num1);

printf ("entre com o segundo numero"); scanf ("%d", &num2);

if (num1 > num2)

printf ("Numero 1 %d maior que Numero 2 %d", num1, num2);

}

Nesse caso, notemos que o if atende apenas à condição verdade como também só existe uma instrução caso a condição seja verdade. Porém, podemos ter diversos comandos dentro do if, bastando para isso usarmos as chaves, vejamos a sintaxe:

if (condição Lógica){

Instrução1; Instrução2; InstruçãoN;

}

 

No exemplo abaixo, usaremos a comparação entre dois números e se o primeiro for maior que o segundo efetuaremos a subtração dos dois números, mostrando a diferença entre eles. Vejamos o código:

#include <stdio.h> void main(){

int num1, num2, dif ;

printf ("entre com o primeiro numero"); scanf ("%d", &num1);

printf ("entre com o segundo numero"); scanf ("%d", &num2);

if (num1 > num2){

printf ("Numero 1 %d maior que Numero 2 %d", num1, num2); dif=num1-num2;

printf ("\n A diferenca entre os dois numeros e %d", dif);

}

}

Bem, mas se desejarmos não só sabermos se o primeiro é maior que o segundo e calcularmos a diferença destes mas também se o primeiro não for maior que o segundo efetuarmos a soma destes números? Para isso usaremos o comando if completo, com o uso do “else”, vejamos a sintaxe:

 

if (condição Lógica){

 

 }else{

 

}

 

Instrução1; Instrução2; InstruçãoN;

 

Instrução1; Instrução2; InstruçãoN;

 

Vejamos agora como fica o exemplo implementado:

#include <stdio.h> void main(){

int num1, num2, dif, som;

printf ("entre com o primeiro numero"); scanf ("%d", &num1);

printf ("entre com o segundo numero"); scanf ("%d", &num2);

if (num1 > num2){

printf ("Numero 1 %d maior que Numero 2 %d", num1, num2); dif=num1-num2;

printf ("\n A diferenca entre os dois numeros e %d", dif);

} else{

printf ("Numero 1%d menor que Numero 2%d", num1, num2); som=num1+num2;

printf ("\ A soma entre os dois numeros e %d", som);

                }

Também podemos ter casos em que é necessário o uso de diversos comandos if para tomadas de decisões de maior complexidade. Nestes casos, devemos sempre ter cuidado com os blocos de comando if, sempre controlando o inicio e o fim dos mesmos. Logo, também podemos usar os conectores lógicos formando expressões lógicas para simplificar o uso dos if.

Fonte: Linguagem da programação I, UFERSA, Macedo, Luiz

Comando switch

Comando switch


O comando switch também é um comando de desvio condicional, assim como o if. Porém nele podemos ter diversas possibilidades de desvios, ou escolhas.

A sintaxe do comando é: switch (variável)

{

case opção1:

instrução 1;

instrução 2; instrução N; break;

case opção2:

instrução 2;

instrução N; break;

case opçãoN:

instrução 1;

instrução 2; instrução N; break;

default:

}

 instrução 1;

instrução 2; instrução N;

 

Vejamos um exemplo prático: queremos construir um programa em que o usuário forneça um número entre 0 e 4 e o programa escreverá na tela o nome do número digitado, caso o número digitado não esteja entre 0 e 4 o programa deve emitir uma mensagem informando que o número não é conhecido.

 

#include <stdio.h> void main(){

int num;

printf("entre com um número de 0 a 4"); scanf("%d", &num);

switch (num){ case 0:

 

printf("zero"); break;

 

printf("um"); break;

 

printf("dois"); break;

 

printf("tres");

 

default:

 

}

}

 

break;

 

printf("quatro"); break;

 

printf("numero nao reconhecido pelo programa");

 

O comando switch é ideal para trabalharmos com grandes números de opções e comandos distintos para cada uma das opções.

Fonte: Linguagem da programação I, UFERSA, Macedo, Luiz

Laços de repetição

  

Laços de repetição

Os laços de repetição garantem a repetição de um ou mais comandos em uma estrutura de controle, onde devemos sempre usar uma variável para controle do laço e garantir que o laço tenha uma condição de finalização, evitando a criação de laços infinitos quando estes não forem desejados.

Os principais comandos de repetição são: For, while e do-while.

O Laço for é um laço de repetição onde sabemos, ou temos como saber em tempo de execução do programa quantas vezes teremos a repetição um ou vários comandos que estarão presos no laço. Além dessa característica, o laço for consegue realizar o auto- incremento da variável de controle do laço.

O laço while trabalha uma condição lógica, que deverá ser verdadeira para a entrada no laço e permanecerá neste até que a condição seja alterada para falsa. O controle da condição lógica deverá ser dentro do bloco de repetição para que o mesmo tenha um fim.

O laço do-while é um laço em que um ou vários comandos de dentro do laço são executados pelo menos uma vez, pois o teste lógico será realizado ao final do comando, tendo que prever a condição lógica de saída do laço, assim como no laço while.

 

Abaixo descreveremos as principais características de cada um dos comandos de repetição.

 

Laço for

 

O laço for é um laço em que podemos controlar a quantidade de repetições, tendo como principal vantagem

o de ser auto-incrementado. A sintaxe do laço é:

for(inicialização; condição; incremento) Instrução;

Como exemplo, podemos citar o seguinte código:

for(aux=1; aux<100; aux++) printf(“%d”, aux);

No trecho acima, temos o laço de repetição que inicia com valor 1 e finaliza com o valor 99, escrevendo na tela o valor de X. Após a impressão do valor de X, X é incrementado com o valor dele adicionado ao valor da variável aux (X=X+aux). O exemplo ilustra o uso do laço for com um bloco de comandos a serem executados a cada uma das repetições, no caso 99 vezes.

Vejamos um exemplo onde queremos definir em tempo de execução do programa a quantidade de

repetições de um laço:

#include <stdio.h>

int main(void){

int X=0, aux, num;

printf("Digite um numero para repetir o laco"); scanf("%d", &num);

for(aux=0; aux<=num; aux++) printf("%d, ", aux);

}

 

No exemplo acima, o programa pede um número e ao ser digitado, esse número é usado como condição de teste no laço de repetição. Como resultado, temos que o laço será repetido quantas vezes o usuário do programa desejar e a cada repetição será impresso o número da variável que estamos usando na repetição. Também é possível executar o laço for com decremento, ou seja ao invés de incrementar um valor, este pode ser decrementado. Segue um exemplo:

#include <stdio.h> int main(void){

int X=0, aux, num;

printf("Digite um numero para repetir o laco"); scanf("%d", &num);

for(aux=num; aux!=0; aux--) printf("%d, ", aux);

}

 

O programa acima também recebe um número para controlar as repetições do laço, porém o número é

 

colocado como o valor inicial da variável aux, que é decrementada em -1 a cada execução do laço for. O laço for pode ser usado para criar um laço infinito, como por exemplo:

 

for ( ; ;)

 

printf(“esse laço e infinito...”);

 

Observe que o programa fica preso ao laço for por não ter nenhuma condição. Neste caso, para sair do laço infinito, podemos usar o comando break. Vejamos o exemplo abaixo:

 

#include <conio.h> #include <stdio.h>

 

int main(void){

for( ; ; ){

printf("laco infinito, tecle A para sair..."); if(getchar()=='A')

break;

}

}

Apesar de estranho o fato de que o programa não tenha nenhuma variável e conter um laço infinito, este programa está correto! Sua condição de saída do laço se dá através da inserção da tecla ‘A’ (que deve ser maiúscula!).

Laço while

O comando while é um laço de repetição onde devemos ter uma variável para entrada no laço, onde esta deve ser uma expressão lógica verdadeira. As repetições serão realizadas até que a condição do laço seja falsa.

 

A sintaxe do laço while é:

while(condição) Comando1;

Com o uso das chaves, o comando while consegue repetir uma sequência de instruções, que fica presa ao

laço, conforme podemos ver na sintaxe abaixo: while(condição){

Comando1; Comando2; ComandoN;

}

Como exemplo de aplicação, vejamos um programa que entra em um laço while e imprime na tela a quantidade de vezes em que o laço será executado até que o usuário digite o caractere ‘s’.

#include <stdio.h> int main(void){

int x=1;

char sair='n';

printf("entrando dentro de um laco \n\n"); while(sair!='s') {

printf("o laco foi executado a %d vez \n\n", x);

x++;

scanf("%c", &sair);

}

}

Outro exemplo do laço while, vejamos:

#include <conio.h> #include <stdio.h> int main(void){

int x=1;

char sair='n';

printf("entrando dentro de um laco \n\n");

while(1) {

printf("o laco foi executado a %d vez \n\n", x); printf("tecle s para sair do laco \n");

scanf(" %c", &sair); if (sair=='s')

break; x=x+1;

}

}

Neste exemplo, o laço while é executado de forma infinita, pois não temos uma comparação lógica a fazer e sim um valor pronto, ao qual será entendida como uma condição verdade. Assim, para sairmos do laço while infinito, podemos usar o comando break.

 

Laço do - While

O laço do-while é um laço em que o teste da condição é realizado no final do bloco de comandos. Isso faz com que o código do bloco de comandos seja repetido, pelo menos uma vez, antes da condição lógica ser testada ao final. A sintaxe do comando é:

Do{

comando1; comando2; comando;

}

while(condição);

Vejamos um exemplo em que o usuário entra no laço e para sair deve digitar o caractere ‘s’: #include <conio.h>

#include <stdio.h>

int main(void){

int x=1; char ch;

 

printf("entrando dentro de um laco de while \n\n"

do{

 

printf("o laco foi executado a %d vez \n\n", x); x++;

printf("tecle s para sair do laco \n"); ch=getche();

 

} while (ch!='s');

}

Notemos que não é preciso inicializar a variável de controle do laço “ch”, pois a mesma só receberá valores antes da condição ser testada.

Assim como no while, o do-while também executa laços infinitos, podendo usar o comando break para a

saída do laço em questão. Segue um exemplo:

 

#include <conio.h> #include <stdio.h>

 

int main(void){

int x=1;

printf("entrando dentro de um laco do while \n\n"); do{

printf("o laco foi executado a %d vez \n\n", x); x++;

printf("tecle s para sair do laco \n"); if(getche()=='s')

break;

} while (1);

}

Fonte: Linguagem da programação I, UFERSA, Macedo, Luiz

Vetores linguagem C

Vetores linguagem C


Uma matriz é um conjunto de variáveis de mesmo tipo alocados de forma contigua na memória. Um Vetor é uma matriz de uma dimensão.

Dessa forma, podemos declarar um vetor da seguinte maneira:

<tipo> Nome [quantidade de elementos]; Ex.:

int vetor[50];

No exemplo declaramos um vetor de nome vetor com 50 colunas, ou seja, 50 elementos, do tipo inteiro.

Já vimos alguns exemplos de vetores neste caderno, que são as strings de caracter, que nada mais são que um vetor de char, conforme podemos ver abaixo:

Char nome[40];

Assim, a declaração acima se refere a um vetor de caractere com 40 posições de memória, aceitando assim quarenta caracteres em sua estrutura.

Observação:

Na Linguagem C, os índices de um vetor começam pela posição 0, não pela posição 1 conforme vimos no caderno de algoritmo e estrutura de dados. Assim, em um vetor de 50 elementos o índice vai da posição 0 a posição de número 49.

  

Para inserir dados em um vetor, procedemos da mesma forma como qualquer outra variável, observando

 

apenas o nome e a posição do vetor. scanf(“%d”, &vetor1[4]);

Colocando um valor na quinta posição do vetor.

Para escrever o vetor, procedemos da mesma forma como qualquer outra variável, observando apenas o nome e a posição do vetor.

printf(“%d”, vetor1[0]);

Escrevemos o valor que está na primeira posição do vetor. Valor que escreverá será: 10

Inicialização de vetores:

Um vetor pode ser declaro e iniciado ao mesmo tempo, vejamos o exemplo: int vetor[5] = {0,1,2,3,4};

Aqui, definimos um vetor de nome vetor com 5 posições e colocamos os 5 valores em sua inicialização.

Observação:

Ao preenchermos um vetor de forma automática, podemos omitir o tamanho do mesmo. Vejamos: int vetor[] = {0,1,2,3,4};

Apesar de não colocarmos a quantidade de elementos no vetor e inicializarmos este com 5 elementos, a declaração está correta. O mesmo não é válido para uma declaração sem inicialização de variáveis.

Para exemplificarmos, construiremos um programa que armazena valores inteiros em um vetor com 5 posições e cria um segundo vetor, também de 5 posições, com valores sendo negativos armazenados no primeiro vetor.

 

#include <stdio.h> int main(){

int vet1[5], vet2[5]; int i;

/* entrando com os dados no vetor 1 */ for (i=0; i<5; i++){

printf("\n entre com um valor para armazenar na posicao %d", i); scanf("%d", &vet1[i]);

}

/* criando o segundo vetor com valores negativos */ for (i=0; i<5; i++)

vet2[i]= -(vet1[i]);

/* mostrando os dois vetores */ for (i=0; i<5; i++)

printf("\n eo valor na posicao %d do vetor 1 e: %d, do vetor 2 e: %d", i, vet1[i], vet2[i]);

}

 

No próximo exemplo, mostraremos o código de um programa em C que recebe um nome qualquer do usuário e posteriormente pede que o usuário entre com uma letra para então o programa pesquisar em qual posição da palavra a letra pesquisada foi encontrado.

#include <conio.h> #include <stdio.h>

main(){

char nome[20]; char letra;

int i;

printf("digite um nome para pesquisa\n\n"); scanf("%s", &nome);

printf("digite uma letra para pesquisa no nome\n\n"); letra=getche();

for (i=0; i<20; i++){

if (nome[i]==letra)

printf("\nA letra %c foi encontrada na posicao %d da palavra %s", letra, i, nome);

}

}

Fonte: Linguagem da programação I, UFERSA, Macedo, Luiz

Função cin

Função cin


A função cin representa entrada de dados, também é um comando de saída de dados. Este comando pertence à biblioteca iostream.h Vejamos seu uso:

 

#include <iostream.h> void main (){

int X;

cin >> X; cout << X;

}

 

Seu uso é bastante semelhante ao do scanf. O mesmo aviso dado para o cout() também é válido para o cin(): A biblioteca iostream.h de manipulação de dados está em desuso em alguns compiladores. Portanto, o comando só funcionará se você tiver a biblioteca. Verifique! Já para o código em C++ a biblioteca é padrão, podendo usar o comando cin() normalmente.

Função getch ()

Fonte: Linguagem da programação I, UFERSA, Macedo, Luiz