https://wiki.sj.ifsc.edu.br/api.php?action=feedcontributions&user=Beatriz.s&feedformat=atomMediaWiki do Campus São José - Contribuições do(a) usuário(a) [pt-br]2024-03-29T12:03:11ZContribuições do(a) usuário(a)MediaWiki 1.35.9https://wiki.sj.ifsc.edu.br/index.php?title=Aplicativo_m%C3%B3vel_para_otimizar_compras_em_supermercados&diff=116695Aplicativo móvel para otimizar compras em supermercados2016-09-11T22:58:48Z<p>Beatriz.s: /* Bibliografia */</p>
<hr />
<div><center><br />
<big><big><br />
Aplicativo Móvel para otimizar Compras em Supermercados<br />
</big></big><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
Orientador: Emerson Ribeiro de Mello<br />
<br />
Curso: CST em Sistemas de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
beatriz1304@gmail.com, mello@ifsc.edu.br<br />
<br />
</center> <br />
<br />
= Objetivo =<br />
Desenvolver um aplicativo para dispositivos móveis, com o sistema operacional<br />
Android, que ajude o usuário a realizar compras de produtos em supermercados. O<br />
principal diferencial desse aplicativo está na forma como apresentará a lista de produtos<br />
no momento que usuário estiver fazendo a compra no mercado. O aplicativo aprenderá em<br />
qual mercado o usuário está no momento, bem como a disposição das seções, prateleiras e<br />
produtos. O aplicativo ainda permitirá o compartilhamento da lista por várias de pessoas<br />
de forma que todas poderão estar fazendo compra de forma simultânea. Sendo assim, os<br />
itens que uma pessoa pegar no mercado e marcar no aplicativo, deverão ser sincronizados<br />
com as demais pessoas que possuem acesso a essa lista. Dessa forma, espera-se otimizar o<br />
tempo necessário para que o usuário consiga varrer toda a lista de compras.<br />
<br />
= Resumo =<br />
<br />
O gerenciamento do tempo é essencial para manter a produtividade no seu dia a dia. Muitas das aplicações que encontramos disponíveis atualmente colaboram com o propósito de gerir o tempo e os recursos de forma eficiente. Porém, isso não é uma novidade. Gerir o tempo, é algo que nós já fazemos antes mesmo do surgimento dos Smartphones. Um exemplo simples seria no momento em que alguém, antes de ir ao supermercado, prepara uma lista de compras utilizando papel e caneca. A lista de papel tem o propósito de ser eficiente e que as compras sejam feitas de forma rápida e breve, sem perder muito tempo tentando lembrar algo que estamos precisando. Entretanto, o que ocorre muitas vezes é que uma mesma lista muitas vezes pode ser feita por mais de uma pessoa, e além de que na maioria das vezes podendo ocorre de se esquecer de algum item na lista, ou ter o mesmo produto adquirido mais de uma vez e percebendo somente após à compra. <br />
<br />
Outro problema encontrado em listas de papeis é que escrevemos a lista, de acordo, com o que lembramos que está em falta em nossas casas, sem nos preocuparmos em alguma organização lógica. A ordenação serve para otimizar o tempo, e um dos sistemas que podemos adotar é organizar os itens de acordo com as seções que eles se encontram inseridos. Isso é uma facilidade que o aplicativo pode nos propor. Dado que, no momento em que estamos realizando as compras, frequentemente temos que retornar a uma seção que já passamos, devido a falta de planejamento na hora de criar a lista.<br />
<br />
Ao observar tanto as listas de papeis quanto a maioria dos aplicativos podemos notar que eles são eficientes até um determinado ponto, e que depois disso acabam sendo limitados com funcionalidades que não levam em conta o gerenciamento do tempo, algo precioso nos dias atuais.<br />
Sendo assim, a meu TCC tem como proposta desenvolver um aplicativo para dispositivos móveis, rodando na plataforma Android, a modo de facilitar a criação de uma lista de compras e que seja capaz de organizar, automaticamente as seções. Essas seções serão organizadas de acordo com a disposição das gôndolas do supermercado, indicado na lista, pelo cliente. Isso fara com que os clientes achem os produtos com maior facilidade, otimizando o tempo de compra. A otimização será realizada, de tal modo, que os clientes não gastarão tempo a procura dos produtos, pois eles estarão organizados por seção.<br />
<br />
= Cronograma =<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses | Etapas |jul/2016 |ago/2016|set/2019|out/2016|nov/2016|dec/2016}}<br />
{{cronogramaX-item | Pesquisa Bibliográfica |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento funções básicas do App|0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento algoritmo de ordenação|0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento web service |0 |0 |0 |1 |1 |0 }}<br />
{{cronogramaX-item | Escrita do Documento |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega do Documento e Defesa |0 |0 |0 |0 |0 |1 }}<br />
{{cronogramaX-item | Apresentação do Trabalho à Banca |0 |0 |0 |0 |0 |1 }}<br />
|}<br />
<br />
= Bibliografia =<br />
<references/><br />
<br />
LECHETA, R. R.Google Android-3aEdição: Aprenda a criar aplicações para dispositivosmóveis com o Android SDK. [S.l.]: Novatec Editora, 2013. <br />
<br />
MONTEIRO, J. B.Google Android. Crie Aplicações Para Celulares (Em Portuguese doBrasil). [S.l.]: CASA DO CODIGO, 2013. ISBN 8566250028.</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Aplicativo_m%C3%B3vel_para_otimizar_compras_em_supermercados&diff=116690Aplicativo móvel para otimizar compras em supermercados2016-09-11T22:45:21Z<p>Beatriz.s: /* Objetivo */</p>
<hr />
<div><center><br />
<big><big><br />
Aplicativo Móvel para otimizar Compras em Supermercados<br />
</big></big><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
Orientador: Emerson Ribeiro de Mello<br />
<br />
Curso: CST em Sistemas de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
beatriz1304@gmail.com, mello@ifsc.edu.br<br />
<br />
</center> <br />
<br />
= Objetivo =<br />
Desenvolver um aplicativo para dispositivos móveis, com o sistema operacional<br />
Android, que ajude o usuário a realizar compras de produtos em supermercados. O<br />
principal diferencial desse aplicativo está na forma como apresentará a lista de produtos<br />
no momento que usuário estiver fazendo a compra no mercado. O aplicativo aprenderá em<br />
qual mercado o usuário está no momento, bem como a disposição das seções, prateleiras e<br />
produtos. O aplicativo ainda permitirá o compartilhamento da lista por várias de pessoas<br />
de forma que todas poderão estar fazendo compra de forma simultânea. Sendo assim, os<br />
itens que uma pessoa pegar no mercado e marcar no aplicativo, deverão ser sincronizados<br />
com as demais pessoas que possuem acesso a essa lista. Dessa forma, espera-se otimizar o<br />
tempo necessário para que o usuário consiga varrer toda a lista de compras.<br />
<br />
= Resumo =<br />
<br />
O gerenciamento do tempo é essencial para manter a produtividade no seu dia a dia. Muitas das aplicações que encontramos disponíveis atualmente colaboram com o propósito de gerir o tempo e os recursos de forma eficiente. Porém, isso não é uma novidade. Gerir o tempo, é algo que nós já fazemos antes mesmo do surgimento dos Smartphones. Um exemplo simples seria no momento em que alguém, antes de ir ao supermercado, prepara uma lista de compras utilizando papel e caneca. A lista de papel tem o propósito de ser eficiente e que as compras sejam feitas de forma rápida e breve, sem perder muito tempo tentando lembrar algo que estamos precisando. Entretanto, o que ocorre muitas vezes é que uma mesma lista muitas vezes pode ser feita por mais de uma pessoa, e além de que na maioria das vezes podendo ocorre de se esquecer de algum item na lista, ou ter o mesmo produto adquirido mais de uma vez e percebendo somente após à compra. <br />
<br />
Outro problema encontrado em listas de papeis é que escrevemos a lista, de acordo, com o que lembramos que está em falta em nossas casas, sem nos preocuparmos em alguma organização lógica. A ordenação serve para otimizar o tempo, e um dos sistemas que podemos adotar é organizar os itens de acordo com as seções que eles se encontram inseridos. Isso é uma facilidade que o aplicativo pode nos propor. Dado que, no momento em que estamos realizando as compras, frequentemente temos que retornar a uma seção que já passamos, devido a falta de planejamento na hora de criar a lista.<br />
<br />
Ao observar tanto as listas de papeis quanto a maioria dos aplicativos podemos notar que eles são eficientes até um determinado ponto, e que depois disso acabam sendo limitados com funcionalidades que não levam em conta o gerenciamento do tempo, algo precioso nos dias atuais.<br />
Sendo assim, a meu TCC tem como proposta desenvolver um aplicativo para dispositivos móveis, rodando na plataforma Android, a modo de facilitar a criação de uma lista de compras e que seja capaz de organizar, automaticamente as seções. Essas seções serão organizadas de acordo com a disposição das gôndolas do supermercado, indicado na lista, pelo cliente. Isso fara com que os clientes achem os produtos com maior facilidade, otimizando o tempo de compra. A otimização será realizada, de tal modo, que os clientes não gastarão tempo a procura dos produtos, pois eles estarão organizados por seção.<br />
<br />
= Cronograma =<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses | Etapas |jul/2016 |ago/2016|set/2019|out/2016|nov/2016|dec/2016}}<br />
{{cronogramaX-item | Pesquisa Bibliográfica |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento funções básicas do App|0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento algoritmo de ordenação|0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento web service |0 |0 |0 |1 |1 |0 }}<br />
{{cronogramaX-item | Escrita do Documento |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega do Documento e Defesa |0 |0 |0 |0 |0 |1 }}<br />
{{cronogramaX-item | Apresentação do Trabalho à Banca |0 |0 |0 |0 |0 |1 }}<br />
|}<br />
<br />
= Bibliografia =<br />
<references/></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Aplicativo_m%C3%B3vel_para_otimizar_compras_em_supermercados&diff=116687Aplicativo móvel para otimizar compras em supermercados2016-09-11T22:41:13Z<p>Beatriz.s: /* Cronograma */</p>
<hr />
<div><center><br />
<big><big><br />
Aplicativo Móvel para otimizar Compras em Supermercados<br />
</big></big><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
Orientador: Emerson Ribeiro de Mello<br />
<br />
Curso: CST em Sistemas de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
beatriz1304@gmail.com, mello@ifsc.edu.br<br />
<br />
</center> <br />
<br />
= Objetivo =<br />
<br />
<br />
= Resumo =<br />
<br />
O gerenciamento do tempo é essencial para manter a produtividade no seu dia a dia. Muitas das aplicações que encontramos disponíveis atualmente colaboram com o propósito de gerir o tempo e os recursos de forma eficiente. Porém, isso não é uma novidade. Gerir o tempo, é algo que nós já fazemos antes mesmo do surgimento dos Smartphones. Um exemplo simples seria no momento em que alguém, antes de ir ao supermercado, prepara uma lista de compras utilizando papel e caneca. A lista de papel tem o propósito de ser eficiente e que as compras sejam feitas de forma rápida e breve, sem perder muito tempo tentando lembrar algo que estamos precisando. Entretanto, o que ocorre muitas vezes é que uma mesma lista muitas vezes pode ser feita por mais de uma pessoa, e além de que na maioria das vezes podendo ocorre de se esquecer de algum item na lista, ou ter o mesmo produto adquirido mais de uma vez e percebendo somente após à compra. <br />
<br />
Outro problema encontrado em listas de papeis é que escrevemos a lista, de acordo, com o que lembramos que está em falta em nossas casas, sem nos preocuparmos em alguma organização lógica. A ordenação serve para otimizar o tempo, e um dos sistemas que podemos adotar é organizar os itens de acordo com as seções que eles se encontram inseridos. Isso é uma facilidade que o aplicativo pode nos propor. Dado que, no momento em que estamos realizando as compras, frequentemente temos que retornar a uma seção que já passamos, devido a falta de planejamento na hora de criar a lista.<br />
<br />
Ao observar tanto as listas de papeis quanto a maioria dos aplicativos podemos notar que eles são eficientes até um determinado ponto, e que depois disso acabam sendo limitados com funcionalidades que não levam em conta o gerenciamento do tempo, algo precioso nos dias atuais.<br />
Sendo assim, a meu TCC tem como proposta desenvolver um aplicativo para dispositivos móveis, rodando na plataforma Android, a modo de facilitar a criação de uma lista de compras e que seja capaz de organizar, automaticamente as seções. Essas seções serão organizadas de acordo com a disposição das gôndolas do supermercado, indicado na lista, pelo cliente. Isso fara com que os clientes achem os produtos com maior facilidade, otimizando o tempo de compra. A otimização será realizada, de tal modo, que os clientes não gastarão tempo a procura dos produtos, pois eles estarão organizados por seção.<br />
<br />
= Cronograma =<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses | Etapas |jul/2016 |ago/2016|set/2019|out/2016|nov/2016|dec/2016}}<br />
{{cronogramaX-item | Pesquisa Bibliográfica |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento funções básicas do App|0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento algoritmo de ordenação|0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Desenvolvimento web service |0 |0 |0 |1 |1 |0 }}<br />
{{cronogramaX-item | Escrita do Documento |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega do Documento e Defesa |0 |0 |0 |0 |0 |1 }}<br />
{{cronogramaX-item | Apresentação do Trabalho à Banca |0 |0 |0 |0 |0 |1 }}<br />
|}<br />
<br />
= Bibliografia =<br />
<references/></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Aplicativo_m%C3%B3vel_para_otimizar_compras_em_supermercados&diff=98441Aplicativo móvel para otimizar compras em supermercados2015-11-26T22:22:12Z<p>Beatriz.s: /* Resumo Estendido */</p>
<hr />
<div><center><br />
<big><big><br />
Aplicativo Móvel para otimizar Compras em Supermercados<br />
</big></big><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
Orientador: Emerson Ribeiro de Mello<br />
<br />
Curso: CST em Sistemas de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
beatriz1304@gmail.com, mello@ifsc.edu.br<br />
<br />
</center> <br />
<br />
= Objetivo =<br />
<br />
<br />
= Resumo =<br />
<br />
O gerenciamento do tempo é essencial para manter a produtividade no seu dia a dia. Muitas das aplicações que encontramos disponíveis atualmente colaboram com o propósito de gerir o tempo e os recursos de forma eficiente. Porém, isso não é uma novidade. Gerir o tempo, é algo que nós já fazemos antes mesmo do surgimento dos Smartphones. Um exemplo simples seria no momento em que alguém, antes de ir ao supermercado, prepara uma lista de compras utilizando papel e caneca. A lista de papel tem o propósito de ser eficiente e que as compras sejam feitas de forma rápida e breve, sem perder muito tempo tentando lembrar algo que estamos precisando. Entretanto, o que ocorre muitas vezes é que uma mesma lista muitas vezes pode ser feita por mais de uma pessoa, e além de que na maioria das vezes podendo ocorre de se esquecer de algum item na lista, ou ter o mesmo produto adquirido mais de uma vez e percebendo somente após à compra. <br />
<br />
Outro problema encontrado em listas de papeis é que escrevemos a lista, de acordo, com o que lembramos que está em falta em nossas casas, sem nos preocuparmos em alguma organização lógica. A ordenação serve para otimizar o tempo, e um dos sistemas que podemos adotar é organizar os itens de acordo com as seções que eles se encontram inseridos. Isso é uma facilidade que o aplicativo pode nos propor. Dado que, no momento em que estamos realizando as compras, frequentemente temos que retornar a uma seção que já passamos, devido a falta de planejamento na hora de criar a lista.<br />
<br />
Ao observar tanto as listas de papeis quanto a maioria dos aplicativos podemos notar que eles são eficientes até um determinado ponto, e que depois disso acabam sendo limitados com funcionalidades que não levam em conta o gerenciamento do tempo, algo precioso nos dias atuais.<br />
Sendo assim, a meu TCC tem como proposta desenvolver um aplicativo para dispositivos móveis, rodando na plataforma Android, a modo de facilitar a criação de uma lista de compras e que seja capaz de organizar, automaticamente as seções. Essas seções serão organizadas de acordo com a disposição das gôndolas do supermercado, indicado na lista, pelo cliente. Isso fara com que os clientes achem os produtos com maior facilidade, otimizando o tempo de compra. A otimização será realizada, de tal modo, que os clientes não gastarão tempo a procura dos produtos, pois eles estarão organizados por seção.<br />
<br />
= Cronograma =<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses | Etapas |nov/2015|dez/2015|jan/2016|fev/2016|mar/2016|abr/2016}}<br />
{{cronogramaX-item | Pesquisa Bibliográfica|1|1|1|0|0|0}}<br />
{{cronogramaX-item | Escrita do Documento|0|1|1|1|0|0}}<br />
{{cronogramaX-item | Entrega do Documento e Defesa |0|0|0|0|1|0}}<br />
{{cronogramaX-item | Apresentação do Trabalho à Banca |0|0|0|0|0|1}}<br />
|}<br />
<br />
<br />
= Bibliografia =<br />
<references/></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Aplicativo_m%C3%B3vel_para_otimizar_compras_em_supermercados&diff=98440Aplicativo móvel para otimizar compras em supermercados2015-11-26T22:21:35Z<p>Beatriz.s: Criou página com '<center> <big><big> Aplicativo Móvel para otimizar Compras em Supermercados </big></big> Autor: Beatriz da Silveira Orientador: Emerson Ribeiro de Mello Curso: CST em Sistema...'</p>
<hr />
<div><center><br />
<big><big><br />
Aplicativo Móvel para otimizar Compras em Supermercados<br />
</big></big><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
Orientador: Emerson Ribeiro de Mello<br />
<br />
Curso: CST em Sistemas de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
beatriz1304@gmail.com, mello@ifsc.edu.br<br />
<br />
</center> <br />
<br />
= Objetivo =<br />
<br />
<br />
= Resumo Estendido =<br />
<br />
O gerenciamento do tempo é essencial para manter a produtividade no seu dia a dia. Muitas das aplicações que encontramos disponíveis atualmente colaboram com o propósito de gerir o tempo e os recursos de forma eficiente. Porém, isso não é uma novidade. Gerir o tempo, é algo que nós já fazemos antes mesmo do surgimento dos Smartphones. Um exemplo simples seria no momento em que alguém, antes de ir ao supermercado, prepara uma lista de compras utilizando papel e caneca. A lista de papel tem o propósito de ser eficiente e que as compras sejam feitas de forma rápida e breve, sem perder muito tempo tentando lembrar algo que estamos precisando. Entretanto, o que ocorre muitas vezes é que uma mesma lista muitas vezes pode ser feita por mais de uma pessoa, e além de que na maioria das vezes podendo ocorre de se esquecer de algum item na lista, ou ter o mesmo produto adquirido mais de uma vez e percebendo somente após à compra. <br />
<br />
Outro problema encontrado em listas de papeis é que escrevemos a lista, de acordo, com o que lembramos que está em falta em nossas casas, sem nos preocuparmos em alguma organização lógica. A ordenação serve para otimizar o tempo, e um dos sistemas que podemos adotar é organizar os itens de acordo com as seções que eles se encontram inseridos. Isso é uma facilidade que o aplicativo pode nos propor. Dado que, no momento em que estamos realizando as compras, frequentemente temos que retornar a uma seção que já passamos, devido a falta de planejamento na hora de criar a lista.<br />
<br />
Ao observar tanto as listas de papeis quanto a maioria dos aplicativos podemos notar que eles são eficientes até um determinado ponto, e que depois disso acabam sendo limitados com funcionalidades que não levam em conta o gerenciamento do tempo, algo precioso nos dias atuais.<br />
Sendo assim, a meu TCC tem como proposta desenvolver um aplicativo para dispositivos móveis, rodando na plataforma Android, a modo de facilitar a criação de uma lista de compras e que seja capaz de organizar, automaticamente as seções. Essas seções serão organizadas de acordo com a disposição das gôndolas do supermercado, indicado na lista, pelo cliente. Isso fara com que os clientes achem os produtos com maior facilidade, otimizando o tempo de compra. A otimização será realizada, de tal modo, que os clientes não gastarão tempo a procura dos produtos, pois eles estarão organizados por seção. <br />
<br />
<br />
<br />
= Cronograma =<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses | Etapas |nov/2015|dez/2015|jan/2016|fev/2016|mar/2016|abr/2016}}<br />
{{cronogramaX-item | Pesquisa Bibliográfica|1|1|1|0|0|0}}<br />
{{cronogramaX-item | Escrita do Documento|0|1|1|1|0|0}}<br />
{{cronogramaX-item | Entrega do Documento e Defesa |0|0|0|0|1|0}}<br />
{{cronogramaX-item | Apresentação do Trabalho à Banca |0|0|0|0|0|1}}<br />
|}<br />
<br />
<br />
= Bibliografia =<br />
<references/></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=61947PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-11-07T23:22:58Z<p>Beatriz.s: /* Exercício 1 */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 18 DIA 9/10/2013}}<br />
<br />
== AULA 18 DIA 9/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Seja uma matriz 10x4, onde nas duas primeiras colunas (0 e 1) estão armazenados por linha um número complexo no formato retangular. Computar as duas colunas finais onde na coluna 2 estão o modulo e na 3 o ângulo.<br />
Esqueleto:<br />
<syntaxhighlight lang=c><br />
#define LINHA 10<br />
#define COLUNA 4<br />
<br />
float Matriz[LINHA][COLUNA] = {<br />
{5.8,9.7},<br />
{6.7,12.5},<br />
{3.8,20.7},<br />
{6.7,12.5},<br />
{5.8,12.4},<br />
{6.7,18.5},<br />
{15.8,39.7},<br />
{6.7,12.5},<br />
{55.8,9.7},<br />
{66.8,40.9} <br />
};<br />
<br />
float CalculaModulo(float parx, pary)<br />
{<br />
float modulo;<br />
/* a fazer */<br />
return modulo;<br />
} <br />
<br />
float CalculaAngulo(float parx, pary)<br />
{<br />
float angulo;<br />
/* a fazer */<br />
return angulo;<br />
} <br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<LINHA;i++) {<br />
Matriz[i][2] = CalculaModulo(Matriz[i][0], Matriz[i][1]);<br />
Matriz[i][3] = CalculaAngulo(Matriz[i][0], Matriz[i][1]); <br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Exercício 16 AULA 8<br />
<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
AULA 10 - Exercício 2<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 19 DIA 9/10/2013}}<br />
== AULA 19 DIA 9/10/2013==<br />
<br />
[http://wiki.sj.ifsc.edu.br/index.php/Abcdef Aval2a]<br />
<br />
[http://wiki.sj.ifsc.edu.br/index.php/Aval2 Aval2b]<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 14/10/2013}}<br />
<br />
== AULA 20 DIA 14/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*uso de ponteiros para passar parâmetros;<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser + ou menos. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 21 DIA 16/10/2013}}<br />
== AULA 21 DIA 16/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicação conforme abaixo:<br />
<br />
$ cmpcadeia alfa beta gama delta<br />
$ cmpcadeia: dois parâmetros devem ser passados<br />
<br />
$ cmpcadeia alfa beta<br />
$ cmpcadeia: as strings são diferentes<br />
<br />
$ cmpcadeia alfa alfa<br />
$ cmpcadeia: as strings são iguais<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
<br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser '+' ou '-'. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 17/10/2013}}<br />
<br />
==AULA 22 DIA 17/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*comando switch e aplicação na construção do menu de opções do controle de acesso;<br />
*Ponteiros (continuação);<br />
<br />
===Comando ''switch'' ===<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1<br />
<br />
Implementar um programa de calculadora similar ao da aula passada, onde dois operandos e um operador são fornecidos na linha de comando. O operador pode ser uma das 4 operações básicas. Usar um switch para testar o operador e implementar a operação.<br />
<br />
===Continuação de Ponteiros===<br />
<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Múltiplas indireções===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int a, *b, **c, ***d;<br />
<br />
a = 3;<br />
b = &a;<br />
c = &b;<br />
d = &c;<br />
<br />
printf("Valor de a = %d\n",***d);<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
#include <stdio.h><br />
<br />
main () {<br />
<br />
char opcao;<br />
int opr1;<br />
int opr2;<br />
int result;<br />
printf("Entre com a operação desejada\n");<br />
opcao=getchar();<br />
<br />
printf("Entre com o operando\n");<br />
scanf("%d",&opr1);<br />
<br />
printf("Entre com outro operando\n");<br />
scanf("%d",&opr2);<br />
<br />
switch(opcao) {<br />
case '+':<br />
<br />
result=opr1+opr2;<br />
printf("Soma: %d\n",result);<br />
break; /* o break força o encerramento da instrução*/<br />
case '-':<br />
result=opr1-opr2;<br />
printf("Subtração: %d\n",result);<br />
break;<br />
case '*':<br />
result=opr1*opr2;<br />
printf("Multiplicação: %d\n",result);<br />
break;<br />
case '/':<br />
result=opr1/opr2;<br />
printf("Divisão: %d\n",result);<br />
break;<br />
<br />
default:<br />
printf("Nenhuma das operações é válida!\n");<br />
break; <br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|AULA 23 DIA 21/10/2013}}<br />
<br />
==AULA 23 DIA 21/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*exercícios ponteiros;<br />
*anatomia de um programa em execução;<br />
*alocação dinâmica de memória.<br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar uma função que recebe dois números complexos no formato retangular e retorna a soma dos mesmos no no formato polar. Os parâmetros são passados por referência (usar ponteiro). Demonstre o funcionamento no programa main.<br />
<br />
<syntaxhighlight lang=c><br />
struct TComplexoRet {<br />
float x;<br />
float y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod;<br />
float ang;<br />
};<br />
<br />
struct TComplexoPolar conv_polar(struct TComplexoRet *p1, struct TComplexoRet *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
obs: é possível retornar um ponteiro para uma estrutura??<br />
Exercício 2<br />
<br />
Implemente uma função usando ponteiros que recebe duas strings como parâmetro e retorna o número de vezes que a segunda string está contida na primeira. Use a função da biblioteca strcmp() como apoio.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <string.h><br />
<br />
int conta_sub_strings(char *p1, char *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Seja um vetor de inteiros ''x'' definido globalmente. Implemente uma função para ler dados para este vetor, dado o endereço inicial do mesmo e o tamanho. Imprima na função ''main'' o vetor. Usar ponteiros no acesso ao vetor.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int x[10];<br />
<br />
void ler_vetor(int *p, int tamanho)<br />
{<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implemente uma função que recebe uma ''string'' como parâmetro. Esta ''string'' contém um número inteiro. A função deve retornar um inteiro no formato ''int''. Obs: é uma reimplementação do ''atoi'' da biblioteca.<br />
<br />
===A área de heap e o layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*py = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando uma estrutura ===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
};<br />
<br />
struct TTeste *teste;<br />
<br />
<br />
<br />
teste = (struct TTeste *) malloc (sizeof(struct TTeste));<br />
if (teste==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste->x=10;<br />
<br />
free(teste);<br />
<br />
teste=NULL;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: <br />
<br />
Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 24/10/2013}}<br />
<br />
==AULA 24 DIA 24/10/2013==<br />
<br />
Exercícios<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 31/10/2013}}<br />
<br />
==AULA 25 DIA 31/10/2013==<br />
<br />
===Exercícios de Ponteiros===<br />
<br />
Exercício 1 - Verificar qual o erro do código abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
t->y = 5;<br />
<br />
}<br />
<br />
O código correto está mostrado abaixo:<br />
<br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
}teste;<br />
<br />
teste.y = 5;<br />
printf("Valor de y %d\n",teste.y);<br />
<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 2 - Qual o valor a ser impresso no printf do programa abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TTeste {<br />
int x;<br />
int y;<br />
struct TTeste *p;<br />
}; <br />
<br />
main()<br />
{<br />
<br />
struct TTeste x = {4,7,NULL};<br />
struct TTeste y = {10,8,NULL};<br />
<br />
struct TTeste *teste;<br />
<br />
x.p = &y;<br />
teste = &x;<br />
<br />
printf ("Valor = %d\n", teste->p->x);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Considere uma tabela de usuários de um sistema de controle de acesso conforme código abaixo. Implemente as funções abaixo usando alocação dinâmica de memória. Observe que as entradas livres deve estar iniciadas com NULL.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define TAM_MAX 10<br />
<br />
struct TEndereco {<br />
char *pRuaNumero;<br />
char *pCidade;<br />
char *pEstado;<br />
};<br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char *userID;<br />
char *senha;<br />
struct TEndereco *pEndereco;<br />
} TabelaUsuarios[TAM_MAX]={<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
};<br />
<br />
/* adiciona usuario - retorna 0 se tudo ok e -1 se não conseguiu alocar */<br />
/* ler dados com scanf */<br />
<br />
int add_user()<br />
{<br />
}<br />
<br />
/* remove o usuário - perguntar com scanf */<br />
void del_user()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* exemplo de uso */<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
#define TAM_MAX 10<br />
<br />
struct TEndereco {<br />
char *pRuaNumero;<br />
char *pCidade;<br />
char *pEstado;<br />
};<br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char *userID;<br />
char *senha;<br />
struct TEndereco *pEndereco;<br />
} TabelaUsuarios[TAM_MAX]={<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
};<br />
<br />
/* adiciona usuario - retorna 0 se tudo ok e -1 se não conseguiu alocar */<br />
/* ler dados com scanf */<br />
<br />
int add_user()<br />
{<br />
char aux[100];<br />
int i;<br />
<br />
/* procurar a primeira entrada livre na tabela */<br />
for(i=0;i<TAM_MAX;i++) {<br />
if (TabelaUsuarios[i].userID==NULL)<br />
break;<br />
}<br />
<br />
if (i==TAM_MAX)<br />
return -1;<br />
<br />
/* ler userid para variavel auxiliar */<br />
printf("Entre com o userID\n");<br />
scanf("%s", aux); <br />
<br />
if( (TabelaUsuarios[i].userID = (char *) malloc(strlen(aux)+1)) == NULL) {<br />
return -1;<br />
}<br />
<br />
strcpy(TabelaUsuarios[i].userID, aux);<br />
<br />
printf("Entre com o senha\n");<br />
scanf("%s", aux); <br />
<br />
if((TabelaUsuarios[i].senha = (char *) malloc(strlen(aux)+1)) == NULL) {<br />
free(TabelaUsuarios[i].userID);<br />
TabelaUsuarios[i].userID = NULL;<br />
return -1;<br />
}<br />
<br />
strcpy(TabelaUsuarios[i].senha, aux);<br />
<br />
if((TabelaUsuarios[i].pEndereco = (struct TEndereco *) malloc(sizeof(struct TEndereco))) == NULL) {<br />
free(TabelaUsuarios[i].userID);<br />
free(TabelaUsuarios[i].senha); <br />
TabelaUsuarios[i].userID = NULL;<br />
TabelaUsuarios[i].senha = NULL; <br />
return -1; <br />
}<br />
<br />
printf("Entre com a rua\n");<br />
scanf("%s", aux); <br />
<br />
if( (TabelaUsuarios[i].pEndereco->pRuaNumero = (char *) malloc(strlen(aux)+1)) == NULL) { <br />
free(TabelaUsuarios[i].userID);<br />
free(TabelaUsuarios[i].senha); <br />
TabelaUsuarios[i].userID = NULL;<br />
TabelaUsuarios[i].senha = NULL; <br />
free(TabelaUsuarios[i].pEndereco);<br />
TabelaUsuarios[i].pEndereco = NULL; <br />
return -1; <br />
<br />
} <br />
strcpy(TabelaUsuarios[i].pEndereco->pRuaNumero, aux); <br />
<br />
return 0;<br />
}<br />
<br />
/* remove o usuário - perguntar com scanf */<br />
void del_user()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* exemplo de uso */<br />
}<br />
</syntaxhighlight><br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
No código abaixo foi implementado as funções: add_node_head(), print_list, delete_node(int codigo)<br />
<br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = head;<br />
<br />
if (head==NULL) {<br />
/* lista vazia */<br />
head = tail = p;<br />
}else{<br />
head=p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
for(tail=head; tail->next !=NULL; tail=tail->next);<br />
tail->next = p;<br />
// tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
int delete_node(int codigo){<br />
struct TProduto *anterior=NULL;<br />
struct TProduto *p=NULL;<br />
//Caso o código seja o primeiro da lista entrará no if, caso seja do meio ou do final entrará no else<br />
if(head->codigo==codigo){<br />
head=head->next;<br />
free(p);<br />
}else{<br />
<br />
for(p=head;p->codigo!=codigo;p=p->next){<br />
anterior=p;<br />
}<br />
anterior->next=p->next;<br />
free(p);<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista<br />
*/<br />
<br />
void print_list( struct TProduto *inicio)<br />
{<br />
<br />
struct TProduto *p;<br />
for (p = inicio; p != NULL; p = p->next)<br />
printf( "Imprimindo estrutura: %d\n", p->codigo);<br />
<br />
}<br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
// print_list (head);<br />
<br />
//Inserindo códigos no final da lista<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
//Inserindo códigos no início da lista<br />
for(i=6;i<9;i++)<br />
add_nodo_head(i);<br />
print_list (head);<br />
printf("-----------------\n");<br />
//Deletando o código de número 8<br />
delete_node(8);<br />
<br />
print_list(head);<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 31/10/2013}}<br />
<br />
==AULA 26 DIA 4/11/2013==<br />
<br />
===Objetivos===<br />
<br />
*Divisão em duplas;<br />
*Início de trabalho de final de disciplina.<br />
<br />
===Exercício 1===<br />
<br />
Considere um sistema de controle de ar condicionado que permite controlar salas de uma instituição.<br />
Elaborar uma estrutura para servir como base de uma lista ligada capaz de representar estas salas. <br />
Uma sala possui um nome e uma temperatura que deve ser controlada. Um administrador deve ter as seguintes funções:<br />
*inserir nova sala;<br />
*editar sala;<br />
*remover sala;<br />
*modificar temperatura da sala;<br />
Duas salas não podem ter o mesmo nome. As temperaturas controladas somente podem estar na faixa de 0 a 30 graus.<br />
<br />
Faça um programa que implemente estas funções.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
struct TSala {<br />
char nome[30];<br />
float temperatura;<br />
struct TSala *next;<br />
};<br />
<br />
struct TSala *head=NULL,<br />
*tail=NULL;<br />
<br />
int adiciona_sala()<br />
{<br />
struct TSala *p;<br />
<br />
p = (struct TSala *) malloc (sizeof(struct TSala));<br />
if(!p)<br />
return -1;<br />
<br />
printf("Entre com o nome da sala\n");<br />
scanf("%s",p->nome);<br />
printf("Entre com a temperatura\n"); <br />
scanf("%f",&p->temperatura); <br />
<br />
p->next = NULL;<br />
<br />
if(head==NULL) {<br />
head = tail = p;<br />
} else {<br />
tail->next = p;<br />
tail = p;<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
void imprime_lista()<br />
{<br />
struct TSala *p;<br />
<br />
for(p=head;p!=NULL;p=p->next) {<br />
printf("Sala %s\n", p->nome);<br />
printf("Temperatura %f\n", p->temperatura);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
adiciona_sala();<br />
adiciona_sala();<br />
adiciona_sala();<br />
imprime_lista();<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 26 DIA 7/11/2013}}<br />
<br />
<br />
//Questão 1<br />
<br />
//Considere a tabela abaixo. Implemente uma função para retornar a média das notas do semestre 1 de todos os alunos da turma. <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TNotas{<br />
float semestre1;<br />
float semestre2;<br />
};<br />
<br />
struct TRegistroAluno{<br />
char nome[30];<br />
struct TNotas notas;<br />
}TabelaTurma[6] = {<br />
"joao",{4.5,8.9},<br />
"maria",{5.5,8.3},<br />
"jose",{3.5,8.6},<br />
"lara",{6.5,3.9},<br />
"luisa",{7.5,7.9},<br />
"beatriz",{8.5,9.9},<br />
};<br />
<br />
float MediaSemestre1()<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
/* testar aqui */<br />
}<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=c><br />
Implementação da função MediaSemestre1 feita pela monitora Beatriz<br />
Uma possível solução para a questão, implementado abaixo.<br />
<br />
<br />
<br />
#include <stdio.h><br />
<br />
struct TNotas{<br />
float semestre1;<br />
float semestre2;<br />
};<br />
<br />
struct TRegistroAluno{<br />
char nome[30];<br />
struct TNotas notas;<br />
}TabelaTurma[6] = {<br />
"joao",{4.5,8.9},<br />
"maria",{5.5,8.3},<br />
"jose",{3.5,8.6},<br />
"lara",{6.5,3.9},<br />
"luisa",{7.5,7.9},<br />
"beatriz",{8.5,9.9},<br />
};<br />
<br />
float MediaSemestre1()<br />
{<br />
/* implementar aqui */<br />
struct TRegistroAluno *treg;<br />
float media=0;<br />
int i=0;<br />
//float notasem1;<br />
while(i<6){<br />
treg=&TabelaTurma[i];<br />
media+=treg->notas.semestre1;<br />
i++;<br />
}<br />
media=media/i;<br />
return media;<br />
}<br />
<br />
void main()<br />
{<br />
/* testar aqui */<br />
printf("Nota %.2f \n", MediaSemestre1());<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
// Questão 2<br />
<br />
//Elabore uma função que recebe como parâmetro um ponteiro para uma string. A função deve retornar um ponteiro para uma substring da string passada e que comece com a primeira letra 'B' desta string. O esqueleto da função é dado:<br />
<br />
<syntaxhighlight lang=c><br />
char *retornaSubstring(char *p)<br />
{<br />
/* implementar aqui */<br />
} <br />
<br />
main()<br />
{<br />
char *aux="NOBODY";<br />
/* exemplo de uso */<br />
printf("%s", retornaSubstring(aux));<br />
}<br />
</syntaxhighlight><br />
<br />
O printf deve imprimir "BODY"<br />
<br />
//QUESTÂO 3<br />
<br />
//Considere um sistema de estoque de uma livraria representado por uma tabela conforme abaixo:<br />
//Elabore uma função para adicionar um livro na tabela. Considere que uma entrada livre possui o ///ponteiro titulo NULL.<br />
<br />
<syntaxhighlight lang=c><br />
#define TAM 10<br />
<br />
struct TFornecedor{<br />
char *editora;<br />
char *endereco;<br />
}<br />
<br />
struct TLivro {<br />
char *titulo;<br />
char *autor;<br />
float *preco;<br />
int *estoque;<br />
struct TFornecedor *fornecedor;<br />
} Livros[TAM] ;<br />
<br />
void adicionar_livro()<br />
{<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 26 DIA 7/11/2013}}<br />
<br />
PROVA B<br />
<br />
Questão 1<br />
<br />
Considere a tabela abaixo. Implemente uma função para retornar o índice da tabela correspondente a maior média anual dentre os alunos da turma. <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TNotas{<br />
float semestre1;<br />
float semestre2;<br />
};<br />
<br />
struct TRegistroAluno{<br />
char nome[30];<br />
struct TNotas notas;<br />
}TabelaTurma[6] = {<br />
"joao",{4.5,8.9},<br />
"maria",{5.5,8.3},<br />
"jose",{3.5,8.6},<br />
"lara",{6.5,3.9},<br />
"luisa",{7.5,7.9},<br />
"beatriz",{8.5,9.9},<br />
};<br />
<br />
int MaiorMédiaAnual()<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
/* testar aqui */<br />
}<br />
</syntaxhighlight><br />
<br />
Questão 2<br />
<br />
Elabore uma função que recebe como parâmetro uma string e um char. A função deve retornar um ponteiro para a primeira substring da primeira string que comece com o caracter passado. O esqueleto da função é dado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
char *retornaSubstring(char *p1, char letra)<br />
{<br />
/* implementar aqui */<br />
} <br />
<br />
main()<br />
{<br />
char *aux="COLORADO";<br />
/* exemplo de uso */<br />
printf("%s", retornaSubstring(aux, 'A'));<br />
}<br />
</syntaxhighlight><br />
<br />
O printf deve imprimir "ADO"<br />
<br />
QUESTÂO 3<br />
<br />
Considere um sistema de estoque de uma livraria representado por uma tabela conforme abaixo:<br />
Elabore uma função para adicionar um livro na tabela. Considere que uma entrada livre possui o ponteiro titulo NULL. A função deve TESTAR se já existe um livro com mesmo título. Neste caso ela deve dar uma mensagem e retornar.<br />
<br />
<syntaxhighlight lang=c><br />
#define TAM 10<br />
<br />
struct TFornecedor{<br />
char *editora;<br />
char *endereco;<br />
}<br />
<br />
struct TLivro {<br />
char *titulo;<br />
char *autor;<br />
float *preco;<br />
int *estoque;<br />
struct TFornecedor *fornecedor;<br />
} Livros[TAM] ;<br />
<br />
void adicionar_livro()<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=61873PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-11-06T22:45:49Z<p>Beatriz.s: /* Listas Ligadas */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 18 DIA 9/10/2013}}<br />
<br />
== AULA 18 DIA 9/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Seja uma matriz 10x4, onde nas duas primeiras colunas (0 e 1) estão armazenados por linha um número complexo no formato retangular. Computar as duas colunas finais onde na coluna 2 estão o modulo e na 3 o ângulo.<br />
Esqueleto:<br />
<syntaxhighlight lang=c><br />
#define LINHA 10<br />
#define COLUNA 4<br />
<br />
float Matriz[LINHA][COLUNA] = {<br />
{5.8,9.7},<br />
{6.7,12.5},<br />
{3.8,20.7},<br />
{6.7,12.5},<br />
{5.8,12.4},<br />
{6.7,18.5},<br />
{15.8,39.7},<br />
{6.7,12.5},<br />
{55.8,9.7},<br />
{66.8,40.9} <br />
};<br />
<br />
float CalculaModulo(float parx, pary)<br />
{<br />
float modulo;<br />
/* a fazer */<br />
return modulo;<br />
} <br />
<br />
float CalculaAngulo(float parx, pary)<br />
{<br />
float angulo;<br />
/* a fazer */<br />
return angulo;<br />
} <br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<LINHA;i++) {<br />
Matriz[i][2] = CalculaModulo(Matriz[i][0], Matriz[i][1]);<br />
Matriz[i][3] = CalculaAngulo(Matriz[i][0], Matriz[i][1]); <br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Exercício 16 AULA 8<br />
<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
AULA 10 - Exercício 2<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 19 DIA 9/10/2013}}<br />
== AULA 19 DIA 9/10/2013==<br />
<br />
[http://wiki.sj.ifsc.edu.br/index.php/Abcdef Aval2a]<br />
<br />
[http://wiki.sj.ifsc.edu.br/index.php/Aval2 Aval2b]<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 14/10/2013}}<br />
<br />
== AULA 20 DIA 14/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*uso de ponteiros para passar parâmetros;<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser + ou menos. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 21 DIA 16/10/2013}}<br />
== AULA 21 DIA 16/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicação conforme abaixo:<br />
<br />
$ cmpcadeia alfa beta gama delta<br />
$ cmpcadeia: dois parâmetros devem ser passados<br />
<br />
$ cmpcadeia alfa beta<br />
$ cmpcadeia: as strings são diferentes<br />
<br />
$ cmpcadeia alfa alfa<br />
$ cmpcadeia: as strings são iguais<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
<br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser '+' ou '-'. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 17/10/2013}}<br />
<br />
==AULA 22 DIA 17/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*comando switch e aplicação na construção do menu de opções do controle de acesso;<br />
*Ponteiros (continuação);<br />
<br />
===Comando ''switch'' ===<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1<br />
<br />
Implementar um programa de calculadora similar ao da aula passada, onde dois operandos e um operador são fornecidos na linha de comando. O operador pode ser uma das 4 operações básicas. Usar um switch para testar o operador e implementar a operação.<br />
<br />
===Continuação de Ponteiros===<br />
<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Múltiplas indireções===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int a, *b, **c, ***d;<br />
<br />
a = 3;<br />
b = &a;<br />
c = &b;<br />
d = &c;<br />
<br />
printf("Valor de a = %d\n",***d);<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
#include <stdio.h><br />
<br />
main () {<br />
<br />
char opcao;<br />
int opr1;<br />
int opr2;<br />
int result;<br />
printf("Entre com a operação desejada\n");<br />
opcao=getchar();<br />
<br />
printf("Entre com o operando\n");<br />
scanf("%d",&opr1);<br />
<br />
printf("Entre com outro operando\n");<br />
scanf("%d",&opr2);<br />
<br />
switch(opcao) {<br />
case '+':<br />
<br />
result=opr1+opr2;<br />
printf("Soma: %d\n",result);<br />
break; /* o break força o encerramento da instrução*/<br />
case '-':<br />
result=opr1-opr2;<br />
printf("Subtração: %d\n",result);<br />
break;<br />
case '*':<br />
result=opr1*opr2;<br />
printf("Multiplicação: %d\n",result);<br />
break;<br />
case '/':<br />
result=opr1/opr2;<br />
printf("Divisão: %d\n",result);<br />
break;<br />
<br />
default:<br />
printf("Nenhuma das operações é válida!\n");<br />
break; <br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|AULA 23 DIA 21/10/2013}}<br />
<br />
==AULA 23 DIA 21/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*exercícios ponteiros;<br />
*anatomia de um programa em execução;<br />
*alocação dinâmica de memória.<br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar uma função que recebe dois números complexos no formato retangular e retorna a soma dos mesmos no no formato polar. Os parâmetros são passados por referência (usar ponteiro). Demonstre o funcionamento no programa main.<br />
<br />
<syntaxhighlight lang=c><br />
struct TComplexoRet {<br />
float x;<br />
float y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod;<br />
float ang;<br />
};<br />
<br />
struct TComplexoPolar conv_polar(struct TComplexoRet *p1, struct TComplexoRet *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
obs: é possível retornar um ponteiro para uma estrutura??<br />
Exercício 2<br />
<br />
Implemente uma função usando ponteiros que recebe duas strings como parâmetro e retorna o número de vezes que a segunda string está contida na primeira. Use a função da biblioteca strcmp() como apoio.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <string.h><br />
<br />
int conta_sub_strings(char *p1, char *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Seja um vetor de inteiros ''x'' definido globalmente. Implemente uma função para ler dados para este vetor, dado o endereço inicial do mesmo e o tamanho. Imprima na função ''main'' o vetor. Usar ponteiros no acesso ao vetor.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int x[10];<br />
<br />
void ler_vetor(int *p, int tamanho)<br />
{<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implemente uma função que recebe uma ''string'' como parâmetro. Esta ''string'' contém um número inteiro. A função deve retornar um inteiro no formato ''int''. Obs: é uma reimplementação do ''atoi'' da biblioteca.<br />
<br />
===A área de heap e o layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*py = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando uma estrutura ===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
};<br />
<br />
struct TTeste *teste;<br />
<br />
<br />
<br />
teste = (struct TTeste *) malloc (sizeof(struct TTeste));<br />
if (teste==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste->x=10;<br />
<br />
free(teste);<br />
<br />
teste=NULL;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: <br />
<br />
Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 24/10/2013}}<br />
<br />
==AULA 24 DIA 24/10/2013==<br />
<br />
Exercícios<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 31/10/2013}}<br />
<br />
==AULA 25 DIA 31/10/2013==<br />
<br />
===Exercícios de Ponteiros===<br />
<br />
Exercício 1 - Verificar qual o erro do código abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
t->y = 5;<br />
<br />
}<br />
<br />
O código correto está mostrado abaixo:<br />
<br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
}teste;<br />
<br />
teste.y = 5;<br />
printf("Valor de y %d\n",teste.y);<br />
<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 2 - Qual o valor a ser impresso no printf do programa abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TTeste {<br />
int x;<br />
int y;<br />
struct TTeste *p;<br />
}; <br />
<br />
main()<br />
{<br />
<br />
struct TTeste x = {4,7,NULL};<br />
struct TTeste y = {10,8,NULL};<br />
<br />
struct TTeste *teste;<br />
<br />
x.p = &y;<br />
teste = &x;<br />
<br />
printf ("Valor = %d\n", teste->p->x);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Considere uma tabela de usuários de um sistema de controle de acesso conforme código abaixo. Implemente as funções abaixo usando alocação dinâmica de memória. Observe que as entradas livres deve estar iniciadas com NULL.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define TAM_MAX 10<br />
<br />
struct TEndereco {<br />
char *pRuaNumero;<br />
char *pCidade;<br />
char *pEstado;<br />
};<br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char *userID;<br />
char *senha;<br />
struct TEndereco *pEndereco;<br />
} TabelaUsuarios[TAM_MAX]={<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
};<br />
<br />
/* adiciona usuario - retorna 0 se tudo ok e -1 se não conseguiu alocar */<br />
/* ler dados com scanf */<br />
<br />
int add_user()<br />
{<br />
}<br />
<br />
/* remove o usuário - perguntar com scanf */<br />
void del_user()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* exemplo de uso */<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
#define TAM_MAX 10<br />
<br />
struct TEndereco {<br />
char *pRuaNumero;<br />
char *pCidade;<br />
char *pEstado;<br />
};<br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char *userID;<br />
char *senha;<br />
struct TEndereco *pEndereco;<br />
} TabelaUsuarios[TAM_MAX]={<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
};<br />
<br />
/* adiciona usuario - retorna 0 se tudo ok e -1 se não conseguiu alocar */<br />
/* ler dados com scanf */<br />
<br />
int add_user()<br />
{<br />
char aux[100];<br />
int i;<br />
<br />
/* procurar a primeira entrada livre na tabela */<br />
for(i=0;i<TAM_MAX;i++) {<br />
if (TabelaUsuarios[i].userID==NULL)<br />
break;<br />
}<br />
<br />
if (i==TAM_MAX)<br />
return -1;<br />
<br />
/* ler userid para variavel auxiliar */<br />
printf("Entre com o userID\n");<br />
scanf("%s", aux); <br />
<br />
if( (TabelaUsuarios[i].userID = (char *) malloc(strlen(aux)+1)) == NULL) {<br />
return -1;<br />
}<br />
<br />
strcpy(TabelaUsuarios[i].userID, aux);<br />
<br />
printf("Entre com o senha\n");<br />
scanf("%s", aux); <br />
<br />
if((TabelaUsuarios[i].senha = (char *) malloc(strlen(aux)+1)) == NULL) {<br />
free(TabelaUsuarios[i].userID);<br />
TabelaUsuarios[i].userID = NULL;<br />
return -1;<br />
}<br />
<br />
strcpy(TabelaUsuarios[i].senha, aux);<br />
<br />
if((TabelaUsuarios[i].pEndereco = (struct TEndereco *) malloc(sizeof(struct TEndereco))) == NULL) {<br />
free(TabelaUsuarios[i].userID);<br />
free(TabelaUsuarios[i].senha); <br />
TabelaUsuarios[i].userID = NULL;<br />
TabelaUsuarios[i].senha = NULL; <br />
return -1; <br />
}<br />
<br />
printf("Entre com a rua\n");<br />
scanf("%s", aux); <br />
<br />
if( (TabelaUsuarios[i].pEndereco->pRuaNumero = (char *) malloc(strlen(aux)+1)) == NULL) { <br />
free(TabelaUsuarios[i].userID);<br />
free(TabelaUsuarios[i].senha); <br />
TabelaUsuarios[i].userID = NULL;<br />
TabelaUsuarios[i].senha = NULL; <br />
free(TabelaUsuarios[i].pEndereco);<br />
TabelaUsuarios[i].pEndereco = NULL; <br />
return -1; <br />
<br />
} <br />
strcpy(TabelaUsuarios[i].pEndereco->pRuaNumero, aux); <br />
<br />
return 0;<br />
}<br />
<br />
/* remove o usuário - perguntar com scanf */<br />
void del_user()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* exemplo de uso */<br />
}<br />
</syntaxhighlight><br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
No código abaixo foi implementado as funções: add_node_head(), print_list, delete_node(int codigo)<br />
<br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = head;<br />
<br />
if (head==NULL) {<br />
/* lista vazia */<br />
head = tail = p;<br />
}else{<br />
head=p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
for(tail=head; tail->next !=NULL; tail=tail->next);<br />
tail->next = p;<br />
// tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
int delete_node(int codigo){<br />
struct TProduto *anterior=NULL;<br />
struct TProduto *p=NULL;<br />
//Caso o código seja o primeiro da lista entrará no if, caso seja do meio ou do final entrará no else<br />
if(head->codigo==codigo){<br />
head=head->next;<br />
free(p);<br />
}else{<br />
<br />
for(p=head;p->codigo!=codigo;p=p->next){<br />
anterior=p;<br />
}<br />
anterior->next=p->next;<br />
free(p);<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista<br />
*/<br />
<br />
void print_list( struct TProduto *inicio)<br />
{<br />
<br />
struct TProduto *p;<br />
for (p = inicio; p != NULL; p = p->next)<br />
printf( "Imprimindo estrutura: %d\n", p->codigo);<br />
<br />
}<br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
// print_list (head);<br />
<br />
//Inserindo códigos no final da lista<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
//Inserindo códigos no início da lista<br />
for(i=6;i<9;i++)<br />
add_nodo_head(i);<br />
print_list (head);<br />
printf("-----------------\n");<br />
//Deletando o código de número 8<br />
delete_node(8);<br />
<br />
print_list(head);<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 31/10/2013}}<br />
<br />
==AULA 26 DIA 4/11/2013==<br />
<br />
===Objetivos===<br />
<br />
*Divisão em duplas;<br />
*Início de trabalho de final de disciplina.<br />
<br />
===Exercício 1===<br />
<br />
Considere um sistema de controle de ar condicionado que permite controlar salas de uma instituição.<br />
Elaborar uma estrutura para servir como base de uma lista ligada capaz de representar estas salas. <br />
Uma sala possui um nome e uma temperatura que deve ser controlada. Um administrador deve ter as seguintes funções:<br />
*inserir nova sala;<br />
*editar sala;<br />
*remover sala;<br />
*modificar temperatura da sala;<br />
Duas salas não podem ter o mesmo nome. As temperaturas controladas somente podem estar na faixa de 0 a 30 graus.<br />
<br />
Faça um programa que implemente estas funções.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
struct TSala {<br />
char nome[30];<br />
float temperatura;<br />
struct TSala *next;<br />
};<br />
<br />
struct TSala *head=NULL,<br />
*tail=NULL;<br />
<br />
int adiciona_sala()<br />
{<br />
struct TSala *p;<br />
<br />
p = (struct TSala *) malloc (sizeof(struct TSala));<br />
if(!p)<br />
return -1;<br />
<br />
printf("Entre com o nome da sala\n");<br />
scanf("%s",p->nome);<br />
printf("Entre com a temperatura\n"); <br />
scanf("%f",&p->temperatura); <br />
<br />
p->next = NULL;<br />
<br />
if(head==NULL) {<br />
head = tail = p;<br />
} else {<br />
tail->next = p;<br />
tail = p;<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
void imprime_lista()<br />
{<br />
struct TSala *p;<br />
<br />
for(p=head;p!=NULL;p=p->next) {<br />
printf("Sala %s\n", p->nome);<br />
printf("Temperatura %f\n", p->temperatura);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
adiciona_sala();<br />
adiciona_sala();<br />
adiciona_sala();<br />
imprime_lista();<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=61776PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-11-05T22:26:09Z<p>Beatriz.s: /* Exercícios de Ponteiros */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 18 DIA 9/10/2013}}<br />
<br />
== AULA 18 DIA 9/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Seja uma matriz 10x4, onde nas duas primeiras colunas (0 e 1) estão armazenados por linha um número complexo no formato retangular. Computar as duas colunas finais onde na coluna 2 estão o modulo e na 3 o ângulo.<br />
Esqueleto:<br />
<syntaxhighlight lang=c><br />
#define LINHA 10<br />
#define COLUNA 4<br />
<br />
float Matriz[LINHA][COLUNA] = {<br />
{5.8,9.7},<br />
{6.7,12.5},<br />
{3.8,20.7},<br />
{6.7,12.5},<br />
{5.8,12.4},<br />
{6.7,18.5},<br />
{15.8,39.7},<br />
{6.7,12.5},<br />
{55.8,9.7},<br />
{66.8,40.9} <br />
};<br />
<br />
float CalculaModulo(float parx, pary)<br />
{<br />
float modulo;<br />
/* a fazer */<br />
return modulo;<br />
} <br />
<br />
float CalculaAngulo(float parx, pary)<br />
{<br />
float angulo;<br />
/* a fazer */<br />
return angulo;<br />
} <br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<LINHA;i++) {<br />
Matriz[i][2] = CalculaModulo(Matriz[i][0], Matriz[i][1]);<br />
Matriz[i][3] = CalculaAngulo(Matriz[i][0], Matriz[i][1]); <br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Exercício 16 AULA 8<br />
<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
AULA 10 - Exercício 2<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 19 DIA 9/10/2013}}<br />
== AULA 19 DIA 9/10/2013==<br />
[http://wiki.sj.ifsc.edu.br/index.php/Abcdef]<br />
http://wiki.sj.ifsc.edu.br/index.php/Aval2<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 14/10/2013}}<br />
== AULA 20 DIA 14/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*uso de ponteiros para passar parâmetros;<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser + ou menos. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 21 DIA 16/10/2013}}<br />
== AULA 21 DIA 16/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicação conforme abaixo:<br />
<br />
$ cmpcadeia alfa beta gama delta<br />
$ cmpcadeia: dois parâmetros devem ser passados<br />
<br />
$ cmpcadeia alfa beta<br />
$ cmpcadeia: as strings são diferentes<br />
<br />
$ cmpcadeia alfa alfa<br />
$ cmpcadeia: as strings são iguais<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
<br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser '+' ou '-'. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 17/10/2013}}<br />
<br />
==AULA 22 DIA 17/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*comando switch e aplicação na construção do menu de opções do controle de acesso;<br />
*Ponteiros (continuação);<br />
<br />
===Comando ''switch'' ===<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1<br />
<br />
Implementar um programa de calculadora similar ao da aula passada, onde dois operandos e um operador são fornecidos na linha de comando. O operador pode ser uma das 4 operações básicas. Usar um switch para testar o operador e implementar a operação.<br />
<br />
===Continuação de Ponteiros===<br />
<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Múltiplas indireções===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int a, *b, **c, ***d;<br />
<br />
a = 3;<br />
b = &a;<br />
c = &b;<br />
d = &c;<br />
<br />
printf("Valor de a = %d\n",***d);<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
#include <stdio.h><br />
<br />
main () {<br />
<br />
char opcao;<br />
int opr1;<br />
int opr2;<br />
int result;<br />
printf("Entre com a operação desejada\n");<br />
opcao=getchar();<br />
<br />
printf("Entre com o operando\n");<br />
scanf("%d",&opr1);<br />
<br />
printf("Entre com outro operando\n");<br />
scanf("%d",&opr2);<br />
<br />
switch(opcao) {<br />
case '+':<br />
<br />
result=opr1+opr2;<br />
printf("Soma: %d\n",result);<br />
break; /* o break força o encerramento da instrução*/<br />
case '-':<br />
result=opr1-opr2;<br />
printf("Subtração: %d\n",result);<br />
break;<br />
case '*':<br />
result=opr1*opr2;<br />
printf("Multiplicação: %d\n",result);<br />
break;<br />
case '/':<br />
result=opr1/opr2;<br />
printf("Divisão: %d\n",result);<br />
break;<br />
<br />
default:<br />
printf("Nenhuma das operações é válida!\n");<br />
break; <br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|AULA 23 DIA 21/10/2013}}<br />
<br />
==AULA 23 DIA 21/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*exercícios ponteiros;<br />
*anatomia de um programa em execução;<br />
*alocação dinâmica de memória.<br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar uma função que recebe dois números complexos no formato retangular e retorna a soma dos mesmos no no formato polar. Os parâmetros são passados por referência (usar ponteiro). Demonstre o funcionamento no programa main.<br />
<br />
<syntaxhighlight lang=c><br />
struct TComplexoRet {<br />
float x;<br />
float y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod;<br />
float ang;<br />
};<br />
<br />
struct TComplexoPolar conv_polar(struct TComplexoRet *p1, struct TComplexoRet *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
obs: é possível retornar um ponteiro para uma estrutura??<br />
Exercício 2<br />
<br />
Implemente uma função usando ponteiros que recebe duas strings como parâmetro e retorna o número de vezes que a segunda string está contida na primeira. Use a função da biblioteca strcmp() como apoio.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <string.h><br />
<br />
int conta_sub_strings(char *p1, char *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Seja um vetor de inteiros ''x'' definido globalmente. Implemente uma função para ler dados para este vetor, dado o endereço inicial do mesmo e o tamanho. Imprima na função ''main'' o vetor. Usar ponteiros no acesso ao vetor.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int x[10];<br />
<br />
void ler_vetor(int *p, int tamanho)<br />
{<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implemente uma função que recebe uma ''string'' como parâmetro. Esta ''string'' contém um número inteiro. A função deve retornar um inteiro no formato ''int''. Obs: é uma reimplementação do ''atoi'' da biblioteca.<br />
<br />
===A área de heap e o layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*py = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando uma estrutura ===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
};<br />
<br />
struct TTeste *teste;<br />
<br />
<br />
<br />
teste = (struct TTeste *) malloc (sizeof(struct TTeste));<br />
if (teste==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste->x=10;<br />
<br />
free(teste);<br />
<br />
teste=NULL;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: <br />
<br />
Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 24/10/2013}}<br />
<br />
==AULA 24 DIA 24/10/2013==<br />
<br />
Exercícios<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 31/10/2013}}<br />
<br />
==AULA 25 DIA 31/10/2013==<br />
<br />
===Exercícios de Ponteiros===<br />
<br />
Exercício 1 - Verificar qual o erro do código abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
t->y = 5;<br />
<br />
}<br />
<br />
O código correto está mostrado abaixo:<br />
<br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
}teste;<br />
<br />
teste.y = 5;<br />
printf("Valor de y %d\n",teste.y);<br />
<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 2 - Qual o valor a ser impresso no printf do programa abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TTeste {<br />
int x;<br />
int y;<br />
struct TTeste *p;<br />
}; <br />
<br />
main()<br />
{<br />
<br />
struct TTeste x = {4,7,NULL};<br />
struct TTeste y = {10,8,NULL};<br />
<br />
struct TTeste *teste;<br />
<br />
x.p = &y;<br />
teste = &x;<br />
<br />
printf ("Valor = %d\n", teste->p->x);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Considere uma tabela de usuários de um sistema de controle de acesso conforme código abaixo. Implemente as funções abaixo usando alocação dinâmica de memória. Observe que as entradas livres deve estar iniciadas com NULL.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define TAM_MAX 10<br />
<br />
struct TEndereco {<br />
char *pRuaNumero;<br />
char *pCidade;<br />
char *pEstado;<br />
};<br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char *userID;<br />
char *senha;<br />
struct TEndereco *pEndereco;<br />
} TabelaUsuarios[TAM_MAX]={<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
};<br />
<br />
/* adiciona usuario - retorna 0 se tudo ok e -1 se não conseguiu alocar */<br />
/* ler dados com scanf */<br />
<br />
int add_user()<br />
{<br />
}<br />
<br />
/* remove o usuário - perguntar com scanf */<br />
void del_user()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* exemplo de uso */<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
#define TAM_MAX 10<br />
<br />
struct TEndereco {<br />
char *pRuaNumero;<br />
char *pCidade;<br />
char *pEstado;<br />
};<br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char *userID;<br />
char *senha;<br />
struct TEndereco *pEndereco;<br />
} TabelaUsuarios[TAM_MAX]={<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
{NULL,NULL,NULL},<br />
};<br />
<br />
/* adiciona usuario - retorna 0 se tudo ok e -1 se não conseguiu alocar */<br />
/* ler dados com scanf */<br />
<br />
int add_user()<br />
{<br />
char aux[100];<br />
int i;<br />
<br />
/* procurar a primeira entrada livre na tabela */<br />
for(i=0;i<TAM_MAX;i++) {<br />
if (TabelaUsuarios[i].userID==NULL)<br />
break;<br />
}<br />
<br />
if (i==TAM_MAX)<br />
return -1;<br />
<br />
/* ler userid para variavel auxiliar */<br />
printf("Entre com o userID\n");<br />
scanf("%s", aux); <br />
<br />
if( (TabelaUsuarios[i].userID = (char *) malloc(strlen(aux)+1)) == NULL) {<br />
return -1;<br />
}<br />
<br />
strcpy(TabelaUsuarios[i].userID, aux);<br />
<br />
printf("Entre com o senha\n");<br />
scanf("%s", aux); <br />
<br />
if((TabelaUsuarios[i].senha = (char *) malloc(strlen(aux)+1)) == NULL) {<br />
free(TabelaUsuarios[i].userID);<br />
TabelaUsuarios[i].userID = NULL;<br />
return -1;<br />
}<br />
<br />
strcpy(TabelaUsuarios[i].senha, aux);<br />
<br />
if((TabelaUsuarios[i].pEndereco = (struct TEndereco *) malloc(sizeof(struct TEndereco))) == NULL) {<br />
free(TabelaUsuarios[i].userID);<br />
free(TabelaUsuarios[i].senha); <br />
TabelaUsuarios[i].userID = NULL;<br />
TabelaUsuarios[i].senha = NULL; <br />
return -1; <br />
}<br />
<br />
printf("Entre com a rua\n");<br />
scanf("%s", aux); <br />
<br />
if( (TabelaUsuarios[i].pEndereco->pRuaNumero = (char *) malloc(strlen(aux)+1)) == NULL) { <br />
free(TabelaUsuarios[i].userID);<br />
free(TabelaUsuarios[i].senha); <br />
TabelaUsuarios[i].userID = NULL;<br />
TabelaUsuarios[i].senha = NULL; <br />
free(TabelaUsuarios[i].pEndereco);<br />
TabelaUsuarios[i].pEndereco = NULL; <br />
return -1; <br />
<br />
} <br />
strcpy(TabelaUsuarios[i].pEndereco->pRuaNumero, aux); <br />
<br />
return 0;<br />
}<br />
<br />
/* remove o usuário - perguntar com scanf */<br />
void del_user()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* exemplo de uso */<br />
}<br />
</syntaxhighlight><br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 31/10/2013}}<br />
<br />
==AULA 26 DIA 4/11/2013==<br />
<br />
===Objetivos===<br />
<br />
*Divisão em duplas;<br />
*Início de trabalho de final de disciplina.<br />
<br />
===Exercício 1===<br />
<br />
Considere um sistema de controle de ar condicionado que permite controlar salas de uma instituição.<br />
Elaborar uma estrutura para servir como base de uma lista ligada capaz de representar estas salas. <br />
Uma sala possui um nome e uma temperatura que deve ser controlada. Um administrador deve ter as seguintes funções:<br />
*inserir nova sala;<br />
*editar sala;<br />
*remover sala;<br />
*modificar temperatura da sala;<br />
Duas salas não podem ter o mesmo nome. As temperaturas controladas somente podem estar na faixa de 0 a 30 graus.<br />
<br />
Faça um programa que implemente estas funções.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
struct TSala {<br />
char nome[30];<br />
float temperatura;<br />
struct TSala *next;<br />
};<br />
<br />
struct TSala *head=NULL,<br />
*tail=NULL;<br />
<br />
int adiciona_sala()<br />
{<br />
struct TSala *p;<br />
<br />
p = (struct TSala *) malloc (sizeof(struct TSala));<br />
if(!p)<br />
return -1;<br />
<br />
printf("Entre com o nome da sala\n");<br />
scanf("%s",p->nome);<br />
printf("Entre com a temperatura\n"); <br />
scanf("%f",&p->temperatura); <br />
<br />
p->next = NULL;<br />
<br />
if(head==NULL) {<br />
head = tail = p;<br />
} else {<br />
tail->next = p;<br />
tail = p;<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
void imprime_lista()<br />
{<br />
struct TSala *p;<br />
<br />
for(p=head;p!=NULL;p=p->next) {<br />
printf("Sala %s\n", p->nome);<br />
printf("Temperatura %f\n", p->temperatura);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
adiciona_sala();<br />
adiciona_sala();<br />
adiciona_sala();<br />
imprime_lista();<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=61289PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-10-24T23:00:48Z<p>Beatriz.s: /* Múltiplas indireções */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 18 DIA 9/10/2013}}<br />
<br />
== AULA 18 DIA 9/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Seja uma matriz 10x4, onde nas duas primeiras colunas (0 e 1) estão armazenados por linha um número complexo no formato retangular. Computar as duas colunas finais onde na coluna 2 estão o modulo e na 3 o ângulo.<br />
Esqueleto:<br />
<syntaxhighlight lang=c><br />
#define LINHA 10<br />
#define COLUNA 4<br />
<br />
float Matriz[LINHA][COLUNA] = {<br />
{5.8,9.7},<br />
{6.7,12.5},<br />
{3.8,20.7},<br />
{6.7,12.5},<br />
{5.8,12.4},<br />
{6.7,18.5},<br />
{15.8,39.7},<br />
{6.7,12.5},<br />
{55.8,9.7},<br />
{66.8,40.9} <br />
};<br />
<br />
float CalculaModulo(float parx, pary)<br />
{<br />
float modulo;<br />
/* a fazer */<br />
return modulo;<br />
} <br />
<br />
float CalculaAngulo(float parx, pary)<br />
{<br />
float angulo;<br />
/* a fazer */<br />
return angulo;<br />
} <br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<LINHA;i++) {<br />
Matriz[i][2] = CalculaModulo(Matriz[i][0], Matriz[i][1]);<br />
Matriz[i][3] = CalculaAngulo(Matriz[i][0], Matriz[i][1]); <br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Exercício 16 AULA 8<br />
<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
AULA 10 - Exercício 2<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 19 DIA 9/10/2013}}<br />
== AULA 19 DIA 9/10/2013==<br />
[http://wiki.sj.ifsc.edu.br/index.php/Abcdef]<br />
http://wiki.sj.ifsc.edu.br/index.php/Aval2<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 14/10/2013}}<br />
== AULA 20 DIA 14/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*uso de ponteiros para passar parâmetros;<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser + ou menos. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 21 DIA 16/10/2013}}<br />
== AULA 21 DIA 16/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicação conforme abaixo:<br />
<br />
$ cmpcadeia alfa beta gama delta<br />
$ cmpcadeia: dois parâmetros devem ser passados<br />
<br />
$ cmpcadeia alfa beta<br />
$ cmpcadeia: as strings são diferentes<br />
<br />
$ cmpcadeia alfa alfa<br />
$ cmpcadeia: as strings são iguais<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
<br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser '+' ou '-'. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 17/10/2013}}<br />
<br />
==AULA 22 DIA 17/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*comando switch e aplicação na construção do menu de opções do controle de acesso;<br />
*Ponteiros (continuação);<br />
<br />
===Comando ''switch'' ===<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1<br />
<br />
Implementar um programa de calculadora similar ao da aula passada, onde dois operandos e um operador são fornecidos na linha de comando. O operador pode ser uma das 4 operações básicas. Usar um switch para testar o operador e implementar a operação.<br />
<br />
===Continuação de Ponteiros===<br />
<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Múltiplas indireções===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int a, *b, **c, ***d;<br />
<br />
a = 3;<br />
b = &a;<br />
c = &b;<br />
d = &c;<br />
<br />
printf("Valor de a = %d\n",***d);<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
#include <stdio.h><br />
<br />
main () {<br />
<br />
char opcao;<br />
int opr1;<br />
int opr2;<br />
int result;<br />
printf("Entre com a operação desejada\n");<br />
opcao=getchar();<br />
<br />
printf("Entre com o operando\n");<br />
scanf("%d",&opr1);<br />
<br />
printf("Entre com outro operando\n");<br />
scanf("%d",&opr2);<br />
<br />
switch(opcao) {<br />
case '+':<br />
<br />
result=opr1+opr2;<br />
printf("Soma: %d\n",result);<br />
break; /* o break força o encerramento da instrução*/<br />
case '-':<br />
result=opr1-opr2;<br />
printf("Subtração: %d\n",result);<br />
break;<br />
case '*':<br />
result=opr1*opr2;<br />
printf("Multiplicação: %d\n",result);<br />
break;<br />
case '/':<br />
result=opr1/opr2;<br />
printf("Divisão: %d\n",result);<br />
break;<br />
<br />
default:<br />
printf("Nenhuma das operações é válida!\n");<br />
break; <br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|AULA 23 DIA 21/10/2013}}<br />
<br />
==AULA 23 DIA 21/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*exercícios ponteiros;<br />
*anatomia de um programa em execução;<br />
*alocação dinâmica de memória.<br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar uma função que recebe dois números complexos no formato retangular e retorna a soma dos mesmos no no formato polar. Os parâmetros são passados por referência (usar ponteiro). Demonstre o funcionamento no programa main.<br />
<br />
<syntaxhighlight lang=c><br />
struct TComplexoRet {<br />
float x;<br />
float y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod;<br />
float ang;<br />
};<br />
<br />
struct TComplexoPolar conv_polar(struct TComplexoRet *p1, struct TComplexoRet *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
obs: é possível retornar um ponteiro para uma estrutura??<br />
Exercício 2<br />
<br />
Implemente uma função usando ponteiros que recebe duas strings como parâmetro e retorna o número de vezes que a segunda string está contida na primeira. Use a função da biblioteca strcmp() como apoio.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <string.h><br />
<br />
int conta_sub_strings(char *p1, char *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Seja um vetor de inteiros ''x'' definido globalmente. Implemente uma função para ler dados para este vetor, dado o endereço inicial do mesmo e o tamanho. Imprima na função ''main'' o vetor. Usar ponteiros no acesso ao vetor.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int x[10];<br />
<br />
void ler_vetor(int *p, int tamanho)<br />
{<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implemente uma função que recebe uma ''string'' como parâmetro. Esta ''string'' contém um número inteiro. A função deve retornar um inteiro no formato ''int''. Obs: é uma reimplementação do ''atoi'' da biblioteca.<br />
<br />
===A área de heap e o layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*py = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando uma estrutura ===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
};<br />
<br />
struct TTeste *teste;<br />
<br />
<br />
<br />
teste = (struct TTeste *) malloc (sizeof(struct TTeste));<br />
if (teste==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste->x=10;<br />
<br />
free(teste);<br />
<br />
teste=NULL;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: <br />
<br />
Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 24/10/2013}}<br />
<br />
==AULA 24 DIA 24/10/2013==<br />
<br />
===Exercícios de Ponteiros===<br />
<br />
Exercício 1 - Verificar qual o erro do código abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
t->y = 5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2 - Qual o valor a ser impresso no printf do programa abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TTeste {<br />
int x;<br />
int y;<br />
struct TTeste *p;<br />
}; <br />
<br />
main()<br />
{<br />
<br />
struct TTeste x = {4,7,NULL};<br />
struct TTeste y = {10,8,NULL};<br />
<br />
struct TTeste *teste;<br />
<br />
x.p = &y;<br />
teste = &x;<br />
<br />
printf ("Valor = %d\n", teste->p->x);<br />
}<br />
</syntaxhighlight><br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=61288PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-10-24T22:58:35Z<p>Beatriz.s: /* Múltiplas indireções */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 18 DIA 9/10/2013}}<br />
<br />
== AULA 18 DIA 9/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Seja uma matriz 10x4, onde nas duas primeiras colunas (0 e 1) estão armazenados por linha um número complexo no formato retangular. Computar as duas colunas finais onde na coluna 2 estão o modulo e na 3 o ângulo.<br />
Esqueleto:<br />
<syntaxhighlight lang=c><br />
#define LINHA 10<br />
#define COLUNA 4<br />
<br />
float Matriz[LINHA][COLUNA] = {<br />
{5.8,9.7},<br />
{6.7,12.5},<br />
{3.8,20.7},<br />
{6.7,12.5},<br />
{5.8,12.4},<br />
{6.7,18.5},<br />
{15.8,39.7},<br />
{6.7,12.5},<br />
{55.8,9.7},<br />
{66.8,40.9} <br />
};<br />
<br />
float CalculaModulo(float parx, pary)<br />
{<br />
float modulo;<br />
/* a fazer */<br />
return modulo;<br />
} <br />
<br />
float CalculaAngulo(float parx, pary)<br />
{<br />
float angulo;<br />
/* a fazer */<br />
return angulo;<br />
} <br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<LINHA;i++) {<br />
Matriz[i][2] = CalculaModulo(Matriz[i][0], Matriz[i][1]);<br />
Matriz[i][3] = CalculaAngulo(Matriz[i][0], Matriz[i][1]); <br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Exercício 16 AULA 8<br />
<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
AULA 10 - Exercício 2<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 19 DIA 9/10/2013}}<br />
== AULA 19 DIA 9/10/2013==<br />
[http://wiki.sj.ifsc.edu.br/index.php/Abcdef]<br />
http://wiki.sj.ifsc.edu.br/index.php/Aval2<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 14/10/2013}}<br />
== AULA 20 DIA 14/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*uso de ponteiros para passar parâmetros;<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser + ou menos. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 21 DIA 16/10/2013}}<br />
== AULA 21 DIA 16/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicação conforme abaixo:<br />
<br />
$ cmpcadeia alfa beta gama delta<br />
$ cmpcadeia: dois parâmetros devem ser passados<br />
<br />
$ cmpcadeia alfa beta<br />
$ cmpcadeia: as strings são diferentes<br />
<br />
$ cmpcadeia alfa alfa<br />
$ cmpcadeia: as strings são iguais<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
<br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser '+' ou '-'. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 17/10/2013}}<br />
<br />
==AULA 22 DIA 17/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*comando switch e aplicação na construção do menu de opções do controle de acesso;<br />
*Ponteiros (continuação);<br />
<br />
===Comando ''switch'' ===<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1<br />
<br />
Implementar um programa de calculadora similar ao da aula passada, onde dois operandos e um operador são fornecidos na linha de comando. O operador pode ser uma das 4 operações básicas. Usar um switch para testar o operador e implementar a operação.<br />
<br />
===Continuação de Ponteiros===<br />
<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Múltiplas indireções===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int a, *b, **c, ***d;<br />
<br />
a = 3;<br />
b = &a;<br />
c = &b;<br />
d = &c;<br />
<br />
printf("Valor de a = %d\n",***d);<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
#include <stdio.h><br />
<br />
main () {<br />
<br />
char opcao;<br />
int opr1;<br />
int opr2;<br />
int result;<br />
printf("Entre com a operação desejada\n");<br />
opcao=getchar();<br />
<br />
printf("Entre com o operando\n");<br />
scanf("%d",&opr1);<br />
<br />
printf("Entre com outro operando\n");<br />
scanf("%d",&opr2);<br />
<br />
switch(opcao) {<br />
case '+':<br />
<br />
result=opr1+opr2;<br />
printf("Soma: %d\n",result);<br />
break; /* o break força o encerramento da instrução*/<br />
case '-':<br />
result=opr1-opr2;<br />
printf("Subtração: %d\n",result);<br />
break;<br />
case '*':<br />
result=opr1*opr2;<br />
printf("Multiplicação: %d\n",result);<br />
break;<br />
case '/':<br />
result=opr1/opr2;<br />
printf("Divisão: %d\n",result);<br />
break;<br />
<br />
default:<br />
printf("Nenhuma das operações é válida!\n");<br />
break; <br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|AULA 23 DIA 21/10/2013}}<br />
<br />
==AULA 23 DIA 21/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*exercícios ponteiros;<br />
*anatomia de um programa em execução;<br />
*alocação dinâmica de memória.<br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar uma função que recebe dois números complexos no formato retangular e retorna a soma dos mesmos no no formato polar. Os parâmetros são passados por referência (usar ponteiro). Demonstre o funcionamento no programa main.<br />
<br />
<syntaxhighlight lang=c><br />
struct TComplexoRet {<br />
float x;<br />
float y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod;<br />
float ang;<br />
};<br />
<br />
struct TComplexoPolar conv_polar(struct TComplexoRet *p1, struct TComplexoRet *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
obs: é possível retornar um ponteiro para uma estrutura??<br />
Exercício 2<br />
<br />
Implemente uma função usando ponteiros que recebe duas strings como parâmetro e retorna o número de vezes que a segunda string está contida na primeira. Use a função da biblioteca strcmp() como apoio.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <string.h><br />
<br />
int conta_sub_strings(char *p1, char *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Seja um vetor de inteiros ''x'' definido globalmente. Implemente uma função para ler dados para este vetor, dado o endereço inicial do mesmo e o tamanho. Imprima na função ''main'' o vetor. Usar ponteiros no acesso ao vetor.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int x[10];<br />
<br />
void ler_vetor(int *p, int tamanho)<br />
{<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implemente uma função que recebe uma ''string'' como parâmetro. Esta ''string'' contém um número inteiro. A função deve retornar um inteiro no formato ''int''. Obs: é uma reimplementação do ''atoi'' da biblioteca.<br />
<br />
===A área de heap e o layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*py = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando uma estrutura ===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
};<br />
<br />
struct TTeste *teste;<br />
<br />
<br />
<br />
teste = (struct TTeste *) malloc (sizeof(struct TTeste));<br />
if (teste==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste->x=10;<br />
<br />
free(teste);<br />
<br />
teste=NULL;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: <br />
<br />
Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 24/10/2013}}<br />
<br />
==AULA 24 DIA 24/10/2013==<br />
<br />
===Exercícios de Ponteiros===<br />
<br />
Exercício 1 - Verificar qual o erro do código abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
t->y = 5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2 - Qual o valor a ser impresso no printf do programa abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TTeste {<br />
int x;<br />
int y;<br />
struct TTeste *p;<br />
}; <br />
<br />
main()<br />
{<br />
<br />
struct TTeste x = {4,7,NULL};<br />
struct TTeste y = {10,8,NULL};<br />
<br />
struct TTeste *teste;<br />
<br />
x.p = &y;<br />
teste = &x;<br />
<br />
printf ("Valor = %d\n", teste->p->x);<br />
}<br />
</syntaxhighlight><br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=61287PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-10-24T22:56:07Z<p>Beatriz.s: /* Múltiplas indireções */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 18 DIA 9/10/2013}}<br />
<br />
== AULA 18 DIA 9/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Seja uma matriz 10x4, onde nas duas primeiras colunas (0 e 1) estão armazenados por linha um número complexo no formato retangular. Computar as duas colunas finais onde na coluna 2 estão o modulo e na 3 o ângulo.<br />
Esqueleto:<br />
<syntaxhighlight lang=c><br />
#define LINHA 10<br />
#define COLUNA 4<br />
<br />
float Matriz[LINHA][COLUNA] = {<br />
{5.8,9.7},<br />
{6.7,12.5},<br />
{3.8,20.7},<br />
{6.7,12.5},<br />
{5.8,12.4},<br />
{6.7,18.5},<br />
{15.8,39.7},<br />
{6.7,12.5},<br />
{55.8,9.7},<br />
{66.8,40.9} <br />
};<br />
<br />
float CalculaModulo(float parx, pary)<br />
{<br />
float modulo;<br />
/* a fazer */<br />
return modulo;<br />
} <br />
<br />
float CalculaAngulo(float parx, pary)<br />
{<br />
float angulo;<br />
/* a fazer */<br />
return angulo;<br />
} <br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<LINHA;i++) {<br />
Matriz[i][2] = CalculaModulo(Matriz[i][0], Matriz[i][1]);<br />
Matriz[i][3] = CalculaAngulo(Matriz[i][0], Matriz[i][1]); <br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
Exercício 16 AULA 8<br />
<br />
<br />
===Exercício modelo para uma das questões da avaliação===<br />
<br />
AULA 10 - Exercício 2<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 19 DIA 9/10/2013}}<br />
== AULA 19 DIA 9/10/2013==<br />
[http://wiki.sj.ifsc.edu.br/index.php/Abcdef]<br />
http://wiki.sj.ifsc.edu.br/index.php/Aval2<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 14/10/2013}}<br />
== AULA 20 DIA 14/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*uso de ponteiros para passar parâmetros;<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO 1: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser + ou menos. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 21 DIA 16/10/2013}}<br />
== AULA 21 DIA 16/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*vetor de ponteiros;<br />
*argc e argv<br />
<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicação conforme abaixo:<br />
<br />
$ cmpcadeia alfa beta gama delta<br />
$ cmpcadeia: dois parâmetros devem ser passados<br />
<br />
$ cmpcadeia alfa beta<br />
$ cmpcadeia: as strings são diferentes<br />
<br />
$ cmpcadeia alfa alfa<br />
$ cmpcadeia: as strings são iguais<br />
<br />
EXERCÍCIO 3: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
<br />
<br />
Exercício 4<br />
<br />
Implememtar um programa que recebe 3 parâmetros na linha de comando: dois números reais e um operador (char). Operador pode ser '+' ou '-'. O programa deve mostrar o resultado da operação. Exemplo:<br />
<br />
calcula 3.5 + 2.6<br />
<br />
OBS: usar a função atof para converter string em float. <br />
<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
destino++;<br />
}<br />
while(*origem!=0){<br />
*destino++=*origem++;<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2<br />
<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 17/10/2013}}<br />
<br />
==AULA 22 DIA 17/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*comando switch e aplicação na construção do menu de opções do controle de acesso;<br />
*Ponteiros (continuação);<br />
<br />
===Comando ''switch'' ===<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1<br />
<br />
Implementar um programa de calculadora similar ao da aula passada, onde dois operandos e um operador são fornecidos na linha de comando. O operador pode ser uma das 4 operações básicas. Usar um switch para testar o operador e implementar a operação.<br />
<br />
===Continuação de Ponteiros===<br />
<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Múltiplas indireções===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int a, *b, **c, ***d;<br />
<br />
a = 3;<br />
b = &a;<br />
c = &b;<br />
d = &c;<br />
<br />
printf("Valor de a = %d\n",***d);<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse top|Soluções}}<br />
Exercício 1<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|AULA 23 DIA 21/10/2013}}<br />
<br />
==AULA 23 DIA 21/10/2013==<br />
<br />
===Objetivos===<br />
<br />
*exercícios ponteiros;<br />
*anatomia de um programa em execução;<br />
*alocação dinâmica de memória.<br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar uma função que recebe dois números complexos no formato retangular e retorna a soma dos mesmos no no formato polar. Os parâmetros são passados por referência (usar ponteiro). Demonstre o funcionamento no programa main.<br />
<br />
<syntaxhighlight lang=c><br />
struct TComplexoRet {<br />
float x;<br />
float y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod;<br />
float ang;<br />
};<br />
<br />
struct TComplexoPolar conv_polar(struct TComplexoRet *p1, struct TComplexoRet *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
obs: é possível retornar um ponteiro para uma estrutura??<br />
Exercício 2<br />
<br />
Implemente uma função usando ponteiros que recebe duas strings como parâmetro e retorna o número de vezes que a segunda string está contida na primeira. Use a função da biblioteca strcmp() como apoio.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <string.h><br />
<br />
int conta_sub_strings(char *p1, char *p2)<br />
{<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 3<br />
<br />
Seja um vetor de inteiros ''x'' definido globalmente. Implemente uma função para ler dados para este vetor, dado o endereço inicial do mesmo e o tamanho. Imprima na função ''main'' o vetor. Usar ponteiros no acesso ao vetor.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int x[10];<br />
<br />
void ler_vetor(int *p, int tamanho)<br />
{<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Exercício 4<br />
<br />
Implemente uma função que recebe uma ''string'' como parâmetro. Esta ''string'' contém um número inteiro. A função deve retornar um inteiro no formato ''int''. Obs: é uma reimplementação do ''atoi'' da biblioteca.<br />
<br />
===A área de heap e o layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*py = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando uma estrutura ===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
};<br />
<br />
struct TTeste *teste;<br />
<br />
<br />
<br />
teste = (struct TTeste *) malloc (sizeof(struct TTeste));<br />
if (teste==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste->x=10;<br />
<br />
free(teste);<br />
<br />
teste=NULL;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct TTeste{<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct TTeste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: <br />
<br />
Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 24/10/2013}}<br />
<br />
==AULA 24 DIA 24/10/2013==<br />
<br />
===Exercícios de Ponteiros===<br />
<br />
Exercício 1 - Verificar qual o erro do código abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
struct TTeste {<br />
int x;<br />
int y;<br />
} *teste;<br />
<br />
t->y = 5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2 - Qual o valor a ser impresso no printf do programa abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TTeste {<br />
int x;<br />
int y;<br />
struct TTeste *p;<br />
}; <br />
<br />
main()<br />
{<br />
<br />
struct TTeste x = {4,7,NULL};<br />
struct TTeste y = {10,8,NULL};<br />
<br />
struct TTeste *teste;<br />
<br />
x.p = &y;<br />
teste = &x;<br />
<br />
printf ("Valor = %d\n", teste->p->x);<br />
}<br />
</syntaxhighlight><br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=60869PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-10-08T22:57:43Z<p>Beatriz.s: /* Ponteiros para qualquer coisa */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
*(destino++);<br />
}<br />
while(*origem!=0){<br />
*(destino++)=*(origem++);<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 1: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=60868PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-10-08T22:56:28Z<p>Beatriz.s: /* Argumentos de linha de comando */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
*(destino++);<br />
}<br />
while(*origem!=0){<br />
*(destino++)=*(origem++);<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 1: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<syntaxhighlight lang=c><br />
Código implementado pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int comp;<br />
if((argc-1)>2){<br />
printf("cmpcadeia: dois parametros devem ser passados\n");<br />
}else{<br />
comp=strcmp(argv[1],argv[2]);<br />
if(comp==0){<br />
printf("palavras iguais\n");<br />
}else{<br />
printf("palavras diferentes\n");<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 2: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
<code><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=60794PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-10-07T22:49:13Z<p>Beatriz.s: /* Usando ponteiro na passagem de parâmetros */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else {<br />
if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
}<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 5/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro. <syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno;<br />
<br />
if (num1==num2) {<br />
retorno=0;<br />
} else {<br />
if(num1 > num2){<br />
retorno=1;<br />
}else<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int ret;<br />
ret = compara_num(10,7);<br />
if(ret==0)<br />
printf("Números iguais\n");<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).<br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em ohms dado as três cores.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]. OBSERVAÇÂO: entrar as cores com números inteiros (1) preto etc.<br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<br />
#Melhorar o programa acima, construindo uma FUNÇÃO que recebe os coeficientes e o x como parâmetro, retornando o y.<br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math><br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências.<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<br />
#Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
#Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
#Implementar uma função da forma:<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
Exemplo de uso:<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<code><br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
</syntaxhighlight><br />
#Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
0 1 2 3 4 5 6 7<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
0 1 2 3 X 5 6 7<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
0 1 2 D X 5 6 7<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 DIA 9/09/2013}}<br />
<br />
== AULA 9 DIA 9/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá:<br />
<br />
*compreender o conceito de vetores;<br />
*definir e inicializar vetores do tipo int, float e double no C;<br />
*passar vetores como parâmetro (sem usar o conceito de ponteiros;<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Definindo e usando vetores no C===<br />
<br />
<br />
Um vetor pode ser facilmente definido no C da forma:<br />
<br />
TipoVetor NomeDoVetor[dimensao];<br />
<br />
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int vet1[5],vet2[5];<br />
int i;<br />
<br />
for(i=0;i<5;i++) {<br />
printf("Entre com vet[%d] => ",i);<br />
scanf("%d",&vet1[i]);<br />
vet2[i]=vet1[i]*5;<br />
}<br />
/* para conferir- vamos imprimir o conteúdo de vet2 */<br />
for(i=0;i<5;i++)<br />
printf("vet2[%d] => %d\n",i,vet2[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
i=2;<br />
x[i*2]=i*1.5; /* usando uma expressão como índice */<br />
<br />
while (i<8) { /* usando loop para acessar o vetor */<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam SEMPRE na posição 0<br />
<br />
===Iniciando vetores em C===<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando vetores como parâmetros===<br />
<br />
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void ler_vet(int aux[5])<br />
{<br />
int i;<br />
<br />
for (i=0;i<5;i++) {<br />
printf("aux[%d] <== ",i);<br />
scanf("%dd",&aux[i]);<br />
} <br />
}<br />
<br />
main()<br />
{<br />
int vet[5], i;<br />
<br />
ler_vet(vet);<br />
for (i=0;i<5;i++)<br />
printf("vet[%d]=%d\n",i,vet[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.<br />
<br />
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor. <br />
<br />
===Exercícios ===<br />
<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. <br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;u<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
#Considere um vetor global de ''floats'' chamado ''vetRnd'' de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6. <br />
#Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br />
#Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: <syntaxhighlight lang=c><br />
int compara_vetores(int ve1[],int vet2[], int tamanho)<br />
{<br />
int num_elementos;<br />
<br />
return num_elementos;<br />
}<br />
</syntaxhighlight><br />
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 12/09/2013}}<br />
<br />
== AULA 10 DIA 12/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetores de char e strings<br />
*Processamento de Strings<br />
<br />
===Tipo Char===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição{{collapse top|solução}}<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}</syntaxhighlight>{{collapse bottom}}<br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 11 DIA 16/09/2013}}<br />
<br />
<br />
== AULA 11 DIA 16/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
<br />
===Iniciando uma cadeia na declaração===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
</syntaxhighlight><br />
<br />
===Processamento de strings===<br />
<br />
Nas aulas anteriores vimos como definir e usar vetores. Vimos que é possível armazenar strings em vetores de char. O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos deste processamento.<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
A função abaixo permite computar o tamanho de uma string.<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
Da mesma forma que o exmplo anterior, implementar uma função similar a função strcat que permite concatenar duas strings passadas como parâmetro.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
Exercício:<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1 se elas forem diferentes. A função é ''case sensitive''.<br />
2.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
--><br />
3.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
5.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
6.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 12 DIA 19/09/2013}}<br />
<br />
== AULA 12 DIA 19/09/2013==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> <br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<br />
<br />
{{collapse top| soluções}}<br />
ex.1<br />
Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
ex.2<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 13 DIA 25/09/2013}}<br />
<br />
== AULA 13 DIA 25/09/2013==<br />
<br />
Avaliação I<br />
<br />
http://wiki.sj.ifsc.edu.br/index.php/Teste-prg-1<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 26/09/2013}}<br />
== AULA 14 DIA 26/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercícios<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
<br />
{{collapse top| soluções}}<br />
<br />
ex.1<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
ex.2<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ex.3<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 30/09/2013}}<br />
<br />
== AULA 15 DIA 30/09/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
===Iniciando structs na definição===<br />
<br />
Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria",<br />
"42342342234",<br />
{"Rua AlfaBeta","145"},<br />
5;<br />
};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceita de ponteiro.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<!-- <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
--><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 3/10/2013}}<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE<br />
*Exercícios com structs e matrizes<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.<br />
<br />
===Exercícios com structs===<br />
<br />
====Exercício 1====<br />
<br />
Implementar uma função ''converte_para_polar'' que recebe como parâmetro um número complexo na forma retangular (representado por uma ''struct''). A função deve retornar uma ''struct'' contendo o número complexo na forma polar.Usar as funções ''sqrtf'' e ''atanf'' da [[http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] biblioteca matemática]. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<br />
NOTE que as funções atanf e similares retornam em RADIANOS.<br />
<br />
====Exercício 2====<br />
<br />
Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
<br />
/* INICIAR DADOS AQUI PARA NÃO PRECISAR ENTRAR PELO TECLADO */<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
<br />
/* A FAZER */<br />
<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
====Exercício 3====<br />
<br />
Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita:<br />
*calcular o total contas em negativo;<br />
*retornar o saldo de um usuário dado o seu nome;<br />
*retornar o saldo de um usuário dado o seu CPF;<br />
*calcular o total de dinheiro do banco em função do saldo das contas<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
<br />
/* A FAZER */<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
/* A FAZER: INICIAR COM VALORES*/<br />
};<br />
<br />
float saldoTotal()<br />
{<br />
/* A FAZER */<br />
return saldoTotal;<br />
}<br />
<br />
int totalContasNegativas()<br />
{<br />
/* A FAZER */<br />
return TotalContas;<br />
}<br />
<br />
float saldoUsuarioPorCPF(char cpf[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
float saldoUsuarioPorNome(char nome[])<br />
{<br />
<br />
return saldo;<br />
}<br />
<br />
int main()<br />
{<br />
int x;<br />
char cpf[TAM_CPF];<br />
<br />
while(1){<br />
<br />
/* FAZER MENU DE OPÇÕES */<br />
}<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Exercícios com Matrizes===<br />
<br />
====Exercício 4====<br />
<br />
Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
<br />
====Exercício 5====<br />
<br />
Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
<br />
====Exercício 6====<br />
<br />
Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento significa casa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<br />
<br />
===Lista Exercícios===<br />
<br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
Soluções:<br />
{{collapse top}}<br />
<br />
Exercício 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 2<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
Exercício 3<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 7/10/2013}}<br />
<br />
== AULA 17 DIA 7/10/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
===Ponteiros===<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
<br />
OBSERVE que p++ incrementa em 4 unidades.<br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
<syntaxhighlight lang=c><br />
Implementação feita pela monitora de programação<br />
<br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
void str_cat(char *destino, char *origem){<br />
while(*destino!=0){<br />
*(destino++);<br />
}<br />
while(*origem!=0){<br />
*(destino++)=*(origem++);<br />
}<br />
*destino=0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
<br />
printf("string destino = %s\n", destino);<br />
<br />
str_cat(destino, "alunos");<br />
<br />
printf("string destino = %s\n", destino);<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 1: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 2: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===Ponteiros para qualquer coisa===<br />
<br />
Podemos criar ponteiros para apontar para qualquer objeto na memória.<br />
Por exemplo, podemos apontar para variáveis do tipo float, double etc.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float a, *p;<br />
<br />
p=&a;<br />
<br />
*p= 5.5;<br />
<br />
}<br />
<code><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-2-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=58913PRG1-2013-2-Engenharia Programação 1 - Engenharia2013-09-05T00:23:06Z<p>Beatriz.s: /* Exercícios de fixação de chamada de funções com parâmetros */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=DADOS DA DISCIPLINA=<br />
<br />
==CARGA HORÁRIA==<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
==PRÉ REQUISITOS: LÓGICA ==<br />
<br />
==EMENTA==<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
==Bibliografia Básica==<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
==Referências Complementares==<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 15/08/2013}}<br />
== AULA 1 DIA 15/08/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C , por exemplo.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Representando o algoritmo com pseudo-código===<br />
<br />
<code><br />
ALGORITMO MEDIA<br />
VARIAVEIS<br />
NUM1: INTEIRO<br />
NUM2: INTEIRO<br />
MEDIA: REAL<br />
INICIO<br />
LER NUM1<br />
LER NUM2<br />
MEDIA = (NUM1+NUM2)/2<br />
MOSTRAR MEDIA<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Representando o algoritmo em linguagem C===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1,num2;<br />
float media;<br />
<br />
scanf("%d",&num1);<br />
scanf("%d",&num2);<br />
media = (num1+num2)/2.0;<br />
prinft("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta <math> y = 5x+2 </math> dado x. Identifique quem são as variáveis e constantes do problema.<br />
<br />
2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes ''a'' e ''b''. OBS: <math>DELTA=b^2-4ac</math><br />
<br />
3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2. <br />
<br />
4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.<br />
<br />
5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre<br />
um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.<br />
<br />
6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.<br />
<br />
7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 19/08/2013}}<br />
== AULA 2 DIA 19/08/2013==<br />
<br />
===Objetivos ===<br />
<br />
O aluno deverá saber utilizar expressões com:<br />
<br />
*Operadores Relacionais e Lógicos<br />
*Comandos de Decisão<br />
*Comandos de decisão com aninhamento<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:<br />
<br />
Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se <br />
<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
X = A>B<br />
MOSTRAR "A expressão A>B é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
Exercício: Fazer um fluxograma para o algoritmo acima.<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.<br />
<br />
<code><br />
ALGORITMO exemplo<br />
VARIÁVEIS:<br />
A: inteiro<br />
B: inteiro<br />
C: inteiro<br />
X: booleana<br />
INÍCIO<br />
LER A<br />
LER B<br />
LER C<br />
X = A>B E A < C<br />
MOSTRAR "A expressão A>B E A<C é ", X<br />
FIM<br />
</syntaxhighlight> <br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.<br />
<br />
===Controle do Fluxo de Execução: Estruturas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
=====Algoritmo usando Fluxograma=====<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
=====Algoritmo usando Pseudo-código=====<br />
<br />
<code><br />
ALGORITMO ControleAcesso<br />
VARIÁVEIS<br />
SENHA: alfanumérica<br />
INICIO<br />
LER SENHA <br />
SE SENHA=="alfa" ENTÃO<br />
"Abrir a porta"<br />
SENÃO<br />
"Senha não confere"<br />
FIMSE<br />
IR PARA INICIO<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Aninhamento de estruturas de decisão===<br />
<br />
Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.<br />
<br />
<code><br />
ALGORITMO trangulo<br />
VARIAVEIS<br />
lado1,lado2,lado3: real<br />
INICIO<br />
SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO<br />
MOSTRAR "não é triângulo"<br />
SENÃO<br />
SE lado1==lado2 E lado1==lado3 ENTÃO<br />
MOSTRAR "equilatero"<br />
SENAO<br />
SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO<br />
MOSTRAR "isósceles"<br />
SENÃO<br />
MOSTRAR "escaleno"<br />
FIMSE<br />
FIMSE<br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 23/08/2013}}<br />
<br />
== AULA 3 DIA 23/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
<br />
=== Compilando um programa C===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Estrutura do Programa em C===<br />
<br />
Um programa em C pode ser visto como um conjunto de uma ou mais funções:<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No programa acima temos uma única função: a função ''main()''<br />
Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função ''main''. A primeira instrução desta função é o ponto de entrada do código do usuário. <br />
<br />
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''. Esta função permite mostrar dados no terminal. <br />
<br />
Não é possível colocar instruções fora de funções!<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 5 | x<br />
+-----+<br />
<br />
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.<br />
<br />
+-----+<br />
<nowiki>|</nowiki> 6.5 | y<br />
+-----+<br />
<br />
Observe que as instruções de atribuição acima envolvem constantes também.<br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados: o ''printf()'' - já apresentado - e o ''scanf()''. Esta última função permite entrada de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Construindo expressões no C===<br />
<br />
====Operador de Atribuição====<br />
<br />
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.<br />
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e a média é calculada e colocada na variável média.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%f", &x);<br />
printf("Entre com y\n");<br />
scanf("%f", &y);<br />
media = (x+y)/2;<br />
printf("Valor de media = %f\n",media);<br />
}<br />
</syntaxhighlight><br />
<br />
Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que o código:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: ''lvalue required as left operand of assignment''<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br />
<br />
====Operadores aritméticos====<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
====Operadores Relacionais e Lógicos====<br />
<br />
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND (E)<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR (OU)<br />
|-<br />
|!<br />
|NOT (NÃO)<br />
|}<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.<br />
<br />
Exemplo:<br />
<syntaxhighlight lang=c><br />
if (2)<br />
printf("expressão sempre VERDADEIRA");<br />
if ('2')<br />
printf("expressão sempre VERDADEIRA"); <br />
if (1-1)<br />
printf("expressão sempre FALSA");<br />
if (x=1) /* um erro comum - sinal de atribuição no lugar de == */<br />
printf("expressão sempre VERDADEIRA");<br />
</syntaxhighlight><br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius. <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.<br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.<br />
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios adicionais===<br />
<br />
Exercício 1<br />
<br />
Considere dois vetores '''A''' e '''B''' dados pelas coordenadas em (x,y) em um espaço ''n'' dimensional [http://pt.wikipedia.org/wiki/Produto_escalar]:<br />
<br />
: <math>\bold{A} = \left( a_1, a_2, \cdots, a_n \right)</math><br />
: <math>\bold{B} = \left( b_1, b_2, \cdots, b_n \right)</math><br />
<br />
O produto escalar entre '''A''' e '''B''' é escrito como sendo:<br />
<br />
: <math>\bold{A}\cdot\bold{B} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n </math><br />
<br />
Implemente um programa C para calcular o produto escalar entre dois vetores representados no plano (2 dimensões).<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um programa ''Scratch'' para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido. <br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
Exercício 3<br />
<br />
Implementar um programa C que pergunta por uma opção de cálculo e então realiza uma das seguintes operações:<br />
*(1)conversão de um número complexo representado na forma retangular para polar;<br />
*(2)conversão de um número complexo representado na forma polar para retangular;<br />
*(3)soma de dois números complexos no formato retangular;<br />
*(4)soma de dois números complexos no formato polar.<br />
<br />
Note que para um dado número complexo <math>z</math> tem-se:<br />
<br />
:<math>\textstyle r=|z|=\sqrt{x^2+y^2}.\,</math><br />
<br />
:<math>\varphi = \arg(z) =<br />
\begin{cases}<br />
\arctan(\frac{y}{x}) & \mbox{if } x > 0 \\<br />
\arctan(\frac{y}{x}) + \pi & \mbox{if } x < 0 \mbox{ and } y \ge 0\\<br />
\arctan(\frac{y}{x}) - \pi & \mbox{if } x < 0 \mbox{ and } y < 0\\<br />
\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y > 0\\<br />
-\frac{\pi}{2} & \mbox{if } x = 0 \mbox{ and } y < 0\\<br />
\mbox{indeterminado } & \mbox{if } x = 0 \mbox{ and } y = 0.<br />
\end{cases}</math><br />
<br />
e<br />
<br />
:<math> z = r(\cos \varphi + i\sin \varphi ).\,</math><br />
onde<br />
:<math> x = r \cos \varphi </math><br />
:<math> y = r \sin \varphi </math><br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 24/08/2013}}<br />
<br />
== AULA 4 DIA 24/08/2013==<br />
<br />
Aula de sábado - Exercícios propostos na aula anterior<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 26/08/2013}}<br />
<br />
== AULA 5 DIA 26/08/2013==<br />
<br />
===Objetivos===<br />
<br />
*Estruturas de Repetição<br />
*Repetições com teste de condição no início;<br />
*Repetições com teste de condição no final;<br />
*Repetições com número determinado;<br />
<br />
===Repetições com teste de condição no início===<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO <br />
<br />
Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF.<br />
<br />
===Estruturas de repetição com teste no início===<br />
<br />
No exemplo anterior mostramos uma estruta de repetição com teste no início do loop.<br />
<br />
O teste no início permite permite que se execute o LOOP 0 ou mais vezes.<br />
<br />
Neste tipo de REPETIÇÃO pode ser necessário algum processamento antes do LOOP para<br />
que se possa avaliar a CONDIÇÂO de teste. Exemlo:<br />
<br />
Implementar um algoritmo em pseudocódigo que calcule a soma de uma QUANTIDADE indeterminada de números INTEIROS POSITIVOS fornecidos como entrada. Quando o número for ZERO ou NEGATIVO o algoritmo deve mostrar o resultado e se encerrar.<br />
<br />
<code><br />
ALGORITMO somatorio<br />
VARIAVEIS<br />
SOMA: inteiro<br />
NUM: inteiro<br />
INICIO<br />
SOMA=0<br />
LER NUM<br />
ENQUANTO NUM > 0 FAÇA<br />
SOMA = SOMA + NUM;<br />
LER NUM<br />
FIM_ENQUANTO<br />
MOSTRAR SOMA<br />
FIM<br />
</syntaxhighlight><br />
<br />
Note que antes do LOOP foi realizado um processamento (LER NUM) de forma a permitir um teste válido no início.<br />
<br />
EXERCÍCIO<br />
<br />
Modificar o exercício anterior para que seja ignorados números pares na computação da soma.<br />
<br />
===Estruturas de repetição com teste no final===<br />
<br />
Por vezes é necessário que o LOOP se execute pelo menos uma VEZ. <br />
<br />
Exemplo: O usuário deve tentar adivinhar uma palavra pré-determinada. Ele pode errar até 3 vezes.<br />
<br />
<code><br />
ALGORITMO ADIVINHA_PALAVRA<br />
PALAVRA: alfanumerica<br />
CONT: inteiro<br />
INICIO<br />
CONT = 0<br />
FAÇA<br />
LER PALAVRA<br />
SE PALAVRA == "IFSC"<br />
MOSTRAR "Acertou!"<br />
CONT=4;<br />
SENAO<br />
CONT=CONT+1<br />
FIM_SE<br />
ENQUANTO CONT<3<br />
FIM<br />
</syntaxhighlight><br />
<br />
Neste caso, pela estrutura do problema, a palavra deve ser lida pelo menos uma vez.<br />
<br />
<br />
Exercícios<br />
<br />
Coloque o algoritmo na forma de fluxograma.<br />
<br />
===Aninhamento de estruturas de repetição===<br />
<br />
Note que estruturas de repetição podem ser aninhadas. <br />
<br />
Problema: Elaborar um pseudocódigo para calcular <math>x^y</math> onde x e y são positivos e fornecidos pelo teclado. O algoritmo permite entrar continuamente com <math><x></math> e, caso seja negativo, o programa deve se encerrar. Caso <math>y</math> seja negativo, o algoritmo deve continuamente informar que este deve ser positivo e deve permitir que o usuário forneça-o novamente.<br />
<br />
<code><br />
ALGORITMO potencia<br />
VARIAVEL<br />
X, Y, I, POT: inteiro<br />
INICIO<br />
LER X<br />
ENQUANTO X > 0 FAÇA<br />
LER Y<br />
ENQUANTO Y < 1 FAÇA<br />
LER Y<br />
FIM_ENQUANTO<br />
POT = 1<br />
FAÇA<br />
POT = POT*X;<br />
Y = Y - 1<br />
ENQUANTO Y > 0<br />
MOSTRAR POT<br />
LER X<br />
FIM_ENQUANTO <br />
FIM<br />
</syntaxhighlight><br />
<br />
===Exercícios===<br />
<br />
Exercício 1<br />
<br />
Implementar um algoritmo para calcular o fatorial de um número a ser lido pelo teclado. A função fatorial é definida por:<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
Use uma estrutura de repetição.<br />
<br />
Exercício 2<br />
<br />
Considere um móvel cuja velocidade no tempo é dada pela equação abaixo.<br />
<br />
: <math> v(t) = v_0 + 5t^3 </math><br />
<br />
Implemente um algoritmo na forma de fluxograma para calcular a a aceleração em um dado tempo <math>t_d</math> fornecido, conforme a sugestão abaixo. Mostre o resultado para<br />
<math>\Delta</math> variando de 0.1,0.01,...,0.000001. Calcule as derivadas para <math> t_d</math> variando de 0 a 10 com passo de 1.<br />
'''Sugestão:''' o programa deve calcular <math>v(t_d)</math> e <math>v(t_d+\Delta p)</math> onde <math>\Delta p</math> é um passo extremamente pequeno, por exemplo, 0.001. A aceleração no ponto <math>t_d</math> é a derivada de <math>v(t)</math> no ponto, podendo ser aproximada por <math> \frac{v(t_d+\Delta p)-v(t_d)}{\Delta p}</math>.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 DIA 29/08/2013}}<br />
<br />
== AULA 6 DIA 29/08/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de colocar estruturas de repetição especificadas<br />
em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====O comando ''while()'':teste da repetição no começo ====<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
while (''expressão'')<br />
''instrução_simples;''<br />
<br />
ou<br />
<br />
while (''expressão'') {<br />
''lista_de_instruções''<br />
} <br />
<br />
Vamos ver a correspondência do comando ''while'' com um fluxograma:<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while'': controle do ''loop'' no final====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
do { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
} while (contador<5);<br />
} <br />
</syntaxhighlight><br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (''expressão'');<br />
<br />
ou<br />
<br />
do {<br />
''lista_de_instruções''<br />
} while (''expressão''); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
for (i=0;i<10;i++)<br />
printf("i =%d\n",i);<br />
}<br />
</syntaxhighlight><br />
<br />
A estrutura do comando é:<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''instrução_simples;''<br />
ou<br />
<br />
for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') {<br />
''lista_de_instruções''<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Aninhamento de loops====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
printf("valor de i = %d\n", i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====Uso de break para sair de loops====<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
====Uso do continue para prosseguir no início do ''loop''====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
if (i==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
continue;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
====Usando o gdb para depurar programas====<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc ex1.c -o ex1 -lm<br />
<br />
====EXERCÍCIOS====<br />
<br />
#Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. <br />
#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight> Estude também o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
#Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
#Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
#Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;<br />
#Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<!--<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
--><br />
#Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Antes de executar o programa tente inferir todos os valores finais das variáveis.<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 DIA 2/09/2013}}<br />
<br />
== AULA 7 DIA 2/09/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
*passar parâmetros em funções e retonar valores.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
<br />
===Exemplo de Função usando pseudo-código===<br />
<br />
Seja uma função que retorna a média de 5 números reais passados como parâmetros:<br />
<br />
<code><br />
real FUNCAO(real num1, real num2, real num3, real num 4, real num5)<br />
VARIAVEIS<br />
media: real<br />
INICIO<br />
media = (num1+num2+num3+num4+num5) /5<br />
RETORNAR media <br />
FIM<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS===<br />
<br />
''EXERCÍCIO 1'': Implementar uma função (subprograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
Mostre um exemplo de uso a partir de um fluxograma principal.<br />
<br />
''EXERCÍCIO 2'': Usando a formula de Heron, implemente na forma de pseudo-código uma função que recebe três números reais (lados de um triângulo) e retorne o valor da área do mesmo.<br />
<br />
''EXERCÍCIO 3'': Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q'', onde "s" é o número inicial e "q" a razão da progressão. A função deve retornar um número real que é o valor da PG.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
<br />
''EXERCÍCIO 4:'' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade!<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 DIA 2/09/2013}}<br />
<br />
== AULA 8 DIA 5/09/2013==<br />
<br />
===Objetivos===<br />
<br />
Fixar conhecimentos de chamada de funções, passagem de parâmetro e retorno de valor.<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
<syntaxhighlight lang=c><br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2) {<br />
retorno=0;<br />
} else if(num1 > num2){<br />
retorno=1;<br />
}else if(num1 < num2){<br />
retorno=-1;<br />
}<br />
return retorno;<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<br />
<syntaxhighlight lang=c><br />
<br />
As alterações feitas no código, foram implementadas pela monitora Beatriz da Silveira<br />
<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
<br />
int compara_num(int num1, int num2)<br />
{<br />
int retorno=0;<br />
if (num1==num2 || num1>num2) {<br />
retorno=-1;<br />
} else{<br />
imprimeFaixa(num1,num2);<br />
}<br />
return retorno;<br />
}<br />
<br />
void imprimeFaixa(int n1,int n2){<br />
<br />
while(n1<=n2){<br />
printf(" %d ",n1);<br />
n1++;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y);<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Monitoria_de_Programa%C3%A7%C3%A3o&diff=56304Monitoria de Programação2013-07-14T23:32:32Z<p>Beatriz.s: </p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|Algoritmos}}<br />
==Algoritmos==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Fluxogramas}}<br />
==Fluxogramas==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Linguagem C}}<br />
<br />
==Linguagem C==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão===<br />
====''if()'' e ''if() else'' ====<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
====Comando ''switch''====<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Arrays}}<br />
==Arrays==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Funções}}<br />
<br />
==Funções==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Parâmetros e Retorno de Valores em Subprogramas (Funções)===<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Uso do DEFINE / Tipo Double / Biblioteca Math }}<br />
==Uso do DEFINE / Tipo Double / Biblioteca Math ==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da biblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Expressões Aritméticas e Lógicas}}<br />
==Expressões Aritméticas e Lógicas==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Tipo Char}}<br />
==Tipo Char==<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
{{collapse top|Estruturas de Repetição}}<br />
==Estruturas de Repetição==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
===Uso de break para sair de loops===<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
printf("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Lista de Exercícios}}<br />
<br />
==Lista de Exercícios==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Avaliação 01}}<br />
==Avaliação 01==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Vetores}}<br />
==Vetores==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Usando o gdb para depurar programas}}<br />
==Usando o gdb para depurar programas==<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Exercícios de Revisão }}<br />
==Exercícios de Revisão==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Strings}}<br />
==Strings==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Matrizes}}<br />
<br />
==Matrizes==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Estruturas}}<br />
<br />
==Estruturas==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Avaliação 02}}<br />
<br />
==Avaliação 02==<br />
<br />
===OBJETIVOS===<br />
<br />
*Avaliação 2 de Laboratório<br />
<br />
===AVALIAÇÂO LAB 2 A===<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
3.Implementar uma tabela global usando structs que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total de dinheiro do banco em função do saldo das contas e uma função que retorna o saldo de um usuário dado o seu CPF.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
3.Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total contas em negativo e uma função que retorna o saldo de um usuário dado o seu nome.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Lista Exercícios}}<br />
<br />
==Lista Exercícios==<br />
<br />
* Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento segnifica cassa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Ponteiros}}<br />
<br />
===Referências===<br />
http://pw1.netcom.com/~tjensen/ptr/ch1x.htm<br />
http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx<br />
http://duramecho.com/ComputerInformation/WhyCPointers.html<br />
http://boredzo.org/pointers/<br />
<br />
<br />
==Ponteiros==<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 1: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 2: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Alocação Dinâmica de Memória}}<br />
==Alocação Dinâmica de Memória==<br />
<br />
===A área de heap e o Layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*px = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct Tteste{<br />
int x;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct Tteste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct Tteste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
No código abaixo foi implementado as funções: add_node_head(), print_list, delete_node(int codigo)<br />
<br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = head;<br />
<br />
if (head==NULL) {<br />
/* lista vazia */<br />
head = tail = p;<br />
}else{<br />
head=p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
for(tail=head; tail->next !=NULL; tail=tail->next);<br />
tail->next = p;<br />
// tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
int delete_node(int codigo){<br />
struct TProduto *anterior=NULL;<br />
struct TProduto *p=NULL;<br />
//Caso o código seja o primeiro da lista entrará no if, caso seja do meio ou do final entrará no else<br />
if(head->codigo==codigo){<br />
head=head->next;<br />
free(p);<br />
}else{<br />
<br />
for(p=head;p->codigo!=codigo;p=p->next){<br />
anterior=p;<br />
}<br />
anterior->next=p->next;<br />
free(p);<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista<br />
*/<br />
<br />
void print_list( struct TProduto *inicio)<br />
{<br />
<br />
struct TProduto *p;<br />
for (p = inicio; p != NULL; p = p->next)<br />
printf( "Imprimindo estrutura: %d\n", p->codigo);<br />
<br />
}<br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
// print_list (head);<br />
<br />
//Inserindo códigos no final da lista<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
//Inserindo códigos no início da lista<br />
for(i=6;i<9;i++)<br />
add_nodo_head(i);<br />
print_list (head);<br />
printf("-----------------\n");<br />
//Deletando o código de número 8<br />
delete_node(8);<br />
<br />
print_list(head);<br />
return 0;<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Operando com Arquivos}}<br />
<br />
==Operando com Arquivos==<br />
<br />
===Objetivos===<br />
<br />
*Tratamento de arquivos no C<br />
*O sistema de arquivos no Linux<br />
*O acesso com funções de alto nível<br />
<br />
===O sistema de arquivos no Linux===<br />
<br />
====O Arquivo====<br />
'''Um arquivo é um conjunto de dados que pode ser referenciado por um nome e pode ter outros atributos tais como: permissão para leitura e escrita, data da criação, data da última modificação etc.'''<br />
<br />
Note que um arquivo pode conter dados (um relatório, por exemplo), um programa C, um programa executável, música, fotos etc. Seja qual for a natureza dos dados o armazenamento será na forma de bits.<br />
<br />
Normalmente, arquivos são armazenados em memórias secundárias, tais como CD, hard disk etc, mas eles podem se armazenados na memória principal também (RAM, FLASH).<br />
<br />
Quanto a forma como os dados são armazenados, podemos dizer que os arquivos são [http://en.wikipedia.org/wiki/Binary_file binários] ou [http://en.wikipedia.org/wiki/Text_file texto]. Qualquer um deles armazena bits mas os bytes de um arquivo texto representam códigos ASCII.<br />
<br />
====Sistema de Arquivos====<br />
<br />
Um sistema tal como o Linux possui milhares de arquivos. Para que arquivos possam ser acessados e armazenados de forma consistente, eles são organizados em um sistema de arquivos.<br />
<br />
Tipicamente, um sistema de arquivos ocupa uma área de um disco (ou mídia de armazenamento).<br />
Nesta área ficam armazenados blocos de armazenamento dos dados dos arquivos e também as estruturas chamadas de '''inodes'''.<br />
<br />
Um [http://upload.wikimedia.org/wikipedia/commons/a/a2/Ext2-inode.gif inode] é um estrutura que possui as propriedades do arquivo e ponteiros para os blocos que contém os dados do arquivo. Tipicamente um sistema de arquivos possui uma lista de inodes que permite "indexar" cada um dos arquivos do sistema de arquivos.<br />
<br />
Existem vários formatos de sistema de arquivos, dependendo do sistema operacional. No linux os formatos mais conhecidos são: ext2, ext3, ext4 etc.<br />
<br />
Um sistema de arquivos normalmente possui uma estrutura de dados inicial chamada de superbloco. O superbloco traz informações sobre o tamanho de blocos do sistema, o início da lista de inodes (/), etc.<br />
<br />
<code><br />
+-------------+-----------------+------------------------+<br />
| superbloco | lista de inodes | blocos dos arquivos |<br />
+-------------+-----------------+------------------------+<br />
</syntaxhighlight><br />
<br />
<br />
====Diretórios====<br />
<br />
São arquivos especiais que contém basicamente uma lista contendo nome e inode correspondente dos arquivos que o diretório contém.<br />
<br />
Em um sistema de arquivos, o diretório / é o diretório raiz do sistema, a partir do qual pode-se encontrar todos os demais arquivos.<br />
<br />
=====Referência a um arquivo=====<br />
<br />
A localização de um arquivo pode ser realizada pela referência absoluta, ou seja, desde o diretório / do sistema:<br />
<br />
cat /etc/passwd<br />
<br />
O comando cat tem por objetivo mostrar no terminal o conteúdo do arquivo ''passwd''. Para que este arquivo seja encontrado na árvore de diretórios, deve-se fornecer a referência absoluta, desde o diretório /<br />
<br />
Uma alternativa de acesso, é o uso da referência relativa ao diretório de trabalho. O conceito de diretório de trabalho é criado pelo interpretador de comandos (''shell''). Desta forma pode-se por exemplo fazer o comando:<br />
<br />
cat passwd<br />
<br />
O sistema procurará o arquivo passwd dentro do diretório de trabalho, que é armazenado pelo ''shell''. Neste caso, o diretório de trabalho deveria ser ''/etc''<br />
<br />
cd /etc<br />
cat passwd<br />
<br />
=====No Linux/Unix tudo é arquivo=====<br />
<br />
No Linux, qualquer referência/acesso ao hardware/dispositivos é realizada na forma de acesso a arquivo. Ver arquivos no diretório de dispositivos:<br />
<br />
ls -l /dev<br />
<br />
Como consequência, a partir de um programa em C, é possível abrir e escrever/ler em um dispositivo (desde que se tenha autorização).<br />
<br />
===Acessando arquivos a partir de programas C===<br />
<br />
====Acesso a arquivos: funções de baixo e alto nível====<br />
<br />
Em sistemas do porte do Linux e Windows, por questões de segurança e controle, todo acesso a arquivo é realizado através de código do sistema operacional. Desta forma, um programa que deseja acessar um arquivo deve gerar uma CHAMADA AO SISTEMA.<br />
O Linux (assim como outros sistemas) possui uma API (Application Programming Interface) bem definida, na forma de um conjunto de chamadas que permitem realizar uma série de funcionalidades (serviços) para os processos(programas em execução).<br />
<br />
Um programa em C realiza uma CHAMADA AO SISTEMA com auxílio de funções da biblioteca C (a glib no caso do Linux).<br />
Duas categorias de funções para acesso a arquivo são disponibilizadas [http://en.wikipedia.org/wiki/C_file_input/output (ver detalhes aqui)]:<br />
*Funções de baixo nível: acessam diretamente o sistema;<br />
*Funções de alto nível: as funções intermediam o acesso, criando buffers no espaço de endereçamento do processo. As funções de baixo nível são invocadas para ler e escrever dados no buffer.<br />
<br />
====Acesso a arquivo em MODO TEXTO através de funções de alto nível====<br />
<br />
O acesso em alto nível é realizado usando uma estrutura do tipo [http://www.gnu.org/software/libc/manual/html_node/Streams.html#Streams FILE] definida no stdio.h.<br />
Todo acesso passa inicialmente por abrir o arquivo (função fopen), ler/escrever (várias funções, tipo fread(), fwrite()) e fechar o arquivo (fclose()).<br />
<br />
<br />
=====Exemplo 1: Escrevendo e lendo um arquivo texto de forma formatada=====<br />
<br />
Nos exemplos que se seguem, serão usadas as funções [http://www.cplusplus.com/reference/cstdio/fopen/ fopen] e [http://www.cplusplus.com/reference/cstdio/fclose/?kw=fclose fclose], para abrir e fechar arquivo e [http://www.cplusplus.com/reference/cstdio/fprintf/?kw=fprintf fprintf()] e [http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf fscanf()] para leitura e escrita.<br />
A forma é similar ao ''printf'' e ''scanf''(ver http://diuf.unifr.ch/pai/ip/tutorials/c/TC02_scanf.pdf), a não ser pelo fato de que a escrita e leitura é realizada no arquivo indicado<br />
por ''p_arq''<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i;<br />
int res;<br />
<br />
if ((p_arq=fopen("IFSC.txt", "w")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i = 0; i<10;i++) {<br />
/* A funcao fprintf devolve o número de bytes gravados ou EOF se houve erro na gravação */<br />
if((res = fprintf(p_arq,"Linha %d\n",i))==EOF) { <br />
printf("Erro\n");<br />
break;<br />
}<br />
}<br />
fclose(p_arq);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que se o arquivo IFSC.txt não existir, ele será criado.<br />
Para ver o que fois escrito faça:<br />
cat IFSC.txt<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i,j;<br />
int res;<br />
char buff[100];<br />
<br />
if ((p_arq=fopen("IFSC.txt", "r")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i = 0; i<10;i++) {<br />
if((res = fscanf(p_arq,"%s %d",buff,&j))==EOF) { <br />
printf("Fim de leitura\n");<br />
break;<br />
}<br />
printf("%s %d\n",buff,j);<br />
}<br />
fclose(p_arq);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o fscanf se comporta de forma similar ao scanf. A função retorna o caracter EOF (end-of-file) quando não existe mais dados a serem lidos.<br />
<br />
*Exercícios<br />
<br />
#Implementar uma função que soma duas matrizes fornecidas em dois arquivos texto separados: MatA.dat e MatB.dat. Colocar o resultado em um arquivo chamado MatC.dat.<br />
<br />
====Exemplo2====<br />
<br />
Neste exemplo usaremos as funções fgetc e fputc para ler e cescrever caracteres ASCII nos arquivos. Seja um programa que conta o número de ocorrências do caracter 'a' em um arquivo e reescreve o arquivo sem os "as":<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
main()<br />
{<br />
FILE *fp_fonte,*fp_destino;<br />
int x,cont=0;<br />
<br />
if((fp_fonte=fopen("teste.dat","r")) == NULL) {<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
}<br />
if((fp_destino=fopen("dest.dat","w")) == NULL){<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
}<br />
<br />
/* note que fgetc retorna um inteiro contendo o ASCII lido */<br />
while ((x=fgetc(fp_fonte)) != EOF){<br />
if(x=='a')<br />
cont++;<br />
else<br />
if((x=fputc(x,fp_destino))==EOF) {<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
} <br />
} <br />
printf("ocorrências de a = %d\n", cont);<br />
fclose(fp_fonte);<br />
fclose(fp_destino);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que ''fputc'' recebe o caracter como um inteiro mas realiza um ''cast'' para<br />
''unsigned char'' com fins de escrevê-lo no arquivo.<br />
<br />
====Exemplo 3====<br />
<br />
Neste exemplo vamos explorar o modo de abertura do arquivo para fazer um append (escrever no final do arquivo).<br />
<br />
<syntaxhighlight lang=c><br />
#include <time.h><br />
#include <stdio.h><br />
<br />
int main(void)<br />
{<br />
time_t ltime;<br />
FILE *fp;<br />
int num;<br />
<br />
time(&ltime); <br />
<br />
if ((fp=fopen("DATA.txt", "a")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
if ((num = fputs( ctime(&ltime), fp )) != EOF ) {<br />
fclose(fp);<br />
} else {<br />
printf("Erro na escrita do arquivo!\n");<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Execute o programa da forma (suponha que se chame LOG_tempo:<br />
log_tempo<br />
cat DATA.txt<br />
log_tempo<br />
cat DATA.txt<br />
log_tempo<br />
cat DATA.txt <br />
<br />
*Exercício: Substitua o modo de append por uma simples escrita (w). Reexecute o programa conforme especificado anteriormente.<br />
<br />
====Acesso a arquivo em MODO BINÁRIO através de funções de alto nível====<br />
<br />
Neste exemplo vamos escrever e ler uma struct (com dados binários) usando fwrite e fread. Note que os dados são gravados de forma binária.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
struct TNum {<br />
float x;<br />
float y;<br />
} Num = { 1.5,<br />
2.6, <br />
};<br />
<br />
main()<br />
{<br />
FILE *fp;<br />
int num_itens;<br />
<br />
fp = fopen("data.bin", "wb");<br />
num_itens = fwrite((char*)&Num, sizeof(struct TNum), 1, fp);<br />
fclose(fp);<br />
<br />
Num.x =0;<br />
Num.y = 0;<br />
<br />
fp = fopen("data.bin", "rb");<br />
num_itens = fread((char*)&Num, sizeof(struct TNum), 1, fp);<br />
<br />
printf("Valor de x = %f\n", Num.x);<br />
fclose(fp);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Referências<br />
<br />
[http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fctime.htm Material IBM]<br />
<br />
{{collapse bottom}}<br />
{{collapse top|Apresentação do Projeto Final}}<br />
<br />
==Projeto Final==<br />
<br />
===Objetivos===<br />
<br />
*Apresentação de placas a serem usadas no projeto;<br />
*Apresentação do projeto final;<br />
<br />
===Apresentação do Projeto Final===<br />
<br />
*Sistema de controle de acesso;<br />
**Substituir a tabela estática de usuários por uma lista simples dinamicamente alocada;<br />
**Armazenamento de dados de usuários e administrador em arquivo;<br />
**Bloqueio e desbloqueio de acesso após N tentativas;<br />
**Mensagens para usuários;<br />
**Facilidade de inserção e remoção de usuários;<br />
**Determinação de faixa-horária para acesso de usuário;<br />
**Perguntas adicionais para validar usuário (cidade onde nasceu, quem é o pai etc);<br />
**Liga-Desliga ar-condicionado em função de temperatura ambiente da sala. Temperatura deve liga e desliga deve ser configurável) - simulação VIA LED;<br />
**Sinal sonoro de fechamento de laboratório após hora pré-programada pelo administrador - simulação VIA LED;<br />
**Sinal sonoro de alarme (leitura de sensor na porta). Deve ser ignorado se for uma entrada de usuário.<br />
**registro de log do horário de entrada de usuário;<br />
**código de abertura de emergência via teclado externo.<br />
**Simulação da abertura de porta VIA LED.<br />
<br />
Avaliação do Trabalho<br />
**divisão de arquivos .c e .h<br />
**uso apropriado de defines<br />
**arquivo makefile<br />
**código indentado e comentado<br />
**funcionalidades implementadas<br />
<br />
===Estrutura Base do Projeto===<br />
<br />
<br />
Para fims de organização vamos implementar inicialmente a seguinte estrutura:<br />
<br />
[[imagem:TrabalhoFinalFluxogramaPrincipal.jpg|400px]]<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Ideias sobre o trabalho}}<br />
<br />
==Ideias sobre o trabalho==<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
#include <stdlib.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
struct TUsuario *next;<br />
} *head, *tail;<br />
<br />
void adicione_usuario_tail(struct TUsuario *p)<br />
{<br />
if (tail==NULL) { <br />
tail = head = p;<br />
}else {<br />
tail->next = p;<br />
tail = p;<br />
}<br />
}<br />
<br />
void adicionar_usuario ()<br />
{<br />
struct TUsuario *p;<br />
<br />
if ((p=(struct TUsuario *)malloc(sizeof(struct TUsuario)))==NULL) {<br />
printf("Não é possível adicionar usuário ao sistema");<br />
return;<br />
}<br />
printf("Entre com userID\n");<br />
scanf("%s",p->userID);<br />
printf("Entre com senha\n");<br />
scanf("%s",p->senha);<br />
p->next = NULL;<br />
adicione_usuario_tail(p);<br />
}<br />
<br />
struct TUsuario *encontrar_usuario_lista(userID)<br />
{<br />
<br />
}<br />
<br />
struct TUsuario *remover_usuario_lista(struct TUsuario *p)<br />
{<br />
}<br />
<br />
void remover_usuario()<br />
{<br />
char userID[20];<br />
struct TUsuario *p; <br />
printf("Entre com userID do usuario a ser removido\n");<br />
scanf("%s", userID);<br />
<br />
p = encontrar_usuario_lista(userID); <br />
if (!p)<br />
printf("Usuário não existente\n");<br />
else { <br />
remover_usuario_lista(p);<br />
printf("Usuário removido!\n");<br />
}<br />
}<br />
<br />
main()<br />
{<br />
adicionar_usuario();<br />
adicionar_usuario();<br />
remover_usuario();<br />
}<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Monitoria_de_Programa%C3%A7%C3%A3o&diff=56303Monitoria de Programação2013-07-14T23:28:02Z<p>Beatriz.s: </p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|Algoritmos}}<br />
==Algoritmos==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Fluxogramas}}<br />
==Fluxogramas==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Linguagem C}}<br />
<br />
==Linguagem C==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão===<br />
====''if()'' e ''if() else'' ====<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
====Comando ''switch''====<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Arrays}}<br />
==Arrays==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Funções}}<br />
<br />
==Funções==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
<br />
===Parâmetros e Retorno de Valores em Subprogramas (Funções)===<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Uso do DEFINE / Tipo Double / Biblioteca Math }}<br />
==Uso do DEFINE / Tipo Double / Biblioteca Math ==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da biblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Expressões Aritméticas e Lógicas}}<br />
==Expressões Aritméticas e Lógicas==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Tipo Char}}<br />
==Tipo Char==<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|Estruturas de Repetição}}<br />
==Estruturas de Repetição==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
===Uso de break para sair de loops===<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
printf("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|Lista de Exercícios}}<br />
<br />
==Lista de Exercícios==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Avaliação 01}}<br />
==Avaliação 01==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Vetores}}<br />
==Vetores==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Usando o gdb para depurar programas}}<br />
==Usando o gdb para depurar programas==<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Exercícios de Revisão }}<br />
==Exercícios de Revisão==<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Strings}}<br />
==Strings==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Matrizes}}<br />
<br />
==Matrizes==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Estruturas}}<br />
<br />
==Estruturas==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Avaliação 02}}<br />
<br />
==Avaliação 02==<br />
<br />
===OBJETIVOS===<br />
<br />
*Avaliação 2 de Laboratório<br />
<br />
===AVALIAÇÂO LAB 2 A===<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
3.Implementar uma tabela global usando structs que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total de dinheiro do banco em função do saldo das contas e uma função que retorna o saldo de um usuário dado o seu CPF.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
3.Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total contas em negativo e uma função que retorna o saldo de um usuário dado o seu nome.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Lista Exercícios}}<br />
<br />
==Lista Exercícios==<br />
<br />
* Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento segnifica cassa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Ponteiros}}<br />
<br />
===Referências===<br />
http://pw1.netcom.com/~tjensen/ptr/ch1x.htm<br />
http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx<br />
http://duramecho.com/ComputerInformation/WhyCPointers.html<br />
http://boredzo.org/pointers/<br />
<br />
<br />
==Ponteiros==<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
===Ponteiro para inteiro===<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
===Ponteiro para ''char''===<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
===Apontando para um vetor de inteiros===<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
===Usando ponteiro na passagem de parâmetros===<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 1: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 2: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Alocação Dinâmica de Memória}}<br />
==Alocação Dinâmica de Memória==<br />
<br />
===A área de heap e o Layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*px = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct Tteste{<br />
int x;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct Tteste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct Tteste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
No código abaixo foi implementado as funções: add_node_head(), print_list, delete_node(int codigo)<br />
<br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = head;<br />
<br />
if (head==NULL) {<br />
/* lista vazia */<br />
head = tail = p;<br />
}else{<br />
head=p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
for(tail=head; tail->next !=NULL; tail=tail->next);<br />
tail->next = p;<br />
// tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
int delete_node(int codigo){<br />
struct TProduto *anterior=NULL;<br />
struct TProduto *p=NULL;<br />
//Caso o código seja o primeiro da lista entrará no if, caso seja do meio ou do final entrará no else<br />
if(head->codigo==codigo){<br />
head=head->next;<br />
free(p);<br />
}else{<br />
<br />
for(p=head;p->codigo!=codigo;p=p->next){<br />
anterior=p;<br />
}<br />
anterior->next=p->next;<br />
free(p);<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista<br />
*/<br />
<br />
void print_list( struct TProduto *inicio)<br />
{<br />
<br />
struct TProduto *p;<br />
for (p = inicio; p != NULL; p = p->next)<br />
printf( "Imprimindo estrutura: %d\n", p->codigo);<br />
<br />
}<br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
// print_list (head);<br />
<br />
//Inserindo códigos no final da lista<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
//Inserindo códigos no início da lista<br />
for(i=6;i<9;i++)<br />
add_nodo_head(i);<br />
print_list (head);<br />
printf("-----------------\n");<br />
//Deletando o código de número 8<br />
delete_node(8);<br />
<br />
print_list(head);<br />
return 0;<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Operando com Arquivos}}<br />
<br />
==Operando com Arquivos==<br />
<br />
===Objetivos===<br />
<br />
*Tratamento de arquivos no C<br />
*O sistema de arquivos no Linux<br />
*O acesso com funções de alto nível<br />
<br />
===O sistema de arquivos no Linux===<br />
<br />
====O Arquivo====<br />
'''Um arquivo é um conjunto de dados que pode ser referenciado por um nome e pode ter outros atributos tais como: permissão para leitura e escrita, data da criação, data da última modificação etc.'''<br />
<br />
Note que um arquivo pode conter dados (um relatório, por exemplo), um programa C, um programa executável, música, fotos etc. Seja qual for a natureza dos dados o armazenamento será na forma de bits.<br />
<br />
Normalmente, arquivos são armazenados em memórias secundárias, tais como CD, hard disk etc, mas eles podem se armazenados na memória principal também (RAM, FLASH).<br />
<br />
Quanto a forma como os dados são armazenados, podemos dizer que os arquivos são [http://en.wikipedia.org/wiki/Binary_file binários] ou [http://en.wikipedia.org/wiki/Text_file texto]. Qualquer um deles armazena bits mas os bytes de um arquivo texto representam códigos ASCII.<br />
<br />
====Sistema de Arquivos====<br />
<br />
Um sistema tal como o Linux possui milhares de arquivos. Para que arquivos possam ser acessados e armazenados de forma consistente, eles são organizados em um sistema de arquivos.<br />
<br />
Tipicamente, um sistema de arquivos ocupa uma área de um disco (ou mídia de armazenamento).<br />
Nesta área ficam armazenados blocos de armazenamento dos dados dos arquivos e também as estruturas chamadas de '''inodes'''.<br />
<br />
Um [http://upload.wikimedia.org/wikipedia/commons/a/a2/Ext2-inode.gif inode] é um estrutura que possui as propriedades do arquivo e ponteiros para os blocos que contém os dados do arquivo. Tipicamente um sistema de arquivos possui uma lista de inodes que permite "indexar" cada um dos arquivos do sistema de arquivos.<br />
<br />
Existem vários formatos de sistema de arquivos, dependendo do sistema operacional. No linux os formatos mais conhecidos são: ext2, ext3, ext4 etc.<br />
<br />
Um sistema de arquivos normalmente possui uma estrutura de dados inicial chamada de superbloco. O superbloco traz informações sobre o tamanho de blocos do sistema, o início da lista de inodes (/), etc.<br />
<br />
<code><br />
+-------------+-----------------+------------------------+<br />
| superbloco | lista de inodes | blocos dos arquivos |<br />
+-------------+-----------------+------------------------+<br />
</syntaxhighlight><br />
<br />
<br />
====Diretórios====<br />
<br />
São arquivos especiais que contém basicamente uma lista contendo nome e inode correspondente dos arquivos que o diretório contém.<br />
<br />
Em um sistema de arquivos, o diretório / é o diretório raiz do sistema, a partir do qual pode-se encontrar todos os demais arquivos.<br />
<br />
=====Referência a um arquivo=====<br />
<br />
A localização de um arquivo pode ser realizada pela referência absoluta, ou seja, desde o diretório / do sistema:<br />
<br />
cat /etc/passwd<br />
<br />
O comando cat tem por objetivo mostrar no terminal o conteúdo do arquivo ''passwd''. Para que este arquivo seja encontrado na árvore de diretórios, deve-se fornecer a referência absoluta, desde o diretório /<br />
<br />
Uma alternativa de acesso, é o uso da referência relativa ao diretório de trabalho. O conceito de diretório de trabalho é criado pelo interpretador de comandos (''shell''). Desta forma pode-se por exemplo fazer o comando:<br />
<br />
cat passwd<br />
<br />
O sistema procurará o arquivo passwd dentro do diretório de trabalho, que é armazenado pelo ''shell''. Neste caso, o diretório de trabalho deveria ser ''/etc''<br />
<br />
cd /etc<br />
cat passwd<br />
<br />
=====No Linux/Unix tudo é arquivo=====<br />
<br />
No Linux, qualquer referência/acesso ao hardware/dispositivos é realizada na forma de acesso a arquivo. Ver arquivos no diretório de dispositivos:<br />
<br />
ls -l /dev<br />
<br />
Como consequência, a partir de um programa em C, é possível abrir e escrever/ler em um dispositivo (desde que se tenha autorização).<br />
<br />
===Acessando arquivos a partir de programas C===<br />
<br />
====Acesso a arquivos: funções de baixo e alto nível====<br />
<br />
Em sistemas do porte do Linux e Windows, por questões de segurança e controle, todo acesso a arquivo é realizado através de código do sistema operacional. Desta forma, um programa que deseja acessar um arquivo deve gerar uma CHAMADA AO SISTEMA.<br />
O Linux (assim como outros sistemas) possui uma API (Application Programming Interface) bem definida, na forma de um conjunto de chamadas que permitem realizar uma série de funcionalidades (serviços) para os processos(programas em execução).<br />
<br />
Um programa em C realiza uma CHAMADA AO SISTEMA com auxílio de funções da biblioteca C (a glib no caso do Linux).<br />
Duas categorias de funções para acesso a arquivo são disponibilizadas [http://en.wikipedia.org/wiki/C_file_input/output (ver detalhes aqui)]:<br />
*Funções de baixo nível: acessam diretamente o sistema;<br />
*Funções de alto nível: as funções intermediam o acesso, criando buffers no espaço de endereçamento do processo. As funções de baixo nível são invocadas para ler e escrever dados no buffer.<br />
<br />
====Acesso a arquivo em MODO TEXTO através de funções de alto nível====<br />
<br />
O acesso em alto nível é realizado usando uma estrutura do tipo [http://www.gnu.org/software/libc/manual/html_node/Streams.html#Streams FILE] definida no stdio.h.<br />
Todo acesso passa inicialmente por abrir o arquivo (função fopen), ler/escrever (várias funções, tipo fread(), fwrite()) e fechar o arquivo (fclose()).<br />
<br />
<br />
=====Exemplo 1: Escrevendo e lendo um arquivo texto de forma formatada=====<br />
<br />
Nos exemplos que se seguem, serão usadas as funções [http://www.cplusplus.com/reference/cstdio/fopen/ fopen] e [http://www.cplusplus.com/reference/cstdio/fclose/?kw=fclose fclose], para abrir e fechar arquivo e [http://www.cplusplus.com/reference/cstdio/fprintf/?kw=fprintf fprintf()] e [http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf fscanf()] para leitura e escrita.<br />
A forma é similar ao ''printf'' e ''scanf''(ver http://diuf.unifr.ch/pai/ip/tutorials/c/TC02_scanf.pdf), a não ser pelo fato de que a escrita e leitura é realizada no arquivo indicado<br />
por ''p_arq''<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i;<br />
int res;<br />
<br />
if ((p_arq=fopen("IFSC.txt", "w")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i = 0; i<10;i++) {<br />
/* A funcao fprintf devolve o número de bytes gravados ou EOF se houve erro na gravação */<br />
if((res = fprintf(p_arq,"Linha %d\n",i))==EOF) { <br />
printf("Erro\n");<br />
break;<br />
}<br />
}<br />
fclose(p_arq);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que se o arquivo IFSC.txt não existir, ele será criado.<br />
Para ver o que fois escrito faça:<br />
cat IFSC.txt<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i,j;<br />
int res;<br />
char buff[100];<br />
<br />
if ((p_arq=fopen("IFSC.txt", "r")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i = 0; i<10;i++) {<br />
if((res = fscanf(p_arq,"%s %d",buff,&j))==EOF) { <br />
printf("Fim de leitura\n");<br />
break;<br />
}<br />
printf("%s %d\n",buff,j);<br />
}<br />
fclose(p_arq);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o fscanf se comporta de forma similar ao scanf. A função retorna o caracter EOF (end-of-file) quando não existe mais dados a serem lidos.<br />
<br />
*Exercícios<br />
<br />
#Implementar uma função que soma duas matrizes fornecidas em dois arquivos texto separados: MatA.dat e MatB.dat. Colocar o resultado em um arquivo chamado MatC.dat.<br />
<br />
====Exemplo2====<br />
<br />
Neste exemplo usaremos as funções fgetc e fputc para ler e cescrever caracteres ASCII nos arquivos. Seja um programa que conta o número de ocorrências do caracter 'a' em um arquivo e reescreve o arquivo sem os "as":<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
main()<br />
{<br />
FILE *fp_fonte,*fp_destino;<br />
int x,cont=0;<br />
<br />
if((fp_fonte=fopen("teste.dat","r")) == NULL) {<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
}<br />
if((fp_destino=fopen("dest.dat","w")) == NULL){<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
}<br />
<br />
/* note que fgetc retorna um inteiro contendo o ASCII lido */<br />
while ((x=fgetc(fp_fonte)) != EOF){<br />
if(x=='a')<br />
cont++;<br />
else<br />
if((x=fputc(x,fp_destino))==EOF) {<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
} <br />
} <br />
printf("ocorrências de a = %d\n", cont);<br />
fclose(fp_fonte);<br />
fclose(fp_destino);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que ''fputc'' recebe o caracter como um inteiro mas realiza um ''cast'' para<br />
''unsigned char'' com fins de escrevê-lo no arquivo.<br />
<br />
====Exemplo 3====<br />
<br />
Neste exemplo vamos explorar o modo de abertura do arquivo para fazer um append (escrever no final do arquivo).<br />
<br />
<syntaxhighlight lang=c><br />
#include <time.h><br />
#include <stdio.h><br />
<br />
int main(void)<br />
{<br />
time_t ltime;<br />
FILE *fp;<br />
int num;<br />
<br />
time(&ltime); <br />
<br />
if ((fp=fopen("DATA.txt", "a")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
if ((num = fputs( ctime(&ltime), fp )) != EOF ) {<br />
fclose(fp);<br />
} else {<br />
printf("Erro na escrita do arquivo!\n");<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Execute o programa da forma (suponha que se chame LOG_tempo:<br />
log_tempo<br />
cat DATA.txt<br />
log_tempo<br />
cat DATA.txt<br />
log_tempo<br />
cat DATA.txt <br />
<br />
*Exercício: Substitua o modo de append por uma simples escrita (w). Reexecute o programa conforme especificado anteriormente.<br />
<br />
====Acesso a arquivo em MODO BINÁRIO através de funções de alto nível====<br />
<br />
Neste exemplo vamos escrever e ler uma struct (com dados binários) usando fwrite e fread. Note que os dados são gravados de forma binária.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
struct TNum {<br />
float x;<br />
float y;<br />
} Num = { 1.5,<br />
2.6, <br />
};<br />
<br />
main()<br />
{<br />
FILE *fp;<br />
int num_itens;<br />
<br />
fp = fopen("data.bin", "wb");<br />
num_itens = fwrite((char*)&Num, sizeof(struct TNum), 1, fp);<br />
fclose(fp);<br />
<br />
Num.x =0;<br />
Num.y = 0;<br />
<br />
fp = fopen("data.bin", "rb");<br />
num_itens = fread((char*)&Num, sizeof(struct TNum), 1, fp);<br />
<br />
printf("Valor de x = %f\n", Num.x);<br />
fclose(fp);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Referências<br />
<br />
[http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fctime.htm Material IBM]<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|Apresentação do Projeto Final}}<br />
<br />
==Projeto Final==<br />
<br />
===Objetivos===<br />
<br />
*Apresentação de placas a serem usadas no projeto;<br />
*Apresentação do projeto final;<br />
<br />
===Apresentação do Projeto Final===<br />
<br />
*Sistema de controle de acesso;<br />
**Substituir a tabela estática de usuários por uma lista simples dinamicamente alocada;<br />
**Armazenamento de dados de usuários e administrador em arquivo;<br />
**Bloqueio e desbloqueio de acesso após N tentativas;<br />
**Mensagens para usuários;<br />
**Facilidade de inserção e remoção de usuários;<br />
**Determinação de faixa-horária para acesso de usuário;<br />
**Perguntas adicionais para validar usuário (cidade onde nasceu, quem é o pai etc);<br />
**Liga-Desliga ar-condicionado em função de temperatura ambiente da sala. Temperatura deve liga e desliga deve ser configurável) - simulação VIA LED;<br />
**Sinal sonoro de fechamento de laboratório após hora pré-programada pelo administrador - simulação VIA LED;<br />
**Sinal sonoro de alarme (leitura de sensor na porta). Deve ser ignorado se for uma entrada de usuário.<br />
**registro de log do horário de entrada de usuário;<br />
**código de abertura de emergência via teclado externo.<br />
**Simulação da abertura de porta VIA LED.<br />
<br />
Avaliação do Trabalho<br />
**divisão de arquivos .c e .h<br />
**uso apropriado de defines<br />
**arquivo makefile<br />
**código indentado e comentado<br />
**funcionalidades implementadas<br />
<br />
===Estrutura Base do Projeto===<br />
<br />
<br />
Para fims de organização vamos implementar inicialmente a seguinte estrutura:<br />
<br />
[[imagem:TrabalhoFinalFluxogramaPrincipal.jpg|400px]]<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|Ideias sobre o trabalho}}<br />
<br />
==Ideias sobre o trabalho==<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
#include <stdlib.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
struct TUsuario *next;<br />
} *head, *tail;<br />
<br />
void adicione_usuario_tail(struct TUsuario *p)<br />
{<br />
if (tail==NULL) { <br />
tail = head = p;<br />
}else {<br />
tail->next = p;<br />
tail = p;<br />
}<br />
}<br />
<br />
void adicionar_usuario ()<br />
{<br />
struct TUsuario *p;<br />
<br />
if ((p=(struct TUsuario *)malloc(sizeof(struct TUsuario)))==NULL) {<br />
printf("Não é possível adicionar usuário ao sistema");<br />
return;<br />
}<br />
printf("Entre com userID\n");<br />
scanf("%s",p->userID);<br />
printf("Entre com senha\n");<br />
scanf("%s",p->senha);<br />
p->next = NULL;<br />
adicione_usuario_tail(p);<br />
}<br />
<br />
struct TUsuario *encontrar_usuario_lista(userID)<br />
{<br />
<br />
}<br />
<br />
struct TUsuario *remover_usuario_lista(struct TUsuario *p)<br />
{<br />
}<br />
<br />
void remover_usuario()<br />
{<br />
char userID[20];<br />
struct TUsuario *p; <br />
printf("Entre com userID do usuario a ser removido\n");<br />
scanf("%s", userID);<br />
<br />
p = encontrar_usuario_lista(userID); <br />
if (!p)<br />
printf("Usuário não existente\n");<br />
else { <br />
remover_usuario_lista(p);<br />
printf("Usuário removido!\n");<br />
}<br />
}<br />
<br />
main()<br />
{<br />
adicionar_usuario();<br />
adicionar_usuario();<br />
remover_usuario();<br />
}<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=56293PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-07-14T18:48:42Z<p>Beatriz.s: /* Listas Ligadas */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 21/06/2013}}<br />
<br />
== AULA 25 DIA 21/06/2013==<br />
<br />
===OBJETIVOS===<br />
<br />
*Avaliação 2 de Laboratório<br />
<br />
===AVALIAÇÂO LAB 2 A===<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
3.Implementar uma tabela global usando structs que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total de dinheiro do banco em função do saldo das contas e uma função que retorna o saldo de um usuário dado o seu CPF.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
3.Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total contas em negativo e uma função que retorna o saldo de um usuário dado o seu nome.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 26 DIA 22/06/2013}}<br />
<br />
== AULA 26 DIA 22/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Lista Exercícios===<br />
<br />
* Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento segnifica cassa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 27 DIA 28/06/2013}}<br />
<br />
== AULA 27 DIA 28/06/2013==<br />
<br />
===Objetivos===<br />
<br />
===Referências===<br />
[http://pw1.netcom.com/~tjensen/ptr/ch1x.htm]<br />
<br />
[http://eternallyconfuzzled.com/tuts/languages/jsw_tut_pointers.aspx]<br />
<br />
[http://duramecho.com/ComputerInformation/WhyCPointers.html]<br />
<br />
[http://boredzo.org/pointers/]<br />
<br />
<br />
====Ponteiros====<br />
<br />
A memória de um computador pode ser vista como um vetor de bytes. <br />
<br />
Cada byte possui um endereço. O tamanho da memória é definido pelo tamanho do barramento de endereços usado para acessá-la.<br />
<br />
Uma variável ocupa uma área da memória. Tipicamente uma variável to tipo ''char'' se utiliza de um ''byte''. Já uma variável do tipo ''int'' pode (dependendo do sistema) usar 4 ''bytes'' contíguos. <br />
<br />
Uma variável possui um endereço e um conteúdo (dados).<br />
<br />
<br />
Uma variável ponteiro tem como conteúdo um endereço. Portanto a variável ponteiro possui um endereço e contém um endereço como conteúdo.<br />
<br />
====Ponteiro para inteiro====<br />
<br />
Observe o programa abaixo. A variável ''p'' é um ponteiro para inteiro. Isto significa que ela pode armazenar um endereço<br />
de um inteiro.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x;<br />
int *p;<br />
<br />
x=5;<br />
printf("Valor de x antes = %d\n", x);<br />
<br />
p = &x;<br />
*p=10;<br />
<br />
printf("Valor de x depois = %d\n", x);<br />
printf("Valor de p = %p\n", p);<br />
}<br />
</syntaxhighlight><br />
<br />
Observe que para se referenciar o conteúdo da posição de memória apontada por ''p'' deve-se usar o asterisco: ''*p''<br />
<br />
EXERCÍCIO 1: Considere o programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x=10;<br />
int y, *p, *w;<br />
<br />
}<br />
</syntaxhighlight><br />
Faça um código para copiar o conteúdo de x para y, sem que estas variáveis apareçam no lado esquerdo de um sinal de atribuição.<br />
<br />
EXERCÍCIO 2: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + *p2;<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 3: Tente inferir qual seria o valor da variável y no final do programa abaixo.<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y,w,*p1,*p2, *p3;<br />
x = 20;<br />
w = 30;<br />
p1 = &x;<br />
p2 = &w;<br />
y = *p1 + w;<br />
p3 = &y;<br />
*p3 = *p3 + 10;<br />
y = *p1 + *p2 + *p3;<br />
}<br />
</syntaxhighlight><br />
<br />
====Ponteiro para ''char''====<br />
<br />
Os ponteiro para ''char'' são muito utilizados pois permitem apontar para ''strings''. A ideia é que ele aponte para o primeiro caracter da ''string''. Veja o exemplo abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p;<br />
<br />
p = &x[2];<br />
<br />
printf("x[2] = %c\n", *p);<br />
<br />
p = x;<br />
<br />
printf("string %s\n", p);<br />
<br />
while (*p!=0) {<br />
printf("Endereco %p conteúdo %c\n", p,*p);<br />
p++;<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Neste foi usado o incremento de um ponteiro, o que implica em adicionar ao endereço armazenado em ''p'' uma quantidade relativa ao tamanho do tipo apontado.<br />
No caso é 1 (tamanho de um ''char'' é um byte).<br />
<br />
EXERCÍCIO: Sem executar o programa abaixo, determine o valor de y no final do programa:<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
char x[10]="ifsc";<br />
char *p, y;<br />
<br />
p = x + 2;<br />
y= *p;<br />
}<br />
</syntaxhighlight><br />
<br />
====Apontando para um vetor de inteiros====<br />
<br />
Da mesma forma que usamos um ponteiro para char para apontar uma ''string'', podemos fazer um ponteiro para ''int'' apontar para para um elemento de um vetor de inteiros.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x[10]= {0,1,2,3,4,5,6,7,8,9};<br />
int *p;<br />
int i;<br />
<br />
p = x;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf(" endereco %p e conteudo %d\n", p, *p);<br />
p++;<br />
i++; <br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
====Usando ponteiro na passagem de parâmetros====<br />
<br />
Observe como podemos usar ponteiros na passagem de parâmetros. <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char *pdest, char *pfonte)<br />
{<br />
while (*pfonte!=0) {<br />
*pdest++ = *pfonte++;<br />
}<br />
*pdest = 0;<br />
}<br />
<br />
<br />
int str_len (char *p)<br />
{<br />
int i=0;<br />
while (*p++!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char fonte[10]="ifsc";<br />
char destino[10];<br />
<br />
str_cpy(destino, fonte);<br />
printf("string destino = %s\n", destino);<br />
<br />
printf("tamanho de dest = %d\n", str_len(destino));<br />
}<br />
</syntaxhighlight><br />
<br />
Um ponto interessante é que ponteiros permitem, na chamada de uma função, passar valores por referência:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
void alfa(int *p)<br />
{<br />
*p=10;<br />
}<br />
<br />
main()<br />
{<br />
int x;<br />
x =5;<br />
printf("Valor de x antes da chamada de alfa = %d\n", x);<br />
alfa(&x);<br />
printf("Valor de x depois da chamada de alfa = %d\n", x);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCíCIO: Implementar a função ''str_cat'' que concatena duas ''strings'' usando ponteiros.<br />
<br />
====Vetor de ponteiros====<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 28 DIA 28/06/2013}}<br />
<br />
==AULA 28 DIA 02/07/2013==<br />
<br />
===Objetivos===<br />
<br />
*Apresentação de placas a serem usadas no projeto;<br />
*Apresentação do projeto final;<br />
*comando switch e aplicação na construção do menu de opções do controle de acesso;<br />
*uso de break e continue em loops;<br />
*Ponteiros (continuação);<br />
<br />
===Apresentação do Projeto Final===<br />
<br />
*Sistema de controle de acesso;<br />
**Substituir a tabela estática de usuários por uma lista simples dinamicamente alocada;<br />
**Armazenamento de dados de usuários e administrador em arquivo;<br />
**Bloqueio e desbloqueio de acesso após N tentativas;<br />
**Mensagens para usuários;<br />
**Facilidade de inserção e remoção de usuários;<br />
**Determinação de faixa-horária para acesso de usuário;<br />
**Perguntas adicionais para validar usuário (cidade onde nasceu, quem é o pai etc);<br />
**Liga-Desliga ar-condicionado em função de temperatura ambiente da sala. Temperatura deve liga e desliga deve ser configurável) - simulação VIA LED;<br />
**Sinal sonoro de fechamento de laboratório após hora pré-programada pelo administrador - simulação VIA LED;<br />
**Sinal sonoro de alarme (leitura de sensor na porta). Deve ser ignorado se for uma entrada de usuário.<br />
**registro de log do horário de entrada de usuário;<br />
**código de abertura de emergência via teclado externo.<br />
**Simulação da abertura de porta VIA LED.<br />
<br />
Avaliação do Trabalho<br />
**divisão de arquivos .c e .h<br />
**uso apropriado de defines<br />
**arquivo makefile<br />
**código indentado e comentado<br />
**funcionalidades implementadas<br />
<br />
===Estrutura Base do Projeto===<br />
<br />
<br />
Para fims de organização vamos implementar inicialmente a seguinte estrutura:<br />
<br />
[[imagem:TrabalhoFinalFluxogramaPrincipal.jpg|400px]]<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
===Comando ''switch'' ===<br />
<br />
O comando ''switch'' permite controlar o fluxo de um programa de forma condicional. O comando testa uma expressão que deve<br />
resultar em um número inteiro. Uma sequência de cláusulas ''case'' permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um ''break''.<br />
<br />
<syntaxhighlight lang=c><br />
main () {<br />
{<br />
int opcao;<br />
printf("Entre com uma opção (número inteiro)\n");<br />
scanf ("%d",&opcao);<br />
switch(opcao) {<br />
case 1:<br />
printf("opcao 1\n");<br />
break; /* o break força o encerramento da instrução*/<br />
case 2:<br />
printf("opcao 2\n");<br />
x++; /* instrução demonstrativa apenas */<br />
printf("Note que pode existir ums lista de instruções");<br />
break;<br />
case 3:<br />
printf("opcao 3\n"); /* note o efeito de não ter o break */<br />
case 4:<br />
printf("opcao 4\n");<br />
break;<br />
case 5:<br />
printf("opcao 5\n");<br />
break;<br />
default:<br />
printf("opcao default\n");<br />
break; /* a opção default é opcional */<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: Implementar um menu de opções para o administrador do sistema de controle de acesso. As opções devem contemplar:<br />
*Modificação de dados do administrador;<br />
*Gerenciar usuários;<br />
*Gerenciar ar-condicionado;<br />
*Gerenciar alarme de fechamento<br />
*Gerenciar alarme da porta<br />
Simule as funções com printf() simples.<br />
<br />
===Uso de break para sair de loops===<br />
<br />
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<10;i++) {<br />
if (i==5)<br />
break;<br />
}<br />
printf("valor de i=%d\n", i);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Note que o break sempre sai do loop mais próximo a ele.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<3;i++) {<br />
for (j=0;j<4;j++) {<br />
if (j==1) { <br />
break;<br />
}<br />
printf("valor de j = %d\n", j);<br />
}<br />
if (i==2)<br />
break;<br />
printf("valor de i = %d\n", i);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Exercício: No sistema de controle de acesso, faça uma variação no código para que quando o usuário for encontrado na tabela, o loop seja encerrado com um break.<br />
<br />
===Continuação de Ponteiros===<br />
<br />
===Apontando para estruturas===<br />
<br />
Ponteiros podem apontar para qualquer "objeto" de qualquer tipo. Vamos verificar como é possível apontar para uma estrutura:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
main()<br />
{<br />
p = &Tabela[3]; /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 3 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o uso de p->nome é uma alternativa ao uso de (*p).nome<br />
<br />
No primeiro caso pode-se ler: o campo nome do objeto que é apontado por p.<br />
<br />
===Retornando uma estrutura em uma função===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
}<br />
;<br />
<br />
struct TRegistro *p;<br />
<br />
struct TRegistro * RetornarStruct(int indice)<br />
{<br />
return &Tabela[indice];<br />
}<br />
<br />
main()<br />
{<br />
p = RetornarStruct(2); /*p aponta para o registro 3 da tabela */<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando uma estrutura como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
struct TRegistro {<br />
char nome[20];<br />
int idade;<br />
} Tabela[4] = {<br />
{"joao",18,},<br />
{"maria",18,},<br />
{"jose",19,},<br />
{"lara",17,},<br />
};<br />
<br />
struct TRegistro *p;<br />
<br />
void MudarStruct(struct TRegistro *p1, int indice)<br />
{<br />
Tabela[indice] = *p1;<br />
}<br />
<br />
main()<br />
{<br />
struct TRegistro aux = {"luisa",16};<br />
<br />
MudarStruct(&aux,2);<br />
p = &Tabela[2];<br />
printf("O nome na posição 2 é %s e idade = %d\n", p->nome,p->idade);<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 29 DIA 5/07/2013}}<br />
<br />
==AULA 29 DIA 5/07/2013==<br />
<br />
===Objetivos===<br />
<br />
*Vetor de ponteiros<br />
*Argumentos de linha de comando<br />
*Alocação dinâmica de memória<br />
<br />
===Vetor de ponteiros===<br />
<br />
Como visto em aulas anteiriores, variáveis ponteiros possuem como conteúdo um endereço.<br />
É perfeitamente possível construir vetores e matrizes de ponteiros. Por exemplo:<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
char *vp[4];<br />
char alfa[5]="IFSC";<br />
char beta[5]="TELE";<br />
char delta[5]="RAC";<br />
char gamma[5]="CGER";<br />
<br />
vp[0] = alfa;<br />
vp[1] = beta;<br />
vp[2] = delta;<br />
vp[3] = gamma; <br />
<br />
for(i=0;i<4;i++)<br />
printf("%s\n", vp[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
[[imagem:Fig1Aula24PrgITele.jpg|700px]]<br />
<br />
Observe que vp é um vetor de ponteiros para char e cada elemento aponta para uma cadeia de caracteres.<br />
<br />
===Argumentos de linha de comando===<br />
<br />
Um bom exemplo de vetor de ponteiros é a passagem de parâmetros na linha de comando. Cada parâmetro é tratado como uma cadeia de caracteres apontada por um elemento do vetor ''argv''. O número de parâmetros é passado em ''argc''. Note que argv[0] aponta para uma string que inidica o nome do programa.<br />
<br />
Exemplo: Considere o programa abaixo:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main(int argc, char *argv[])<br />
{<br />
int i;<br />
<br />
for (i=0;i<argc;i++) {<br />
printf("%s\n", argv[i]);<br />
}<br />
printf("Numero de parametros passados = %d\n", argc-1); /* o primeiro é o nome do arquivo executavél" */<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÍCIO 1: Implementar um programa chamado ''cmpcadeia'' que testa se duas strings passadas na linha de comando são iguais. O programa deve imprimir uma mensagem indicando se são iguais ou diferentes. Usar a função strcmp da biblioteca. Caso sejam passados mais ou menos que dois parâmetros o programa deve se encerrar mostrando uma indicão do tipo:<br />
<br />
cmpcadeia: dois parametros devem ser passados<br />
<br />
EXERCÍCIO 2: Renomeie o executável e veja seja a mensagem de erro mostra o nome correto do programa.<br />
<br />
===A área de heap e o Layout de memória de um programa C===<br />
<br />
Neste link podemos ter uma ideia da anatomia de um programa na memória do computador.<br />
<br />
http://shivacherukuri.blogspot.com.br/2011/03/memory-layout-in-cdata-segmentbss-code.html<br />
<br />
Podemos observar que existe as seguintes áreas:<br />
*TEXT: área onde está o código;<br />
*BSS: dados estaticamente alocados e não inicializados;<br />
*DATA: dados estaticamente alocados e inicializados;<br />
*STACK: área de pilha (variáveis locais);<br />
*HEAP: área de dados alocados dinamicamente.<br />
<br />
Quando declaramos uma variável global da forma:<br />
int x;<br />
a variável x é alocada em uma área chamada BSS (dados não incializados). Note <br />
que x possui uma área de memória reservada a ela (4 bytes) e cuja existência é<br />
o tempo de vida do programa em execução.<br />
<br />
Da mesma forma, uma variável global da forma:<br />
int y=10;<br />
é alocada na área de DATA. A inicialização é definida normalmente na carga do programa. Os valores de inicialização são copiados para a área de DATA na carga do programa, a partir do arquivo executável.<br />
<br />
Por vezes, o tamanho dos dados não são conhecidos antes da execução do programa.<br />
Neste caso, pode ser interessante criá-los dinamicamente e é neste ponto que<br />
entra a área de HEAP. Trata-se de uma área de memória, gerenciada a partir de funções da biblioteca do C.<br />
<br />
As funções mais conhecidas são (http://en.wikipedia.org/wiki/C_dynamic_memory_allocation):<br />
*[http://pt.wikipedia.org/wiki/Malloc malloc]: aloca n bytes de memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/free/?kw=free free]: libera memória;<br />
*[http://www.cplusplus.com/reference/cstdlib/realloc/ realloc]: realoca memória<br />
*[http://pt.wikipedia.org/wiki/Calloc calloc]:<br />
<br />
http://www.linuxjournal.com/article/4681<br />
http://www.cs.cmu.edu/~guna/15-123S11/Lectures/Lecture08.pdf<br />
<br />
Exemplo 1: Alocação dinâmica de números inteiros (exercício puramente didático):<br />
<br />
<syntaxhighlight lang=c><br />
#include <stlib.h><br />
<br />
main()<br />
{<br />
int *px, *py;<br />
int resultado;<br />
px = (int *) malloc(sizeof(int));<br />
*px = 5;<br />
py = (int *) malloc(sizeof(int));<br />
*px = 2;<br />
resultado = *px + *py;<br />
<br />
free (px);<br />
px = NULL;<br />
free (py);<br />
py = NULL;<br />
}<br />
</syntaxhighlight><br />
<br />
===Alocando dinamicamente uma tabela de estruturas===<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
void main()<br />
{<br />
struct Tteste{<br />
int x;<br />
} *teste;<br />
<br />
if ((teste = (struct TTeste *) malloc (100*sizeof(struct Tteste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
<br />
<br />
teste[10].x= 5;<br />
<br />
if ((teste = realloc(teste, 10000*sizeof(struct Tteste)))==NULL) {<br />
printf("erro de alocação");<br />
exit(1);<br />
}<br />
<br />
teste[9000].x=20;<br />
free(teste);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício: Refazer o exemplo anterior para que a quantidade de memória a ser alocada pela tabela seja passada na linha de comando.<br />
<br />
===Listas Ligadas===<br />
<br />
Por vezes não se conhece o tamanho dos dados que se vai manipular e o uso de uma lista pode ser conveniente para<br />
armazená-los. Um sistema de estoque de produtos, por exemplo, poderia ser armazenado na forma de uma lista.<br />
O exercício a seguir explora esta estrutura.<br />
<br />
Exercício de lista ligada<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
tail->next = p;<br />
tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista <br />
*/<br />
<br />
void print_list()<br />
{<br />
<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
print_list ();<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
<br />
print_list ();<br />
}<br />
</syntaxhighlight><br />
<br />
Lição para casa<br />
* Implementar a função add_node_head()<br />
* Implementar a função print_list<br />
* Implementar a função delete_node(int codigo)<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
No código abaixo foi implementado as funções: add_node_head(), print_list, delete_node(int codigo)<br />
<br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
/*========================*/<br />
/** OPERAÇÔES COM LISTA LIGADA ******/<br />
/*========================*/<br />
<br />
/*<br />
tipos e variáveis globais<br />
*/<br />
<br />
struct TProduto{<br />
int codigo;<br />
struct TProduto *next;<br />
} *head, *tail;<br />
<br />
<br />
/*<br />
adiciona item a cabeça da lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_head(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = head;<br />
<br />
if (head==NULL) {<br />
/* lista vazia */<br />
head = tail = p;<br />
}else{<br />
head=p;<br />
}<br />
return 0;<br />
}<br />
<br />
/*<br />
adiciona item ao final lista<br />
retorna 0 se tudo ok e -1 se erro<br />
*/<br />
int add_nodo_tail(int codigo)<br />
{<br />
struct TProduto *p = malloc (sizeof(struct TProduto));<br />
if (!p)<br />
return -1;<br />
<br />
p->codigo = codigo;<br />
p->next = NULL;<br />
<br />
if (tail==NULL) {<br />
/* lista vazia */<br />
tail = head = p;<br />
}else {<br />
/*lista não vazia */<br />
for(tail=head; tail->next !=NULL; tail=tail->next);<br />
tail->next = p;<br />
// tail = p;<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
int delete_node(int codigo){<br />
struct TProduto *anterior=NULL;<br />
struct TProduto *p=NULL;<br />
//Caso o código seja o primeiro da lista entrará no if, caso seja do meio ou do final entrará no else<br />
if(head->codigo==codigo){<br />
head=head->next;<br />
free(p);<br />
}else{<br />
<br />
for(p=head;p->codigo!=codigo;p=p->next){<br />
anterior=p;<br />
}<br />
anterior->next=p->next;<br />
free(p);<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
/*<br />
imprimir lista<br />
*/<br />
<br />
void print_list( struct TProduto *inicio)<br />
{<br />
<br />
struct TProduto *p;<br />
for (p = inicio; p != NULL; p = p->next)<br />
printf( "Imprimindo estrutura: %d\n", p->codigo);<br />
<br />
}<br />
<br />
int main()<br />
{<br />
int i;<br />
<br />
head = tail = NULL;<br />
// print_list (head);<br />
<br />
//Inserindo códigos no final da lista<br />
for (i=0;i<5;i++)<br />
add_nodo_tail(i);<br />
//Inserindo códigos no início da lista<br />
for(i=6;i<9;i++)<br />
add_nodo_head(i);<br />
print_list (head);<br />
printf("-----------------\n");<br />
//Deletando o código de número 8<br />
delete_node(8);<br />
<br />
print_list(head);<br />
return 0;<br />
}<br />
<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 30 DIA 9/07/2013}}<br />
<br />
==AULA 30 DIA 9/07/2013==<br />
<br />
===Objetivos===<br />
<br />
*Tratamento de arquivos no C<br />
*O sistema de arquivos no Linux<br />
*O acesso com funções de alto nível<br />
<br />
===O sistema de arquivos no Linux===<br />
<br />
====O Arquivo====<br />
'''Um arquivo é um conjunto de dados que pode ser referenciado por um nome e pode ter outros atributos tais como: permissão para leitura e escrita, data da criação, data da última modificação etc.'''<br />
<br />
Note que um arquivo pode conter dados (um relatório, por exemplo), um programa C, um programa executável, música, fotos etc. Seja qual for a natureza dos dados o armazenamento será na forma de bits.<br />
<br />
Normalmente, arquivos são armazenados em memórias secundárias, tais como CD, hard disk etc, mas eles podem se armazenados na memória principal também (RAM, FLASH).<br />
<br />
Quanto a forma como os dados são armazenados, podemos dizer que os arquivos são [http://en.wikipedia.org/wiki/Binary_file binários] ou [http://en.wikipedia.org/wiki/Text_file texto]. Qualquer um deles armazena bits mas os bytes de um arquivo texto representam códigos ASCII.<br />
<br />
====Sistema de Arquivos====<br />
<br />
Um sistema tal como o Linux possui milhares de arquivos. Para que arquivos possam ser acessados e armazenados de forma consistente, eles são organizados em um sistema de arquivos.<br />
<br />
Tipicamente, um sistema de arquivos ocupa uma área de um disco (ou mídia de armazenamento).<br />
Nesta área ficam armazenados blocos de armazenamento dos dados dos arquivos e também as estruturas chamadas de '''inodes'''.<br />
<br />
Um [http://upload.wikimedia.org/wikipedia/commons/a/a2/Ext2-inode.gif inode] é um estrutura que possui as propriedades do arquivo e ponteiros para os blocos que contém os dados do arquivo. Tipicamente um sistema de arquivos possui uma lista de inodes que permite "indexar" cada um dos arquivos do sistema de arquivos.<br />
<br />
Existem vários formatos de sistema de arquivos, dependendo do sistema operacional. No linux os formatos mais conhecidos são: ext2, ext3, ext4 etc.<br />
<br />
Um sistema de arquivos normalmente possui uma estrutura de dados inicial chamada de superbloco. O superbloco traz informações sobre o tamanho de blocos do sistema, o início da lista de inodes (/), etc.<br />
<br />
<code><br />
+-------------+-----------------+------------------------+<br />
| superbloco | lista de inodes | blocos dos arquivos |<br />
+-------------+-----------------+------------------------+<br />
</syntaxhighlight><br />
<br />
<br />
====Diretórios====<br />
<br />
São arquivos especiais que contém basicamente uma lista contendo nome e inode correspondente dos arquivos que o diretório contém.<br />
<br />
Em um sistema de arquivos, o diretório / é o diretório raiz do sistema, a partir do qual pode-se encontrar todos os demais arquivos.<br />
<br />
=====Referência a um arquivo=====<br />
<br />
A localização de um arquivo pode ser realizada pela referência absoluta, ou seja, desde o diretório / do sistema:<br />
<br />
cat /etc/passwd<br />
<br />
O comando cat tem por objetivo mostrar no terminal o conteúdo do arquivo ''passwd''. Para que este arquivo seja encontrado na árvore de diretórios, deve-se fornecer a referência absoluta, desde o diretório /<br />
<br />
Uma alternativa de acesso, é o uso da referência relativa ao diretório de trabalho. O conceito de diretório de trabalho é criado pelo interpretador de comandos (''shell''). Desta forma pode-se por exemplo fazer o comando:<br />
<br />
cat passwd<br />
<br />
O sistema procurará o arquivo passwd dentro do diretório de trabalho, que é armazenado pelo ''shell''. Neste caso, o diretório de trabalho deveria ser ''/etc''<br />
<br />
cd /etc<br />
cat passwd<br />
<br />
=====No Linux/Unix tudo é arquivo=====<br />
<br />
No Linux, qualquer referência/acesso ao hardware/dispositivos é realizada na forma de acesso a arquivo. Ver arquivos no diretório de dispositivos:<br />
<br />
ls -l /dev<br />
<br />
Como consequência, a partir de um programa em C, é possível abrir e escrever/ler em um dispositivo (desde que se tenha autorização).<br />
<br />
===Acessando arquivos a partir de programas C===<br />
<br />
====Acesso a arquivos: funções de baixo e alto nível====<br />
<br />
Em sistemas do porte do Linux e Windows, por questões de segurança e controle, todo acesso a arquivo é realizado através de código do sistema operacional. Desta forma, um programa que deseja acessar um arquivo deve gerar uma CHAMADA AO SISTEMA.<br />
O Linux (assim como outros sistemas) possui uma API (Application Programming Interface) bem definida, na forma de um conjunto de chamadas que permitem realizar uma série de funcionalidades (serviços) para os processos(programas em execução).<br />
<br />
Um programa em C realiza uma CHAMADA AO SISTEMA com auxílio de funções da biblioteca C (a glib no caso do Linux).<br />
Duas categorias de funções para acesso a arquivo são disponibilizadas [http://en.wikipedia.org/wiki/C_file_input/output (ver detalhes aqui)]:<br />
*Funções de baixo nível: acessam diretamente o sistema;<br />
*Funções de alto nível: as funções intermediam o acesso, criando buffers no espaço de endereçamento do processo. As funções de baixo nível são invocadas para ler e escrever dados no buffer.<br />
<br />
====Acesso a arquivo em MODO TEXTO através de funções de alto nível====<br />
<br />
O acesso em alto nível é realizado usando uma estrutura do tipo [http://www.gnu.org/software/libc/manual/html_node/Streams.html#Streams FILE] definida no stdio.h.<br />
Todo acesso passa inicialmente por abrir o arquivo (função fopen), ler/escrever (várias funções, tipo fread(), fwrite()) e fechar o arquivo (fclose()).<br />
<br />
<br />
=====Exemplo 1: Escrevendo e lendo um arquivo texto de forma formatada=====<br />
<br />
Nos exemplos que se seguem, serão usadas as funções [http://www.cplusplus.com/reference/cstdio/fopen/ fopen] e [http://www.cplusplus.com/reference/cstdio/fclose/?kw=fclose fclose], para abrir e fechar arquivo e [http://www.cplusplus.com/reference/cstdio/fprintf/?kw=fprintf fprintf()] e [http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf fscanf()] para leitura e escrita.<br />
A forma é similar ao ''printf'' e ''scanf''(ver http://diuf.unifr.ch/pai/ip/tutorials/c/TC02_scanf.pdf), a não ser pelo fato de que a escrita e leitura é realizada no arquivo indicado<br />
por ''p_arq''<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i;<br />
int res;<br />
<br />
if ((p_arq=fopen("IFSC.txt", "w")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i = 0; i<10;i++) {<br />
/* A funcao fprintf devolve o número de bytes gravados ou EOF se houve erro na gravação */<br />
if((res = fprintf(p_arq,"Linha %d\n",i))==EOF) { <br />
printf("Erro\n");<br />
break;<br />
}<br />
}<br />
fclose(p_arq);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que se o arquivo IFSC.txt não existir, ele será criado.<br />
Para ver o que fois escrito faça:<br />
cat IFSC.txt<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
FILE *p_arq;<br />
int i,j;<br />
int res;<br />
char buff[100];<br />
<br />
if ((p_arq=fopen("IFSC.txt", "r")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
<br />
for (i = 0; i<10;i++) {<br />
if((res = fscanf(p_arq,"%s %d",buff,&j))==EOF) { <br />
printf("Fim de leitura\n");<br />
break;<br />
}<br />
printf("%s %d\n",buff,j);<br />
}<br />
fclose(p_arq);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que o fscanf se comporta de forma similar ao scanf. A função retorna o caracter EOF (end-of-file) quando não existe mais dados a serem lidos.<br />
<br />
*Exercícios<br />
<br />
#Implementar uma função que soma duas matrizes fornecidas em dois arquivos texto separados: MatA.dat e MatB.dat. Colocar o resultado em um arquivo chamado MatC.dat.<br />
<br />
====Exemplo2====<br />
<br />
Neste exemplo usaremos as funções fgetc e fputc para ler e cescrever caracteres ASCII nos arquivos. Seja um programa que conta o número de ocorrências do caracter 'a' em um arquivo e reescreve o arquivo sem os "as":<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
main()<br />
{<br />
FILE *fp_fonte,*fp_destino;<br />
int x,cont=0;<br />
<br />
if((fp_fonte=fopen("teste.dat","r")) == NULL) {<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
}<br />
if((fp_destino=fopen("dest.dat","w")) == NULL){<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
}<br />
<br />
/* note que fgetc retorna um inteiro contendo o ASCII lido */<br />
while ((x=fgetc(fp_fonte)) != EOF){<br />
if(x=='a')<br />
cont++;<br />
else<br />
if((x=fputc(x,fp_destino))==EOF) {<br />
puts("Não conseguiu abrir o arquivo\n");<br />
exit(1);<br />
} <br />
} <br />
printf("ocorrências de a = %d\n", cont);<br />
fclose(fp_fonte);<br />
fclose(fp_destino);<br />
}<br />
</syntaxhighlight><br />
<br />
Note que ''fputc'' recebe o caracter como um inteiro mas realiza um ''cast'' para<br />
''unsigned char'' com fins de escrevê-lo no arquivo.<br />
<br />
====Exemplo 3====<br />
<br />
Neste exemplo vamos explorar o modo de abertura do arquivo para fazer um append (escrever no final do arquivo).<br />
<br />
<syntaxhighlight lang=c><br />
#include <time.h><br />
#include <stdio.h><br />
<br />
int main(void)<br />
{<br />
time_t ltime;<br />
FILE *fp;<br />
int num;<br />
<br />
time(&ltime); <br />
<br />
if ((fp=fopen("DATA.txt", "a")) == NULL) {<br />
printf("Problemas na abertura do arquivo\n");<br />
return;<br />
}<br />
if ((num = fputs( ctime(&ltime), fp )) != EOF ) {<br />
fclose(fp);<br />
} else {<br />
printf("Erro na escrita do arquivo!\n");<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Execute o programa da forma (suponha que se chame LOG_tempo:<br />
log_tempo<br />
cat DATA.txt<br />
log_tempo<br />
cat DATA.txt<br />
log_tempo<br />
cat DATA.txt <br />
<br />
*Exercício: Substitua o modo de append por uma simples escrita (w). Reexecute o programa conforme especificado anteriormente.<br />
<br />
====Acesso a arquivo em MODO BINÁRIO através de funções de alto nível====<br />
<br />
Neste exemplo vamos escrever e ler uma struct (com dados binários) usando fwrite e fread. Note que os dados são gravados de forma binária.<br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
struct TNum {<br />
float x;<br />
float y;<br />
} Num = { 1.5,<br />
2.6, <br />
};<br />
<br />
main()<br />
{<br />
FILE *fp;<br />
int num_itens;<br />
<br />
fp = fopen("data.bin", "wb");<br />
num_itens = fwrite((char*)&Num, sizeof(struct TNum), 1, fp);<br />
fclose(fp);<br />
<br />
Num.x =0;<br />
Num.y = 0;<br />
<br />
fp = fopen("data.bin", "rb");<br />
num_itens = fread((char*)&Num, sizeof(struct TNum), 1, fp);<br />
<br />
printf("Valor de x = %f\n", Num.x);<br />
fclose(fp);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Referências<br />
<br />
[http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fctime.htm Material IBM]<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 31 DIA 12/07/2013}}<br />
<br />
==AULA 31 DIA 12/07/2013==<br />
<br />
===Ideias sobre o trabalho===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
#include <stdlib.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
struct TUsuario *next;<br />
} *head, *tail;<br />
<br />
void adicione_usuario_tail(struct TUsuario *p)<br />
{<br />
if (tail==NULL) { <br />
tail = head = p;<br />
}else {<br />
tail->next = p;<br />
tail = p;<br />
}<br />
}<br />
<br />
void adicionar_usuario ()<br />
{<br />
struct TUsuario *p;<br />
<br />
if ((p=(struct TUsuario *)malloc(sizeof(struct TUsuario)))==NULL) {<br />
printf("Não é possível adicionar usuário ao sistema");<br />
return;<br />
}<br />
printf("Entre com userID\n");<br />
scanf("%s",p->userID);<br />
printf("Entre com senha\n");<br />
scanf("%s",p->senha);<br />
p->next = NULL;<br />
adicione_usuario_tail(p);<br />
}<br />
<br />
struct TUsuario *encontrar_usuario_lista(userID)<br />
{<br />
<br />
}<br />
<br />
struct TUsuario *remover_usuario_lista(struct TUsuario *p)<br />
{<br />
}<br />
<br />
void remover_usuario()<br />
{<br />
char userID[20];<br />
struct TUsuario *p; <br />
printf("Entre com userID do usuario a ser removido\n");<br />
scanf("%s", userID);<br />
<br />
p = encontrar_usuario_lista(userID); <br />
if (!p)<br />
printf("Usuário não existente\n");<br />
else { <br />
remover_usuario_lista(p);<br />
printf("Usuário removido!\n");<br />
}<br />
}<br />
<br />
main()<br />
{<br />
adicionar_usuario();<br />
adicionar_usuario();<br />
remover_usuario();<br />
}<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Monitoria_de_Programa%C3%A7%C3%A3o&diff=56291Monitoria de Programação2013-07-14T18:29:24Z<p>Beatriz.s: </p>
<hr />
<div>Teste para a disciplina de Programação 1 2013/1</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55569PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-27T23:17:00Z<p>Beatriz.s: /* Lista Exercícios */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 21/06/2013}}<br />
<br />
== AULA 25 DIA 21/06/2013==<br />
<br />
===OBJETIVOS===<br />
<br />
*Avaliação 2 de Laboratório<br />
<br />
===AVALIAÇÂO LAB 2 A===<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
3.Implementar uma tabela global usando structs que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total de dinheiro do banco em função do saldo das contas e uma função que retorna o saldo de um usuário dado o seu CPF.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
3.Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total contas em negativo e uma função que retorna o saldo de um usuário dado o seu nome.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 26 DIA 22/06/2013}}<br />
<br />
== AULA 26 DIA 22/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Lista Exercícios===<br />
<br />
* Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento segnifica cassa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Implementação do Jogo da Velha<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define linha 3<br />
#define coluna 3<br />
<br />
int Jogo[3][3]={<br />
{0,0,0},<br />
{0,0,0},<br />
{0,0,0}<br />
};<br />
unsigned int jogador_vez=1; /*São os jogadores, que serão representados pelos nºs 1 e 5*/<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
/*O método abaixo apresenta o tabuleiro ao jogador e caso todas as casas já estejam preenchidas<br />
* finaliza o jogo*/<br />
int apresentar_jogo()<br />
{<br />
int finaliza=9;<br />
int i;<br />
int j;<br />
for(i=0;i<linha;i++)<br />
{<br />
for(j=0;j<coluna;j++)<br />
{<br />
printf("%d\t", Jogo[i][j]);<br />
if(Jogo[i][j]!=0){<br />
finaliza--;<br />
<br />
}<br />
}<br />
printf("\n");<br />
}return finaliza;<br />
}<br />
<br />
/*Armazena na struct a linha e a coluna que o jogador deseja inserir a jogada*/<br />
struct Tjogada ler_jogada()<br />
{<br />
printf("Digite a linha que deseja inserir a jogada");<br />
scanf("%d", &jogada.x);<br />
printf("Digite a coluna que deseja inserir a jogada");<br />
scanf("%d", &jogada.y);<br />
return jogada;<br />
}<br />
/*Impede que o jogador tente jogar numa casa já preenchida, ou inserir numa<br />
* linha ou coluna fora do escopo*/<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
if(Jogo[aux_jogada.x][aux_jogada.y]==0 && aux_jogada.x<linha && aux_jogada.y<coluna){<br />
Jogo[aux_jogada.x][aux_jogada.y]=jogador_vez;<br />
return 0;<br />
}<br />
return 1;<br />
}<br />
<br />
int verificar_termino()<br />
{<br />
int i;<br />
int j;<br />
//Confere linha por linha;<br />
for(i=0;i<linha;i++){<br />
int soma=0;<br />
for(j=0;j<coluna;j++)<br />
{<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma == 15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
//Confere coluna por coluna;<br />
}for(j=0;j<coluna;j++){<br />
int soma=0;<br />
for(i=0;i<linha;i++){<br />
soma = soma+Jogo[i][j];<br />
<br />
if(soma==3 || soma ==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
}<br />
//Confere a diagonal principal e a diagonal secundária<br />
int diagonalPrincipal=0;<br />
int diagonalSecundaria=0;<br />
int l;<br />
for(l=0 ; l < linha ; l++)<br />
{<br />
diagonalPrincipal = diagonalPrincipal+Jogo[l][l];<br />
diagonalSecundaria =diagonalSecundaria+Jogo[l][linha-l-1];<br />
<br />
if(diagonalPrincipal==3 || diagonalPrincipal==15 || diagonalSecundaria==3 || diagonalSecundaria==15){<br />
return 0;<br />
break;<br />
}<br />
}<br />
return 1;<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
apresentar_jogo();<br />
}<br />
<br />
int main()<br />
{<br />
while (jogo==1) {<br />
int velha=apresentar_jogo();<br />
<br />
if(velha==0){<br />
printf("Deu velha!");<br />
exit(0);<br />
}<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)==0) {<br />
<br />
if (verificar_termino()==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
printf("Terminou o jogo");<br />
}<br />
if (jogador_vez==1){<br />
jogador_vez=5;<br />
}else{<br />
jogador_vez=1;<br />
}<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
}<br />
return 0;<br />
}<br />
<br />
<br />
</syntaxhighlight></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55321PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-23T18:09:58Z<p>Beatriz.s: /* AVALIAÇÂO LAB 2 A */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 21/06/2013}}<br />
<br />
== AULA 25 DIA 21/06/2013==<br />
<br />
===OBJETIVOS===<br />
<br />
*Avaliação 2 de Laboratório<br />
<br />
===AVALIAÇÂO LAB 2 A===<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
3.Implementar uma tabela global usando structs que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total de dinheiro do banco em função do saldo das contas e uma função que retorna o saldo de um usuário dado o seu CPF.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resolução da questão 3, Avaliação Lab3A<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
#define TAM_CLIENTE 40<br />
#define TAM_CPF 60<br />
#define TAM_END 50<br />
<br />
struct TRegistroCliente{<br />
char nome[TAM_CLIENTE];<br />
char cpf[TAM_CPF];<br />
char endereco[TAM_END];<br />
float saldo;<br />
};<br />
<br />
struct TRegistroCliente TabelaClientes[4] = {<br />
{"Lara","12222212", "kobrasol", 192.97},<br />
{"Joao","44434212", "Campinas", -69.0},<br />
{"Maria","12234272", "Barreiros", 45.90},<br />
{"Jose","75656755", "Centro", 75.00},<br />
};<br />
float totalDinheiro(){<br />
int i;<br />
float saldoTotal=0;<br />
<br />
for(i=0; i<4; i++)<br />
{<br />
saldoTotal=TabelaClientes[i].saldo+saldoTotal;<br />
}<br />
return saldoTotal;<br />
}<br />
float saldoUsuario(char cpf[]){<br />
int i,userEncontrado=1;<br />
float saldo;<br />
<br />
for(i=0;i<4 && userEncontrado;i++) {<br />
if(strcmp(TabelaClientes[i].cpf, cpf)==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0){<br />
i--;<br />
saldo = (TabelaClientes[i].saldo);<br />
}<br />
return saldo;<br />
}<br />
int main(){<br />
int x;<br />
char cpf[TAM_CPF];<br />
while(1){<br />
printf("----------------------------------------------------\n");<br />
printf("Escolha a operação que você deseja realizar\n");<br />
printf("1-saldo total do banco\n2-Saldo do usuário\n");<br />
scanf("%d", &x);<br />
printf("----------------------------------------------------\n");<br />
if(x==1){<br />
printf("O saldo total do banco é de: %.2f\n", totalDinheiro());<br />
}if(x==2){<br />
printf("Insira seu cpf digitando somente numeros\n");<br />
scanf("%s",cpf);<br />
printf("Saldo total do banco é de: %.2f\n", saldoUsuario(cpf));<br />
<br />
}<br />
}}<br />
<br />
</syntaxhighlight><br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
3.Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total contas em negativo e uma função que retorna o saldo de um usuário dado o seu nome.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 26 DIA 22/06/2013}}<br />
<br />
== AULA 26 DIA 22/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Lista Exercícios===<br />
<br />
* Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento segnifica cassa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
<code><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55320PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-23T16:00:59Z<p>Beatriz.s: /* AVALIAÇÂO LAB 2 A */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 21/06/2013}}<br />
<br />
== AULA 25 DIA 21/06/2013==<br />
<br />
===OBJETIVOS===<br />
<br />
*Avaliação 2 de Laboratório<br />
<br />
===AVALIAÇÂO LAB 2 A===<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 2, avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int num_vog(char cadeia[])<br />
{<br />
int i;<br />
int totalDeA=0;<br />
<br />
for(i=0;cadeia[i]!= 'b'; i++)<br />
{<br />
if(cadeia[i]=='a')<br />
totalDeA=totalDeA+1;<br />
}<br />
<br />
return totalDeA;<br />
}<br />
<br />
<br />
int main()<br />
{<br />
char x1[]={'a','b','a','c','a','t','e','\0'};<br />
int x2 = num_vog(x1);<br />
printf("Quantidade de A: %d\n", x2);<br />
<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
3.Implementar uma tabela global usando structs que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total de dinheiro do banco em função do saldo das contas e uma função que retorna o saldo de um usuário dado o seu CPF.<br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
3.Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total contas em negativo e uma função que retorna o saldo de um usuário dado o seu nome.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 26 DIA 22/06/2013}}<br />
<br />
== AULA 26 DIA 22/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Lista Exercícios===<br />
<br />
* Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento segnifica cassa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
<code><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55314PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-23T15:02:33Z<p>Beatriz.s: /* AVALIAÇÂO LAB 2 A */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 25 DIA 21/06/2013}}<br />
<br />
== AULA 25 DIA 21/06/2013==<br />
<br />
===OBJETIVOS===<br />
<br />
*Avaliação 2 de Laboratório<br />
<br />
===AVALIAÇÂO LAB 2 A===<br />
<br />
1.Implementar uma função que recebe como parâmetros dois vetores de ''floats'' cujos tamanhos são passados também como parâmetros. A função deve retornar 1 se a média dos elementos do primeiro vetor for maior que o segundo e 0 se for menor ou igual. Ver esqueleto da funçao: <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
}<br />
<br />
main()<br />
{<br />
float x1[5]={2.4,,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
Resposta da questão 1, da avaliação Lab2A<br />
<br />
#include <stdio.h><br />
<br />
int compara_media_vetores(float vet1[], int tam1, float vet2[], int tam2)<br />
{<br />
/* implementar aqui */<br />
int i;<br />
float total1;<br />
float total2;<br />
<br />
for(i=0;i<tam1;i++)<br />
total1 = total1 + vet1[i];<br />
total1 = total1/tam1;<br />
printf("valor de total1= %.2f\n", total1);<br />
<br />
for(i=0;i<tam2;i++)<br />
total2 = total2 + vet2[i];<br />
total2 = total2/tam2;<br />
printf("valor de total2=%.2f\n", total2);<br />
<br />
if(total1>total2){<br />
return 1;<br />
}else{<br />
return 0;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
float x1[5]={2.4,6.7,8.5,9.6,1.5};<br />
float x2[4]={1.6,2.5,6.7,3.2};<br />
int res;<br />
<br />
/* exemplo de uso da função */<br />
res = compara_media_vetores(x1,5,x2,4);<br />
if (res==1)<br />
printf("media de x1 maior que média de x2\n");<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' que são precedidos pela letra b. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
3.Implementar uma tabela global usando structs que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total de dinheiro do banco em função do saldo das contas e uma função que retorna o saldo de um usuário dado o seu CPF.<br />
<br />
===AVALIAÇÂO LAB2B===<br />
<br />
1.Implementar um programa C (não precisa ser função) que lê valores (usando ''scanf'') de uma matriz ''alfa'' de dimensão MxN de ''inteiros'' (onde M e N são dimensões que devem ser lidas no início). O programa deve mostrar (usando ''printf'') quantas linhas desta matriz possuem valores entre 5 e 10 (inclusive). Exemplo:<br />
A matriz:<br />
12 5 3 <br />
1 4 17 <br />
13 14 10 <br />
Esta matriz possui 2 linhas com valores que estão entre 5 e 10.<br />
<br />
2.Implementar uma função que recebe um vetor de caracteres como parâmetro. Este vetor conterá uma string terminada em NULL. A função deve retornar o número de vogais 'a' e 'i' que sejam sucedidas pela letra c. Na função main apresentar um teste de uso da função <syntaxhighlight lang=c><br />
int num_vog(char cadeia[])<br />
{<br />
/* implementar aqui */<br />
<br />
}<br />
main()<br />
{<br />
/* testar o uso da função aqui */<br />
}<br />
</syntaxhighlight><br />
Explicação adicional:Para a cadeia "abacate" a função deveria retornar 1.<br />
<br />
3.Implementar uma tabela global usando ''structs'' que permita representar as contas bancários de pessoas físicas. Cada registro deve conter nome, cpf, endereço e o saldo atual da conta. Contas podem estar negativas. Implementar uma função que permita calcular o total contas em negativo e uma função que retorna o saldo de um usuário dado o seu nome.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 26 DIA 22/06/2013}}<br />
<br />
== AULA 26 DIA 22/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Exercícios<br />
<br />
===Lista Exercícios===<br />
<br />
* Implementar um jogo da velha usando uma matriz 3x3 de inteiros. Um zero como elemento segnifica cassa vazia. Os números 1 e 2 significam jogadas de jogadores.<br />
<syntaxhighlight lang=c><br />
int Jogo[3][3]={<br />
0,0,0,<br />
0,0,0,<br />
0,0,0,<br />
};<br />
<br />
unsigned int jogador_vez=0; /* 0 e 1 representam os jogadores */<br />
int jogo=1;<br />
<br />
struct Tjogada{<br />
int x,y;<br />
} jogada;<br />
<br />
void apresentar_jogo()<br />
{<br />
}<br />
<br />
struct Tjogada ler_jogada()<br />
{<br />
}<br />
<br />
<br />
int validar_jogada(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void verificar_termino(struct Tjogada aux_jogada)<br />
{<br />
}<br />
<br />
void anunciar_vitoria()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
while (jogo==1) {<br />
apresentar_jogo();<br />
jogada=ler_jogada();<br />
if (validar_jogada(jogada)) {<br />
if (verificar_termino(jogada)==0) {<br />
anunciar_vitoria();<br />
jogo=0;<br />
} <br />
jogador_vez=++jogador_vez%2;<br />
} else {<br />
printf("Jogada inválida\n");<br />
}<br />
} <br />
}<br />
<br />
<code><br />
<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55199PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-20T00:07:57Z<p>Beatriz.s: /* Matrizes de caracteres e vetores de strings */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
<br />
<syntaxhighlight lang=c><br />
Autora: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
int main()<br />
{<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
<br />
<br />
char TabelaUsuarios[5][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
"fim" };<br />
<br />
<br />
do{<br />
<br />
printf("Entre com seu usuário");<br />
scanf("%s", userId);<br />
for (i=0;i<5 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0 && strcmp(userId,&TabelaUsuarios[4][0])==0){<br />
userEncontrado=0;<br />
printf("FIM Abrir porta\n");}<br />
} }while(userEncontrado==1);<br />
printf("O usuário digitado é : FIM");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang=c><br />
O código abaixo foi o código base para a implementação feita acima<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight><br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55198PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-19T23:29:01Z<p>Beatriz.s: </p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<br />
<syntaxhighlight lang=c><br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55197PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-19T23:28:12Z<p>Beatriz.s: /* Matrizes de caracteres e vetores de strings */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
<br />
Autor: Beatriz da Silveira<br />
<br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
#include <string.h><br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
char TabelaSenhas[4][10]={<br />
"joaozinho",<br />
"mari",<br />
"josezinho",<br />
"larinha",<br />
};<br />
<br />
int tratandoAutenticacao(char userId[50], char senha[50]){<br />
int userEncontrado=1;<br />
int senhaEncontrada=1;<br />
int i;<br />
int b=1;<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
<br />
if (userEncontrado==0){<br />
for (i=0;i<4 && senhaEncontrada; i++) {<br />
if( strcmp(senha, &TabelaSenhas[i][0])==0){<br />
senhaEncontrada=0;}}<br />
if(senhaEncontrada==0){<br />
printf("Abrir porta!!!\n");<br />
b=0;<br />
}else{<br />
printf("Senha inválida\n");<br />
b=1;<br />
}<br />
<br />
}else{<br />
printf("User inválido\n");<br />
b=1;<br />
}<br />
<br />
return b;<br />
}<br />
int main()<br />
{<br />
<br />
<br />
char userId[50];<br />
char senha[50];<br />
int aut;<br />
do<br />
{printf("Digite seu userId: \n");<br />
scanf("%s",userId);<br />
printf("Entre com sua senha \n");<br />
scanf("%s", senha);<br />
aut =tratandoAutenticacao(userId, senha);}while(aut == 1);<br />
printf("Usuário e senha corretos");<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55185PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-19T21:30:46Z<p>Beatriz.s: /* Exercícios */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang=c><br />
Autor: Beatriz da Silveira<br />
<br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55184PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-19T21:29:39Z<p>Beatriz.s: /* Exercícios */</p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
Autor: Beatriz da Silveira<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55183PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-19T21:28:36Z<p>Beatriz.s: </p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
Autor: Beatriz da Silveira<br />
<code><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=PRG1-2013-1-Engenharia_Programa%C3%A7%C3%A3o_1_-_Engenharia&diff=55182PRG1-2013-1-Engenharia Programação 1 - Engenharia2013-06-19T21:22:24Z<p>Beatriz.s: </p>
<hr />
<div>PRG1 - PROGRAMAÇÃO I<br />
<br />
=CARGA HORÁRIA=<br />
<br />
TOTAL: 72 HORAS (4 HORAS/SEMANA)<br />
<br />
TEÓRICA: 36 HORAS<br />
<br />
LABORATÓRIO: 36 HORAS<br />
<br />
DIAS COM AULA: 36 (18 semanas)<br />
<br />
=PRÉ REQUISITOS: LÓGICA =<br />
<br />
=EMENTA=<br />
<br />
Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários. <br />
<br />
=Bibliografia Básica=<br />
<br />
* SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953<br />
<br />
=Referências Complementares=<br />
<br />
* Apostila adotada: [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Curso de Linguagem C - Engenharia Elétrica - UFMG]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/images/0/02/L%C3%B3gica_de_Programa%C3%A7%C3%A3o.pdf Apostila sobre Lógica de Programação]<br />
<br />
=AULAS=<br />
<br />
<br />
{{collapse top|AULA 1 DIA 2/04/2013}}<br />
== AULA 1 DIA 2/04/2013==<br />
<br />
=== Como fazer um churrasco ===<br />
<br />
Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:<br />
<br />
<center>{{#ev:youtube|U0xSYIXE9vo#!}} </center><br />
<br />
O que tem o churrasco com a nossa aula??<br />
Trata-se de uma sequência de passos para execução <br />
de um objetivo.<br />
<br />
EXERCÍCIO: Na forma textual, descrever as etapas<br />
para fazer um bom churrasco.<br />
<br />
=== O que é um algoritmo ===<br />
<br />
Um [http://pt.wikipedia.org/wiki/Algoritmo algoritmo] pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.<br />
<br />
A receita de um bom churrasco corresponde <br />
a um algoritmo.<br />
<br />
=== Como representar um algoritmo ? ===<br />
<br />
Uma forma é representar na forma textual ordenada:<br />
<br />
1.Comprar a carne<br />
2.Colocar carvão na churrasqueira<br />
3.Acender o carvão<br />
4.Cortar a carne (picanha)<br />
5.Espetar a carne<br />
6.Salgar a carne<br />
7.Colocar a carne na churrasqueira<br />
8.Aguardar a carne ficar no ponto desejado<br />
9.Bater a carne<br />
10.Servir a carne<br />
<br />
Outras formas são mais apropriadas para o uso no meio computacional:<br />
* pseudo-código<br />
* fluxogramas<br />
<br />
A PENSAR: É possível mudar a ordem das instruções?<br />
É possível paralelizar algumas instruções?<br />
<br />
=== O problema da raposa, do milho e da galinha ===<br />
<br />
<center>{{#ev:youtube|yifW9XueSaI#!}} </center><br />
<br />
<br />
EXERCÍCIO 1: Descrever na forma de etapas um <br />
solução para o problema da raposa, do milho e da galinha.<br />
<br />
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.<br />
<br />
EXERCÍCIO 2: Descrever na forma de etapas uma <br />
solução para o problema dos canibais/padres.<br />
<br />
=== Torres de Hanoi ===<br />
<br />
Veja este jogo:<br />
<br />
<center>{{#ev:youtube|hLnuMXO95f8#!}} </center><br />
<br />
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 3 discos.<br />
<br />
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema <br />
das torres de Hanói usando 4 discos.<br />
<br />
=== E para quem são os algoritmos? ===<br />
<br />
Uma receita de bolo é apropriada para ser executada <br />
por um ser humano. <br />
Um procedimento de como trocar um pneu também. <br />
Mas muitas vezes queremos que o algoritmo seja executado <br />
por uma máquina! O computador é perfeito para isto!<br />
<br />
Neste curso vamos nos concentrar no desenvolvimento de<br />
algoritmos simples, desde a sua concepção até a sua <br />
implementação através de uma LINGUAGEM DE<br />
PROGRAMAÇÃO - a linguagem C, em um computador.<br />
<br />
Um PROGRAMA implementa um algoritmo. É o algoritmo <br />
materializado na forma de uma sequência de instruções.<br />
<br />
Neste sentido, vamos entender minimamente o funcionamento de um computador.<br />
<br />
=== Como funciona um computador? Como ele executa programas ("receitas")? ===<br />
<br />
*Partes de um computador:<br />
**UCP ([http://en.wikipedia.org/wiki/Central_processing_unit CPU]) (Unidade Central de Processamento)<br />
**Barramentos<br />
**[http://en.wikipedia.org/wiki/Memory_%28computers%29 Memórias]: Primária (semicondutora -> RAM e ROM) e Secundárias (disco, pendrive)<br />
**Dispositivos de Entrada e Saída de Dados (Teclado, Monitor etc)<br />
<br />
*O computador é digital: <br />
** Dados e Instruções são sequências de bits<br />
** Representação de dados em sistemas computacionais: uso de códigos (ex:[http://pt.wikipedia.org/wiki/ASCII código ASCII]);<br />
A -> 01000001<br />
B -> 01000010<br />
** As instruções também são palavras binárias interpretadas pela CPU;<br />
<br />
De forma simplificada podemos dizer que as instruções ficam em uma <br />
memória de programa enquanto os dados a serem processados pelo programa<br />
ficam em uma memória de DADOS;<br />
<br />
O programa que está na '''memória de programa''' está escrito<br />
em LINGUAGEM DE MÁQUINA<br />
<br />
*Funcionamento Simplificado de um Computador<br />
<br />
Suponha que um programa a ser executado se encontra em uma memória de programa.<br />
Ao ligar o sistema, a CPU busca na memória de programa uma instrução a ser executada<br />
(ciclo de busca) e, então, executa a instrução (ciclo de execução). Na SEQUÊNCIA,<br />
a CPU busca a PRÓXIMA instrução na memória de programa, e assim sucessivamente...<br />
<br />
O fluxo de execução do programa é, a princípio SEQUENCIAL no sentido <br />
que a execução de uma instrução é realizada somente após a execução da instrução <br />
antecedente.<br />
<br />
[http://www.sj.ifsc.edu.br/~tisemp/SOP/arquitetura_aula1.pdf (apresentação do Prof.Semprebom sobre computadores)]<br />
<br />
=== Possíveis linguagens de programação ===<br />
<br />
Na prática, é inviável desenvolver programas complexos em<br />
LINGUAGEM DE MÁQUINA.<br />
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de<br />
alguma forma, serem traduzidas (compiladas) para a linguagem<br />
de baixo nível ou interpretadas em tempo de execução.<br />
<br />
Exemplo:<br />
<br />
* Linguagem C<br />
* Fortran<br />
* Basic<br />
* C++<br />
* Pascal<br />
* Java<br />
* Python<br />
<br />
Neste curso utilizaremos a linguagem C. Por que? <br />
É uma linguagem muito usada na implementação de produtos <br />
eletrônicos, incluindo àqueles voltados as Telecomunicações.<br />
<br />
=== Um exemplo completo ===<br />
<br />
PROBLEMA: Computar a média de dois números reais fornecidos pelo teclado. Mostrar o resultado no monitor.<br />
<br />
SOLUÇÃO:<br />
<br />
ALGORITMO<br />
DADOS DE ENTRADA: NUM1 e NUM2<br />
DADOS DE SAÍDA: MEDIA<br />
INÍCIO<br />
1.Ler NUM1<br />
2.Ler NUM2<br />
3.MEDIA <- (NUM1+NUM2)/2<br />
4.Mostrar MEDIA<br />
FIM<br />
<br />
<syntaxhighlight lang=c><br />
/* Calculador de media de dois números reais */<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float num1,num2;<br />
<br />
scanf(&num1);<br />
scanf(&num2);<br />
media = (num1+num2)/2;<br />
printf ("media =\n", media);<br />
}<br />
</syntaxhighlight><br />
<br />
EXERCÌCIO 5: Implementar o algoritmo com o Scratch.<br />
<br />
=== Plano de Ensino ===<br />
<br />
Agora que temos uma ideia do que será tratado neste curso, vamos apresentar o [http://wiki.sj.ifsc.edu.br/index.php/PRG1-EngTel_%28Plano_de_Ensino%29 plano de ensino].<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 2 DIA 5/04/2013}}<br />
==AULA 2 DIA 5/4/2013==<br />
<br />
===Objetivos===<br />
<br />
===Recordando o significado de algoritmo===<br />
<br />
Um algoritmo é um "um conjunto de instruções para resolver um determinado problema".<br />
O nome advém de [http://en.wikipedia.org/wiki/Al-Khw%C4%81rizm%C4%AB al-Khwārizmī]<br />
<br />
Segundo Knuth um algoritmo deve:<br />
<br />
*Sempre terminar após um determinado número de passos. Caso contrário, é chamado (por Knuth) de método computacional;<br />
*Cada passo do algoritmo deve ser precisamente definido (sem ambiguidades);<br />
*Um certo número (ou nenhum) de dados de entrada deve ser fornecido no início ou dinamicamente na execução do algoritmo;<br />
*Ter dados de saída, resultantes do processamento dos dados de entrada;<br />
*Ser efetivo, no sentido que suas operações sejam simples e se executem em tempo finito de tempo;<br />
<br />
===Não existe algoritmo para fazer um algoritmo===<br />
<br />
É sempre bom lembrar que não existe um algoritmo para fazer um algoritmo. Podemos considerar que fazer um algoritmo é uma ''forma de arte''. <br />
<br />
No entanto, existem algumas diretrizes que podem ser consideradas. Vamos ver estas:<br />
<br />
*Comprender bem o problema é fundamental para a solução;<br />
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 <br />
minutes thinking about solutions.”<br />
― Albert Einstein<br />
*Tentar enumerar estratégias possíves;<br />
*Tentar dividir o problema e resolver os subproblemas.<br />
<br />
===A Descrição de Algoritmos usando Fluxogramas===<br />
<br />
Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada <br />
para descrição de algoritmos.<br />
<br />
Exemplo: O algoritmo de cálculo da média de dois números da aula anterior:<br />
<br />
[[imagem:FluxogramaMediaDoisNumeros.jpg|150px|center]]<br />
<br />
Pontos fortes:<br />
*permite fácil entendimento do algoritmo, mesmo para pessoas leigas;<br />
<br />
Ponto fraco:<br />
*a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;<br />
<br />
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.<br />
<br />
===Símbolos de um Fluxograma===<br />
[[imagem:TabelaSimbolosFluxograma.jpg|450px]]<br />
<br />
===Teste de Mesa===<br />
<br />
[[imagem:TesteMesaMediaDoisNumeros.jpg|650px]]<br />
<br />
===Constantes, Variáveis===<br />
<br />
Algoritmos operam sobre dados. O que podem ser estes dados?<br />
<br />
Variáveis e Constantes<br />
<br />
No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA<br />
Também podemos identificar uma CONSTANTE. O número 2.<br />
<br />
*Tipo de Variáveis:<br />
<br />
**'''Numéricas''': '''reais''' e '''inteiras'''<br />
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */<br />
**'''Booleanas''': true ou false<br />
Ex: RES = TRUE /* RES é uma variável booleana */ <br />
**'''caracter''': <br />
Ex: LETRA = 'A'<br />
**'''alfanumérica'''<br />
Ex: FRASE = "ALO MUNDO"<br />
<br />
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar<br />
uma primeira noção do C<br />
<br />
===Expressões===<br />
<br />
Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos<br />
e que RESULTAM em um valor.<br />
<br />
A instrução do algoritmo:<br />
<br />
MEDIA = (NUM1 + NUM2) / 2 <br />
<br />
será considerada como uma expressão, que usa os operadores '+', '/' e '='<br />
<br />
O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito<br />
do '=' será atribuída a variável do lado esquerdo.<br />
<br />
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão<br />
como um todo resulta no valor que é atribuído a variável.<br />
<br />
===Operadores Aritméticos===<br />
<br />
Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
| +<br />
|adição<br />
|-<br />
| -<br />
|subtração<br />
|-<br />
|*<br />
|multiplicação<br />
|-<br />
|/<br />
|divisão<br />
|-<br />
|%<br />
|resto<br />
|}<br />
<br />
O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:<br />
A = B%2<br />
será 1.<br />
<br />
===Operadores relacionais===<br />
<br />
Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|><br />
|maior que<br />
|-<br />
|>=<br />
|maior ou igual que<br />
|-<br />
|<<br />
|menor que<br />
|-<br />
|<=<br />
|menor ou igual que<br />
|-<br />
|==<br />
|igual a (se o operando a esquerda é maior que o da direita)<br />
|-<br />
|!= <br />
|diferente de (se o operando a esquerda é diferente do da direita)<br />
|}<br />
<br />
===Operadores Lógicos===<br />
<br />
É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|&&<br />
|AND<br />
|-<br />
|<nowiki>||</nowiki><br />
|OR<br />
|-<br />
|!<br />
|NOT<br />
|}<br />
<br />
Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C<br />
qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.<br />
<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for maior que 1 e menor que 10, imprimir uma mensagem "Número maior que 1 e menor que 10".<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
PROBLEMA: Entrar com um número inteiro pelo teclado. Se o número for menor ou igual a 1 OU se for maior ou igual a 10 então<br />
mostrar a mensagem "Número menor ou igual a 1 ou maior ou igual a 10"<br />
<br />
DADO DE ENTRADA: NUM /* Número inteiro a ser comparado */<br />
DADO DE SAÍDA: Mensagem no display<br />
<br />
Uma outra solução para este último problema poderia ser:<br />
<br />
===LINK PARA O EDITOR YED===<br />
<br />
Se você quiser um editor de fluxogramas pode utilizar a ferramenta abaixo:<br />
* [http://www.yworks.com/en/products_yed_about.html Editor Yed]<br />
<br />
Se baixar o zip com o java, descompactar, entrar no diretório e executar com:<br />
java -jar yed.jar<br />
<br />
===Sheldon e o fluxograma da amizade===<br />
<br />
Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"<br />
<br />
<center>{{#ev:youtube|VAX4jLlNo-Q#!}} </center><br />
<br />
Observer que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão. <br />
<br />
===Controle do Fluxo de Execução: Caixas de Decisão===<br />
<br />
Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída<br />
indicando que o fluxo de saída está claramente determinado.<br />
<br />
Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada. <br />
<br />
Seja o problema:<br />
<br />
====Problema do Controle de Acesso====<br />
<br />
PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.<br />
<br />
DADO DE ENTRADA: SENHA (variável alfanumérica)<br />
<br />
DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"<br />
<br />
VARIÁVEIS: SENHA (tiipo alfanumérica)<br />
<br />
[[imagem:FluxogramaControleAcessoI.jpg|450px]]<br />
<br />
EXERCÍCIO 1: <br />
<br />
Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável.<br />
Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.<br />
<br />
[[imagem:Prg1-ControleAcessoEx1.jpg|450px]]<br />
<br />
EXERCÍCIO 2:<br />
<br />
Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com<br />
a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".<br />
<br />
EXERCÍCIO 3:<br />
<br />
Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado.<br />
A mudança de UserId deve desbloquear o usuário.<br />
<br />
=== Exercícios ===<br />
<br />
OBS: sempre anote antes do fluxograma os tipos e significado das variáveis usadas,<br />
caracterizando os dados de entrada e os de saída.<br />
<br />
#Apresentar um fluxograma para ler 3 números e fazer a média;<br />
#Fazer um teste de mesa usando como valores de entrada 2.0, 5.0 e 3.0;<br />
#Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos;<br />
#Refazer o exercício anterior, para calcular a média do maior e do menor número entre os 3 lidos.<br />
#Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema;<br />
#Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência;<br />
#Considere que a função de uma reta é dada por: <math> y=5x+2 </math>. Elabore um fluxograma para calcular o valor de y dado o valor de x.<br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 3 DIA 9/4/2013}}<br />
==AULA 4 DIA 9/4/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de:<br />
*construir fluxogramas usando estruturas de repetição;<br />
*compreender o aninhamento de estruturas de controle de fluxo<br />
*dividir problemas em subproblemas e utilizar subrotinas para organizar a solução.<br />
<br />
===Quebrando um problema em subproblemas: SUBPROGRAMAS===<br />
<br />
PROBLEMA: Aprimorar o exemplo do controle de acesso para que, no caso de 3 tentativas de acesso seguidas, com senha errada, o sistema seja bloqueado.<br />
<br />
*DADOS DE ENTRADA: SENHA /* variável que armazena a senha entrada pelo usuário ou administrador */<br />
*DADOS DE SAÍDA: mensagem de abertura da porta / usuário bloqueado*/<br />
*VARIÁVEIS INTERMEDIÁRIAS: CONT_ACESSO /* valor inicial zero - incrementada a cada senha inválida */ <br />
<br />
[[imagem:FluxogramaControleAcessoComContador.jpg|border|850px]]<br />
<br />
Note que a variável CONT_ACESSO é iniciada com zero e<br />
incrementada a cada erro no fornecimento da senha. A <br />
atribuição CONT_ACESSO = CONT_+ACESSO + 1 deve ser <br />
interpretada da forma: acesse o valor de CONT_ACESSO e some 1<br />
a este valor. Coloque o resultado novamente em CONT_ACESSO<br />
(o conteúdo anterior é sobrescrito!)<br />
<br />
Neste procedimento pode ser observado que:<br />
*começa a aparecer uma certa complexidade no fluxograma;<br />
*Além disto, não ficou uma abordagem muito interessante, pois se for o administrador que erra a senha, ele pode bloquear o usuário;<br />
*não existe forma de desbloquear a senha (zerar o contador), a não ser mudando a senha.<br />
<br />
Em síntese, existem subproblemas adicionais a serem resolvidos. Como podemos resolvê-los sem deixar um fluxograma complexo?<br />
<br />
Usaremos a caixa de processos pré-definidos que usaremos para invocar funções que resolvem determinado subproblema.<br />
<br />
Inicialmente, vamos construir três subprogramas:<br />
* Iniciar_Sistema(): inicia variáveis do sistema, colocando o sistema em um estado inicial conhecido;<br />
* Tratar_Admin(): é o código que trata a funcionalidade associada ao administrador;<br />
* Tratar_User(): é a funcionalidade que trata o usuário (procedimento de abrir porta, bloquear etc).<br />
<br />
<br />
[[imagem:FluxogramaControleAcessoComSubprograma.jpg|850px]]<br />
<br />
OBS: Note que foi usada uma variável auxiliar AUX que permite ajustar o valor<br />
de número de acessos a ser mostrado no display. Note também que na caixa DISPLAY foi usado<br />
uma string a ser impressa e a variável AUX cujo conteúdo deve ser impresso. Ambos separados<br />
por vírgula.<br />
<br />
* ANINHAMENTO DE DECISÔES<br />
<br />
A função Tratar_User() se utiliza de aninhamento de decisões. Em um primeiro momento é testado se a senha confere com a senha do usuário. SE ela conferir ENTÂO é testado se o contador de bloqueios está dentro do aceitável.<br />
<br />
===Estruturas de repetição===<br />
<br />
No exemplo de controle de acesso da aula passada já construímos uma estrutura de repetição (um ''loop'' infinito). Vamos elaborar um pouco mais estas estruturas de repetição.<br />
<br />
Uma das grandes vantagens de um sistema computacional é a capacidade de repetir um conjunto de instruções<br />
possivelmente sobre dados diferentes, a uma velocidade muito grande.<br />
<br />
PROBLEMA: Calcular a somatório de N valores a serem fornecidos pelo teclado.<br />
<br />
:<math> S = \sum_{i=0}^{N-1} a_i = a_0 + a_1 + .. + a_{N-1}</math><br />
<br />
DADOS DE ENTRADA: <br />
* N /* número de valores */, <br />
* a_i /* valor de um dos N números a serem inseridos */<br />
<br />
DADOS DE SAÌDA = S /* somatório */<br />
<br />
<br />
[[imagem:FluxogramaSomatoria.jpg|border|450px]]<br />
<br />
NOTA: Observe que a estrutura de repetição utilizada é caracterizada por um teste (decisão) de uma expressão que deverá resultar em verdadeiro enquanto houver número a ser lido (dentro da quantidade N de números), um contador de itens lidos "i" e um bloco de repeticão terminado em um arco que conduz o fluxo de execução ao início da decisão.<br />
<br />
EXERCÍCIO: Construir um fluxograma para ler N números inteiros e um número inteiro de de referência REF. O programa deve contar a quantidade de números maior que REF<br />
<br />
===PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS===<br />
<br />
Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subprograma que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|650px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUm3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função (subprograma), usando fluxograma, para computar o valor da PG, dados como parâmetros ''s'' e ''q''.<br />
<br />
EXERCÍCIO 2: Implementar uma função (subpŕograma), usando fluxograma, que recebe dois números inteiros como parâmetro. A função retorna 1 se os números forem iguais, 0 se o primeiro número maior que o segundo e -1 se o segundo for maior que o primeiro.<br />
<br />
===EXERCÍCIOS===<br />
<br />
'''EXERCÍCIO 1:''' Modificar o sistema de controle de acesso para incluir a inserção de nome de usuário (USERID) e senha (SENHA). Prever a existência de dois usuários (USERID_1, USERID_2, SENHA_1, SENHA_2). O admin poderá ser identificado pelo nome ADMIN. Prever bloqueio por usuário (duas variáveis contadores).<br />
Sugestão: criar funcões separadas para tratamento de cada usuário. Em breve veremos como podemos contornar esta duplicação através da parametrização de funções/subprogramas.<br />
<br />
'''EXERCÍCIO 2:''' Implementar o sistema do exercício 1 com o Scratch. Simule as funções usando envio de sinais (isto foi feito no projeto integrador do semestre passado).<br />
<br />
'''EXERCÍCIO 3:''' Escrever um fluxograma que leia como dados de entrada dois números inteiros positivos: "s" e "q". O<br />
programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e <br />
"q" a razão da progressão.<br />
<br />
Obs: Para PG tem-se: <br />
<br />
:<math> a_1 = s </math><br />
:<math> a_n = q\times a_{n-1} </math> ou <br />
:<math>a_n=a_1.q^{n-1}\,\!</math><br />
'''<br />
'''EXERCÍCIO 4:''' Implementar um fluxograma que permita computar a somatória dos N primeiros termos de uma PG, cujos valores de "s" e "q" são também fornecidos como dados de entrada.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 4 DIA 12/4/2013}}<br />
<br />
== AULA 4 - Dia 12/04/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno devera ser capaz de:<br />
<br />
* descrever o processo de compilação;<br />
* diferenciar código fonte, objeto e executável;<br />
* compilar, executar pequenos programa em C usando o gcc;<br />
* declarar e usar variáveis locais inteiras e reais;<br />
* usar as funções de entrada e saída: ''scanf()'' e ''printf''.<br />
<br />
===Introdução a linguagem C ===<br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico]<br />
<br />
<br />
<center>{{#ev:youtube|rGCbvqz6Kt4#!}} </center><br />
<br />
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Vis.C3.A3o_geral Características da Linguagem]<br />
* O C K&R (uma especificação informal da linguagem) e o [http://www.ansi.org/ ANSI] C<br />
* linguagem [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa imperativa] e [http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_procedural procedural].<br />
<br />
===Visão geral do processo de compilação com gcc ===<br />
<br />
* Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)<br />
<br />
[[imagem:ProcessoCompilacao.jpg|700px]]<br />
<br />
=== Compilando o programa ===<br />
<br />
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br />
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui]. <br />
<br />
O processo de desenvolvimento do programa envolve:<br />
<br />
*Editar o programa com um editor de texto tal como o ''vi'' ou ''gedit'';<br />
*Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);<br />
<br />
<br />
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:<br />
mkdir ExerciciosC<br />
cd Exercicios<br />
<br />
Exemplo: salve o programa abaixo como teste.c <br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
printf("Alo Mundo\n");<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
*Compilar/gerar executável do programa usando o gcc:<br />
<br />
gcc teste.c -o teste<br />
<br />
*Testar o programa:<br />
<br />
./teste<br />
<br />
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out<br />
<br />
É possível somente compilar (gerar código objeto):<br />
<br />
gcc -c teste.c<br />
<br />
Observe os subprodutos listando com detalhes:<br />
<br />
ls -l<br />
<br />
===Declarando variáveis inteiras e reais locais===<br />
<br />
No "c" temos que declarar as variáveis que serão utilizadas no programa. <br />
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br />
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
/* aqui começam as declarações de variáveis */<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
/* aqui começam as instruções do programa principal */ <br />
x=5; /* atribuindo o valor 5 (constante) a variável x */<br />
y=6.5; <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Funções de entrada e saída de dados===<br />
<br />
No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca.<br />
Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.<br />
<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%f",&y);<br />
<br />
printf ("O valor de x é %d\n",x);<br />
printf ("O valor de y é %f\n",y); <br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Comandos de decisão ''if()'' e ''if() else'' ===<br />
<br />
<syntaxhighlight lang=c> <br />
<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x; /* declaração de uma variável inteira */<br />
int y; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x)<br />
printf("MSG1:y é maior que x\n");<br />
<br />
<br />
if (y>x)<br />
printf("MSG2:y é maior que x\n");<br />
else<br />
printf("MSG3:y é igual ou menor que x\n");<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Outro exemplo, usando blocos:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
<br />
int x,y,z; /* declaração de uma variável inteira */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%d",&x);<br />
<br />
printf ("Entre com o valor de y ");<br />
scanf("%d",&y);<br />
<br />
if (y>x) {<br />
printf("MSG1: y é maior que x\n");<br />
z = y-x;<br />
printf("MSG2: Neste caso z = %d\n", z);<br />
} else {<br />
printf("MSG3: y é igual ou menor que x\n");<br />
z = x-y;<br />
printf("MSG4: Neste caso z = %d\n", z);<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Comando de repetição while (): decisão no início do ''loop'' ===<br />
<br />
O comando while permite implementar ''loops'' com controle no início:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main() <br />
{<br />
int contador;<br />
<br />
contador=0;<br />
while (contador<5) { <br />
printf("valor do contador = %d\n", contador);<br />
contador=contador+1;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
===Relação de comandos do fluxograma com Programa C===<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
|[[imagem:fluxo1.jpg|120px]]<br />
||<syntaxhighlight lang=c>main()<br />
{<br />
printf("Alo Mundo\n");<br />
}</syntaxhighlight>||<br />
O fluxogram do programa principal corresponde a função main() do C. A primeira instrução que se executa é a primeira instrução da função ''main()'' e a última instrução é a última do ''main()''<br />
|-<br />
| |[[imagem:fluxo2.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5)<br />
x=x+1;<br />
</syntaxhighlight>||<br />
<br />
|-<br />
| |[[imagem:fluxo3.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
}</syntaxhighlight>|| Observar que quando existe mais de uma instrução simples sob o controle do ''if'', deve-se usar as chaves (conceito de ''bloco'').<br />
<br />
|-<br />
| |[[imagem:fluxo4.jpg|150px]]<br />
||<syntaxhighlight lang=c>if (y>5) {<br />
x=x+1;<br />
z=z+1;<br />
} else {<br />
x=x-1;<br />
z=z-1;<br />
}</syntaxhighlight>|| comando if com a parte else (SENÃO)<br />
<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
<br />
|-<br />
| |[[imagem:fluxo6.jpg|350px]]<br />
||<syntaxhighlight lang=c>if (z>5) {<br />
while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
}<br />
}</syntaxhighlight>|| Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
=== Exercícios ===<br />
<br />
#Ler 2 números reais e imprimir a média deles.<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
main()<br />
{<br />
float num1, num2, media;<br />
<br />
printf("Entre com o primeiro numero ");<br />
scanf ("%f", &num1);<br />
<br />
printf("Entre com o segundo numero ");<br />
scanf ("%f", &num2);<br />
<br />
media = (num1 + num2) / 2;<br />
<br />
printf ("\nMedia = %f \n", media);<br />
}<br />
</syntaxhighlight><br />
#Ler 3 números reais e imprimir o produto dos três.<br />
#Ler dois números complexos, em formato retangular, e calcular a soma dos mesmos. Obs: Ler de forma independente a parte real e a parte imaginária de cada um deles.<br />
#Ler as aulas 1 e 2 das aulas de C da UFMG (ver referências no início).<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 5 DIA 16/04/2013}}<br />
== AULA 5 - Dia 16/04/2013 ==<br />
<br />
===ARRAYS UNIDIMENSIONAIS (VETORES)===<br />
<br />
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único.<br />
<br />
PROBLEMA: Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.<br />
<br />
DADO DE ENTRADA: Os 10 números armazenados em VET1<br />
<br />
DADO DE SAÍDA: VET2, o vetor resultado da multiplicação de VET1 por 5.<br />
<br />
<br />
<br />
[[imagem:ExplicacaoVetor1.jpg|border|750px]]<br />
<br />
Exercício 1: Implementar um algoritmo para ler 10 números inteiros para um vetor e imprimir o número de números acima da média. OBS: Definir um contador, iniciado em zero. Calcular a media e fazer um loop sobre o vetor testando cada item para<br />
verificar se é maior que a média.<br />
<br />
===Armazenamento de cadeias de caracteres em vetores===<br />
<br />
Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.<br />
<br />
Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".<br />
<br />
Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:<br />
<br />
[[imagem:ExplicacaoString1.jpg|border|750px]]<br />
<br />
Estamos assumindo que cada caracter é armazenado em um ''byte''. Uma ''string'' terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a ''string'' está armazenada em um vetor CADEIA cujo tamanho excede ao da ''string''. Os ''bytes'' que se seguem ao zero podem ser considerados lixo.<br />
<br />
===Processando cadeias de caracteres===<br />
<br />
Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.<br />
<br />
[[imagem:FluxogramaContadorCaracteresCadeia.jpg|border|350px]]<br />
<br />
EXERCÍCIO 1: Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.<br />
<br />
EXERCÍCIO 2: Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.<br />
<br />
EXERCÍCIO 3: Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 6 -DIA 19/04/2013}}<br />
<br />
==AULA 6 -DIA 19/04/2013==<br />
<br />
===Objetivos da Aula===<br />
<br />
O aluno deverá ser capaz de:<br />
*utilizar funções: passar parâmetros por valor (reais, inteiros e caracter) e retornar valores;<br />
*utilizar funções da biblioteca matemática.<br />
<br />
===Funções no C ===<br />
<br />
====Chamando funções ====<br />
<br />
Um programa em C basicamente é um conjunto de funções. <br />
Uma função pode ser vista como um subprograma para o qual podemos repassar <br />
dados de entrada através de parâmetros e receber os resultados através <br />
do retorno da função.<br />
<br />
Normalmente, um programa bem comportado em C possui pelo menos uma função: a ''função main()''. Esta função<br />
é chamada no início da execução do programa. A primeira instrução da função main() é a primeira instrução<br />
executada pelo programa (pelo menos do ponto de vista do programador). Da mesma forma, a última instrução <br />
desta função é a última instrução a ser chamada.<br />
<br />
Um programa normalmente vai apresentar um conjunto de funções. Por exemplo:<br />
<syntaxhighlight lang=c ><br />
#include <stdio.h><br />
<br />
func4()<br />
{<br />
printf("Esta é a função func4()\n");<br />
}<br />
<br />
func3()<br />
{<br />
printf("Esta é a função func3()\n");<br />
func4();<br />
}<br />
<br />
func2()<br />
{<br />
printf("Esta é a função func2()\n");<br />
}<br />
<br />
func1()<br />
{<br />
printf("Esta é a função func1()\n");<br />
func2();<br />
func3();<br />
}<br />
<br />
main()<br />
{<br />
printf("Esta é a primeira instrução da função main()\n");<br />
func1();<br />
printf("Esta é a última instrução da função main()\n");<br />
}<br />
</syntaxhighlight><br />
<br />
A sequência de chamada de funções pode ser ilustrada da forma:<br />
<br />
[[imagem:FuncChamadaFuncoes.png|600px]]<br />
<br />
EXERCÍCIO: Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com as chamadas das funções.<br />
<br />
NOTA: Uma função pode ser chamada várias vezes no programa. <br />
É O REAPROVEITAMENTO DE CÓDIGO...<br />
<br />
====Passando parâmetros e recebendo valores de retorno====<br />
<br />
Uma função normalmente resolve um determinado problema para um determinado conjunto de dados e produz uma saída. Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.<br />
<br />
Exemplo: Uma função ''media_nums''() que retorna a média de 3 números reais passados como parâmetros <br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media_local = (num1 + num2 + num3)/3;<br />
return media_local;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
*após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus respectivos ''tipos''. Os valores (conteúdos das variáveis) ''aux1'', ''aux2'' e ''aux3'' são copiados para as variáveis ''num1'', ''num2'' e ''num3'' da função ''media_nums()''.<br />
*a função ''media_nums()'' retorna um valor do tipo ''float'' (informado antes do nome da função) que é o valor da variável ''media_local''. Este valor é copiado para a variável media da função ''main()''<br />
*as variáveis ''num1'', ''num2'' e ''num3'' bem como a variável media_local possuem escopo LOCAL, ou seja, são "vistas" somente pela função ''media_nums()'';<br />
*as variáveis ''media'', ''aux1'', ''aux2'' e ''aux3'' também possuem escopo LOCAL, ou seja são "vistas" somente pela função ''main()'';<br />
<br />
NOTE que o formato de declaração de uma função é<br />
<br />
tipo_retorno nome_funcao( lista_de_parametros )<br />
{<br />
declaracao_variaveis_locais<br />
<br />
instruções<br />
}<br />
<br />
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem situações que poderemos relaxar esta afirmação.<br />
<br />
====Um pouco mais sobre parâmetros====<br />
<br />
O termo ''argumento'' ou ''parâmetro real'' (atual) é usado para referenciar os valores que estão sendo passados na CHAMADA da função. Os ''parâmetros formais'' referem-se aos parâmetros listados na função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e identificados pelo contexto em que estão sendo usados.<br />
<br />
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem<br />
POR VALOR.<br />
<br />
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis.<br />
Eles podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).<br />
<br />
Exemplo de chamadas para a função ''media_nums()'':<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
float media, x,y,z;<br />
<br />
x = 5.7;<br />
y = 9.8;<br />
<br />
/* exemplo de chamada 1 */ <br />
media = media_nums(4.8,x,y*3);<br />
<br />
/* exemplo de chamada 2 */ <br />
media = media_nums (x+y,y*y+5,(x+y)/2);<br />
}<br />
</syntaxhighlight><br />
<br />
Deve ser observado que:<br />
* na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3. Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a função!.<br />
* na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas antes da função ser INVOCADA.<br />
<br />
===Variáveis GLOBAIS e variáveis LOCAIS ===<br />
<br />
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis.<br />
<br />
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções. Seja o exemplo anterior modiificado:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
float media; /* Variável GLOBAL */<br />
<br />
void media_nums(float num1, float num2, float num3)<br />
{<br />
media = (num1 + num2 + num3)/3;<br />
return;<br />
}<br />
<br />
main()<br />
{<br />
float aux1, aux2, aux3; /* Variáveis LOCAIS */<br />
<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros é %f\n", media);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Neste exemplo, a variável ''media'' é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função ''media_nums()'' e impressa pela função ''main()''<br />
<br />
NOTE que como a função ''media_nums()'' não retorna valor então declaramos <br />
seu tipo de retorno como ''void'' que significa aqui NADA ou VAZIO. <br />
<br />
NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la<br />
no lado direito do sinal de atribuição.<br />
<br />
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo,<br />
para o caso em que a função ''media_nums()'' retorna um valor, ela poderia ser usada como:<br />
<br />
<syntaxhighlight lang=c><br />
float media_nums(float num1, float num2, float num3)<br />
{<br />
float media_local;<br />
<br />
media = (num1 + num2 + num3)/3;<br />
return media;<br />
}<br />
<br />
main()<br />
{<br />
float media, aux1, aux2, aux3;<br />
printf("\nEntre com numero 1: "); <br />
scanf ("%f",&aux1);).<br />
<br />
printf("\nEntre com numero 2: "); <br />
scanf ("%f",&aux2);<br />
<br />
printf("\nEntre com numero 3: "); <br />
scanf ("%f",&aux3);<br />
<br />
media = media_nums(aux1, aux2, aux3);<br />
printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));<br />
}<br />
</syntaxhighlight><br />
<br />
==== Nome de variáveis ====<br />
<br />
Um nome de variável pode conter letras, dígitos e o ''underscore''(sublinhado). Ela DEVE iniciar com um ''underscore'' ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o C é CASE SENSITIVE <br />
<br />
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso. <br />
<br />
Exercício: Execute o programa abaixo e verifique as saídas.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int i=1; /* GLOBAL */<br />
<br />
func()<br />
{<br />
int i=100; /* LOCAL */<br />
i=i+1; /* incrementa LOCAL */<br />
printf( "Valor de i = %d na função func()\n", i );<br />
}<br />
<br />
main()<br />
{<br />
i=i+1; /* incrementa GLOBAL */<br />
func();<br />
printf( "Valor de i = %d \n", i );<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
NOTA: não é recomendado o uso de variáveis com o mesmo nome.<br />
<br />
====Iniciando variáveis na declaração====<br />
<br />
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração. <br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int alfa=1;<br />
<br />
main()<br />
{<br />
float beta=1.5;<br />
<br />
printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);<br />
}<br />
</syntaxhighlight><br />
<br />
NOTA: variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la corretamente.<br />
<br />
NOTA: variáveis GLOBAIS são iniciadas automaticamente com zero. <br />
Mas mantenha-se informado sobre o sistema que está trabalhando...<br />
Em sistemas embarcados pode não ser verdade<br />
<br />
<br />
===Exercícios de fixação de chamada de funções com parâmetros ===<br />
<br />
#Implementar um programa com uma função que recebe dois números inteiros como parâmetro e imprime uma mensagem caso o primeiro número seja igual ao segundo. A função não retorna nada. A função main deve mostrar como funciona a função, chamando-a três vezes com diferentes valores.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void compara_num(int num1, int num2)<br />
{<br />
if (num1==num2) {<br />
printf("Números %d e %d são iguais!!!\n", num1,num2);<br />
} else {<br />
printf("Números %d e %d são diferentes!!!\n", num1,num2); <br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int x=1;<br />
int y=3;<br />
compara_num(4,5);<br />
compara_num(5,8);<br />
compara_num(2,2);<br />
compara_num(x,1);<br />
compara_num(x*3,y); <br />
}<br />
</syntaxhighlight><br />
#Refazer o exercício anterior mas agora a função não deve imprimir nada. Ela deve retornar 1 se o primeiro parâmetro é maior que o segundo, 0 se forem iguais e -1 se o segundo for maior que o primeiro.<br />
#Implementar uma função chamada ''imprime_faixa'' que recebe dois números inteiros como parâmetros e, caso o segundo parâmetro seja maior que o primeiro ela deve imprimir todos os números inteiros entre oos dois parâmetros (incluindo eles). A função retorna -1 se o segundo número for menor ou igual ao primeiro. Exemplo: Seja a chamada<syntaxhighlight lang=c><br />
imprime_faixa(4,6);<br />
</syntaxhighlight> A saída deve ser: 4 5 6<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int imprime_faixa(int a, int b)<br />
{<br />
int i;<br />
if (a>b)<br />
return -1;<br />
i=a;<br />
while (i<=b) {<br />
printf ("%d ", i);<br />
i = i + 1;<br />
}<br />
printf("\n");<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("\nEntre com x ");<br />
scanf("%d", &x);<br />
printf("\nEntre com y ");<br />
scanf("%d", &y); <br />
if (imprime_faixa (x,y)==-1)<br />
printf("Foram fornecidos parâmetros inválidos\n");<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 7 -DIA 23/04/2013}}<br />
<br />
=PARÂMETROS E RETORNO DE VALORES EM SUBPROGRAMAS(FUNÇÕES)=<br />
<br />
Nas aulas anteriores estudamos o uso de subprogramas como forma de reaproveitar código e estruturar um algoritmo, permitindo a quebra de um problema em subproblemas. Para tornar ainda mais interessante o uso de subprogramas, vamos ver o conceito de passagem de parâmetros e retorno de valores. Este assunto foi explorado no laboratório de programação C mas vamos explorar um pouco mais com fluxogramas.<br />
<br />
Quando chamamos (invocamos) um subprograma podemos passar valores (dados de entrada) para este subprograma.<br />
Estes valores são passados através de variáveis especiais que chamamos de parâmetros.<br />
<br />
Parâmetros podem ser passados por valor e por referência. Por valor é quando os dados a serem passados na invocação<br />
do subprograma são copiados para uma variável do subprograma.<br />
<br />
Os parâmetros são passados por referência quando o que é passado para o subprograma é simplesmente o endereço da variável<br />
repassada na invocação do subprograma.<br />
<br />
Não existe uma forma explícita de definir os parâmetros em um fluxograma. Deve-se realizar um comentário antes ou ao lado do mesmo especificando o tipo e como será tratado o parâmetro.<br />
<br />
EXEMPLO: Seja elaborar um fluxograma correspondente a uma subrotina que deve calcular o fatorial de um número inteiro passado como parâmetro. O subprograma deve retornar o valor calculado.<br />
<br />
A função fatorial é definida por:<br />
<br />
:<math>n!=\prod_{k=1}^n k\qquad\forall n\in\mathbb{N}</math><br />
<br />
<br />
[[imagem:FluxogramaFatorial.jpg|border|550px]]<br />
<br />
Neste fluxograma, o subprograma denominado ''CalcFatorial'' recebe um valor no parâmetro N (implicitamente inteiro) e retorna o valor calculado do fatorial.<br />
<br />
O fluxograma principal invoca duas vezes o subrograma. O retorno é armazenado nas variáveis NUM1 e NUM3.<br />
<br />
Quando um subprograma retorna um valor, ele é chamado de função. Para manter coerência com o C chamaremos<br />
qualquer subrprograma de função (independente de retornar valor).<br />
<br />
EXERCÍCIO 1: Implementar uma função, usando fluxgrama, para computar o valor <math>a_n</math> da PG, dados como parâmetros ''a'', ''r'' e ''n''.<br />
<br />
Lembrar que<br />
:<math>a_n = a\,r^{n-1}.</math><br />
<br />
EXERCÍCIO 2: Implementar uma função chamada ''str_len()'' que recebe uma ''string'' como parâmetro e retorna o tamanho da mesma.<br />
<br />
EXERCÍCIO 3: Elaborar um fluxograma para computador o número de ocorrências de um caracter em uma string armazenada em um vetor. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências, sendo dado como entradas (parâmetros) o vetor e o caracter.<br />
<br />
EXERCÍCIO 4: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna o maior número do vetor.<br />
<br />
EXERCÍCIO 5: Elaborar um fluxograma na forma de subprograma, que recebe um vetor de inteiros e o seu tamanho. O subprograma retorna a média entre o maior e o menor número do vetor.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 8 -DIA 26/04/2013}}<br />
==AULA 8 -DIA 26/04/2013==<br />
<br />
===Objetivos===<br />
<br />
*Uso do DEFINE na definição de constantes<br />
*Tipo double<br />
*Funções da binblioteca matemática<br />
<br />
=== USO de DEFINE ===<br />
<br />
O define é um comando do pré-processador do C.<br />
Observe abaixo como ele pode ser usado<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#define PI 3.1416<br />
<br />
main()<br />
{<br />
<br />
float x; /* declaração de uma variável real */<br />
float y; /* declaração de uma variável real */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%f",&x);<br />
<br />
y = 2*PI*x;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Tipo double===<br />
<br />
O tipo ''double'' permite a definição de variávei com maior precisão (dupla precisão).<br />
Não entraremos em detalhe sobre a sua representação agora mas por ora podemos assumir<br />
que o tipo ''float'' se utiliza de 4 bytes e o ''double'' de 8 bytes para o armazenamento.<br />
<br />
EXERCÍCIO: Testar o tamanho do int, float e double usando o operador sizeof.<br />
<br />
<br />
===Usando funções da biblioteca matemática===<br />
<br />
Para usar as funções [http://en.wikipedia.org/wiki/C_mathematical_functions matemáticas] da biblioteca padrão, fazer os seguintes passos:<br />
<br />
* No arquivo-fonte incluir o ''header math.h'' da biblioteca matemática:<br />
<br />
<syntaxhighlight lang=c> <br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
<br />
double x,y; /* declaração de duas variáveis reais */<br />
<br />
printf ("Entre com o valor de x ");<br />
scanf("%lf",&x);<br />
<br />
y = sqrt(x);<br />
printf ("Raiz de x = %lf", y);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (''double'').<br />
<br />
*Compilar e ''linkar'' o arquivo da forma:<br />
<br />
gcc -lm ex1.c -o ex1<br />
<br />
===Exercícios===<br />
<br />
<ol><br />
<li>Implementar um programa para calcular a área e o comprimento de uma circunferência, dado como entrada o raio.<br />
:<math> comp\_circ = 2 \pi R </math><br />
:<math> area\_circ = \pi R^2 </math><br />
</li><br />
<li> Implementar um programa para listar os senos e cosenos de 20 ângulos no intervalo <math> [0-2 \pi] </math><br />
</li><br />
<li>Implementar um programa para ler um número complexo no formato retangular e convertê-lo para o formato polar. Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math></li><br />
<li>Fazer um fluxograma e implementar um programa C para calcular as raízes de uma equação do segundo grau, dado como entrada os coeficiente ''a'',''b'' e ''c''.<br />
</li><br />
<li>Implementar um programa para calcular o valor de y para um dado valor de x, considerando que:<br />
:<math>y = 2x + 5</math><br />
</li><br />
<li>Implementar um programa para converter radianos em graus;<br />
</li><br />
<li>Modificar o exercício para apresentar um menu que permite escolher se quer transformar graus em radianos ou vice-versa.<br />
</li><br />
</ol><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 9 -DIA 3/04/2013}}<br />
==AULA 9 -DIA 3/04/2013==<br />
===Objetivos===<br />
<br />
*expressões aritméticas e lógicas;<br />
*tipo char.<br />
<br />
===Operador de Atribuição===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y,w;<br />
<br />
x=1;<br />
w=y=x+1;<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
w=2*(y=x+1);<br />
printf("x=%d y=%d w=%d\n", x,y,w);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que:<br />
w=2*y=x+1;<br />
produz um erro de compilação:<br />
erro: lvalue required as left operand of assignment<br />
<br />
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].<br />
<br />
===Operadores aritméticos===<br />
<br />
Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:<br />
<br />
{| border="1" cellpadding="2"<br />
!Operador<br />
!Significado<br />
|-<br />
|%<br />
|resto de uma divisão<br />
|-<br />
|<nowiki>++</nowiki><br />
|incrementa o operando em uma unidade<br />
|-<br />
|<nowiki>--</nowiki><br />
|decrementa o operando em uma unidade<br />
|}<br />
<br />
Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x%2;<br />
printf("resto x divido por 2 =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 2 <br />
<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x++;<br />
printf("Valor de y =%d e o valor de x = %d\n",y, x);<br />
x=1;<br />
y=++x;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Exemplo 3<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
int x,y;<br />
printf("Entre com x\n");<br />
scanf("%d", &x);<br />
y=x--;<br />
printf("Valor de y =%d\n",y);<br />
} <br />
</syntaxhighlight><br />
<br />
Note que existe uma diferença entre <br />
y = x--;<br />
e<br />
y = --x;<br />
<br />
Exemplo 4<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x=1;<br />
y = x+++x++;<br />
printf("x=%d y=%d\n", x,y);<br />
<br />
x=1;<br />
y = ++x+x++;<br />
printf("x=%d y=%d\n", x,y);<br />
}<br />
</syntaxhighlight><br />
<br />
===Operadores Relacionais e Lógicos===<br />
<br />
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]<br />
<br />
===Tipo Char===<br />
<br />
Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de byte.<br />
<br />
Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main ()<br />
{<br />
char x='A',y=65,w=0x41,z;<br />
<br />
scanf("%c",&z);<br />
printf("Caracter lido = %c\n",z);<br />
printf("Caracter lido = %d\n",z);<br />
printf("Caracter lido = %x\n",z);<br />
if (z==x)<br />
printf("Iguais 1\n");<br />
if (z==y)<br />
printf("Iguais 2\n");<br />
if (z==w)<br />
printf("Iguais 3\n");<br />
}<br />
</syntaxhighlight><br />
<br />
ExercícioS<br />
<br />
#Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
main()<br />
{<br />
float num1,num2,resultado;<br />
char oper;<br />
<br />
printf("\nEntre com num1 -> ");<br />
scanf ("%f",&num1);<br />
printf("\nEntre com num2 -> ");<br />
scanf ("%f",&num2);<br />
printf("\nEntre com operador ");<br />
scanf (" %c",&oper);<br />
<br />
if (oper=='+') <br />
resultado = num1 + num2;<br />
if (oper=='-') <br />
resultado = num1 - num2;<br />
if (oper=='x') <br />
resultado = num1 * num2;<br />
if (oper=='/') <br />
resultado = num1 / num2;<br />
<br />
printf("\nResultado = %f", resultado);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.<br />
<!--<br />
<syntaxhighlight lang=c><br />
<br />
#include <stdio.h><br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5)<br />
{<br />
int cont=0;<br />
if (a1=='a')<br />
cont++;<br />
if (a2=='a')<br />
cont++;<br />
if (a3=='a')<br />
cont++;<br />
if (a4=='a')<br />
cont++;<br />
if (a5=='a')<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char a1, char a2, char a3, char a4, char a5, char car_ref)<br />
{<br />
int cont=0;<br />
if (a1==car_ref)<br />
cont++;<br />
if (a2==car_ref)<br />
cont++;<br />
if (a3==car_ref)<br />
cont++;<br />
if (a4==car_ref)<br />
cont++;<br />
if (a5==car_ref)<br />
cont++;<br />
return cont;<br />
}<br />
<br />
main()<br />
{<br />
int result_ocor;<br />
<br />
result_ocor = num_ocorr_a ('a','a','b','c','a','x');<br />
printf("Numero de ocorrencias de a -> %d\n", result_ocor);<br />
}<br />
</syntaxhighlight><br />
--><br />
<br />
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]<br />
<br />
===Indentação===<br />
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]<br />
[http://en.wikipedia.org/wiki/Indent_style Estilos]<br />
<br />
===Exercícios===<br />
<br />
#Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado). <br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
float converter_fahreiheit_para_celsius (float temp_fahr)<br />
{<br />
/* melhorar - retornar -1000 se o valor do parâmetro for inválido */<br />
return ((temp_fahr-32)/1.8);<br />
}<br />
<br />
main()<br />
{<br />
float temperatura_fahre, resultado_celsius;<br />
printf("Entre com graus Fahrenheit -> ");<br />
scanf ("%f", &temperatura_fahre);<br />
resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);<br />
printf("Conversao = %f\n", resultado_celsius);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int x,y;<br />
float media;<br />
<br />
printf("Entre com x\n");<br />
scanf("%d",&x);<br />
printf("Entre com y\n");<br />
scanf("%d",&y);<br />
if (x==y)<br />
printf("números iguais\n");<br />
else {<br />
printf("números diferentes\n");<br />
media = (x+y)/2.0;<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.<br />
<!--<syntaxhighlight lang=c><br />
main()<br />
{<br />
int num1,num2,num3,num4;<br />
int soma1,soma2;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%d", &num2);<br />
printf("Entre com num3\n");<br />
scanf("%d", &num3);<br />
printf("Entre com num4\n");<br />
scanf("%d", &num4);<br />
<br />
soma1 = num1+num2;<br />
soma2 = num3+num4;<br />
<br />
if(soma1<=soma2)<br />
printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float num1,num2;<br />
int operacao;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%f", &num1);<br />
printf("Entre com num2\n");<br />
scanf("%f", &num2);<br />
<br />
printf("Entre com a operacao\n");<br />
scanf("%d", &operacao); <br />
<br />
/* Esta solução pode ser otimizada - veremos<br />
mais tarde */<br />
if (operacao>=1 && operacao <=4) {<br />
if (operacao==1) <br />
resultado = num1 + num2;<br />
if (operacao==3) <br />
resultado = num1 - num2;<br />
if (operacao==3) <br />
resultado = num1 * num2;<br />
if (operacao==4) {<br />
if (num2!=0)<br />
resultado = num1 / num2; <br />
else <br />
printf("Divisao por zero\n");<br />
}<br />
printf("O resultado da operacao %d é %f\n",operacao,resultado);<br />
} else {<br />
printf("Operacao inválida");<br />
}<br />
}<br />
</syntaxhighlight><br />
--><br />
#Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.<br />
#Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.[http://www.google.com/imgres?imgurl=http://www.eletrica.info/wp-content/uploads/2009/07/Tabela-de-Cores.jpg&imgrefurl=http://www.eletrica.info/tabela-de-resistores/&h=498&w=662&sz=90&tbnid=claUq9F5khykmM:&tbnh=90&tbnw=120&zoom=1&docid=gWOWksh3vSRjoM&hl=pt-BR&sa=X&ei=GC6oT-tzr7XoAZjPqNsE&sqi=2&ved=0CHMQ9QEwAA&dur=12 Tabela de Cores]<br />
#Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.<br />
#Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.<br />
#Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada. <br />
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;<br />
<br />
===Exercícios da Avaliação===<br />
<br />
1.Considere o fluxograma abaixo. <br />
a) Elabore um programa em C equivalente. Considere que TODAS as variáveis são inteiras.<br />
b) Coloque todos os valores finais das variáveis do programa.<br />
<br />
[[imagem:ex1prova-11-05-2012.jpg|350px]]<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
int i,k,x;<br />
<br />
i=0;<br />
k=2;<br />
x=0;<br />
<br />
while (i<5) {<br />
if (i==3) {<br />
x = x+2;<br />
k = x*2;<br />
} else {<br />
x = x+1;<br />
}<br />
i = i+1;<br />
}<br />
<br />
k = i;<br />
}<br />
</syntaxhighlight><br />
<br />
Valores de variáveis:<br />
x -> 6<br />
i -> 5<br />
k -> 5<br />
--><br />
2.Implementar um programa em C para ler 5 números inteiros e imprimir uma mensagem se a média dos dois primeiros for igual ou menor a soma dos três últimos.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int n1,n2,n3,n4,n5,soma;<br />
float media;<br />
<br />
printf("Entre com n1\n");<br />
scanf("%d",&n1);<br />
printf("Entre com n2\n");<br />
scanf("%d",&n2);<br />
printf("Entre com n3\n");<br />
scanf("%d",&n3);<br />
printf("Entre com n4\n");<br />
scanf("%d",&n4);<br />
printf("Entre com n5\n");<br />
scanf("%d",&n5);<br />
<br />
media = (n1 + n2)/2;<br />
soma = n3 + n4 + n5;<br />
<br />
if (media<=soma)<br />
printf("media menor ou igual a soma\n"); <br />
<br />
}<br />
</syntaxhighlight><br />
--><br />
3.Elaborar um fluxograma e um programa para ler 10 números reais para um vetor e, em seguida, computar a média de todos os números menores ou iguais a 11.5 E maiores que 5.5. <br />
A média deve ser impressa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10],soma_acum,media;<br />
int i,cont_aux;<br />
<br />
i=0;<br />
soma_acum = 0.0;<br />
cont_aux = 0;<br />
<br />
while (i<10) {<br />
scanf("%f", &x[i]);<br />
if (x[i]>5.5 && x[i]<=11.5) {<br />
cont_aux++;<br />
soma_acum=soma_acum+x[i];<br />
} <br />
i=i+1;<br />
}<br />
<br />
if (cont_aux == 0)<br />
printf("Impossivel dividir por zero\n");<br />
else {<br />
media = soma_acum / cont_aux;<br />
printf ("Media = %f\n", media);<br />
}<br />
<br />
}<br />
<br />
</syntaxhighlight><br />
--><br />
4.Implementar um programa em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos. Se uma (ou ambas) resistências <br />
forem negativas, mostrar uma mensagem e encerrar o programa.<br />
<!--<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float r1,r2,re_serie,re_paralelo;<br />
<br />
printf("Entre com r1\n");<br />
scanf("%f",&r1);<br />
printf("Entre com r2\n");<br />
scanf("%f",&r2);<br />
<br />
if (r1>0 && r2>0) {<br />
re_serie = r1 + r2;<br />
re_paralelo = (r1*r2)/(r1+r2);<br />
} else <br />
printf("As resistencias devem ser maior que zero\n");<br />
}<br />
</syntaxhighlight><br />
--><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 10 DIA 7/05/2013}}<br />
==AULA 10 -DIA 7/05/2013==<br />
<br />
===Exercícios de Revisão===<br />
<br />
Construir um fluxograma correspondente a uma função que recebe dois <br />
vetores de char que contem uma string. A função retorna 0 se as strings forem iguais e 1 se diferentes.<br />
<br />
===VETORES DE STRINGS===<br />
<br />
Na aula passada aprendemos vetores de caracteres e como usá-los para armazenamento de ''strings''. Note que é possível construir vetores de strings. Vamos ao exemplo do controle de acesso.<br />
<br />
PROBLEMA: Suponha que existe uma Tabela global de usuários chamada ''TabUserID''. Suponha também que esta tabela tem tamanho finito de 20 posições. Posições não usadas estão com string VAZIA (0 na primeira posição). Construir uma função chamada LocalizarUserID, que recebe um UserID (''string'') como parâmetro (a tabela não precisa ser passada pois é GLOBAL) e retorna o índice onde se encontra o usuário UserID na tabela. Se o usuário não for encontrado, a função deve retornar -1.<br />
<br />
EXERCÌCIO: Implementar uma função TratarUsuario() que se utiliza de duas tabelas: a TabUserID e a TabPassword para cada usuário na primeira tabela existe uma senha na segunda tabela. A função deve ler o UserID, usar a função LocalizarUserID para determinar o índice do usuário, ler a senha do usuário e validá-la usando o índice encontrado.<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 11 DIA 10/05/2013}}<br />
==AULA 11 - 10/05/2013 ==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá ser capaz de utilizar os comandos de repetição:<br />
<br />
*do while<br />
*while<br />
*for<br />
*goto<br />
<br />
===Estruturas de Repetição===<br />
<br />
Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:<br />
*''while()''<br />
*''do while()''<br />
*''for()''<br />
*''goto label''<br />
<br />
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.<br />
<br />
====Revisitando o comando ''while()'' ====<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxo5.jpg|200px]]<br />
||<syntaxhighlight lang=c>while(contador<5) {<br />
printf("Entre com x\n");<br />
scanf("%f",&x);<br />
soma=soma+x;<br />
contador = contador + 1;<br />
}</syntaxhighlight>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.<br />
|}<br />
<br />
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.<br />
<br />
====Comando ''do while''====<br />
<br />
O comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final. Isto permite que o bloco seja executado pelo menos uma vez.<br />
<br />
A estrutura do comando, informalmente, é:<br />
<br />
do <br />
''instrução_simples;''<br />
while (expressão);<br />
<br />
ou<br />
<br />
do {<br />
lista_de_instruções<br />
} while (expressão); <br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:fluxoDoWhile-Eraldo.jpg|350px]]<br />
||<syntaxhighlight lang=c><br />
contador = 0;<br />
do {<br />
scanf("%d",&x);<br />
soma=soma+x;<br />
if (soma>150) <br />
y=z+x;<br />
contador++;<br />
} while(contador<5);<br />
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.<br />
|}<br />
<br />
====Comando ''for()'' ====<br />
<br />
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.<br />
<br />
A estrutura do comando é:<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
instrução_simples;<br />
ou<br />
<br />
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {<br />
lista_de_instruções<br />
}<br />
<br />
{| border="1" cellpadding="2"<br />
!Fluxograma<br />
!C<br />
!Comentário<br />
|-<br />
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]<br />
||<syntaxhighlight lang=c><br />
for(i=0; i<10; i++) {<br />
printf("Laço de número %d\n", i);<br />
if (i==5)<br />
printf("Este é o laço 5\n");<br />
}<br />
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, no início do comando.<br />
A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão<br />
de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''.<br />
|}<br />
<br />
====Comando ''goto'' ====<br />
<br />
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.<br />
<br />
Exemplo:<br />
<br />
<syntaxhighlight lang=c><br />
<br />
main()<br />
{<br />
int i;<br />
<br />
i=0;<br />
<br />
PONTO1:<br />
printf("Laço de número %d\n", i);<br />
i++;<br />
if (i<10)<br />
goto PONTO1;<br />
}<br />
</syntaxhighlight><br />
<br />
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.<br />
<br />
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].<br />
<br />
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].<br />
<br />
====Loop Infinito====<br />
<br />
É possível implementar loops infinitos com qualquer uma das instruções acima.<br />
<br />
Exemplo com comando ''for'':<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
for(;;) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
ou com o comando ''while'':<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
while(1) {<br />
/* Este bloco se executará infinitamente */<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
====EXERCÍCIOS====<br />
<br />
1.Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:<br />
<syntaxhighlight lang=c><br />
/* rand example: guess the number */<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
int main ()<br />
{<br />
int iSecret, iGuess;<br />
<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
/* generate secret number: */<br />
iSecret = rand() % 10 + 1;<br />
<br />
do {<br />
printf ("Guess the number (1 to 10): ");<br />
scanf ("%d",&iGuess);<br />
if (iSecret<iGuess) <br />
printf ("The secret number is lower\n");<br />
else if (iSecret>iGuess) <br />
printf ("The secret number is higher\n");<br />
} while (iSecret!=iGuess);<br />
<br />
printf ("Congratulations!\n");<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Explique o significado das instruções:<br />
srand ( time(NULL) );<br />
iSecret = rand() % 10 + 1;<br />
<br />
2.Faça uma versão "politicamente incorreta" deste programa fazendo um ''loop'' infinito com o ''do while()'' e usando uma instrução ''goto'' para sair do ''loop''.<br />
<br />
3.Ainda sobre o exercício 1, implemente uma versão usando o comando while(). <br />
<br />
4.Usando o comando for, implemente uma função da forma:<br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char caracter)<br />
<br />
Se a função for chamada da forma:<br />
plot_retangulo(10,3,5,'a');<br />
<br />
ela deve produzir:<br />
<br />
aaaaaaaaaa<br />
a a<br />
aaaaaaaaaa<br />
<br />
Se houver inconsistência nos parâmetros retornar um código de erro -1 senão retornar 0.<br />
<br />
Soulação: <syntaxhighlight lang=c><br />
/* Contribuição do aluno Mathias */<br />
#include <stdio.h><br />
<br />
int plot_retangulo(int lado1, int lado2, int margem_esquerda, char letra)<br />
{<br />
int x, y, aux, aux2;<br />
<br />
/* teste dos parâmetros */<br />
if (lado1 < 1 || lado2 <1 || margem_esquerda <0)<br />
return -1;<br />
<br />
aux=lado1+margem_esquerda;<br />
<br />
for(y=1;y<=lado2;y++) { /* para cada linha faz */<br />
for(x=1;x<=aux;x++) { /* imprime a margem */<br />
if(x<=margem_esquerda)<br />
printf(" ");<br />
else {<br />
if(y==1||y==lado2) /* se for uma linha da extremidade, imprime cheio*/ <br />
printf("%c", letra);<br />
else { /* se não for extremidade imprime vazado */<br />
if(x==(margem_esquerda+1) || x==aux) <br />
printf("%c", letra);<br />
else<br />
printf(" ");<br />
}<br />
}<br />
}<br />
printf("\n");<br />
}<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
plot_retangulo(2,3,0,'h');<br />
}<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<br />
{{collapse top|AULA 12 DIA 11/05/2013}}<br />
<br />
==AULA 12 - 11/05/2013 ==<br />
<br />
===EXERCÍCIOS (nível fácil)===<br />
<br />
#Implementar um programa C para ler 5 números inteiros e calcular a média entre eles. A média deve ser dada como um float.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int num1, num2, num3, num4, num5;<br />
float media;<br />
<br />
printf("Entre com num1\n");<br />
scanf("%d",&num1);<br />
printf("Entre com num2\n");<br />
scanf("%d",&num2);<br />
printf("Entre com num3\n");<br />
scanf("%d",&num3);<br />
printf("Entre com num4\n");<br />
scanf("%d",&num4);<br />
printf("Entre com num5\n");<br />
scanf("%d",&num5);<br />
<br />
media = (num1+num2+num3+num4+num5)/5.0; /* colocar parênteses para garantir precedência. Dividir <br />
por 5.0 para que o resultado seja convertido para real<br />
*/<br />
printf("Média = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa c para ler N números reais (float) e calcular a média entre eles.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int numN, i,x,soma=0;<br />
float media;<br />
<br />
printf("Entre com N\n");<br />
scanf ("%d", &numN);<br />
<br />
for(i=0;i<numN;i++) {<br />
printf("Entre com número %d\n",i+1);<br />
scanf("%d",&x);<br />
soma=soma+x; <br />
}<br />
<br />
media = (float)soma/numN; /* forçar conversão de int para float */<br />
<br />
printf("media = %f\n", media);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite calcular o valor de Y dado o polinômio:<math>y=5x_1+6x_2+10x_3</math> e as entradas x (números reais).<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x1,x2,x3,y;<br />
<br />
printf("Entre com x1\n");<br />
scanf("%f", &x1);<br />
<br />
printf("Entre com x2\n");<br />
scanf("%f", &x2);<br />
<br />
printf("Entre com x3\n");<br />
scanf("%f", &x3);<br />
<br />
y = 5*x1+6*x2+10*x3;<br />
<br />
printf("Valor de y = %f\n", y);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C para computar o valor de y dado o valor de x e sabendo que <math>y=sin{2x}+cos{3x}</math> <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
<br />
main()<br />
{<br />
float x,y; <br />
printf("Entre com x em radianos\n");<br />
scanf("%f",&x);<br />
<br />
y = sinf(2*x) + cosf(3*x);<br />
<br />
printf("y = %f\n", y);<br />
<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa C que permite entrar com N números reais e então calcula a média do maior e do menor número (não precisa usar vetor).<br />
#Implementar um programa que lê um número de 0 a 9 e imprime a cor correspondente na tabela de resistores.<br />
#A fórmula de Heron foi usado no Projeto Integrador da fase I. Elabore uma função que recebe os três lados de um triângulo (usar ''doubles'') e retorna a área deste triângulo. A função deve retornar um número negativo caso um dos parâmetros não seja positivo.<br />
#Implementar um programa para que sejam fornecidos 5 resistências (em ohms). O programa deve calcular o equivalente série e paralelo destas resistências.<br />
<br />
===EXERCÍCIOS (nível médio)===<br />
<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o módulo (da coordenada polar) da soma destes números.<br />
#Implementar uma função que recebe dois números complexos no formato retangular e retorna o ângulo (da coordenada polar) da multiplicação destes números.<br />
#Implementar uma função que sorteia 10000 valores entre 1 e 6, simulando o "jogar de um dado". Armazenar o número de ocorrências de cada um dos valores em variáveis chamadas: val1, val2,...,val6. Ao final mostrar o resultado das ocorrências. Usar o comando ''for''.<br />
#Refazer o exercício anterior usando o comando ''while''.<br />
#Implementar um função que recebe um ângulo (float) e um caracter (char). Se o caracter for 'R' ou 'R' o ângulo será considerado em graus e será transformado para radianos. Se o caracter for 'G' ou 'g' será trasnformado para graus. Os ângulos sempre serão positivos e limitados a 360 graus ou 2PI radianos. A função deve retornar -1 caso haja erro nos valores passados como parâmetros.<br />
#Implementar um programa para apoiar o projeto de instalações elétricas. O programa deve calcular a seção do fio necessário (seção de 1,5, 2.5 e 4 mm2 - ver padrões com o Jaci - ver Tabela [http://peropi.com.br/Tabelas/Tabela%20Cabos2.html aqui]) dado o número de lâmpadas de 40, 60, 100W e de tomadas de 100W do circuito. O programa deve sugerir também o disjuntor a ser usado.<br />
#Considere um circuito simples de uma malha com uma fonte de tensão V e duas resistências em série: R1 e R2. Elabore um programa que dado V, R1 e R2, seja determinada a potência transferida para R2.<br />
#Faça uma modificação do exercício anterior para mostrar a curva de potência em função da variação de R2. Fixe V em 10V e R1 em 5ohms. Para facilitar o traçado da curva considere o eixo da potência na horizontal (linha) e na vertical (sentido crescente para baixo) as resistências. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <math.h><br />
#define RT 5 /* resistor da fonte */<br />
#define VT 10 /* tensão da fonte */<br />
<br />
/* INCOMPLETO - FALTA colocar unidades nos eixos */<br />
<br />
void plotar(int x, int y)<br />
{<br />
int i,aux;<br />
aux=y-1;<br />
printf("%c",'|');<br />
for(i=1;i<aux;i++)<br />
printf("%c",' ');<br />
printf("%c\n",'X'); <br />
}<br />
<br />
void plotar_eixo_y()<br />
{<br />
int i;<br />
for(i=1;i<120;i++)<br />
printf("-");<br />
printf(">\n");<br />
}<br />
<br />
main()<br />
{<br />
float pot, Rcarga;<br />
int i;<br />
<br />
plotar_eixo_y();<br />
for(Rcarga=1;Rcarga<=40;Rcarga++) {<br />
pot=(Rcarga/pow((RT+Rcarga),2))*powf(VT,2);<br />
plotar(Rcarga,pot*20); /* multiplicado por 20 para se adaptar ao terminal */<br />
}<br />
printf("%c\n",'V'); <br />
}<br />
</syntaxhighlight><br />
<br />
===EXERCÍCIOS (nível difícil)===<br />
<br />
#Implementar um programa que é uma variação do programa de sorteio e adivinhação dado em sala. O programa deve flexibilizar a variação da faixa 1 a 10, permitindo que o usuário a configure no início do programa (por exemplo, 1-100). Além disto, o programa deve mostrar o número de tentativas realizadas antes de mostrar a mensagem de ''Congratulations''.<br />
#Implementar uma variação do programa acima, onde o usuário também fornece no início uma margem de erro percentual para o acerto. Exemplo: suponha que a faixa de adivinhação é 1-100 e que o usuário forneça uma margem de erro de 10%. Suponha que o programa sorteie o número 30. Então serão considerados acertos quaisquer entradas entre 20 e 40.<br />
#A corrente que passa por um capacitor é dada por <math>i=dq/dt</math>, ou seja a corrente em um dado momento é dada pela taxa de variação da carga no capacitor. Suponha que a carga elétrica no tempo, nos terminais do capacitor é dada por <math> q = 5t sin(4\Pi t) </math> em mC. Desenvolva um programa para calcular a corrente dado o tempo. Aproxime a derivada <math>dq/dt</math> usando passos de tempo de 0.1, 0.01 e 0.001. (ver problema 1.2 do livro Fundamentos de circuitos elétricos de Charles Alexandre). Teste o programa calculando a corrente i para o tempo de 0.5s.<br />
#Flexibilize o programa anterior para que o passo possa ser fornecido.<br />
#Modifique o exercício anterior dado que <math>q=(10-10e^{-2t})</math>. Faça um gráfico para i e q no intervalo t de [0-5s]. Use caracteres 'X' e 'Y'.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 14 DIA 17/05/2013}}<br />
==AULA 14 - 17/05/2013 ==<br />
<br />
AVALIAÇÃO<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{1+sen2x}{x^2+x}</math><br />
<br />
2.Implementar uma função que calcula a área de um retângulo (float) dado a base e a altura. O programa principal deve ler pelo teclado a base e a altura referente a dois triângulos. Uma mensagem deve ser dada se a área do primeiro triângulo é menor, maior ou igual ao segundo.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAAAA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbBBBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbB<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
<br />
<br />
PROVA 2<br />
<br />
1.Implementar um programna para calcular y dado x, onde <math>y=\frac{\sqrt{1+cos2x}}{x^2+senx}</math><br />
<br />
2.Implementar uma função que calcula a área de um círculo (float) dado o raio. Se o parâmetro for menor ou igual a zero, a função deve retornar -1. O programa principal deve ler pelo teclado dois raios equivalentes a dois círculos. Uma mensagem deve ser dada se a área do primeiro círculo é menor, maior ou igual ao segundo. O programa deve testar situações de erro da função (retorno -1) e notificar através de uma mensagem.<br />
<br />
3.Implementar uma função da forma:<br />
<br />
void plotar_fig(int margem, int lado, char car1, char car2, char c3)<br />
<br />
Exemplo de uso:<br />
<br />
plotar_fig(6,5,'A','B','X')<br />
A figura deverá ser desenhada da forma (onde aparece 'b' é espaço em branco:<br />
<br />
bbbbbbAAAAA<br />
<br />
bbbbbbAAAA<br />
<br />
bbbbbbAAA<br />
<br />
bbbbbbAA<br />
<br />
bbbbbbA<br />
<br />
XXXXXXXXXXX<br />
<br />
bbbbbbB<br />
<br />
bbbbbbBB<br />
<br />
bbbbbbBBB<br />
<br />
bbbbbbBBBB<br />
<br />
bbbbbbBBBBB<br />
<br />
<br />
4.Implementar um programa correspondente a um jogo da seguinte forma:<br />
Inicialmente o programa mostra para o usuário a seguinte sequência<br />
<br />
0 1 2 3 4 5 6 7<br />
<br />
O programa sorteia 2 posições onde serão colocados dois diamantes. Exemplo: posições dos números 2 e 7. O programa pede então para o usuário entrar com números até coletar os dois diamantes. A cada jogada os números devem ser atualizados conforme a jogada. Por exemplo, na primeira tentativa, supondo os diamantes em 3 e 7, se o usuário teclar 4, deve aparecer:<br />
<br />
0 1 2 3 X 5 6 7<br />
<br />
Na segunda tentativa, se o usuário colocar 3 (onde está o diamante), deve aparecer:<br />
<br />
0 1 2 D X 5 6 7<br />
<br />
No final, deve ser mostrado o número de tentativas (de X).<br />
<br />
SUGESTÃO: criar uma variável para cada posição (var0, var1 etc). Inicialmente a var0 é igual a 0, a var1 igual a 1 etc. Criar duas variáveis que contém o sorteio. O sorteio deve ser realizado antes.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 15 DIA 21/05/2013}}<br />
==AULA 15 - 21/05/2013 ==<br />
<br />
===Conceito de Vetores em Programação===<br />
<br />
Rever aula 5.<br />
<br />
===Vetores===<br />
<br />
Um vetor pode ser facilmente definido no C:<br />
<br />
<syntaxhighlight lang=c><br />
main()<br />
{<br />
float x[10]; /* vetor com 10 floats */<br />
int i;<br />
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */<br />
x[9] = x[0] + 2.5;<br />
printf("Entrar com o número na posição 5\n");<br />
scanf("%f",&x[5]);<br />
/* usando uma expressão como índice */<br />
i=2;<br />
x[i*2]=i*1.5;<br />
/*usando loop para acessar o vetor */<br />
while (i<8) {<br />
x[i]=0.0;<br />
i++;<br />
}<br />
} <br />
</syntaxhighlight><br />
<br />
NOTA: vetores na Linguagem C sempre começam na posição 0<br />
<br />
Pode-se iniciar um vetor da forma:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int x[10] = {2,4,7,-5,3,2,3,4,9,10}<br />
<br />
printf("%d\n", x[2]);<br />
}<br />
</syntaxhighlight><br />
<br />
===Exercícios ===<br />
<br />
#Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
float x[10];<br />
int i;<br />
<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
i++;<br />
} <br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício para computar a média dos 10 números que estão no vetor. Usar um DEFINE para definir o tamanho do vetor.<br />
#Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.<br />
<!--<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
main()<br />
{<br />
float x[10];<br />
float soma = 0, media; <br />
int i, cont;<br />
<br />
/* leitura do vetor */<br />
i=0;<br />
while (i<10) {<br />
printf("Entre com x[%d] -> ", i);<br />
scanf("%f",&x[i]);<br />
soma = soma + x[i];<br />
i++;<br />
} <br />
<br />
/* calculo da media */<br />
media = soma /10;<br />
<br />
/* computação de números acima da média */<br />
cont = 0;<br />
i=0;<br />
while (i<10) {<br />
if (x[i] > media) <br />
cont++;<br />
i++;<br />
} <br />
printf ("Número de números acima da média = %d\n", cont);<br />
}<br />
</syntaxhighlight><br />
--><br />
#Refazer os exercícios anteriores usando o comando for;<br />
<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 16 DIA 24/05/2013}}<br />
==AULA 16 - 24/05/2013 ==<br />
===Objetivos===<br />
<br />
*Vetor de char e armazenamento de cadeias em vetores;<br />
*Uso do GDB em modo texto<br />
<br />
===Vetor de Char===<br />
<br />
É possível definir vetores do tipo ''char''. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL),<br />
<br />
Exemplo:<br />
<br />
Fazer um programa para computar o número de caracteres de uma cadeia (''string'') lida pelo teclado.Use o comando ''while''.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
while(alfa[i]!=0)<br />
i++;<br />
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='a'&&alfa[i+1]=='b') {<br />
cont++;<br />
i++; /* avançar uma posição */<br />
}<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia: ");<br />
scanf("%s",alfa);<br />
<br />
cont=0;<br />
while(alfa[i]!=0){<br />
if (alfa[i]=='o')<br />
alfa[i]='O';<br />
i++;<br />
}<br />
printf ("\nNova cadeia -> %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50], beta[50];<br />
int cont;<br />
int i=0;<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",alfa);<br />
<br />
printf ("Entre com a cadeia:\n");<br />
scanf("%s",beta);<br />
<br />
cont=0;<br />
while(alfa[i]!=0 && beta[i]!=0){<br />
if (alfa[i]==beta[i])<br />
cont++;<br />
i++;<br />
}<br />
printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);<br />
}<br />
</syntaxhighlight><br />
#Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta" <br />
#Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.<br />
<br />
<br />
===Usando o gdb para depurar programas===<br />
<br />
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores. <br />
<br />
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]<br />
<br />
Seja o programa armazenado no arquivo teste.c:<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int x,y;<br />
<br />
x = 2;<br />
y = 0;<br />
while (y<5)<br />
x++;<br />
printf ("Valor de x = %d\n",x);<br />
}<br />
</syntaxhighlight><br />
<br />
Para que um programa possa ser depurado, devemos compilá-lo da forma:<br />
<br />
gcc -g teste.c -o teste<br />
<br />
<br />
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.<br />
<br />
O gdb pode então ser chamado da forma:<br />
<br />
gdb teste<br />
<br />
Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar<br />
um breakpoint na entrada da função pode-se fazer:<br />
<br />
b main<br />
<br />
Para executar o programa basta fazer o comando run:<br />
<br />
r<br />
<br />
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.<br />
<br />
Para acompanhar o valor de variáveis pode-se colocá-las em display:<br />
<br />
display x<br />
display y<br />
<br />
Para execução passo a passo pode-se utilizar o comando next:<br />
<br />
n<br />
<br />
Para ver o <br />
<br />
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:<br />
<br />
print x<br />
<br />
<br />
====Iniciando uma cadeia na declaração====<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void main ()<br />
{<br />
char alfa[50]="IFSC-SJ";<br />
<br />
printf ("\nNumero de caracteres em %s\n", alfa);<br />
}<br />
</syntaxhighlight><br />
<br />
===Como passar um vetor de caracteres como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
int tam;<br />
tam = str_len("teste");<br />
}<br />
</syntaxhighlight><br />
<br />
NOTE que vetores são SEMPRE passados como referência:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
void capitalizar(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0) {<br />
if(x[i]>='a'&&x[i]<='z')<br />
x[i]-=0x20;<br />
i++;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
char cadeia[50]="teste";<br />
capitalizar(cadeia);<br />
printf("%s\n",cadeia);<br />
}<br />
</syntaxhighlight><br />
<br />
A variável cadeia será moidifcada e será impresso:<br />
TESTE<br />
<br />
===Exercícios===<br />
<br />
#Elaborar uma função que conta o número de ocorrências da letra 'a' em uma ''string'' passada como parâmetro.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int num_ocorr_a (char x[])<br />
{<br />
int i,cont;<br />
<br />
i = 0;<br />
cont = 0;<br />
while (x[i]!=0) {<br />
if (x[i]=='a')<br />
cont++;<br />
i++;<br />
}<br />
return cont;<br />
}<br />
<br />
void main()<br />
{<br />
char string[100]="ababababab";<br />
int num_oc;<br />
<br />
num_oc = num_ocorr_a(string);<br />
}<br />
</syntaxhighlight><br />
#Melhorar o exercício anterior passando o caracter a ser verificado as ocorrências, também como parâmetro.<br />
#Ïmplementar uma função chamada str_cmp que recebe duas cadeias (através de vetor de char) e retorna 0 se as cadeias forem iguais ou -1 se diferentes.<br />
#Implementar uma função chamada comp_ult que recebe duas cadeias de char. A função deve retornar 1 se o último caracter (excluindo o NULL) de cada uma delas forem iguais. Caso contrário deve retornar -1. Exemplo:<br />
x = comp_ult("alfa","omega")<br />
O valor de x após a execução deve ser 1. Para a chamada:<br />
x = comp_ult("alfa","epson") <br />
O valor de x deve ser -1.<br />
OBS: USE como apoio a função str_len já desenvolvida.<br />
#Implementar uma função que concatena duas cadeias de caracteres da forma:<br />
char alfa[50]="IFSC;<br />
char beta[50]="-SJ";<br />
str_cat(alfa,beta) <br />
Após a execução, dentro da variável alfa teremos a cadeia "IFSC-SJ"<br />
<br />
ATENÇÂO: LEMBREM_SE DOS ESTILOS DE INDENTAÇÂO<br />
http://en.wikipedia.org/wiki/Indent_style#K.26R_style<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 17 DIA 28/05/2013}}<br />
=Aula 17 =<br />
<br />
==Objetivos==<br />
<br />
*Revisãos(exercícios) de vetores (arrays)<br />
<br />
==Exercícios==<br />
<br />
#Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: ''bim1'', ''bim2'',''bim3'' e ''bim4''. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir uma função que retorna: a média da turma, o desvio padrão da turma e a média anual do aluno. Na função ''main'' imprimir a média de cada aluno, a média da turma e o desvio padrão (<math>\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}, {\rm \ \ onde\ \ } \mu = \frac{1}{N} \sum_{i=1}^N x_i.</math>) da turma.<syntaxhighlight lang=c><br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
<br />
}<br />
</syntaxhighlight> Solução:<syntaxhighlight lang=c><br />
#include <math.h><br />
#include <stdio.h><br />
<br />
#define NUM_ALUNOS 6<br />
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};<br />
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};<br />
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};<br />
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};<br />
<br />
float media_aluno(int aluno)<br />
{<br />
float media;<br />
<br />
media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;<br />
<br />
return media;<br />
}<br />
<br />
<br />
float media_turma()<br />
{<br />
int i;<br />
float media;<br />
<br />
media = 0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
media = media + media_aluno(i);<br />
<br />
media = media/NUM_ALUNOS;<br />
<br />
return media; <br />
}<br />
<br />
float desvio_padrao()<br />
{<br />
float media, prod;<br />
int i;<br />
<br />
media = media_turma();<br />
<br />
prod=0;<br />
for (i=0;i<NUM_ALUNOS;i++)<br />
prod = powf(media_aluno(i)-media_turma(),2) + prod;<br />
prod = sqrt(prod/NUM_ALUNOS);<br />
<br />
return prod;<br />
}<br />
<br />
main()<br />
{<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao()); <br />
}<br />
</syntaxhighlight><br />
#Para o exercício anterior, construir na função ''main'' um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.<syntaxhighlight lang=c><br />
main()<br />
{<br />
float desvp,lim_sup,lim_inf,media,aux;<br />
int i,cont;<br />
/* chamar aqui as funções e imprimir os retornos */<br />
printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));<br />
printf("Media Anual da Turma -> %.2f\n", media=media_turma());<br />
printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());<br />
<br />
cont=0;<br />
lim_sup=media+desvp;<br />
lim_inf=media-desvp;<br />
for(i=0;i<NUM_ALUNOS;i++){<br />
aux = media_aluno(i);<br />
if (aux <= lim_sup && aux >= lim_inf)<br />
cont++;<br />
}<br />
printf("Número de alunos dentro da faixa do desvio -> %d\n",cont); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 20 DIA 29/05/2013}}<br />
== AULA 20 DIA 29/05/2013==<br />
<br />
===Objetivos===<br />
<br />
O aluno deverá, após a aula;<br />
<br />
*Saber operar sobre strings (sem uso de ponteiros), seja na função main, seja em funções com passagem de parâmetros do tipo vetor de char;<br />
*Definiir e operar sobre arrays multidimensionais (matrizes).<br />
<br />
===Processamento de strings===<br />
<br />
Na aula anterior vimos vetores. Vimos que é possível armazenar strings em vetores de char.<br />
O processamento de strings é de grande interesse em programação. Vamos continuar a ver alguns aspectos<br />
deste processamento.<br />
<br />
Ainda na aula aula passada vimo como computar o tamanho de uma string usando a função str_len(). V<br />
Vamos elaborar mais algumas funções para comp<br />
<br />
====Computando o tamanho de uma string====<br />
<br />
Em aulas anteriores já havíamos visto que podemos computar o tamanho de uma string da forma:<br />
<br />
<syntaxhighlight lang=c><br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
main()<br />
{<br />
char teste[]="IFSC-SJ";<br />
int tamanho;<br />
<br />
tamanho = str_len(teste); <br />
}<br />
</syntaxhighlight><br />
<br />
====Copiando strings====<br />
<br />
Implementar e testar uma função que copia uma cadeia de caracteres de um vetor de strings fonte para um vetor de destino, de forma similar a função strcpy.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i;<br />
<br />
for(i=0;auxs2[i]!=0;i++) <br />
auxs1[i]=auxs2[i];<br />
auxs1[i]=0;<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight> <br />
ou <syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cpy(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
do { <br />
auxs1[i]=auxs2[i];<br />
}while(auxs2[i++]!=0);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100], str2[100];<br />
<br />
printf("Entre com a string => ");<br />
scanf ("%s", str2);<br />
str_cpy(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Concatenado strings====<br />
<br />
#Da mesma forma que o exercício anterior, implementar uma função similar a função strcat.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void str_cat(char auxs1[], char auxs2[])<br />
{<br />
int i=0;<br />
<br />
/*localizar o final da string de destino*/<br />
while(auxs1[i]!=0)<br />
i++;<br />
<br />
/* usando a função de cópia já implementada temos */<br />
str_cpy(&auxs1[i], auxs2);<br />
}<br />
<br />
main()<br />
{<br />
char str1[100]="IFSC em ", str2[100]="Sao Jose", x[]="teste";<br />
<br />
str_cat(str1, str2);<br />
printf("\nString copiada = %s\n", str1);<br />
}<br />
</syntaxhighlight><br />
<br />
====Comparando strings====<br />
<br />
Exercício: Implementar uma função chamada str_cmp que recebe duas strings como parâmetro e retona 0 se elas são iguais ou 1<br />
se elas forem diferentes. A função é ''case sensitive''.<br />
<br />
====Exercícios sobre strings====<br />
<br />
1.Implementar uma função para adicionar (append) n caracteres iniciais de uma string2 para o final de uma string1. Retornar 0 se sucesso ou -1 se detectado algum problema.<br />
int str_ncat(char string1[], char string2[], int n)<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
int str_len(char x[])<br />
{<br />
int i=0;<br />
printf ("Endereço de x é %p\n", x);<br />
while (x[i]!=0)<br />
i++;<br />
return i;<br />
}<br />
<br />
int str_ncat(char string1[], char string2[], int n)<br />
{<br />
int i,j;<br />
<br />
if (n<=0)<br />
return -1;<br />
<br />
i = str_len(string1);<br />
<br />
for (j=0;j<n && string2[j]!=0;j++) {<br />
string1[i] = string2[j];<br />
i++;<br />
} <br />
if(string2[j]!=0)<br />
string1[i] =0;<br />
<br />
return 0;<br />
}<br />
<br />
main()<br />
{<br />
char x[100]="IFSC-";<br />
char y[100]="Telecom SJ";<br />
<br />
str_ncat(x,y,30);<br />
printf("x - > %s\n", x); <br />
}<br />
</syntaxhighlight><br />
2.Implementar uma função para adicionar (append) a uma subcadeia da string2 para uma string1. A substring é iniciada no índice determinado por n.<br />
int str_nicat(char string1[], char string2[], int n)<br />
3.Implementar uma função para comparar até n primeiros caracteres de duas cadeias passadas como parâmetro. Retornar 0 se iguais, -1 se diferentes.<br />
int str_ncmp(char string1[], char string2[], int n)<br />
4.Implementar uma função para comparar uma substring da string2 com os n2 primeiros caracteres de string1. A substring é determinada pelo índice n1 com tamanho dado por n2. Retornar 0 se sucesso e -1 se problemas.<br />
int str_nicmp(char string1[],char string2[], int n1, int n2)<br />
5.Implementar uma versão não sensitiva a case da função str_cmp.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 22 DIA 7/06/2013}}<br />
<br />
== AULA 22 DIA 7/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definindo matrizes no C<br />
*Operações com matrizes e passagem de parâmetros tipo matriz<br />
<br />
===Como definir e operar com matrizes no C===<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício<br />
<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo ''matA''[N_MAX][N_MAX].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#IMplementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br />
<br />
===Passando matrizes como parâmetro===<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
OBSERVE que matrizes são sempre passadas como referência.<br />
<br />
Exercício<br />
<br />
#Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
<br />
===Matrizes de caracteres e vetores de strings===<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
Exercício<br />
<br />
#Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
char userId[50];<br />
int userEncontrado=1;<br />
<br />
scanf("%s",userId);<br />
<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userId, &TabelaUsuarios[i][0])==0)<br />
userEncontrado=0;<br />
}<br />
if (userEncontrado==0)<br />
printf("Abrir porta!!!\n");<br />
}<br />
</syntaxhighlight> <br />
#Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.<br />
#Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".<br />
#No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).<br />
#No exercício anterior, acrecente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquado e o sistema volta a perguntar por um userID.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 23 DIA 14/06/2013}}<br />
<br />
== AULA 23 DIA 14/06/2013==<br />
<br />
===Objetivos===<br />
<br />
*Definição de estruturas;<br />
*Estruturas como parâmetros;<br />
*Inicialização de estruturas;<br />
*Cópia de estruturas;<br />
*Exercícios com estruturas.<br />
<br />
=== Estruturas ===<br />
<br />
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */<br />
{ <br />
char userID[20];<br />
char senha[20];<br />
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */<br />
<br />
struct TUsuario TabelaUsuario[20];<br />
<br />
main()<br />
{<br />
scanf("%s", Usuario.userId);<br />
scanf("%s", Usuario.senha);<br />
scanf("%s", TabelaUsuario[10].userID);<br />
scanf("%s", TabelaUsuario[10].senha);<br />
}<br />
</syntaxhighlight><br />
<br />
Neste exemplo, foi definido um tipo (modelo) para o registro (''struct TUsuario'') e foi criada uma variável chamada ''Usuario'' a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada ''TabelaUsuario''. Note que basta usar as palavras chave ''struct Usuario'' para criar novas variáveis. O tipo completo é definido uma única vez no início.<br />
<br />
===Estruturas dentro de estruturas===<br />
<br />
Vamos ver um exemplo com estruturas definidas dentro de estruturas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura.<br />
<br />
Exercício 2: Modifique o exercício anterior para que os dados não sejam lidos pelo ''scanf'' mas através da inicialização da estrutura.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao = {"Maria","42342342234",{"João da Silva","350"},10};<br />
<br />
printf("Rua do cidadao = %s\n", Cidadao.endereco.rua);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
===Passando estruturas como parâmetro e retornando estruturas===<br />
<br />
Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia.<br />
Observe o exercício abaixo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",Cidadao.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",Cidadao.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",Cidadao.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",Cidadao.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&Cidadao.num_filhos);<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight> <br />
<br />
O que podemos concluir com os endereços que foram mostrados???<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct TEndereco{<br />
char rua[50];<br />
char numero[10];<br />
};<br />
<br />
struct TCidadao{<br />
char nome[50];<br />
char cpf[20];<br />
struct TEndereco endereco;<br />
int num_filhos;<br />
};<br />
<br />
struct TCidadao ler_struct()<br />
{<br />
struct TCidadao aux;<br />
<br />
printf("Entre com o nome\n");<br />
scanf ("%s",aux.nome);<br />
<br />
printf("Entre com o cpf\n");<br />
scanf ("%s",aux.cpf);<br />
<br />
printf("Entre a rua\n");<br />
scanf ("%s",aux.endereco.rua);<br />
<br />
printf("Entre a numero\n"); <br />
scanf ("%s",aux.endereco.numero);<br />
<br />
printf("Entre com o número de filhos\n");<br />
scanf ("%d",&aux.num_filhos);<br />
<br />
return aux;<br />
}<br />
<br />
void print_struct (struct TCidadao aux)<br />
{<br />
printf("nome=%s cpf=%s\n", aux.nome, aux.cpf);<br />
printf("endereço inicial do aux %p\n", &aux);<br />
}<br />
<br />
void main()<br />
{<br />
struct TCidadao Cidadao;<br />
<br />
Cidadao = ler_struct();<br />
<br />
print_struct(Cidadao);<br />
<br />
printf("endereço inicial do Cidadao %p\n", &Cidadao);<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Copiando structs===<br />
<br />
O exemplo a seguir demonstra como se pode copiar uma variável ''struct'' para outra do mesmo tipo.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
struct THoras{<br />
int hora;<br />
int minuto;<br />
int segundo;<br />
};<br />
<br />
struct THoras Ontem = {2,10,57};<br />
<br />
void main()<br />
{<br />
struct THoras Hoje;<br />
Hoje = Ontem;<br />
<br />
printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo);<br />
}<br />
</syntaxhighlight><br />
<br />
===Aplicação no Controle de Acesso===<br />
<br />
O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo <br />
a tabela de usuários já vem inicializada nos campos ''UserID'' e ''Senha''.<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: TurmaENG.TELECOM - 2012.2 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd"},<br />
{"maria","xxxx"},<br />
{"jose","yyyy"},<br />
{"lara","zzzz"},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
i--; /* o indice do sujeito é i-1 */<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) <br />
printf("Abrir porta!!!\n");<br />
else<br />
printf("Senha Inválida\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
Exercício:<br />
<br />
#Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado.<br />
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <string.h><br />
<br />
/**********************************************/<br />
/*** PROGRAMA DE CONTROLE DE ACESSO **/<br />
/** Autor: Turma ENG.TELECOM - 2013.1 */<br />
/**********************************************/<br />
<br />
/** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/<br />
<br />
struct TRegistroUsuario {<br />
char UserId[10];<br />
char Senha[10];<br />
int contador;<br />
};<br />
<br />
/* Tabela de Usuários */<br />
struct TRegistroUsuario TabelaUsuarios[4] = {<br />
{"joao","abcd",0},<br />
{"maria","xxxx",0},<br />
{"jose","yyyy",0},<br />
{"lara","zzzz",0},<br />
};<br />
<br />
<br />
char userID[20];<br />
<br />
<br />
/** FUNÇÔES DESTE MÓDULO ****/<br />
<br />
void mostrar_menu_entrada_usuario()<br />
{<br />
printf("*******************************\n");<br />
printf("Entre com o seu USERID para ter acesso\n"); <br />
printf("*******************************\n");<br />
}<br />
<br />
/** Função que implementa as tarefas do administrador **/<br />
<br />
void administrar()<br />
{<br />
char aux_senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
printf("Entre com a senha do admin \n");<br />
scanf ("%s", aux_senha);<br />
<br />
if(strcmp(aux_senha,"123456")==0) {<br />
/* senha valida do admin - agora entre com userid a ser desbloqueado */<br />
printf("Entre com userdID a ser desbloqueado\n");<br />
scanf("%s",userID);<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
} <br />
if (userEncontrado==0) {<br />
i--;<br />
TabelaUsuarios[i].contador=0;<br />
} <br />
}<br />
}<br />
<br />
/** Função que valida um usuário e abre a porta **/<br />
<br />
void tratar_usuario()<br />
{<br />
char senha[10];<br />
int userEncontrado=1;<br />
int i;<br />
<br />
<br />
/* <br />
Loop para encontrar o usuário na tabela. <br />
Ao final do loop a variavel i conterá o índice do usuário (se ele estiver<br />
na tabela<br />
*/<br />
for (i=0;i<4 && userEncontrado; i++) {<br />
if( strcmp(userID, TabelaUsuarios[i].UserId)==0)<br />
userEncontrado=0;<br />
}<br />
<br />
/* se usuário encontrado abre a porta */<br />
if (userEncontrado==0) {<br />
i--; /* o indice do sujeito é i-1 */<br />
if (TabelaUsuarios[i].contador<3){<br />
<br />
printf("Bom dia %s! Entre com a senha\n", userID);<br />
scanf("%s",senha);<br />
<br />
if(strcmp(senha,TabelaUsuarios[i].Senha)==0) {<br />
printf("Abrir porta!!!\n");<br />
TabelaUsuarios[i].contador=0;<br />
}<br />
else {<br />
TabelaUsuarios[i].contador++;<br />
printf("Senha Inválida\n");<br />
printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador);<br />
}<br />
} else {<br />
printf("Usuário bloqueado\n");<br />
}<br />
} else {<br />
printf("Usuário não encontrado\n");<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
for(;;) {<br />
mostrar_menu_entrada_usuario();<br />
scanf("%s",userID);<br />
if (strcmp(userID, "admin")==0) {<br />
administrar();<br />
} else {<br />
tratar_usuario();<br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
#No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! <br />
#Implementar na função administrar a inserção da mensagem no exercício anterior.<br />
#Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado.<br />
{{collapse bottom}}<br />
<br />
{{collapse top|AULA 24 DIA 18/06/2013}}<br />
<br />
== AULA 24 DIA 18/06/2013==<br />
<br />
===Objetivos===<br />
<br />
==Exercícios==<br />
<br />
#Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrt[http://www.elook.org/programming/c/sqrt.html] e atan [http://www.elook.org/programming/c/atan.html] da biblioteca matemática. [http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm Como converter]:<br />
:<math> mod = \sqrt{x^2+y^2} </math><br />
:<math> \phi = \arctan \frac{y}{x} </math> ou <math> \phi = \tan^{-1} \frac{y}{x} </math><br />
<syntaxhighlight lang=c><br />
#include <math.h><br />
<br />
struct TComplexoRet {<br />
float x,y;<br />
};<br />
<br />
struct TComplexoPolar {<br />
float mod,ang;<br />
};<br />
<br />
struct TComplexoPolar convert_polar(struct TComplexoRet a)<br />
{<br />
struct TComplexoPolar aux;<br />
<br />
aux.mod = sqrtf(powf(a.x,2)+powf(a.y,2));<br />
aux.ang = atan(a.y/a.x); <br />
return aux;<br />
}<br />
<br />
main()<br />
{<br />
struct TComplexoRet w;<br />
struct TComplexoPolar y;<br />
<br />
w.x = 11.5;<br />
w.y = 4.6;<br />
y = convert_polar(w); <br />
}<br />
</syntaxhighlight><br />
#Implementar um programa em C para registrar notas bimestrais de alunos de uma turma. O registro de cada aluno constará em uma tabela global RegistroAlunos. Em cada registro deve constar o nome do aluno, número de matrícula (8 dígitos), notas bimestrais. Implementar funções para: dado o nome do aluno retornar a média semestral, dado o número de matrícula retornar a média anual, dado o número de mátrícula retornar o index do aluno na tabela. Fazer um programa principal para testar as funções. <syntaxhighlight lang=c><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
} <br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
} <br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i; <br />
}<br />
<br />
main()<br />
{<br />
/* testar as funções aqui! */<br />
}<br />
</syntaxhighlight><br />
<br />
Autor: Beatriz da Silveira<br />
<code><br />
#include <stdio.h><br />
#define NUM_ALUNOS 40<br />
#define TAM_MAT 10<br />
<br />
<br />
<br />
struct TRegistroAluno{<br />
char nome[NUM_ALUNOS];<br />
char matricula[TAM_MAT];<br />
float bim1,bim2,bim3,bim4;<br />
};<br />
<br />
struct TRegistroAluno TabelaNotasTurma[4] = {<br />
{"Lara","12222212", 10.0,10.0,9.5,7.6},<br />
{"Joao","44434212", 7.6,4.5,7.8,9.7},<br />
{"Maria","12234272", 8.7,9.0,9.8,9.6},<br />
{"Jose","75656755", 4.5,6.6,5.5,8.9},<br />
};<br />
<br />
<br />
float media_semestral(char nome[], int semestre)<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
if (semestre!=1 && semestre!=2)<br />
return -1;<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].nome, nome)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
if(semestre==1)<br />
media=(TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2)/2;<br />
else<br />
media=(TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/2;<br />
}<br />
return media;<br />
}<br />
<br />
float media_anual(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
float media;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0){<br />
i--;<br />
media = (TabelaNotasTurma[i].bim1 + TabelaNotasTurma[i].bim2+<br />
TabelaNotasTurma[i].bim3 + TabelaNotasTurma[i].bim4)/4;<br />
}<br />
return media;<br />
}<br />
<br />
int retorna_index(char matricula[])<br />
{<br />
int i,AlunoEncontrado=1;<br />
<br />
for(i=0;i<NUM_ALUNOS && AlunoEncontrado;i++) {<br />
if(strcmp(TabelaNotasTurma[i].matricula, matricula)==0)<br />
AlunoEncontrado=0;<br />
}<br />
if (AlunoEncontrado==0)<br />
i--;<br />
else<br />
i=-1;<br />
return i;<br />
}<br />
void oQueDesejaFazer(int num){<br />
char mat[TAM_MAT];<br />
int semestre;<br />
switch (num)<br />
{<br />
case 1:<br />
printf ("Digite o nome do aluno para saber a média Semestral\n");<br />
char aluno[NUM_ALUNOS];<br />
scanf("%s", aluno);<br />
//int semestre;<br />
printf("Digite 1 0u 2 para saber a nota semestral");<br />
scanf("%d", &semestre);<br />
float media = media_semestral(aluno, semestre);<br />
printf("A média semestral é: %.2f \n", media);<br />
<br />
break;<br />
case 2:<br />
printf ("Digite o número da matrícula do aluno, para saber a média anual");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
float mediaAnual= media_anual(mat);<br />
printf("A média anual do aluno é: %.2f\n", mediaAnual);<br />
break;<br />
case 3:<br />
printf ("Digite o nº da matricula para saber o index do aluno\n");<br />
//char mat[TAM_MAT];<br />
scanf("%s", mat);<br />
int index =retorna_index(mat);<br />
printf("O index do aluno é %d", index);<br />
break;<br />
default:<br />
printf ("Você não escolheu nenhuma das opções listadas.\n");<br />
}<br />
//return(0);<br />
}<br />
int main()<br />
{<br />
int opcao=0;<br />
while(1){<br />
<br />
printf("O que você deseja fazer\n 1-Para saber média semestral\n 2-Para saber média anual\n 3-Index do aluno na tabela\n 4-Para sair");<br />
scanf("%d", &opcao);<br />
if(opcao==4){<br />
printf("Saindoo");<br />
break;<br />
}<br />
oQueDesejaFazer(opcao);<br />
}<br />
<br />
return(0);<br />
}<br />
<br />
</syntaxhighlight><br />
#Implementar uma função que recebe uma matriz de floats de dimensão 3x3 como parâmetro e retorna o determinante (um float) desta matriz.<br />
#Implementar um programa que calcula a transposta de uma matriz qualquer (limitada ao tamanho de 10x10). O usuário deve fornecer as dimensões e, na sequência, a matriz. O programa deverá calcular a transposta da matriz. lembrar que <math> b_{ji}=a_{ij}<br />
</math> onde b é um elemento da matriz transposta.<br />
{{collapse bottom}}</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Monitoria_de_Programa%C3%A7%C3%A3o&diff=55179Monitoria de Programação2013-06-19T21:10:24Z<p>Beatriz.s: Limpou toda a página</p>
<hr />
<div></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Monitoria_de_Programa%C3%A7%C3%A3o&diff=55178Monitoria de Programação2013-06-19T21:09:58Z<p>Beatriz.s: Criou página com 'rtest'</p>
<hr />
<div>rtest</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34937Projeto Integrador - 2011.1 - Fenrir2011-07-12T01:17:33Z<p>Beatriz.s: /* Cabeamento Estruturado */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documentação essa opção é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Domínio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Domínio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Opção que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br então qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Opção que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Opção que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS opções OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
[[Arquivo:Index_fenrir.png|500px]]<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
[[Arquivo:admin_fenrir.png|700px]]<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Se você clicar em "Sair", a seguinte página é invocada, encerrando a seção, e redirecionando você para "index.php":<br />
<nowiki><?<br />
session_start();<br />
session_destroy();<br />
header("location: index.php");<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
[[Arquivo:incluir_fenrir.png|600px]]<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
[[Arquivo:excluir_fenrir.png|400px]]<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em alterar, a seguinte página aparece''':<br />
[[Arquivo:alterar_fenrir.png|400px]]<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
$usuario = $_GET['user']; <br />
$cliente = $_GET['cliente']; <br />
$dmn = $_GET['dmn']; <br />
$senha = $_GET['pass']; <br />
$codigo = $_GET['codigo']; <br />
?><br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Alteracoes</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<br />
<form name="formoutroteste" action="alterando.php?codigo=<? echo $codigo ; ?>&senha=<? echo $senha ; ?>&cliente=<? echo $cliente ; ?>&dmn=<? echo $dmn ; ?>" method="post"><br />
<p>Usuario <br><br />
<input type="text" name="a" value="<? echo $usuario ?>"><br />
<p>Senha <br><br />
<input type="text" name="e" value="<? echo $senha ?>"><br />
<p>Cliente <br><br />
<input type="text" name="b"value="<? echo $cliente ?>"><br />
<p>Dominio <br><br />
<input type="text" name="c" value="<? echo $dmn ?>"><br />
<br />
<input type="submit" name="a_enviar" value="Alterar"><br />
</form><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao alterar algum campo(com exceção do usuário, que não pode ser alterado), o administrador é redirecionado para a página "alterando.php", onde as alterações são feitas:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
#-------------------------------------------------------------------<br />
#NOVOS VALORES<br />
$usuario = $_POST['a'];<br />
$cliente = $_POST['b'];<br />
$dominio = $_POST['c'];<br />
$senha = $_POST['e'];<br />
#CODIGO PARA LOCALIZAR NO MYSQL<br />
$codigo = $_GET['codigo'];<br />
#VALORES QUE ESTAO NA TABELA (PODEMOS DIZER "ANTIGOS")<br />
$pass = $_GET['senha'];<br />
$domain = $_GET['dmn'];<br />
$client = $_GET['cliente'];<br />
#----------------<br />
#--------------------------<br />
#------------------------------------------<br />
#testando se o dominio nao foi escolhido<br />
//conectando no servidor<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
#-------------------------------------------------------<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
#------------------------------------------------<br />
<br />
<br />
//Aqui são feitos uma série de testes, se os dados forem diferentes<br />
<br />
if (($senha != $pass)){ //se a senha for diferente, roda o script para alterá-la<br />
<br />
exec("sudo /var/scripts/alt_senha.sh $usuario $senha",$senhaalterada);<br />
}<br />
<br />
//if (($cliente != $client)){ //testa se houve mudança no nome do cliente<br />
// exec("sudo /var/scripts/alt_cliente $client",$clientealterado);<br />
//}<br />
<br />
<br />
if (($dominio != $domain)){ //testa se houve mudança no domínio, a mudança mais significativa<br />
exec("sudo /var/scripts/alt_dns.sh $domain $dominio",$dominioalterado);<br />
exec("sudo /var/scripts/alt_apache.sh $domain $dominio",$apachealterado);<br />
exec("sudo /var/scripts/alt_postfix.sh $domain $usuario $dominio",$postfixalterado); <br />
<br />
} <br />
<br />
//Atualiazando o usuario<br />
<br />
<br />
$atualizar="UPDATE admin SET senha='$senha', dominio='$dominio', cliente='$cliente' WHERE id=$codigo";<br />
mysql_query($atualizar,$conexao);<br />
<br />
//conectando no servidor radius<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
$alt_radius = "UPDATE radcheck SET value='$senha' WHERE username='$usuario'";<br />
mysql_query($alt_radius,$con_rad);<br />
<br />
//echo mysql_error();<br />
mysql_close($conexao);<br />
mysql_close($con_rad);<br />
header("location: admin.php");<br />
}<br />
}<br />
}<br />
header("location: admin.php");<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
<br />
Na parte de instalação de equipamentos de rede foram feitas as configurações dos equipamentos necessários para que houvesse a comunicação entre os laboratórios de Redes 1 (onde ficarão os servidores das equipes) e Meios de Transmissão ( onde será disposta uma área de trabalho), e ainda para que cada equipe pudesse disponibilizar para seus clientes, acesso a internet via DSL. Os equipamentos necessários para essa ligação foram:<br />
<br />
-Roteadores<br />
<br />
-Modens SHDSL<br />
<br />
-Switch<br />
<br />
-DSLAM<br />
<br />
-Modens DSL<br />
<br />
Além disso foi necessário a configuração de um Concentrador de Acesso, e um servidor Radius. <br />
<br />
A primeira ligação e configurações que tiveram de ser feita foram dos modens SHDSL e roteadores.<br />
Os modens foram configurados a nível 'físico', modificando a pinagem da placa do mesmo, segunda a necessidade requerida. Já para os roteadores foi utilizado um software de gerenciamento utilizado via terminal, para estabelecer as rotas e ip's, o minicom, que requer algumas configurações pelo seu menu. <br />
Para entrar com o minicom, fazer no terminial<br />
<br />
minicom -s <br />
<br />
Para configurar o minicom, selecione a opção : "Configuração da porta serial"<br />
<br />
┌─────────────[configuração]──────────────┐<br />
│ Nomes de arquivos e rotas<br />
│ Protocolos de transferência de arquivos<br />
│ Configuração da porta serial<br />
│ Modem e discagem<br />
│ Tela e teclado<br />
│ Salvar configuração como dfl<br />
│ Salvar configuração como<br />
│ Sair<br />
│ Sair do Minicom<br />
└────────────────────────────────────────┘<br />
<br />
Em seguida aparecerá:<br />
<br />
┌──────────────────────────────────────────────────────────┐<br />
│ A – Dispositivo Serial : /dev/tty1<br />
│ B – Localização do Arquivo de Travamento : /var/lock<br />
│ C – Programa de Entrada :<br />
│ D – Programa de Saída :<br />
│ E – Bps/Paridade/Bits : 38400 8N1<br />
│ F – Controle de Fluxo por Hardware : Sim<br />
│ G – Controle de Fluxo por Software : Não<br />
│<br />
│ Alterar qual configuração?<br />
└──────────────────────────────────────────────────────────┘<br />
<br />
Altere as seguintes opções:<br />
<br />
Dispositivo Serial : /dev/ttSy0<br />
Bps/Paridade/Bits : 9600 8N1<br />
Controle de Fluxo por Hardware : Não<br />
<br />
Após, volte ao menu principal, e salve a configuração como 'Salvar configuração com dfl', e saia do minicom com 'sair'.<br />
Agora já é possível acessar o roteador desejado, no caso o roteador cisco 2500, localizado no Lab. Meios, logando com o usuário e senha vindos de 'fábrica'. Após se logar dar os seguintes comandos:<br />
<br />
enable;<br />
<br />
configure terminal;<br />
<br />
Para configurar a interface serial:<br />
<br />
interface serial 0;<br />
ip address 10.0.0.2/30;<br />
encapsulation ppp;<br />
exit;<br />
<br />
Para configurar a interface ethernet:<br />
interface fastethernet 0;<br />
ip address 192.168.0.1/24;<br />
exit;<br />
exit;<br />
<br />
Para salvar as configurações:<br />
<br />
wr;<br />
<br />
<br />
A mesma configuração foi feita no roteador do Lab. Redes 1, mudando apenas os endereços.<br />
As rotas também tiveram de ser configuradas, no caso, o do Lab. Meios teve rota para o roteador do Lab. Redes.<br />
<br />
Após feita as configurações nos roteadores e modens, os mesmos já estavam se comunicando entre si. Era necessário configurar o restante dos euipamentoS.<br />
O DSLAM foi basicamente configurado pelo professor Sobral, assim como o Concentrador de Acesso (AC), que servirá para receber as solicitações de um 'cliente' e se autenticar no servidor Radius de cada equipe. O modem DSL foi configurado via software do mesmo, ele foi acessado através navegador pelo seu endereço: 10.1.1.1<br />
A página inicial será:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox.png|800px]]<br />
<br />
Ir para advanced setup, Wan, <br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-1.png|800px]]<br />
<br />
<br />
Configurar: Modo PPOE, Encapulamento SNAP/LLC:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-2.png|800px]]<br />
<br />
E Nat:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-4.png|800px]]<br />
<br />
E pronto.<br />
<br />
O servidor Radius que teve de ser configurado por cada equipe, em seu servidores, funciona como autenticador, no caso para o acesso via modem DSL. Ele deve funcionar com um banco de dados onde estarão cadastrados os clientes, e lá será sua base para a autenticação.<br />
Para instalá-lo:<br />
apt-get install freeradius-mysql<br />
<br />
Seus arquivos de configuração ficam no diretório /etc/freeradius<br />
Nossa equipe seguiu um tutorial da internet para auxiliar na configuração do Radius com o banco de dados. Site: http://www.howtoforge.com/authentication-authorization-and-accounting-with-freeradius-and-mysql-backend-and-webbased-management-with-daloradius<br />
<br />
Obs.: Em muitas configurações não foi possível redigi-las, já que foi feita pela o professor, por isso não forma citadas. <br />
<br />
Após as demais configurações feitas a rede ficou da seguinte forma:<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
<br />
A parte de infra-estrutura da rede, foi desenvolvida no Lab. Meios, e contou basicamente com:<br />
<br />
-Um rack principal (dividido pelas equipes);<br />
-Um rack secundário (dividido pelas equipes);<br />
-Uma área de trabalho por equipe.<br />
<br />
A disposição da rede física pode ser melhor compreendida pelo diagrama:<br />
<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg|800px]]<br />
[[Arquivo:Legendaa.jpg|500px]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34933Projeto Integrador - 2011.1 - Fenrir2011-07-12T01:12:08Z<p>Beatriz.s: /* Instalação de Equipamento de Redes */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documentação essa opção é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Domínio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Domínio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Opção que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br então qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Opção que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Opção que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS opções OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
[[Arquivo:Index_fenrir.png|400px]]<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
''foto admin''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Se você clicar em "Sair", a seguinte página é invocada, encerrando a seção, e redirecionando você para "index.php":<br />
<nowiki><?<br />
session_start();<br />
session_destroy();<br />
header("location: index.php");<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
''foto incluir''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
''foto excluir''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em alterar, a seguinte página aparece''':<br />
''foto alterar''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
$usuario = $_GET['user']; <br />
$cliente = $_GET['cliente']; <br />
$dmn = $_GET['dmn']; <br />
$senha = $_GET['pass']; <br />
$codigo = $_GET['codigo']; <br />
?><br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Alteracoes</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<br />
<form name="formoutroteste" action="alterando.php?codigo=<? echo $codigo ; ?>&senha=<? echo $senha ; ?>&cliente=<? echo $cliente ; ?>&dmn=<? echo $dmn ; ?>" method="post"><br />
<p>Usuario <br><br />
<input type="text" name="a" value="<? echo $usuario ?>"><br />
<p>Senha <br><br />
<input type="text" name="e" value="<? echo $senha ?>"><br />
<p>Cliente <br><br />
<input type="text" name="b"value="<? echo $cliente ?>"><br />
<p>Dominio <br><br />
<input type="text" name="c" value="<? echo $dmn ?>"><br />
<br />
<input type="submit" name="a_enviar" value="Alterar"><br />
</form><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao alterar algum campo(com exceção do usuário, que não pode ser alterado), o administrador é redirecionado para a página "alterando.php", onde as alterações são feitas:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
#-------------------------------------------------------------------<br />
#NOVOS VALORES<br />
$usuario = $_POST['a'];<br />
$cliente = $_POST['b'];<br />
$dominio = $_POST['c'];<br />
$senha = $_POST['e'];<br />
#CODIGO PARA LOCALIZAR NO MYSQL<br />
$codigo = $_GET['codigo'];<br />
#VALORES QUE ESTAO NA TABELA (PODEMOS DIZER "ANTIGOS")<br />
$pass = $_GET['senha'];<br />
$domain = $_GET['dmn'];<br />
$client = $_GET['cliente'];<br />
#----------------<br />
#--------------------------<br />
#------------------------------------------<br />
#testando se o dominio nao foi escolhido<br />
//conectando no servidor<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
#-------------------------------------------------------<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
#------------------------------------------------<br />
<br />
<br />
//Aqui são feitos uma série de testes, se os dados forem diferentes<br />
<br />
if (($senha != $pass)){ //se a senha for diferente, roda o script para alterá-la<br />
<br />
exec("sudo /var/scripts/alt_senha.sh $usuario $senha",$senhaalterada);<br />
}<br />
<br />
//if (($cliente != $client)){ //testa se houve mudança no nome do cliente<br />
// exec("sudo /var/scripts/alt_cliente $client",$clientealterado);<br />
//}<br />
<br />
<br />
if (($dominio != $domain)){ //testa se houve mudança no domínio, a mudança mais significativa<br />
exec("sudo /var/scripts/alt_dns.sh $domain $dominio",$dominioalterado);<br />
exec("sudo /var/scripts/alt_apache.sh $domain $dominio",$apachealterado);<br />
exec("sudo /var/scripts/alt_postfix.sh $domain $usuario $dominio",$postfixalterado); <br />
<br />
} <br />
<br />
//Atualiazando o usuario<br />
<br />
<br />
$atualizar="UPDATE admin SET senha='$senha', dominio='$dominio', cliente='$cliente' WHERE id=$codigo";<br />
mysql_query($atualizar,$conexao);<br />
<br />
//conectando no servidor radius<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
$alt_radius = "UPDATE radcheck SET value='$senha' WHERE username='$usuario'";<br />
mysql_query($alt_radius,$con_rad);<br />
<br />
//echo mysql_error();<br />
mysql_close($conexao);<br />
mysql_close($con_rad);<br />
header("location: admin.php");<br />
}<br />
}<br />
}<br />
header("location: admin.php");<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
<br />
Na parte de instalação de equipamentos de rede foram feitas as configurações dos equipamentos necessários para que houvesse a comunicação entre os laboratórios de Redes 1 (onde ficarão os servidores das equipes) e Meios de Transmissão ( onde será disposta uma área de trabalho), e ainda para que cada equipe pudesse disponibilizar para seus clientes, acesso a internet via DSL. Os equipamentos necessários para essa ligação foram:<br />
<br />
-Roteadores<br />
<br />
-Modens SHDSL<br />
<br />
-Switch<br />
<br />
-DSLAM<br />
<br />
-Modens DSL<br />
<br />
Além disso foi necessário a configuração de um Concentrador de Acesso, e um servidor Radius. <br />
<br />
A primeira ligação e configurações que tiveram de ser feita foram dos modens SHDSL e roteadores.<br />
Os modens foram configurados a nível 'físico', modificando a pinagem da placa do mesmo, segunda a necessidade requerida. Já para os roteadores foi utilizado um software de gerenciamento utilizado via terminal, para estabelecer as rotas e ip's, o minicom, que requer algumas configurações pelo seu menu. <br />
Para entrar com o minicom, fazer no terminial<br />
<br />
minicom -s <br />
<br />
Para configurar o minicom, selecione a opção : "Configuração da porta serial"<br />
<br />
┌─────────────[configuração]──────────────┐<br />
│ Nomes de arquivos e rotas<br />
│ Protocolos de transferência de arquivos<br />
│ Configuração da porta serial<br />
│ Modem e discagem<br />
│ Tela e teclado<br />
│ Salvar configuração como dfl<br />
│ Salvar configuração como<br />
│ Sair<br />
│ Sair do Minicom<br />
└────────────────────────────────────────┘<br />
<br />
Em seguida aparecerá:<br />
<br />
┌──────────────────────────────────────────────────────────┐<br />
│ A – Dispositivo Serial : /dev/tty1<br />
│ B – Localização do Arquivo de Travamento : /var/lock<br />
│ C – Programa de Entrada :<br />
│ D – Programa de Saída :<br />
│ E – Bps/Paridade/Bits : 38400 8N1<br />
│ F – Controle de Fluxo por Hardware : Sim<br />
│ G – Controle de Fluxo por Software : Não<br />
│<br />
│ Alterar qual configuração?<br />
└──────────────────────────────────────────────────────────┘<br />
<br />
Altere as seguintes opções:<br />
<br />
Dispositivo Serial : /dev/ttSy0<br />
Bps/Paridade/Bits : 9600 8N1<br />
Controle de Fluxo por Hardware : Não<br />
<br />
Após, volte ao menu principal, e salve a configuração como 'Salvar configuração com dfl', e saia do minicom com 'sair'.<br />
Agora já é possível acessar o roteador desejado, no caso o roteador cisco 2500, localizado no Lab. Meios, logando com o usuário e senha vindos de 'fábrica'. Após se logar dar os seguintes comandos:<br />
<br />
enable;<br />
<br />
configure terminal;<br />
<br />
Para configurar a interface serial:<br />
<br />
interface serial 0;<br />
ip address 10.0.0.2/30;<br />
encapsulation ppp;<br />
exit;<br />
<br />
Para configurar a interface ethernet:<br />
interface fastethernet 0;<br />
ip address 192.168.0.1/24;<br />
exit;<br />
exit;<br />
<br />
Para salvar as configurações:<br />
<br />
wr;<br />
<br />
<br />
A mesma configuração foi feita no roteador do Lab. Redes 1, mudando apenas os endereços.<br />
As rotas também tiveram de ser configuradas, no caso, o do Lab. Meios teve rota para o roteador do Lab. Redes.<br />
<br />
Após feita as configurações nos roteadores e modens, os mesmos já estavam se comunicando entre si. Era necessário configurar o restante dos euipamentoS.<br />
O DSLAM foi basicamente configurado pelo professor Sobral, assim como o Concentrador de Acesso (AC), que servirá para receber as solicitações de um 'cliente' e se autenticar no servidor Radius de cada equipe. O modem DSL foi configurado via software do mesmo, ele foi acessado através navegador pelo seu endereço: 10.1.1.1<br />
A página inicial será:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox.png|800px]]<br />
<br />
Ir para advanced setup, Wan, <br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-1.png|800px]]<br />
<br />
<br />
Configurar: Modo PPOE, Encapulamento SNAP/LLC:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-2.png|800px]]<br />
<br />
E Nat:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-4.png|800px]]<br />
<br />
E pronto.<br />
<br />
O servidor Radius que teve de ser configurado por cada equipe, em seu servidores, funciona como autenticador, no caso para o acesso via modem DSL. Ele deve funcionar com um banco de dados onde estarão cadastrados os clientes, e lá será sua base para a autenticação.<br />
Para instalá-lo:<br />
apt-get install freeradius-mysql<br />
<br />
Seus arquivos de configuração ficam no diretório /etc/freeradius<br />
Nossa equipe seguiu um tutorial da internet para auxiliar na configuração do Radius com o banco de dados. Site: http://www.howtoforge.com/authentication-authorization-and-accounting-with-freeradius-and-mysql-backend-and-webbased-management-with-daloradius<br />
<br />
Obs.: Em muitas configurações não foi possível redigi-las, já que foi feita pela o professor, por isso não forma citadas. <br />
<br />
Após as demais configurações feitas a rede ficou da seguinte forma:<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg|800px]]<br />
[[Arquivo:Legendaa.jpg|500px]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34930Projeto Integrador - 2011.1 - Fenrir2011-07-12T01:07:49Z<p>Beatriz.s: /* Instalação de Equipamento de Redes */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documentação essa opção é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Domínio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Domínio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Opção que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br então qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Opção que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Opção que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS opções OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
[[Arquivo:Index_fenrir.png|400px]]<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
''foto admin''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Se você clicar em "Sair", a seguinte página é invocada, encerrando a seção, e redirecionando você para "index.php":<br />
<nowiki><?<br />
session_start();<br />
session_destroy();<br />
header("location: index.php");<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
''foto incluir''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
''foto excluir''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em alterar, a seguinte página aparece''':<br />
''foto alterar''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
$usuario = $_GET['user']; <br />
$cliente = $_GET['cliente']; <br />
$dmn = $_GET['dmn']; <br />
$senha = $_GET['pass']; <br />
$codigo = $_GET['codigo']; <br />
?><br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Alteracoes</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<br />
<form name="formoutroteste" action="alterando.php?codigo=<? echo $codigo ; ?>&senha=<? echo $senha ; ?>&cliente=<? echo $cliente ; ?>&dmn=<? echo $dmn ; ?>" method="post"><br />
<p>Usuario <br><br />
<input type="text" name="a" value="<? echo $usuario ?>"><br />
<p>Senha <br><br />
<input type="text" name="e" value="<? echo $senha ?>"><br />
<p>Cliente <br><br />
<input type="text" name="b"value="<? echo $cliente ?>"><br />
<p>Dominio <br><br />
<input type="text" name="c" value="<? echo $dmn ?>"><br />
<br />
<input type="submit" name="a_enviar" value="Alterar"><br />
</form><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao alterar algum campo(com exceção do usuário, que não pode ser alterado), o administrador é redirecionado para a página "alterando.php", onde as alterações são feitas:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
#-------------------------------------------------------------------<br />
#NOVOS VALORES<br />
$usuario = $_POST['a'];<br />
$cliente = $_POST['b'];<br />
$dominio = $_POST['c'];<br />
$senha = $_POST['e'];<br />
#CODIGO PARA LOCALIZAR NO MYSQL<br />
$codigo = $_GET['codigo'];<br />
#VALORES QUE ESTAO NA TABELA (PODEMOS DIZER "ANTIGOS")<br />
$pass = $_GET['senha'];<br />
$domain = $_GET['dmn'];<br />
$client = $_GET['cliente'];<br />
#----------------<br />
#--------------------------<br />
#------------------------------------------<br />
#testando se o dominio nao foi escolhido<br />
//conectando no servidor<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
#-------------------------------------------------------<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
#------------------------------------------------<br />
<br />
<br />
//Aqui são feitos uma série de testes, se os dados forem diferentes<br />
<br />
if (($senha != $pass)){ //se a senha for diferente, roda o script para alterá-la<br />
<br />
exec("sudo /var/scripts/alt_senha.sh $usuario $senha",$senhaalterada);<br />
}<br />
<br />
//if (($cliente != $client)){ //testa se houve mudança no nome do cliente<br />
// exec("sudo /var/scripts/alt_cliente $client",$clientealterado);<br />
//}<br />
<br />
<br />
if (($dominio != $domain)){ //testa se houve mudança no domínio, a mudança mais significativa<br />
exec("sudo /var/scripts/alt_dns.sh $domain $dominio",$dominioalterado);<br />
exec("sudo /var/scripts/alt_apache.sh $domain $dominio",$apachealterado);<br />
exec("sudo /var/scripts/alt_postfix.sh $domain $usuario $dominio",$postfixalterado); <br />
<br />
} <br />
<br />
//Atualiazando o usuario<br />
<br />
<br />
$atualizar="UPDATE admin SET senha='$senha', dominio='$dominio', cliente='$cliente' WHERE id=$codigo";<br />
mysql_query($atualizar,$conexao);<br />
<br />
//conectando no servidor radius<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
$alt_radius = "UPDATE radcheck SET value='$senha' WHERE username='$usuario'";<br />
mysql_query($alt_radius,$con_rad);<br />
<br />
//echo mysql_error();<br />
mysql_close($conexao);<br />
mysql_close($con_rad);<br />
header("location: admin.php");<br />
}<br />
}<br />
}<br />
header("location: admin.php");<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
<br />
Na parte de instalação de equipamentos de rede foram feitas as configurações dos equipamentos necessários para que houvesse a comunicação entre os laboratórios de Redes 1 (onde ficarão os servidores das equipes) e Meios de Transmissão ( onde será disposta uma área de trabalho), e ainda para que cada equipe pudesse disponibilizar para seus clientes, acesso a internet via DSL. Os equipamentos necessários para essa ligação foram:<br />
<br />
-Roteadores<br />
<br />
-Modens SHDSL<br />
<br />
-Switch<br />
<br />
-DSLAM<br />
<br />
-Modens DSL<br />
<br />
Além disso foi necessário a configuração de um Concentrador de Acesso, e um servidor Radius. <br />
<br />
A primeira ligação e configurações que tiveram de ser feita foram dos modens SHDSL e roteadores.<br />
Os modens foram configurados a nível 'físico', modificando a pinagem da placa do mesmo, segunda a necessidade requerida. Já para os roteadores foi utilizado um software de gerenciamento utilizado via terminal, para estabelecer as rotas e ip's, o minicom, que requer algumas configurações pelo seu menu. <br />
Para entrar com o minicom, fazer no terminial<br />
<br />
minicom -s <br />
<br />
Para configurar o minicom, selecione a opção : "Configuração da porta serial"<br />
<br />
┌─────────────[configuração]──────────────┐<br />
│ Nomes de arquivos e rotas<br />
│ Protocolos de transferência de arquivos<br />
│ Configuração da porta serial<br />
│ Modem e discagem<br />
│ Tela e teclado<br />
│ Salvar configuração como dfl<br />
│ Salvar configuração como<br />
│ Sair<br />
│ Sair do Minicom<br />
└────────────────────────────────────────┘<br />
<br />
Em seguida aparecerá:<br />
<br />
┌──────────────────────────────────────────────────────────┐<br />
│ A – Dispositivo Serial : /dev/tty1<br />
│ B – Localização do Arquivo de Travamento : /var/lock<br />
│ C – Programa de Entrada :<br />
│ D – Programa de Saída :<br />
│ E – Bps/Paridade/Bits : 38400 8N1<br />
│ F – Controle de Fluxo por Hardware : Sim<br />
│ G – Controle de Fluxo por Software : Não<br />
│<br />
│ Alterar qual configuração?<br />
└──────────────────────────────────────────────────────────┘<br />
<br />
Altere as seguintes opções:<br />
<br />
Dispositivo Serial : /dev/ttSy0<br />
Bps/Paridade/Bits : 9600 8N1<br />
Controle de Fluxo por Hardware : Não<br />
<br />
Após, volte ao menu principal, e salve a configuração como 'Salvar configuração com dfl', e saia do minicom com 'sair'.<br />
Agora já é possível acessar o roteador desejado, no caso o roteador cisco 2500, localizado no Lab. Meios, logando com o usuário e senha vindos de 'fábrica'. Após se logar dar os seguintes comandos:<br />
<br />
enable;<br />
<br />
configure terminal;<br />
<br />
Para configurar a interface serial:<br />
<br />
interface serial 0;<br />
ip address 10.0.0.2/30;<br />
encapsulation ppp;<br />
exit;<br />
<br />
Para configurar a interface ethernet:<br />
interface fastethernet 0;<br />
ip address 192.168.0.1/24;<br />
exit;<br />
exit;<br />
<br />
Para salvar as configurações:<br />
<br />
wr;<br />
<br />
<br />
A mesma configuração foi feita no roteador do Lab. Redes 1, mudando apenas os endereços.<br />
As rotas também tiveram de ser configuradas, no caso, o do Lab. Meios teve rota para o roteador do Lab. Redes.<br />
<br />
Após feita as configurações nos roteadores e modens, os mesmos já estavam se comunicando entre si. Era necessário configurar o restante dos euipamentoS.<br />
O DSLAM foi basicamente configurado pelo professor Sobral, assim como o Concentrador de Acesso (AC), que servirá para receber as solicitações de um 'cliente' e se autenticar no servidor Radius de cada equipe. O modem DSL foi configurado via software do mesmo, ele foi acessado através navegador pelo seu endereço: 10.1.1.1<br />
A página inicial será:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox.png|800px]]<br />
<br />
Ir para advanced setup, Wan, <br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-1.png|800px]]<br />
<br />
<br />
Configurar: Modo PPOE, Encapulamento SNAP/LLC:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-2.png|800px]]<br />
<br />
E Nat:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-4.png|800px]]<br />
<br />
E pronto.<br />
<br />
O servidor Radius que teve de ser configurado por cada equipe, em seu servidores, funciona como autenticador, no caso para o acesso via modem DSL.Ele deve funcionar com um banco de dados onde estarão cadastrados os clientes, e lá será sua base para a autenticação.<br />
Para instalá-lo:<br />
apt-get install freeradius-mysql<br />
<br />
Seus arquivos de configuração ficam no diretório /etc/freeradius<br />
Nossa equipe seguiu um tutorial da internet para auxiliar na configuração do Radius com o banco de dados.Site: http://www.howtoforge.com/authentication-authorization-and-accounting-with-freeradius-and-mysql-backend-and-webbased-management-with-daloradius<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg|800px]]<br />
[[Arquivo:Legendaa.jpg|500px]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34929Projeto Integrador - 2011.1 - Fenrir2011-07-12T01:00:43Z<p>Beatriz.s: /* Instalação de Equipamento de Redes */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documentação essa opção é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Domínio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Domínio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Opção que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br então qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Opção que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Opção que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS opções OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
[[Arquivo:Index_fenrir.png|400px]]<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
''foto admin''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Se você clicar em "Sair", a seguinte página é invocada, encerrando a seção, e redirecionando você para "index.php":<br />
<nowiki><?<br />
session_start();<br />
session_destroy();<br />
header("location: index.php");<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
''foto incluir''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
''foto excluir''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em alterar, a seguinte página aparece''':<br />
''foto alterar''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
$usuario = $_GET['user']; <br />
$cliente = $_GET['cliente']; <br />
$dmn = $_GET['dmn']; <br />
$senha = $_GET['pass']; <br />
$codigo = $_GET['codigo']; <br />
?><br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Alteracoes</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<br />
<form name="formoutroteste" action="alterando.php?codigo=<? echo $codigo ; ?>&senha=<? echo $senha ; ?>&cliente=<? echo $cliente ; ?>&dmn=<? echo $dmn ; ?>" method="post"><br />
<p>Usuario <br><br />
<input type="text" name="a" value="<? echo $usuario ?>"><br />
<p>Senha <br><br />
<input type="text" name="e" value="<? echo $senha ?>"><br />
<p>Cliente <br><br />
<input type="text" name="b"value="<? echo $cliente ?>"><br />
<p>Dominio <br><br />
<input type="text" name="c" value="<? echo $dmn ?>"><br />
<br />
<input type="submit" name="a_enviar" value="Alterar"><br />
</form><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao alterar algum campo(com exceção do usuário, que não pode ser alterado), o administrador é redirecionado para a página "alterando.php", onde as alterações são feitas:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
#-------------------------------------------------------------------<br />
#NOVOS VALORES<br />
$usuario = $_POST['a'];<br />
$cliente = $_POST['b'];<br />
$dominio = $_POST['c'];<br />
$senha = $_POST['e'];<br />
#CODIGO PARA LOCALIZAR NO MYSQL<br />
$codigo = $_GET['codigo'];<br />
#VALORES QUE ESTAO NA TABELA (PODEMOS DIZER "ANTIGOS")<br />
$pass = $_GET['senha'];<br />
$domain = $_GET['dmn'];<br />
$client = $_GET['cliente'];<br />
#----------------<br />
#--------------------------<br />
#------------------------------------------<br />
#testando se o dominio nao foi escolhido<br />
//conectando no servidor<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
#-------------------------------------------------------<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
#------------------------------------------------<br />
<br />
<br />
//Aqui são feitos uma série de testes, se os dados forem diferentes<br />
<br />
if (($senha != $pass)){ //se a senha for diferente, roda o script para alterá-la<br />
<br />
exec("sudo /var/scripts/alt_senha.sh $usuario $senha",$senhaalterada);<br />
}<br />
<br />
//if (($cliente != $client)){ //testa se houve mudança no nome do cliente<br />
// exec("sudo /var/scripts/alt_cliente $client",$clientealterado);<br />
//}<br />
<br />
<br />
if (($dominio != $domain)){ //testa se houve mudança no domínio, a mudança mais significativa<br />
exec("sudo /var/scripts/alt_dns.sh $domain $dominio",$dominioalterado);<br />
exec("sudo /var/scripts/alt_apache.sh $domain $dominio",$apachealterado);<br />
exec("sudo /var/scripts/alt_postfix.sh $domain $usuario $dominio",$postfixalterado); <br />
<br />
} <br />
<br />
//Atualiazando o usuario<br />
<br />
<br />
$atualizar="UPDATE admin SET senha='$senha', dominio='$dominio', cliente='$cliente' WHERE id=$codigo";<br />
mysql_query($atualizar,$conexao);<br />
<br />
//conectando no servidor radius<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
$alt_radius = "UPDATE radcheck SET value='$senha' WHERE username='$usuario'";<br />
mysql_query($alt_radius,$con_rad);<br />
<br />
//echo mysql_error();<br />
mysql_close($conexao);<br />
mysql_close($con_rad);<br />
header("location: admin.php");<br />
}<br />
}<br />
}<br />
header("location: admin.php");<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
<br />
Na parte de instalação de equipamentos de rede foram feitas as configurações dos equipamentos necessários para que houvesse a comunicação entre os laboratórios de Redes 1 (onde ficarão os servidores das equipes) e Meios de Transmissão ( onde será disposta uma área de trabalho), e ainda para que cada equipe pudesse disponibilizar para seus clientes, acesso a internet via DSL. Os equipamentos necessários para essa ligação foram:<br />
<br />
-Roteadores<br />
<br />
-Modens SHDSL<br />
<br />
-Switch<br />
<br />
-DSLAM<br />
<br />
-Modens DSL<br />
<br />
Além disso foi necessário a configuração de um Concentrador de Acesso, e um servidor Radius. <br />
<br />
A primeira ligação e configurações que tiveram de ser feita foram dos modens SHDSL e roteadores.<br />
Os modens foram configurados a nível 'físico', modificando a pinagem da placa do mesmo, segunda a necessidade requerida. Já para os roteadores foi utilizado um software de gerenciamento utilizado via terminal, para estabelecer as rotas e ip's, o minicom, que requer algumas configurações pelo seu menu. <br />
Para entrar com o minicom, fazer no terminial<br />
<br />
minicom -s <br />
<br />
Para configurar o minicom, selecione a opção : "Configuração da porta serial"<br />
<br />
┌─────────────[configuração]──────────────┐<br />
│ Nomes de arquivos e rotas<br />
│ Protocolos de transferência de arquivos<br />
│ Configuração da porta serial<br />
│ Modem e discagem<br />
│ Tela e teclado<br />
│ Salvar configuração como dfl<br />
│ Salvar configuração como<br />
│ Sair<br />
│ Sair do Minicom<br />
└────────────────────────────────────────┘<br />
<br />
Em seguida aparecerá:<br />
<br />
┌──────────────────────────────────────────────────────────┐<br />
│ A – Dispositivo Serial : /dev/tty1<br />
│ B – Localização do Arquivo de Travamento : /var/lock<br />
│ C – Programa de Entrada :<br />
│ D – Programa de Saída :<br />
│ E – Bps/Paridade/Bits : 38400 8N1<br />
│ F – Controle de Fluxo por Hardware : Sim<br />
│ G – Controle de Fluxo por Software : Não<br />
│<br />
│ Alterar qual configuração?<br />
└──────────────────────────────────────────────────────────┘<br />
<br />
Altere as seguintes opções:<br />
<br />
Dispositivo Serial : /dev/ttSy0<br />
Bps/Paridade/Bits : 9600 8N1<br />
Controle de Fluxo por Hardware : Não<br />
<br />
Após, volte ao menu principal, e salve a configuração como 'Salvar configuração com dfl', e saia do minicom com 'sair'.<br />
Agora já é possível acessar o roteador desejado, no caso o roteador cisco 2500, localizado no Lab. Meios, logando com o usuário e senha vindos de 'fábrica'. Após se logar dar os seguintes comandos:<br />
<br />
enable;<br />
<br />
configure terminal;<br />
<br />
Para configurar a interface serial:<br />
<br />
interface serial 0;<br />
ip address 10.0.0.2/30;<br />
encapsulation ppp;<br />
exit;<br />
<br />
Para configurar a interface ethernet:<br />
interface fastethernet 0;<br />
ip address 192.168.0.1/24;<br />
exit;<br />
exit;<br />
<br />
Para salvar as configurações:<br />
<br />
wr;<br />
<br />
<br />
A mesma configuração foi feita no roteador do Lab. Redes 1, mudando apenas os endereços.<br />
As rotas também tiveram de ser configuradas, no caso, o do Lab. Meios teve rota para o roteador do Lab. Redes.<br />
<br />
Após feita as configurações nos roteadores e modens, os mesmos já estavam se comunicando entre si. Era necessário configurar o restante dos euipamentoS.<br />
O DSLAM foi basicamente configurado pelo professor Sobral, assim como o Concentrador de Acesso (AC), que servirá para receber as solicitações de um 'cliente' e se autenticar no servidor Radius de cada equipe. O modem DSL foi configurado via software do mesmo, ele foi acessado através navegador pelo seu endereço: 10.1.1.1<br />
A página inicial será:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox.png|800px]]<br />
<br />
Ir para advanced setup, Wan, <br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-1.png|800px]]<br />
<br />
<br />
Configurar: Modo PPOE, Encapulamento SNAP/LLC:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-2.png|800px]]<br />
<br />
E Nat:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-4.png|800px]]<br />
<br />
E pronto.<br />
<br />
O servidor Radius que teve de ser configurado por cada equipe, em seu servidores, funciona como autenticador, no caso para o acesso via modem DSL.Ele deve funcionar com um banco de dados onde estarão cadastrados os clientes, e lá será sua base para a autenticação.<br />
Para instalá-lo:<br />
apt-get install freeradius-mysql<br />
<br />
Seus arquivos de configuração ficam no diretório /etc/freeradius<br />
<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg|800px]]<br />
[[Arquivo:Legendaa.jpg|500px]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34928Projeto Integrador - 2011.1 - Fenrir2011-07-12T00:59:57Z<p>Beatriz.s: </p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documentação essa opção é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Domínio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Domínio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Opção que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br então qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Opção que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Opção que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS opções OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
[[Arquivo:Index_fenrir.png|400px]]<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
''foto admin''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Se você clicar em "Sair", a seguinte página é invocada, encerrando a seção, e redirecionando você para "index.php":<br />
<nowiki><?<br />
session_start();<br />
session_destroy();<br />
header("location: index.php");<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
''foto incluir''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
''foto excluir''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em alterar, a seguinte página aparece''':<br />
''foto alterar''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
$usuario = $_GET['user']; <br />
$cliente = $_GET['cliente']; <br />
$dmn = $_GET['dmn']; <br />
$senha = $_GET['pass']; <br />
$codigo = $_GET['codigo']; <br />
?><br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Alteracoes</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<br />
<form name="formoutroteste" action="alterando.php?codigo=<? echo $codigo ; ?>&senha=<? echo $senha ; ?>&cliente=<? echo $cliente ; ?>&dmn=<? echo $dmn ; ?>" method="post"><br />
<p>Usuario <br><br />
<input type="text" name="a" value="<? echo $usuario ?>"><br />
<p>Senha <br><br />
<input type="text" name="e" value="<? echo $senha ?>"><br />
<p>Cliente <br><br />
<input type="text" name="b"value="<? echo $cliente ?>"><br />
<p>Dominio <br><br />
<input type="text" name="c" value="<? echo $dmn ?>"><br />
<br />
<input type="submit" name="a_enviar" value="Alterar"><br />
</form><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao alterar algum campo(com exceção do usuário, que não pode ser alterado), o administrador é redirecionado para a página "alterando.php", onde as alterações são feitas:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
#-------------------------------------------------------------------<br />
#NOVOS VALORES<br />
$usuario = $_POST['a'];<br />
$cliente = $_POST['b'];<br />
$dominio = $_POST['c'];<br />
$senha = $_POST['e'];<br />
#CODIGO PARA LOCALIZAR NO MYSQL<br />
$codigo = $_GET['codigo'];<br />
#VALORES QUE ESTAO NA TABELA (PODEMOS DIZER "ANTIGOS")<br />
$pass = $_GET['senha'];<br />
$domain = $_GET['dmn'];<br />
$client = $_GET['cliente'];<br />
#----------------<br />
#--------------------------<br />
#------------------------------------------<br />
#testando se o dominio nao foi escolhido<br />
//conectando no servidor<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
#-------------------------------------------------------<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
#------------------------------------------------<br />
<br />
<br />
//Aqui são feitos uma série de testes, se os dados forem diferentes<br />
<br />
if (($senha != $pass)){ //se a senha for diferente, roda o script para alterá-la<br />
<br />
exec("sudo /var/scripts/alt_senha.sh $usuario $senha",$senhaalterada);<br />
}<br />
<br />
//if (($cliente != $client)){ //testa se houve mudança no nome do cliente<br />
// exec("sudo /var/scripts/alt_cliente $client",$clientealterado);<br />
//}<br />
<br />
<br />
if (($dominio != $domain)){ //testa se houve mudança no domínio, a mudança mais significativa<br />
exec("sudo /var/scripts/alt_dns.sh $domain $dominio",$dominioalterado);<br />
exec("sudo /var/scripts/alt_apache.sh $domain $dominio",$apachealterado);<br />
exec("sudo /var/scripts/alt_postfix.sh $domain $usuario $dominio",$postfixalterado); <br />
<br />
} <br />
<br />
//Atualiazando o usuario<br />
<br />
<br />
$atualizar="UPDATE admin SET senha='$senha', dominio='$dominio', cliente='$cliente' WHERE id=$codigo";<br />
mysql_query($atualizar,$conexao);<br />
<br />
//conectando no servidor radius<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
$alt_radius = "UPDATE radcheck SET value='$senha' WHERE username='$usuario'";<br />
mysql_query($alt_radius,$con_rad);<br />
<br />
//echo mysql_error();<br />
mysql_close($conexao);<br />
mysql_close($con_rad);<br />
header("location: admin.php");<br />
}<br />
}<br />
}<br />
header("location: admin.php");<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
== Instalação de Equipamento de Redes ==<br />
<br />
Na parte de instalação de equipamentos de rede foram feitas as configurações dos equipamentos necessários para que houvesse a comunicação entre os laboratórios de Redes 1 (onde ficarão os servidores das equipes) e Meios de Transmissão ( onde será disposta uma área de trabalho), e ainda para que cada equipe pudesse disponibilizar para seus clientes, acesso a internet via DSL. Os equipamentos necessários para essa ligação foram:<br />
<br />
-Roteadores<br />
<br />
-Modens SHDSL<br />
<br />
-Switch<br />
<br />
-DSLAM<br />
<br />
-Modens DSL<br />
<br />
Além disso foi necessário a configuração de um Concentrador de Acesso, e um servidor Radius. <br />
<br />
A primeira ligação e configurações que tiveram de ser feita foram dos modens SHDSL e roteadores.<br />
Os modens foram configurados a nível 'físico', modificando a pinagem da placa do mesmo, segunda a necessidade requerida. Já para os roteadores foi utilizado um software de gerenciamento utilizado via terminal, para estabelecer as rotas e ip's, o minicom, que requer algumas configurações pelo seu menu. <br />
Para entrar com o minicom, fazer no terminial<br />
<br />
minicom -s <br />
<br />
Para configurar o minicom, selecione a opção : "Configuração da porta serial"<br />
<br />
┌─────────────[configuração]──────────────┐<br />
│ Nomes de arquivos e rotas<br />
│ Protocolos de transferência de arquivos<br />
│ Configuração da porta serial<br />
│ Modem e discagem<br />
│ Tela e teclado<br />
│ Salvar configuração como dfl<br />
│ Salvar configuração como<br />
│ Sair<br />
│ Sair do Minicom<br />
└────────────────────────────────────────┘<br />
<br />
Em seguida aparecerá:<br />
<br />
┌──────────────────────────────────────────────────────────┐<br />
│ A – Dispositivo Serial : /dev/tty1<br />
│ B – Localização do Arquivo de Travamento : /var/lock<br />
│ C – Programa de Entrada :<br />
│ D – Programa de Saída :<br />
│ E – Bps/Paridade/Bits : 38400 8N1<br />
│ F – Controle de Fluxo por Hardware : Sim<br />
│ G – Controle de Fluxo por Software : Não<br />
│<br />
│ Alterar qual configuração?<br />
└──────────────────────────────────────────────────────────┘<br />
<br />
Altere as seguintes opções:<br />
<br />
Dispositivo Serial : /dev/ttSy0<br />
Bps/Paridade/Bits : 9600 8N1<br />
Controle de Fluxo por Hardware : Não<br />
<br />
Após, volte ao menu principal, e salve a configuração como 'Salvar configuração com dfl', e saia do minicom com 'sair'.<br />
Agora já é possível acessar o roteador desejado, no caso o roteador cisco 2500, localizado no Lab. Meios, logando com o usuário e senha vindos de 'fábrica'. Após se logar dar os seguintes comandos:<br />
<br />
enable;<br />
<br />
configure terminal;<br />
<br />
Para configurar a interface serial:<br />
<br />
interface serial 0;<br />
ip address 10.0.0.2/30;<br />
encapsulation ppp;<br />
exit;<br />
<br />
Para configurar a interface ethernet:<br />
interface fastethernet 0;<br />
ip address 192.168.0.1/24;<br />
exit;<br />
exit;<br />
<br />
Para salvar as configurações:<br />
<br />
wr;<br />
<br />
<br />
A mesma configuração foi feita no roteador do Lab. Redes 1, mudando apenas os endereços.<br />
As rotas também tiveram de ser configuradas, no caso, o do Lab. Meios teve rota para o roteador do Lab. Redes.<br />
<br />
Após feita as configurações nos roteadores e modens, os mesmos já estavam se comunicando entre si. Era necessário configurar o restante dos euipamentoS.<br />
O DSLAM foi basicamente configurado pelo professor Sobral, assim como o Concentrador de Acesso (AC), que servirá para receber as solicitações de um 'cliente' e se autenticar no servidor Radius de cada equipe. O modem DSL foi configurado via software do mesmo, ele foi acessado através navegador pelo seu endereço: 10.1.1.1<br />
A página inicial será:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox.png|800px]]<br />
<br />
Ir para advanced setup, Wan, <br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-1.png|800px]]<br />
<br />
<br />
Configurar: Modo PPOE, Encapulamento SNAP/LLC:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-2.png|800px]]<br />
<br />
E Nat:<br />
<br />
[[Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-4.png|800px]]<br />
<br />
E pronto.<br />
<br />
O servidor Radius que teve de ser configurado por cada equipe, em seu servidores, funciona como autenticador, no caso para o acesso via modem DSL.Ele deve funcionar com um banco de dados onde estarão cadastrados os clientes, e lá será sua base para a autenticação.<br />
Para instalá-lo:<br />
apt-get install freeradius-mysql<br />
<br />
Seus arquivos de configuração ficam no diretório /etc/freeradius<br />
<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg|800px]]<br />
[[Arquivo:Legendaa.jpg|500px]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-4.png&diff=34927Arquivo:Captura de tela-ADSL 2+ Router - Mozilla Firefox-4.png2011-07-12T00:57:19Z<p>Beatriz.s: </p>
<hr />
<div></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-2.png&diff=34926Arquivo:Captura de tela-ADSL 2+ Router - Mozilla Firefox-2.png2011-07-12T00:54:06Z<p>Beatriz.s: </p>
<hr />
<div></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox-1.png&diff=34925Arquivo:Captura de tela-ADSL 2+ Router - Mozilla Firefox-1.png2011-07-12T00:52:17Z<p>Beatriz.s: </p>
<hr />
<div></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:Captura_de_tela-ADSL_2%2B_Router_-_Mozilla_Firefox.png&diff=34923Arquivo:Captura de tela-ADSL 2+ Router - Mozilla Firefox.png2011-07-12T00:49:40Z<p>Beatriz.s: </p>
<hr />
<div></div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34919Projeto Integrador - 2011.1 - Fenrir2011-07-12T00:21:16Z<p>Beatriz.s: /* Postfix */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documentação essa opção é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Domínio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Domínio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Opção que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br então qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Opção que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Opção que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS opções OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
''foto index''<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
''foto admin''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Se você clicar em "Sair", a seguinte página é invocada, encerrando a seção, e redirecionando você para "index.php":<br />
<nowiki><?<br />
session_start();<br />
session_destroy();<br />
header("location: index.php");<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
''foto incluir''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
''foto excluir''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em alterar, a seguinte página aparece''':<br />
''foto alterar''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
$usuario = $_GET['user']; <br />
$cliente = $_GET['cliente']; <br />
$dmn = $_GET['dmn']; <br />
$senha = $_GET['pass']; <br />
$codigo = $_GET['codigo']; <br />
?><br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Alteracoes</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<br />
<form name="formoutroteste" action="alterando.php?codigo=<? echo $codigo ; ?>&senha=<? echo $senha ; ?>&cliente=<? echo $cliente ; ?>&dmn=<? echo $dmn ; ?>" method="post"><br />
<p>Usuario <br><br />
<input type="text" name="a" value="<? echo $usuario ?>"><br />
<p>Senha <br><br />
<input type="text" name="e" value="<? echo $senha ?>"><br />
<p>Cliente <br><br />
<input type="text" name="b"value="<? echo $cliente ?>"><br />
<p>Dominio <br><br />
<input type="text" name="c" value="<? echo $dmn ?>"><br />
<br />
<input type="submit" name="a_enviar" value="Alterar"><br />
</form><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao alterar algum campo(com exceção do usuário, que não pode ser alterado), o administrador é redirecionado para a página "alterando.php", onde as alterações são feitas:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
#-------------------------------------------------------------------<br />
#NOVOS VALORES<br />
$usuario = $_POST['a'];<br />
$cliente = $_POST['b'];<br />
$dominio = $_POST['c'];<br />
$senha = $_POST['e'];<br />
#CODIGO PARA LOCALIZAR NO MYSQL<br />
$codigo = $_GET['codigo'];<br />
#VALORES QUE ESTAO NA TABELA (PODEMOS DIZER "ANTIGOS")<br />
$pass = $_GET['senha'];<br />
$domain = $_GET['dmn'];<br />
$client = $_GET['cliente'];<br />
#-------------------------------------------------------------------<br />
#MAY THE MADNESS BEGIN!-----------------------------<br />
#------------------------------------------<br />
#testando se o dominio nao foi escolhido<br />
//conectando no servidor<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
#-------------------------------------------------------<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
#------------------------------------------------<br />
<br />
<br />
if (($senha != $pass)){<br />
<br />
exec("sudo /var/scripts/alt_senha.sh $usuario $senha",$senhaalterada);<br />
}<br />
<br />
//if (($cliente != $client)){<br />
// exec("sudo /var/scripts/alt_cliente $client",$clientealterado);<br />
//}<br />
<br />
<br />
if (($dominio != $domain)){<br />
exec("sudo /var/scripts/alt_dns.sh $domain $dominio",$dominioalterado);<br />
exec("sudo /var/scripts/alt_apache.sh $domain $dominio",$apachealterado);<br />
exec("sudo /var/scripts/alt_postfix.sh $domain $usuario $dominio",$postfixalterado); <br />
<br />
} <br />
<br />
//Atualiazando o usuario<br />
<br />
<br />
$atualizar="UPDATE admin SET senha='$senha', dominio='$dominio', cliente='$cliente' WHERE id=$codigo";<br />
mysql_query($atualizar,$conexao);<br />
<br />
//conectando no servidor radius<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
$alt_radius = "UPDATE radcheck SET value='$senha' WHERE username='$usuario'";<br />
mysql_query($alt_radius,$con_rad);<br />
<br />
//echo mysql_error();<br />
mysql_close($conexao);<br />
mysql_close($con_rad);<br />
header("location: admin.php");<br />
}<br />
}<br />
}<br />
header("location: admin.php");<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
== Instalação de Equipamento de Redes ==<br />
<br />
Na parte de instalação de equipamentos de rede foram feitas as configurações dos equipamentos necessários para que houvesse a comunicação entre os laboratórios de Redes 1 (onde ficarão os servidores das equipes) e Meios de Transmissão ( onde será disposta uma área de trabalho), e ainda para que cada equipe pudesse disponibilizar para seus clientes, acesso a internet via DSL. Os equipamentos necessários para essa ligação foram:<br />
<br />
-Roteadores<br />
<br />
-Modens SHDSL<br />
<br />
-Switch<br />
<br />
-DSLAM<br />
<br />
-Modens DSL<br />
<br />
A primeira ligação e configurações que tiveram de ser feita foram dos modens SHDSL e roteadores.<br />
Os modens foram configurados a nível 'físico', modificando a pinagem da placa do mesmo, segunda a necessidade requerida. Já para os roteadores foi utilizado um software de gerenciamento utilizado via terminal, para estabelecer as rotas e ip's, o minicom, que requer algumas configurações pelo seu menu. <br />
Para entrar com o minicom, fazer no terminial<br />
<br />
minicom -s <br />
<br />
Para configurar o minicom, selecione a opção : "Configuração da porta serial"<br />
<br />
┌─────────────[configuração]──────────────┐<br />
│ Nomes de arquivos e rotas<br />
│ Protocolos de transferência de arquivos<br />
│ Configuração da porta serial<br />
│ Modem e discagem<br />
│ Tela e teclado<br />
│ Salvar configuração como dfl<br />
│ Salvar configuração como<br />
│ Sair<br />
│ Sair do Minicom<br />
└────────────────────────────────────────┘<br />
<br />
Em seguida aparecerá:<br />
<br />
┌──────────────────────────────────────────────────────────┐<br />
│ A – Dispositivo Serial : /dev/tty1<br />
│ B – Localização do Arquivo de Travamento : /var/lock<br />
│ C – Programa de Entrada :<br />
│ D – Programa de Saída :<br />
│ E – Bps/Paridade/Bits : 38400 8N1<br />
│ F – Controle de Fluxo por Hardware : Sim<br />
│ G – Controle de Fluxo por Software : Não<br />
│<br />
│ Alterar qual configuração?<br />
└──────────────────────────────────────────────────────────┘<br />
<br />
Altere as seguintes opções:<br />
<br />
Dispositivo Serial : /dev/ttSy0<br />
Bps/Paridade/Bits : 9600 8N1<br />
Controle de Fluxo por Hardware : Não<br />
<br />
Após, volte ao menu principal, e salve a configuração como 'Salvar configuração com dfl', e saia do minicom com 'sair'.<br />
Agora já é possível acessar o roteador desejado, no caso o roteador cisco 2500, logando com o usuário e senha dos mesmos. Após se logar dar os <br />
<br />
seguintes comandos:<br />
<br />
enable;<br />
configure terminal;<br />
<br />
Para configurar a interface serial:<br />
<br />
interface serial 0;<br />
ip address 10.0.0.2/30;<br />
encapsulation ppp;<br />
exit;<br />
<br />
Para configurar a interface ethernet:<br />
interface fastethernet 0;<br />
ip address 192.168.0.1/24;<br />
exit;<br />
exit;<br />
<br />
Para salvar as configurações:<br />
wr;<br />
<br />
<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg|800px]]<br />
[[Arquivo:Legendaa.jpg|500px]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34917Projeto Integrador - 2011.1 - Fenrir2011-07-12T00:15:26Z<p>Beatriz.s: /* Cabeamento Estruturado */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documenta��o essa op��o é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Dom�nio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Dom�nio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Op��o que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br ent�o qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Op��o que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Op��o que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS op��es OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
''foto index''<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
''foto admin''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Se você clicar em "Sair", a seguinte página é invocada, encerrando a seção, e redirecionando você para "index.php":<br />
<nowiki><?<br />
session_start();<br />
session_destroy();<br />
header("location: index.php");<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
''foto incluir''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
''foto excluir''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em alterar, a seguinte página aparece''':<br />
''foto alterar''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
$usuario = $_GET['user']; <br />
$cliente = $_GET['cliente']; <br />
$dmn = $_GET['dmn']; <br />
$senha = $_GET['pass']; <br />
$codigo = $_GET['codigo']; <br />
?><br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Alteracoes</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<br />
<form name="formoutroteste" action="alterando.php?codigo=<? echo $codigo ; ?>&senha=<? echo $senha ; ?>&cliente=<? echo $cliente ; ?>&dmn=<? echo $dmn ; ?>" method="post"><br />
<p>Usuario <br><br />
<input type="text" name="a" value="<? echo $usuario ?>"><br />
<p>Senha <br><br />
<input type="text" name="e" value="<? echo $senha ?>"><br />
<p>Cliente <br><br />
<input type="text" name="b"value="<? echo $cliente ?>"><br />
<p>Dominio <br><br />
<input type="text" name="c" value="<? echo $dmn ?>"><br />
<br />
<input type="submit" name="a_enviar" value="Alterar"><br />
</form><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Ao alterar algum campo(com exceção do usuário, que não pode ser alterado), o administrador é redirecionado para a página "alterando.php", onde as alterações são feitas:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
#-------------------------------------------------------------------<br />
#NOVOS VALORES<br />
$usuario = $_POST['a'];<br />
$cliente = $_POST['b'];<br />
$dominio = $_POST['c'];<br />
$senha = $_POST['e'];<br />
#CODIGO PARA LOCALIZAR NO MYSQL<br />
$codigo = $_GET['codigo'];<br />
#VALORES QUE ESTAO NA TABELA (PODEMOS DIZER "ANTIGOS")<br />
$pass = $_GET['senha'];<br />
$domain = $_GET['dmn'];<br />
$client = $_GET['cliente'];<br />
#-------------------------------------------------------------------<br />
#MAY THE MADNESS BEGIN!-----------------------------<br />
#------------------------------------------<br />
#testando se o dominio nao foi escolhido<br />
//conectando no servidor<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
#-------------------------------------------------------<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
#------------------------------------------------<br />
<br />
<br />
if (($senha != $pass)){<br />
<br />
exec("sudo /var/scripts/alt_senha.sh $usuario $senha",$senhaalterada);<br />
}<br />
<br />
//if (($cliente != $client)){<br />
// exec("sudo /var/scripts/alt_cliente $client",$clientealterado);<br />
//}<br />
<br />
<br />
if (($dominio != $domain)){<br />
exec("sudo /var/scripts/alt_dns.sh $domain $dominio",$dominioalterado);<br />
exec("sudo /var/scripts/alt_apache.sh $domain $dominio",$apachealterado);<br />
exec("sudo /var/scripts/alt_postfix.sh $domain $usuario $dominio",$postfixalterado); <br />
<br />
} <br />
<br />
//Atualiazando o usuario<br />
<br />
<br />
$atualizar="UPDATE admin SET senha='$senha', dominio='$dominio', cliente='$cliente' WHERE id=$codigo";<br />
mysql_query($atualizar,$conexao);<br />
<br />
//conectando no servidor radius<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
//selecao da base de dadosi<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
$alt_radius = "UPDATE radcheck SET value='$senha' WHERE username='$usuario'";<br />
mysql_query($alt_radius,$con_rad);<br />
<br />
//echo mysql_error();<br />
mysql_close($conexao);<br />
mysql_close($con_rad);<br />
header("location: admin.php");<br />
}<br />
}<br />
}<br />
header("location: admin.php");<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
== Instalação de Equipamento de Redes ==<br />
<br />
Na parte de instalação de equipamentos de rede foram feitas as configurações dos equipamentos necessários para que houvesse a comunicação entre os laboratórios de Redes 1 (onde ficarão os servidores das equipes) e Meios de Transmissão ( onde será disposta uma área de trabalho), e ainda para que cada equipe pudesse disponibilizar para seus clientes, acesso a internet via DSL. Os equipamentos necessários para essa ligação foram:<br />
<br />
-Roteadores<br />
<br />
-Modens SHDSL<br />
<br />
-Switch<br />
<br />
-DSLAM<br />
<br />
-Modens DSL<br />
<br />
A primeira ligação e configurações que tiveram de ser feita foram dos modens SHDSL e roteadores.<br />
Os modens foram configurados a nível 'físico', modificando a pinagem da placa do mesmo, segunda a necessidade requerida. Já para os roteadores foi utilizado um software de gerenciamento utilizado via terminal, para estabelecer as rotas e ip's, o minicom, que requer algumas configurações pelo seu menu. <br />
Para entrar com o minicom, fazer no terminial<br />
<br />
minicom -s <br />
<br />
Para configurar o minicom, selecione a opção : "Configuração da porta serial"<br />
<br />
┌─────────────[configuração]──────────────┐<br />
│ Nomes de arquivos e rotas<br />
│ Protocolos de transferência de arquivos<br />
│ Configuração da porta serial<br />
│ Modem e discagem<br />
│ Tela e teclado<br />
│ Salvar configuração como dfl<br />
│ Salvar configuração como<br />
│ Sair<br />
│ Sair do Minicom<br />
└────────────────────────────────────────┘<br />
<br />
Em seguida aparecerá:<br />
<br />
┌──────────────────────────────────────────────────────────┐<br />
│ A – Dispositivo Serial : /dev/tty1<br />
│ B – Localização do Arquivo de Travamento : /var/lock<br />
│ C – Programa de Entrada :<br />
│ D – Programa de Saída :<br />
│ E – Bps/Paridade/Bits : 38400 8N1<br />
│ F – Controle de Fluxo por Hardware : Sim<br />
│ G – Controle de Fluxo por Software : Não<br />
│<br />
│ Alterar qual configuração?<br />
└──────────────────────────────────────────────────────────┘<br />
<br />
Altere as seguintes opções:<br />
<br />
Dispositivo Serial : /dev/ttSy0<br />
Bps/Paridade/Bits : 9600 8N1<br />
Controle de Fluxo por Hardware : Não<br />
<br />
Após, volte ao menu principal, e salve a configuração como 'Salvar configuração com dfl', e saia do minicom com 'sair'.<br />
Agora já é possível acessar o roteador desejado, no caso o roteador cisco 2500, logando com o usuário e senha dos mesmos. Após se logar dar os <br />
<br />
seguintes comandos:<br />
<br />
enable;<br />
configure terminal;<br />
<br />
Para configurar a interface serial:<br />
<br />
interface serial 0;<br />
ip address 10.0.0.2/30;<br />
encapsulation ppp;<br />
exit;<br />
<br />
Para configurar a interface ethernet:<br />
interface fastethernet 0;<br />
ip address 192.168.0.1/24;<br />
exit;<br />
exit;<br />
<br />
Para salvar as configurações:<br />
wr;<br />
<br />
<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg|800px]]<br />
[[Arquivo:Legendaa.jpg|500px]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34915Projeto Integrador - 2011.1 - Fenrir2011-07-12T00:11:20Z<p>Beatriz.s: /* Instalação de Equipamento de Redes */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documenta��o essa op��o é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Dom�nio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Dom�nio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Op��o que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br ent�o qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Op��o que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Op��o que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS op��es OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
''foto index''<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
''foto admin''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
''foto incluir''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
''foto excluir''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
== Instalação de Equipamento de Redes ==<br />
<br />
Na parte de instalação de equipamentos de rede foram feitas as configurações dos equipamentos necessários para que houvesse a comunicação entre os laboratórios de Redes 1 (onde ficarão os servidores das equipes) e Meios de Transmissão ( onde será disposta uma área de trabalho), e ainda para que cada equipe pudesse disponibilizar para seus clientes, acesso a internet via DSL. Os equipamentos necessários para essa ligação foram:<br />
<br />
-Roteadores<br />
<br />
-Modens SHDSL<br />
<br />
-Switch<br />
<br />
-DSLAM<br />
<br />
-Modens DSL<br />
<br />
A primeira ligação e configurações que tiveram de ser feita foram dos modens SHDSL e roteadores.<br />
Os modens foram configurados a nível 'físico', modificando a pinagem da placa do mesmo, segunda a necessidade requerida. Já para os roteadores foi utilizado um software de gerenciamento utilizado via terminal, para estabelecer as rotas e ip's, o minicom, que requer algumas configurações pelo seu menu. <br />
Para entrar com o minicom, fazer no terminial<br />
<br />
minicom -s <br />
<br />
Para configurar o minicom, selecione a opção : "Configuração da porta serial"<br />
<br />
┌─────────────[configuração]──────────────┐<br />
│ Nomes de arquivos e rotas<br />
│ Protocolos de transferência de arquivos<br />
│ Configuração da porta serial<br />
│ Modem e discagem<br />
│ Tela e teclado<br />
│ Salvar configuração como dfl<br />
│ Salvar configuração como<br />
│ Sair<br />
│ Sair do Minicom<br />
└────────────────────────────────────────┘<br />
<br />
Em seguida aparecerá:<br />
<br />
┌──────────────────────────────────────────────────────────┐<br />
│ A – Dispositivo Serial : /dev/tty1<br />
│ B – Localização do Arquivo de Travamento : /var/lock<br />
│ C – Programa de Entrada :<br />
│ D – Programa de Saída :<br />
│ E – Bps/Paridade/Bits : 38400 8N1<br />
│ F – Controle de Fluxo por Hardware : Sim<br />
│ G – Controle de Fluxo por Software : Não<br />
│<br />
│ Alterar qual configuração?<br />
└──────────────────────────────────────────────────────────┘<br />
<br />
Altere as seguintes opções:<br />
<br />
Dispositivo Serial : /dev/ttSy0<br />
Bps/Paridade/Bits : 9600 8N1<br />
Controle de Fluxo por Hardware : Não<br />
<br />
Após, volte ao menu principal, e salve a configuração como 'Salvar configuração com dfl', e saia do minicom com 'sair'.<br />
Agora já é possível acessar o roteador desejado, no caso o roteador cisco 2500, logando com o usuário e senha dos mesmos. Após se logar dar os <br />
<br />
seguintes comandos:<br />
<br />
enable;<br />
configure terminal;<br />
<br />
Para configurar a interface serial:<br />
<br />
interface serial 0;<br />
ip address 10.0.0.2/30;<br />
encapsulation ppp;<br />
exit;<br />
<br />
Para configurar a interface ethernet:<br />
interface fastethernet 0;<br />
ip address 192.168.0.1/24;<br />
exit;<br />
exit;<br />
<br />
Para salvar as configurações:<br />
wr;<br />
<br />
<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
<br />
''Diagrama da rede:''<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg]]<br />
[[Arquivo:Legendaa.jpg]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34914Projeto Integrador - 2011.1 - Fenrir2011-07-12T00:06:24Z<p>Beatriz.s: /* Postfix */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
<br />
Os arquivos de configuração ficam no /etc/postfix<br />
As configurações do servidor de email ficm no /etc/postfix/main.cf<br />
<br />
#ARQUIVOS MODIFICADOS PARA DOMINIO DA EQUIPE FENRIR<br />
#---------------------------------------------------------------------<br />
#Segundo a documenta��o essa op��o é necessario para o funcionamento do emails alias (emails de subdominios)<br />
best_mx_transport = local<br />
# Maquina onde estáhospedado meu servidor de e-mails <br />
myhostname = mail.fenrir.sj.edu.br<br />
# Nome do meu Dom�nio<br />
mydomain = fenrir.sj.ifsc.edu.br<br />
# Nome do Dom�nio de origem (quando enviamos e-mails)<br />
myorigin = fenrir.sj.ifsc.edu.br<br />
# Op��o que ativa os dominios virtuais<br />
# Todos os Subdominio devem ser acrescentados no arquivo mydomains<br />
# O comando hash éigual o include. porem no manual do postfix se manda utilizar o hash ao inves do include<br />
virtual_alias_domains = hash:/etc/postfix/mydomains<br />
# Lista de dominios que nosso email pode receber ou seja:<br />
# $mydomain = fenrir.sj.ifsc.edu.br ent�o qualquer e-mail enviado para esse dominio nosso servidor de e-mails reconhecera que na verdade é pra ele esse e-maa<br />
il<br />
mydestination = $myhostname, $mydomain, $virtual_alias_domains<br />
<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
# Op��o que define por qual interface de rede ele vai receber e-mails <br />
# No nosso caso ativamos todas, ou seja se ele receber e-mail pela eth0 ou eth1 eth2 tanto faz pra ele não faz difereça<br />
inet_interfaces = all<br />
<br />
mynetworks_style = subnet<br />
#Op��o que define o que fazer com o e-mail com destino para um subdominio declarado no mydomains<br />
#No nosso caso mandamos redirecionar para usuarios Linux <br />
alias_maps = hash:/etc/postfix/virtual<br />
#Cria uma pasta para cada usuario e salva cada e-mail em arquivo texto separado<br />
home_mailbox = Maildir/<br />
#<br />
# TODOS AS OUTRAS op��es OPTAMOS POR DEIXAR DEFAULT<br />
#------------------------------------------------------<br />
relayhost =<br />
mailbox_size_limit = 0<br />
recipient_delimiter = + <br />
<br />
<br />
arquivo /etc/postfix/mydomains<br />
<br />
Todos os subdomínios são inseridos no arquivo /etc/postfix/mydomains, para inclui-los no servidor de email foi feito um arquivo virtual_alias_domains=hash:/etc/postfix/mydomains<br />
<br />
fenrir.sj.ifsc.edu.br OK<br />
azaghal.fenrir.sj.ifsc.edu.br OK<br />
marco.fenrir.sj.ifsc.edu.br OK<br />
sextafeira.fenrir.sj.ifsc.edu.br OK<br />
novoteste.fenrir.sj.ifsc.edu.br OK<br />
laksdalkdakljd.fenrir.sj.ifsc.edu.br OK<br />
<br />
arquivo /etc/postfix/virtual<br />
<br />
Neste arquivo coloco os usuários com os seus subdomínios<br />
<br />
fenrir@fenrir.sj.ifsc.edu.br fenrir<br />
azaghal@azaghal.fenrir.sj.ifsc.edu.br azaghal<br />
marco@marco.fenrir.sj.ifsc.edu.br marco<br />
sexta@sextafeira.fenrir.sj.ifsc.edu.br sexta<br />
novoteste@novoteste.fenrir.sj.ifsc.edu.br novoteste<br />
boromir@laksdalkdakljd.fenrir.sj.ifsc.edu.br boromir<br />
<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
'''Todas as páginas têm, como medida de segurança, uma seção(session), para impedir o acesso não autorizado às páginas, que têm caráter administrativo. Segue a configuração de sessão padrão:'''<br />
<br />
<nowiki><?<br />
session_start();//inicia a sessão<br />
if (isset($_SESSION['aut'])){ //testa se a seção é válida com um laço if - Se não for, vai para a index.php, se for, continua para o resto da página.<br />
header ("location: admin.php");<br />
}else{<br />
<br />
//resto da página<br />
}<br />
?></nowiki><br />
<br />
<br />
'''Página index:'''<br />
''foto index''<br />
<nowiki><?<br />
session_start();<br />
if (isset($_SESSION['aut'])){<br />
header ("location: admin.php");<br />
}else{<br />
?><br />
<html><br />
<head><br />
<meta http-equiv="Content-Type"<br />
content="text/html; charset=utf-8"><br />
<title>AdministraÃÃo de usuÃrios - Fenrir</title><br />
<style type="text/css"><br />
<!--<br />
html, body, form, fieldset {<br />
margin: 0px;<br />
padding: 0;<br />
}<br />
body {<br />
background: #FFF;<br />
color: #000;<br />
font-family: "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;<br />
line-height: 140%;<br />
font-size:12px;<br />
color:#fff;<br />
}<br />
#login {<br />
position:absolute;<br />
width:460px;<br />
height:210px;<br />
z-index:1;<br />
left: 50%;<br />
top: 50%;<br />
margin-left:-230px;<br />
margin-top:-105px;<br />
background:url(logo.jpg) center no-repeat #fff;<br />
}<br />
.inputbox {<br />
color: #666;<br />
font-size: 11px;<br />
margin: 2px 0 0 5px;<br />
padding: 2px;<br />
height:15px;<br />
width:166px;<br />
}<br />
</nowiki><br />
<br />
'''A seguir, a página admin.php, que funciona como uma página principal, mostrando uma tabela com os clientes cadastrados no sistema, além de dar a opção de incluir, deletar ou alterar os dados dos cadastrados.'''<br />
''foto admin''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset ( $_SESSION['aut'])){<br />
header ("location: index.php");<br />
}else{<br />
<br />
?><br />
<br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<br />
<title>Servidor Fenrir</title><br />
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /><br />
</head><br />
<style><br />
tr.linha, div.linha {<br />
background-color:#75AC68; <br />
}<br />
</style><br />
<body><br />
<body background="metal.jpg"> <br />
<br />
<?<br />
//conectando no servidor<br />
<br />
<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
<br />
//selecao da base de dados<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
//obtendo os registro da tabela contatos<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
?><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<br><br />
<p><a href="sair.php">Sair</a></p><br />
<br />
<table border="0" bgcolor=FFFFFF style="width: 100%" cellpascing="1" cellpadding="0"><br />
<caption></caption><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<col /><br />
<tbody><br />
<tr><br />
<td height="23" background="fundo.jpg" > Usuario </td><br />
<td height="23" background="fundo.jpg"> Senha</td><br />
<td height="23" background="fundo.jpg" align="center">Dominio </td><br />
<td height="23" background="fundo.jpg" align="center">E-mail</td><br />
<td height="23" background="fundo.jpg" align="center">Nome</td><br />
<td height="23" background="fundo.jpg" align="center">Acao</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
<td> </td><br />
</tr><br />
<?<br />
$i=0;<br />
while($linha = mysql_fetch_array($resultado)){<br />
$i++;<br />
if ($i%2==0) $classe = " class='linha'"; else $classe = "";<br />
?><br />
<tr <?=$classe?>><br />
<br />
<td><a href="alterar.php?user=<? echo $linha['usuario'];?>&cliente=<? echo $linha['cliente'];?>&dmn=<? echo $linha['dominio'];?>&codigo=<? echo $linha['id'];?>&pass=<? echo $linha['senha']; ?>"> <? echo $linha['usuario'];?> </a></td><br />
<td> <? echo $linha['senha']; ?> </td><br />
<td> <? echo $linha['dominio']; ?></td><br />
<td> <? echo $linha['usuario']; ?>@<? echo $linha['dominio']; ?>.fenrir.sj.ifsc.edu.br </td><br />
<td> <? echo $linha['cliente']; ?> </td><br />
<td><a href="excluir.php?usuario=<? echo $linha['usuario'];?>&codigo=<? echo $linha['id']; ?>&dominio=<? echo $linha['dominio'];?>&cliente=<? echo $linha['cliente']; ?>">Excluir </a></td><br />
<?<br />
}<br />
//abaixo está o código para a imagem de incluir<br />
//<img border="0" src="atualizar.jpg" width="30" height="30"></a><? echo $linha['usuario']; <br />
?><br />
<tr><br />
<td height="23" background="fundo.jpg" > </td><br />
<td height="23" background="fundo.jpg"> </td><br />
<td height="23" background="fundo.jpg" align="center"> </td><br />
<td height="23" background="fundo.jpg" align="center"></td><br />
<td height="23" background="fundo.jpg" align="center"> . </td><br />
</tr><br />
<br />
<br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p></p><br />
<br />
<p><a href="incluir.php"><img border="0" src="cadastro.gif" width="30" height="30" </a>Adicionar Novo Dominio<br />
</body><br />
</html><br />
<?<br />
//liberando a consulta<br />
mysql_free_result($resultado);<br />
<br />
//fechando a conexao<br />
mysql_close($conexao);<br />
}<br />
?></nowiki><br />
<br />
'''Ao clicar em "adicionar um usuário", a pagina é redirecionada para incluir.php, que seve para colocar os dados do novo cliente:'''<br />
''foto incluir''<br />
<br />
<nowiki><?<br />
session_start();<br />
if (!isset($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
?> <br />
<br />
<html><br />
<head><br />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><br />
<br />
<title>Incluir clientes no Servidor Fenrir</title><br />
</head><br />
<body><br />
<body background="metal.jpg"><br />
<form name="formTeste" action="conectar.php" method="get"><br />
<br />
<center><br />
<p>Usuario: <br><br />
<input type="text" name="usr"><br />
<p>Senha: <br><br />
<input type="text" name="pass"><br />
<p>Dominio: <br><br />
<input type="text" name="dm"><br />
<p>Cliente: <br><br />
<input type="text" name="nm"><br />
<input type="submit" name="b_enviar" value="Enviar"><br />
<p><a href="admin.php">Lista de Clientes</a><br />
</form><br />
</center><br />
<br />
</body><br />
</html><br />
<br />
<?<br />
}<br />
?></nowiki><br />
<br />
'''Os dados anteriores são enviados pelo método "get", para a página seguinte, conectar.php:'''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
$usuario = trim($_GET['usr']);<br />
$cliente = trim($_GET['nm']);<br />
$senha= trim($_GET['pass']);<br />
$dominio = trim($_GET['dm']);<br />
<br />
if ((empty($usuario)) || (empty($cliente)) || (empty($dominio)) || (empty($senha))) {<br />
<br />
header("location: erro.php");<br />
<br />
}else{<br />
//passando um "filtro" nas variaves<br />
$usuario = strtolower($usuario);<br />
//troca possiveis letras maiusculas por minusculas<br />
$dominio = strtolower($dominio);<br />
$senha = strtolower($senha);<br />
<br />
//retira possiveis espaços<br />
$usuario = str_replace(" ","",$usuario);<br />
$senha = str_replace(" ","",$senha);<br />
$dominio = str_replace(" ","",$dominio);<br />
//<br />
//<br />
$conexao = mysql_connect("localhost","fenrir","20bmw11");<br />
$base_ok = mysql_select_db("fenrir",$conexao);<br />
<br />
<br />
<br />
//-----------------------------------<br />
//verifica se já existe um dominio de mesmo nome<br />
//-----------------------------<br />
<br />
$consulta = "SELECT * from admin";<br />
$resultado = mysql_query($consulta,$conexao);<br />
while($linha = mysql_fetch_array($resultado)){<br />
if ((! $linha['dominio'] == $dominio) || (! $linha['usuario'] == $usuario)) {<br />
<br />
<br />
//---------------------------------<br />
//---------------------------------<br />
<br />
$inserir = "INSERT INTO admin (usuario,senha,dominio,cliente) VALUES ('$usuario','$senha','$dominio','$cliente')";<br />
//mandando os dados<br />
mysql_query($inserir,$conexao);<br />
//echo mysql_error($conexao)<br />
//-------------------------------------------<br />
//INSERINDO NA TABELA DO RADIUS---------<br />
//----------------------------------<br />
<br />
<br />
<br />
$con_rad = mysql_connect("localhost","freerad","bmwls2011");<br />
$base_ok = mysql_select_db("radius",$con_rad);<br />
<br />
$inserir_radius = "INSERT INTO radcheck (username,attribute,op,value) VALUES ('$usuario','password','==','$senha')";<br />
<br />
mysql_query($inserir_radius,$con_rad);<br />
<br />
<br />
mysql_close($con_rad);<br />
mysql_close($conexao);<br />
<br />
exec("sudo /var/scripts/add_user.sh $usuario $senha",$adduser);<br />
exec("sudo /var/scripts/add_apache.sh $dominio",$apache);<br />
exec("sudo /var/scripts/add_dns.sh $dominio",$dns);<br />
<br />
exec("sudo /var/scripts/add_postfix.sh $dominio $usuario",$postfix);<br />
header("location: admin.php");<br />
}<br />
}<br />
<br />
}<br />
}<br />
header("location: admin.php");<br />
<br />
?><br />
</nowiki><br />
<br />
'''Ao clicar em excluir um usuário, a página vai para exluir.php:'''<br />
''foto excluir''<br />
<nowiki><?<br />
session_start();<br />
if (!isset ($_SESSION['aut'])){<br />
header("location: index.php");<br />
}else{<br />
<br />
<br />
$usuario = $_GET['usuario'];<br />
$codigo = $_GET['codigo'];<br />
$dominio = $_GET['dominio']; <br />
$cliente = $_GET['cliente']; <br />
?><br />
<html><br />
<head><br />
<br />
<title>Excluir Cliente</title><br />
</head><br />
<body><br />
<body background="metal.jpg"> <br />
Você realmente deseja exclur o cliente <?echo $cliente; ?> ?<br /><br />
<br />
<a href="excluir_logica.php?codigo=<? echo $_GET['codigo']; ?>&dominio=<? echo $_GET['dominio']; ?>&usuario=<? echo $_GET['usuario'];?>">Sim</a><br />
<a href="admin.php">Não</a><br /><br />
</body><br />
</html><br />
<?<br />
}<br />
?></nowiki><br />
<br />
== Instalação de Equipamento de Redes ==<br />
''Diagrama da rede:''<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg]]<br />
[[Arquivo:Legendaa.jpg]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34904Projeto Integrador - 2011.1 - Fenrir2011-07-11T23:18:17Z<p>Beatriz.s: /* DNS */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#adicinar subdominio<br />
#subdominio<br />
<br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
<br />
#!/bin/bash<br />
#remover subdominio<br />
#dominio<br />
conf=$1<br />
<br />
if [ ! "$#" -lt "1" ]<br />
<br />
then<br />
#retira do named.conf a linha onde o dominio esta localizado. Isso por si só"desativa" o dominio<br />
<br />
sed -i /$conf.fenrir/Id /etc/bind/named.conf<br />
#para nao acumular lixo no /etc/bind os outros arquivos de configuracao sao remoridos<br />
rm /etc/bind/$conf.fenrir.config<br />
rm /etc/bind/$conf.fenrir.zone<br />
<br />
service bind9 restart<br />
fi<br />
<br />
<br />
<br />
#!/bin/bash<br />
#alterar dominio<br />
#dominio<br />
conf=$1<br />
#novo dominio<br />
conf2=$2<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#troca o antido dominio pelo novo no named.conf <br />
sed -i s/$conf.fenrir/$conf2.fenrir/g /etc/bind/named.conf <br />
#troca o dominio antigo pelo novo nos arquivos de configuracao<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.config<br />
sed -i s/$conf/$conf2/g /etc/bind/$conf.fenrir.zone <br />
#altera o nome dos arquivos de configuracao<br />
mv /etc/bind/$conf.fenrir.zone /etc/bind/$conf2.fenrir.zone<br />
mv /etc/bind/$conf.fenrir.config /etc/bind/$conf2.fenrir.config <br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
<br />
'''Ao alterar uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verirfica se existem ao menos dois argumentos<br />
if [ ! "$#" -lt "2" ];<br />
then<br />
<br />
#dominio antigo <br />
old=$1<br />
<br />
#dominio novo<br />
new=$2<br />
<br />
#criando a pasta nova e movendo os arquivos antigos para ela<br />
<br />
mv /var/www/$old /var/www/$new<br />
<br />
#desativando o site antigo<br />
rm /etc/apache2/sites-enabled/$old<br />
rm /etc/apache2/sites-available/$old<br />
<br />
#criando um arquivo vazio, e em seguida envia o conteudo do arquivo padrao para o novo arquivo, contendo os dados do novo site<br />
touch /etc/apache2/sites-available/$new<br />
sed s/dominiou/$new/g /var/scripts/hosts > /etc/apache2/sites-available/$new<br />
<br />
#ativando o site<br />
<br />
a2ensite $new<br />
service apache2 reload<br />
fi<br />
#Fim do script</nowiki><br />
<br />
<br />
<br />
'''Os scripts acima utilizam o sed para agilizar a criação do arquivo de configuração, usando o arquivo seguinte, substituindo a palavra "dominiou" pelo nome desejado para o submdominio. E em seguinda o copia para sites-available, e o ativando com o comando a2ensite'''<br />
<nowiki><VirtualHost *:80><br />
ServerName dominiou.fenrir.sj.ifsc.edu.br<br />
DocumentRoot /var/www/dominiou<br />
ServerAlias *dominiou.fenrir.sj.ifsc.edu.br<br />
ErrorLog /var/log/apache2/dominiou-error.log<br />
<Directory /var/www/dominiou><br />
Options Indexes<br />
DirectoryIndex index.html index.php<br />
order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
== Instalação de Equipamento de Redes ==<br />
''Diagrama da rede:''<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg]]<br />
[[Arquivo:Legendaa.jpg]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34901Projeto Integrador - 2011.1 - Fenrir2011-07-11T23:05:32Z<p>Beatriz.s: /* DNS */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
Abaxo estão os scrips, ja comentados, para adicinar remover e alterar o subdominos no dns.<br />
<br />
#!/bin/bash<br />
#subdominio<br />
# <br />
conf=$1<br />
<br />
if [ ! "$#" -lt 1 ];<br />
then<br />
#Adiciona no named.conf o subdonio<br />
<br />
echo "include \"/etc/bind/$conf.fenrir.zone\";" >> /etc/bind/named.conf<br />
#Editam dois arquivos modelo de configuracao do dsn substituindo a string "modelo" pelo subdominio<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.config > /etc/bind/$conf.fenrir.config<br />
<br />
sed s/modelo/$conf/g /etc/bind/scripsmodelo/modelo.fenrir.zone > /etc/bind/$conf.fenrir.zone<br />
<br />
#reinicia o servidor<br />
service bind9 restart<br />
<br />
fi<br />
<br />
=== Postfix ===<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost></nowiki><br />
<br />
<br />
<br />
'''Ao criar uma página, o seguinte script é executado:'''<br />
<br />
<br />
<nowiki>#!/bin/bash<br />
#Testa se os argumentos existem<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#seta a variável "$dominio" com o valor do primeiro argumento<br />
dominio=$1<br />
<br />
#cria o diretorio de cada subdominio<br />
mkdir /var/www/$dominio<br />
#copia uma página index padrão para o diretório criando<br />
cp /var/scripts/index.php /var/www/$dominio/ <br />
#cria um arquivo vazio, que posteriormente vai conter as informações do subdominio criado<br />
touch /etc/apache2/sites-available/$dominio<br />
#copia as informações de um arquivo de subdominio padrão, substituindo a palavra "dominiou" pela palavra contida na variável "$dominio"<br />
sed s/dominiou/$dominio/g /var/scripts/hosts > /etc/apache2/sites-available/$dominio<br />
<br />
#ativa o site criado<br />
a2ensite $dominio<br />
#recarrega o apache<br />
service apache2 reload<br />
<br />
fi<br />
<br />
#Fim do programa</nowiki><br />
<br />
'''Ao excluir uma página, o seguinte script é executado:'''<br />
<nowiki>#!/bin/bash<br />
#Verifica se exite ao menos um argumento valido<br />
if [ ! "$#" -lt "1" ];<br />
then<br />
#Seta a variável "$dominio" com o domínio desejado<br />
dominio=$1<br />
<br />
#remove a pasta do arquivo antigo<br />
rm -r /var/www/$dominio<br />
#remove os arquivos do site antigo<br />
rm /etc/apache2/sites-enabled/$dominio<br />
rm /etc/apache2/sites-available/$dominio<br />
#recarrega o apache<br />
service apache2 reload <br />
<br />
fi<br />
#fim do programa</nowiki><br />
<br />
== Programação para Redes de Computadores ==<br />
== Instalação de Equipamento de Redes ==<br />
''Diagrama da rede:''<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg]]<br />
[[Arquivo:Legendaa.jpg]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34896Projeto Integrador - 2011.1 - Fenrir2011-07-11T22:53:31Z<p>Beatriz.s: /* Apache */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
=== Postfix ===<br />
=== RoundClub ===<br />
=== Apache ===<br />
'''Arquivo default do apache salvo em /etc/apache2/sites-available e em /etc/apache2/sites-enabled'''<br />
<br />
<nowiki><VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www<br />
<Directory /><br />
Options FollowSymLinks<br />
AllowOverride None<br />
</Directory><br />
<Directory /var/www/><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
<br />
</VirtualHost><br />
<br />
'''Ao criar uma página(<br />
== Programação para Redes de Computadores ==<br />
== Instalação de Equipamento de Redes ==<br />
''Diagrama da rede:''<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
== Cabeamento Estruturado ==<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg]]<br />
[[Arquivo:Legendaa.jpg]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Integrador_-_2011.1_-_Fenrir&diff=34885Projeto Integrador - 2011.1 - Fenrir2011-07-11T22:08:29Z<p>Beatriz.s: /* Instalação de Equipamento de Redes */</p>
<hr />
<div>= Equipe Fenrir =<br />
*Beatriz da Silveira<br />
*Luana Beatriz da Silva<br />
*Marco Aurelio<br />
*Sergio Araujo Stahelin<br />
*William Jamir Silva<br />
<br />
== 1º Dia - 13/06/2011 ==<br />
*Atividades<br />
**Sistema Operacional:Ubuntu-Server<br />
**Definido Sistema de Arquivo:<br />
**Nome da Máquina: fenrir<br />
**Nome do Domínio: fenrir.sj.ifsc.edu.br<br />
<br />
<br />
==2º Dia 14/06/2011 ==<br />
*Recebemos do Professor Saul as orientações necessarias para realizar a instalação do Cabeamento Estruturado <br />
<br />
==3º Dia 15/06/2011 ==<br />
<br />
*Equipe foi subdividida em:<br />
** Sergio e Luana - IER<br />
** Marco, Beatriz e WIlliam - Gerência de Redes<br />
*** Marco - Apache<br />
*** Beatriz - DNS<br />
*** William - Postfix<br />
<br />
*Status das Atividades<br />
** DNS<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios <br />
**Postfix<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nos endereços de e-mails<br />
** Apache<br />
***Concluido a instalação Básica.<br />
*** Planejando a implentação de sub-dominios nas paginas web<br />
<br />
= Documentação =<br />
<br />
== Gerência de Redes ==<br />
=== DNS === <br />
arquivo /etc/bind/named.conf<br />
<br />
/ This is the primary configuration file for the BIND DNS server named.<br />
//<br />
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the <br />
// structure of BIND configuration files in Debian, *BEFORE* you customize <br />
// this configuration file.<br />
//<br />
// If you are just adding zones, please do that in /etc/bind/named.conf.local<br />
<br />
include "/etc/bind/named.conf.options";<br />
include "/etc/bind/named.conf.local";<br />
include "/etc/bind/named.conf.default-zones";<br />
include "/etc/bind/minastirith.fenrir.zone";<br />
include "/etc/bind/luana.fenrir.zone";<br />
include "/etc/bind/azaghal.fenrir.zone";<br />
include "/etc/bind/marco.fenrir.zone";<br />
include "/etc/bind/sextafeira.fenrir.zone";<br />
include "/etc/bind/novoteste.fenrir.zone";<br />
include "/etc/bind/hello.fenrir.zone";<br />
<br />
arquivo /etc/bind/named.conf.local<br />
<br />
//<br />
// Do any local configuration here<br />
//<br />
<br />
// Consider adding the 1918 zones here, if they are not used in your<br />
// organization<br />
//include "/etc/bind/zones.rfc1918";<br />
zone "fenrir.sj.ifsc.edu.br" {<br />
type master;<br />
file "/etc/bind/fenrir.zone";<br />
};<br />
<br />
zone "37.135.200.in-addr.arpa" {<br />
type master;<br />
file"/etc/bind/37.135.200.in-addr.arpa";<br />
};<br />
<br />
arquivo /etc/bind/fenrir.zone<br />
<br />
Neste arquivo estão as configurações do Fenrir<br />
<br />
$TTL 60<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600 ;serial<br />
60 ;refresh <br />
60 ;TTL<br />
60 ;<br />
60 ;<br />
)<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 mail.fenrir.sj.ifsc.edu.br.<br />
IN A 200.135.37.99<br />
batman IN NS batman.fenrir.sj.ifsc.edu.br.<br />
sheldon IN NS sheldon.fenrir.sj.ifsc.edu.br.<br />
<br />
<br />
<br />
$ORIGIN fenrir.sj.ifsc.edu.br.<br />
A 200.135.37.99<br />
ns1 A 200.135.37.99<br />
www A 200.135.37.99<br />
mail A 200.135.37.99<br />
sheldon A 200.135.37.99<br />
batman A 200.135.37.99<br />
<br />
arquivo 37.135.200.in-addr.arpa<br />
<br />
Neste arquivo se encontra as configurações do dns reverso para o dominio fenrir<br />
<br />
$TTL 86400<br />
@ IN SOA ns1.fenrir.sj.ifsc.edu.br. root (<br />
2011061600<br />
60<br />
60<br />
60<br />
60 )<br />
<br />
IN NS ns1.fenrir.sj.ifsc.edu.br.<br />
IN MX 0 ns1.fenrir.sj.ifsc.edu.br.<br />
99 PTR fenrir.sj.ifsc.edu.br.<br />
<br />
=== Postfix ===<br />
=== RoundClub ===<br />
=== Apache ===<br />
<br />
== Programação para Redes de Computadores ==<br />
<br />
== Instalação de Equipamento de Redes ==<br />
<br />
''Diagrama da rede:''<br />
<br />
<br />
[[Arquivo:Diagrama_da_rede1.jpg]]<br />
<br />
== Cabeamento Estruturado ==<br />
<br />
''Diagrama de rede e esquema de ligações nos Racks:''<br />
[[Arquivo:Diagrama_Cabe.jpg]]<br />
<br />
<br />
[[Arquivo:Legendaa.jpg]]</div>Beatriz.shttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:Diagrama_da_rede1.jpg&diff=34884Arquivo:Diagrama da rede1.jpg2011-07-11T22:06:29Z<p>Beatriz.s: foi enviada uma nova versão de &quot;Arquivo:Diagrama da rede1.jpg&quot;</p>
<hr />
<div></div>Beatriz.s