·

Engenharia Elétrica ·

Estrutura de Dados

Send your question to AI and receive an answer instantly

Ask Question

Recommended for you

Preview text

É importante reconhecer as limitações de determinada implementação Frequentemente será possível apresentar várias implementações do mesmo tipo de dado cada uma com vantagens e desvantagens próprias Talvez determinada implementação seja melhor que outra para uma aplicação específica e o programador precisa conhecer os possíveis compromissos envolvidos Uma consideração importante em qualquer implementação é a sua eficiência Na verdade a razão pela qual as estruturas de dados de alto nível que discutimos não são construídas em C é a significativa sobrecarga que acarretariam Existem linguagens de nível muito mais alto que C que possuem vários desses tipos de dados já incorporados mas muitas delas são ineficientes e portanto não amplamente usadas Em geral a eficiência é determinada por dois fatores tempo e espaço Se determinada aplicação depender intensivamente da manipulação de estruturas de dados de alto nível a velocidade na qual essas manipulações podem ser executadas será o principal determinante da velocidade da aplicação inteira De modo semelhante se um programa usar uma grande quantidades destas estruturas uma implementação que utiliza uma quantidade excessiva de espaço para representar a estrutura de dados não será prática Infelizmente em geral existe um compromisso entre esses dois prismas de eficiência de modo que uma implementação veloz usa mais armazenamento do que uma implementação lenta A escolha da implementação nesse caso requer uma avaliação cuidadosa dos compromissos entre as várias possibilidades EXERCÍCIOS 111 No texto é feita uma analogia entre o tamanho de uma linha e o número de bits de informação numa string de bits De que maneira essa analogia é inadequada 112 Determine que tipos de dados de hardware estão disponíveis no computador de sua instalação e que operações podem ser executadas sobre eles 113 Prove que existem 2n definições diferentes para n chaves bivalentes Suponha que queremos ter m definições Quantas chaves seriam necessárias 114 Interprete as seguintes definições de bits como inteiros positivos binários como inteiros binários em complemento de dois e como inteiros decimais codificados em binário Se uma definição não puder ser interpretada como um inteiro decimal codificado em binário explique por quê a 10011001 b 1001 c 000100010001 d 01110111 e 01010101 f 100000010101 115 Escreva funções em C add subtract e multiply que leiam duas strings de 0s e 1s representando inteiros nãonegativos binários e imprima a string representando a soma a diferença e o produto respectivamente 116 Imagine um computador ternário no qual a unidade básica de memória seja um trit ternary digit em vez de um bit Esse trit pode ter três possíveis definições 0 1 e 2 em vez de apenas duas 0 e 1 Mostre como os inteiros nãonegativos podem ser representados em notação ternária usando esses trits com um método análogo à notação binária para bits Existe algum inteiro nãonegativo que pode ser representado usando notação ternária e trits mas que não pode ser representado usando notação binária e bits Existe algum que pode ser representado usando bits mas que não pode ser representado usando trits Por que os computadores binários são mais comuns do que os computadores ternários 117 Escreva um programa C para ler uma string de 0s e 1s representando um inteiro positivo em notação binária e imprima uma string de 0s 1s e 2s representando o mesmo número em notação ternária veja o exercício anterior Escreva outro programa C para ler um número ternário e imprimir o equivalente em notação binária 118 Escreva uma especificação de TDA para os números complexos a bi onde absa bi é sqrta2 b2 a bi c di é a c b di a b c di é a c b d a d b ci e a bi é a bi 12 VETORES EM C Nesta e na próxima seção examinaremos várias estruturas de dados que representam uma parte inestimável da linguagem C Veremos como usar essas estruturas e como elas podem ser implementadas Essas estruturas são tipos de dados compostos ou estruturados ou seja elas são formadas de estruturas de dados mais simples que existem na linguagem O estudo dessas estruturas de dados envolve uma análise de como as estruturas simples se combinam de modo a formar a composição e como extrair um componente específico da composição Esperamos que você já tenha visto essas estruturas de dados num curso introdutório de programação em C e saiba como elas são definidas e usadas em C Portanto nessas seções não descreveremos os detalhes associados a tais estruturas destacaremos apenas os recursos interessantes sob o ponto de vista da estrutura de dados O primeiro desses tipos de dados é o vetor A forma mais simples de vetor é um vetor unidimensional que pode ser definido abstratamente como um conjunto finito e ordenado de elementos homogêneos Por finito entendemos que existe um número específico de elementos no vetor Esse número pode ser grande ou pequeno mas ele precisa existir Por ordenado entendemos que os elementos do vetor são organizados de tal forma que exista um elemento zero um primeiro elemento um segundo um terceiro e assim por diante Por homogêneo entendemos que todos os elementos no vetor precisam ser do mesmo tipo Por exemplo um vetor pode conter inteiros ou caracteres mas não ambos Entretanto especificar a forma de uma estrutura de dados não descreve totalmente sua estrutura Precisamos também especificar como a estrutura é acessada Por exemplo a declaração C int a100 especifica um vetor de 100 inteiros As duas operações básicas que acessam um vetor são a extração e o armazenamento A operação de extração é uma função que aceita um vetor a e um índice i e retorna um elemento do e armazenado por linha Cada elemento de AR supostamente ocupa esize posições de armazenamento e basear é definido como o endereço do primeiro elemento do vetor ou seja ar00 0 Sendo assim para acessar o elemento ari1i2 in primeiro é necessário atravessar i1 hiperplanos cada um consistindo em r2 r3 rn elementos para chegar ao primeiro elemento de ar cujo primeiro índice é i1 Em seguida é necessário atravessar i2 grupos adicionais de r3 r4 rn elementos para chegar ao primeiro elemento de ar cujos dois primeiros índices sejam i1 e i2 respectivamente Um processo semelhante deve ser executado em outras dimensões até ser alcançado o primeiro elemento cujos primeiros n 1 índices correspondam aos do elemento necessário Finalmente é necessário atravessar in elementos adicionais para chegar ao elemento desejado Dessa forma o endereço de ari1i2 in pode ser escrito como basear esize i1 r2 rn i2 r3 rn in 1 rn in que pode ser avaliado com mais eficiência usandose a fórmula equivalente basear esize in rn in 1 rn 1 r3 i2 r2 i1 Esta fórmula pode ser avaliada pelo seguinte algoritmo que calcula o endereço do elemento do vetor e o introduz em addr pressupondo que os vetores i e r de tamanho n armazenem os índices e as faixas respectivamente offset 0 for j 0 j n j offset rj offset ij addr basear esize offset EXERCÍCIOS 121 a A mediana de um vetor de números é o elemento m do vetor tal que metade dos números restantes no vetor é maior ou igual a m e metade é menor ou igual a m se o número de elementos no vetor BIBLIOTECA IFGCAMPUS ITUMBIARA for ímpar Se o número de elementos for par a mediana será a média dos dois elementos m1 e m2 tal que metade dos elementos restantes é maior ou igual a m1 e m2 e metade dos elementos é menor ou igual a m1 e m2 Escreva uma função em C que aceite um vetor de números e retorne a mediana dos números no vetor b A MODA de um vetor de números é o número m no vetor que é repetido com maior frequência Se mais de um número for repetido com frequência máxima igual não existirá uma moda Escreva uma função em C que aceite um vetor de números e retorne a moda ou uma indicação de que a moda não existe 122 Escreva um programa em C que faça o seguinte Leia um grupo de leituras de temperatura Uma leitura consiste em dois números um inteiro entre 90 e 90 representando a latitude na qual a leitura foi efetuada e a temperatura observada nessa latitude Imprima uma tabela consistindo em cada latitude e na temperatura média da latitude Se não existirem leituras em determinada latitude imprima sem dados em vez de uma média Em seguida imprima a temperatura média nos hemisférios Norte e Sul o Norte consiste em latitudes de 1 a 90 e o Sul em latitudes de 1 a 90 Essa temperatura média deve ser calculada como a média das médias não como a média das leituras iniciais Determine também o hemisfério mais quente Ao fazer a determinação use as temperaturas médias em todas as latitudes de cada hemisfério para os quais existem dados tanto para essa latitude como para a latitude correspondente no outro hemisfério Por exemplo se existirem dados para latitude 57 mas não para latitude 57 então a temperatura média para a latitude 57 deve ser ignorada ao determinar o hemisfério mais quente 123 Escreva um programa para uma cadeia de 20 lojas de departamentos cada uma das quais vendendo dez itens diferentes Todo mês o gerente de cada loja apresenta uma ficha de dados de cada item consistindo no número de uma filial de 1 a 20 no número de um item de 1 a 10 e nos valores de venda abaixo de 100000 representando a quantidade de vendas de determinado item em determinada filial Entretanto é possível que alguns gerentes não apresentem fichas para alguns itens ou seja nem todos os itens são vendidos em todas as filiais Você deve escrever um programa em C que leia essas fichas de dados e imprima uma tabela de 12 colunas A primeira coluna deve conter os números das filiais de 1 a 20 e a palavra TOTAL na última linha As dez colunas seguintes devem conter os valores de vendas de cada um dos dez itens em cada filial com o total de vendas de cada item na última linha A última coluna deve conter o total de vendas de todos os itens em cada uma das 20 filiais com o valor do total final de vendas da cadeia de lojas posicionado no canto inferior direito Cada coluna deve ter um título adequado Se nenhuma venda for informada para determinada filial e item pressuponha um valor de vendas igual a zero Não presuma que sua entrada esteja em nenhuma ordem predeterminada 124 Mostre como um tabuleiro de xadrez pode ser representado por um vetor em C Mostre como representar o estado de um jogo de enxadristas em determinado momento Escreva uma função em C que seja uma entrada para um vetor representando este tabuleiro de xadrez e imprima todas as possíveis jogadas que o preto possa fazer a partir dessa posição 125 Escreva uma função printara que aceite um vetor a mporn de inteiros e imprima os valores do vetor em várias páginas como segue cada página deve conter 50 linhas e 20 colunas do vetor No início de cada página devem ser impressos os títulos COL 0 COL 1 e assim por diante e ao longo da margem esquerda de cada página devem ser impressos os títulos ROW 0 ROW 1 e assim por diante O vetor deve ser impresso por subvetores Por exemplo se a fosse um vetor de 100por100 a primeira página conteria a00 até a4919 a segunda página conteria a020 até a4939 a terceira página conteria a040 até a4959 e assim por diante até que a quinta página contivesse a080 até a4999 a sexta página a500 até a9919 e assim por diante A saída impressa inteira ocuparia dez páginas Se o número de linhas não for um múltiplo de 50 ou o número de colunas não for um múltiplo de 20 as últimas páginas da saída impressa deverão conter menos de 100 números 126 Suponha que cada elemento de um vetor a armazenado por linhas ocupe quatro unidades de armazenamento Se a é declarado por cada um dos seguintes e o endereço do primeiro elemento de a é 100 encontre o endereço do elemento do vetor indicado a int a100 b int a200 c int a1020 d int a1020 e int a1020 f int a1020 g int a1020 h int a1020 i int a1020 endereco de a10 endereco de a100 endereco de a00 endereco de a21 endereco de a51 endereco de a110 endereco de a210 endereco de a53 endereco de a919 127 Escreva uma função em C listoff que aceite como parâmetros dois vetores unidimensionais do mesmo tamanho range e subrange representa a faixa de um vetor de inteiros Por exemplo se os elementos de range são 3 5 10 6 3 range representa um vetor a declarado por int a351063 Os elementos de sub representam índices para o vetor anterior Se subi não estiver entre 0 e rangei 1 todos os índices a partir do iésimo em diante estão ausentes No exemplo anterior se os elementos de sub são 1 3 1 2 3 sub representa o vetor unidimensional a1312 A função listoff deve imprimir os deslocamentos a partir da base do vetor a representado por range de todos os elementos de a que estejam incluídos no vetor ou o deslocamento do único elemento se todos os índices estiverem dentro dos limites representado por sub Pressuponha que o tamanho esize de cada elemento de a seja 1 No exemplo anterior listoff imprimiria os valores 4 5 e 6 128 a Um vetor a triangular inferior está num vetor de nporn em que aij 0 se i j Qual o número máximo de elementos diferentes de zero nesse vetor Como esses elementos podem ser armazenados sequencialmente na memória Desenvolva um algoritmo para acessar aij onde i j Desenvolva um vetor triangular superior de modo análogo e faça com esse vetor a mesma coisa que você fez com o vetor triangular inferior EXERCÍCIOS 131 Implemente números complexos conforme especificado no Exercício 118 usando estruturas com partes reais e complexas Escreva rotinas para somar multiplicar e negar tais números 132 Vamos supor que um número real seja representado por uma estrutura em C como esta struct realtype int left int right onde left e right representam os dígitos posicionados à esquerda e à direita do ponto decimal respectivamente Se left for um inteiro negativo o número real representado será negativo a Escreva uma rotina para inserir um número real e criar uma estrutura representando esse número b Escreva uma função que aceite essa estrutura e retorne o número real representado por ela c Escreva rotinas add subtract e multiply que aceitem duas dessas estruturas e definam o valor de uma terceira estrutura para representar o número que seja a soma a diferença e o produto respectivamente dos dois registros de entrada 133 Suponha que um inteiro precise de quatro bytes um número real precise de oito bytes e um caractere precise de um byte Pressuponha as seguintes definições e declarações struct nametype char first10 char midinit char last20 struct person struct nametype name int birthday2 struct nametype parents2 int income int numchildren char address20 char city10 char state2 struct person p100 Se o endereço inicial de p for 100 quais serão os endereços iniciais em bytes de cada um dos seguintes a p10 b p200namemidinit c p20income d p20address5 e p5parents1last10 134 Suponha dois vetores um de registros de estudantes e outro de registros de funcionários Cada registro de estudante contém membros para um último nome um primeiro nome e um índice de pontos de graduação Cada registro de funcionário contém membros para um último nome um primeiro nome e um salário Ambos os vetores são classificados em ordem alfabética pelo último e pelo primeiro nome Dois registros com o último e o primeiro nome iguais não aparecem no mesmo vetor Escreva uma função em C para conceder um aumento de 10 a todo funcionário que tenha um registro de estudante cujo índice de pontos de graduação seja maior que 30 135 Escreva uma função semelhante à do exercício anterior mas pressupondo que os registros dos funcionários e estudantes sejam mantidos em dois arquivos externos classificados em vez de em dois vetores classificados 136 Usando a representação de números racionais apresentada no texto escreva rotinas para somar subtrair e dividir tais números 137 O texto apresenta uma função equal que determina se dois números racionais r1 e r2 são iguais ou não reduzindo primeiramente r1 e r2 a seus termos mínimos e verificando em seguida a igualdade Um método alternativo seria multiplicar o denominador de cada número pelo numerador do outro e testar a igualdade dos dois produtos Escreva uma função equal2 para implementar esse algoritmo Qual dos dois métodos é preferível Exercícios capítulo 1 111 R a analogia entre o tamanho de uma linha e o número de bits de informação em uma string de bits é inadequada porque não leva em consideração a complexidade da informação a codificação a redundância a compactação e a necessidade de um esquema de mapeamento claro entre os dois conceitos 112 R Exemplos de Tipos de Dados de Hardware Processador O tipo de processador CPU como Intel Core i5 ou AMD Ryzen 5 determina a capacidade de processamento do computador Memória A quantidade de memória RAM Random Access Memory disponível determina a quantidade de dados que o computador pode processar simultaneamente Armazenamento O tipo e a capacidade do dispositivo de armazenamento como disco rígido HDD ou disco de estado sólido SSD determinam a quantidade de dados que o computador pode armazenar Dispositivos de ES Os dispositivos de entrada e saída ES como teclado mouse monitor impressora e placa de rede permitem que o usuário interaja com o computador e se comunique com outros dispositivos 2 Operações que podem ser Executadas sobre os Dados de Hardware Os dados de hardware podem ser usados para executar diversas operações como Processamento de dados O processador pode realizar cálculos operações lógicas e outras operações matemáticas sobre os dados Armazenamento de dados Os dispositivos de armazenamento podem armazenar dados de forma permanente ou temporária Transferência de dados Os dispositivos de ES podem transferir dados entre o computador e outros dispositivos Controle de dispositivos Os dados de hardware podem ser usados para controlar o funcionamento dos dispositivos de hardware do computador 113 R Para determinar o número de chaves bivalentes necessárias para representar m definições diferentes podemos utilizar a seguinte fórmula Número de chaves 2m Cada definição diferente pode ser representada por uma chave bivalente de m bits Cada bit na chave representa uma escolha binária entre as duas definições possíveis Por exemplo se m 2 então existem duas definições diferentes Uma chave bivalente de 2 bits pode ser usada para representar essas duas definições com 0 representando a primeira definição e 1 representando a segunda definição 114 R Definição Inteiro positivo binário Inteiro binário em complemento de dois Inteiro decimal codificado em binário Observação a 10011001 129 127 99 Válido para todos os tipos b 1001 9 7 1 Válido para todos os tipos c 257 255 161 Válido para 000100010001 positivo binário e complemento de dois d 01110111 127 127 79 Válido para todos os tipos e 01010101 85 85 53 Válido para todos os tipos f 100000010101 517 515 341 Válido para positivo binário e complemento de dois 115 R include stdioh include stdlibh include stringh Função para adicionar dois números binários char addchar a char b int lena strlena lenb strlenb int maxlen lena lenb lena lenb int carry 0 char result mallocmaxlen 2 for int i maxlen 1 i 0 i int ai i lena ai 0 0 int bi i lenb bi 0 0 int sum ai bi carry carry sum 2 resulti sum 2 0 if carry resultmaxlen 1 maxlen resultmaxlen 0 return result Função para subtrair dois números binários char subtractchar a char b int lena strlena lenb strlenb int maxlen lena lenb lena lenb int borrow 0 char result mallocmaxlen 2 for int i maxlen 1 i 0 i int ai i lena ai 0 0 int bi i lenb bi 0 0 int diff ai bi borrow if diff 0 diff 2 borrow 1 else borrow 0 resulti diff 0 while maxlen 0 resultmaxlen 1 0 maxlen resultmaxlen 0 return result Função para multiplicar dois números binários char multiplychar a char b int lena strlena lenb strlenb int maxlen lena lenb char result mallocmaxlen 2 for int i 0 i maxlen i resulti 0 for int i 0 i lena i int ai ai 0 for int j 0 j lenb j int bi bj 0 int carry resulti j 0 ai bi resulti j carry 2 0 carry 2 if carry resulti j 1 carry while maxlen 0 resultmaxlen 1 0 maxlen resultmaxlen 0 return result Função principal para ler as strings e imprimir os resultados int main char a100 b100 scanfs s a b printfSoma s adda b printfDiferença s subtracta b printfProduto s multiplya b return 0 116 R Em um computador ternário cada dígito trit pode ter três valores 0 1 ou 2 Para representar inteiros nãonegativos em notação ternária podemos usar um método similar à notação binária Exemplo O número decimal 10 pode ser representado em ternário como 102 2 é a maior potência de 3 menor que 10 31 3 O coeficiente do termo 31 é 0 pois 10 2 3 4 1 é a maior potência de 3 menor que 4 30 1 O coeficiente do termo 30 é 2 pois 4 1 1 3 Assim 10 em decimal é igual a 102 em ternário 2 Inteiros nãorepresentáveis em binário e ternário a Não representáveis em binário Em binário só podemos representar números com potências de 2 Números com potências de 3 que não são potências de 2 não podem ser representados em binário Em ternário podemos representar números com potências de 2 e 3 No entanto números com potências de 5 que não são potências de 2 ou 3 não podem ser representados em ternário 117 R include stdioh int main char binario100 int decimal 0 i j ternario100 k Leitura da string binária scanfs binario Conversão para decimal for i strlenbinario 1 j 0 i 0 i j decimal binarioi 0 1 j Conversão para ternário for i 0 decimal 0 i ternarioi decimal 3 decimal 3 Impressão da string ternária for k i 1 k 0 k printfd ternariok return 0 118 R Operadores Adição a bi c di a c b di Subtração a bi c di a c b di Multiplicação a bi c di ac bd ad bci Divisão a bi c di a bi c di c2 d2 ac bd c2 d2 bc adi c2 d2 Negação a bi a bi Módulo a bi sqrta2 b2 Funções complex createcomplexdouble a double b Cria um novo número complexo a partir de seus componentes real e imaginário double getrealcomplex c Retorna a parte real do número complexo double getimaginarycomplex c Retorna a parte imaginária do número complexo void setrealcomplex c double a Define a parte real do número complexo void setimaginarycomplex c double b Define a parte imaginária do número complexo complex conjugatecomplex c Retorna o conjugado do número complexo double abscomplexcomplex c Retorna o módulo do número complexo complex addcomplexcomplex c1 complex c2 Soma dois números complexos complex subtractcomplexcomplex c1 complex c2 Subtrai dois números complexos complex multiplycomplexcomplex c1 complex c2 Multiplica dois números complexos complex dividecomplexcomplex c1 complex c2 Divide dois números complexos int comparecomplexcomplex c1 complex c2 Compara dois números complexos string tostringcomplexcomplex c Converte um número complexo para string 121 a R include stdioh int main int n i j temp int v100 Leitura do tamanho do vetor printfDigite o tamanho do vetor scanfd n Leitura dos elementos do vetor for i 0 i n i printfDigite o elemento d i 1 scanfd vi Ordenação do vetor em ordem crescente for i 0 i n 1 i for j i 1 j n j if vi vj temp vi vi vj vj temp Cálculo da mediana int mediana if n 2 1 mediana vn 1 2 1 else mediana vn 2 1 vn 2 2 Impressão da mediana printfA mediana do vetor eh d mediana return 0 121 b R int verificamodaint vetor int tamanho int moda int i int frequenciamoda 0 Contar a frequência da moda for i 0 i tamanho i if vetori moda frequenciamoda Imprimir a moda e sua frequência if frequenciamoda 0 return moda else return 1 122 R include stdioh define MAXLATITUDE 90 typedef struct int latitude float temperatura Leitura int main Leitura leiturasMAXLATITUDE 2 int nLeituras 0 float temperaturasNorteMAXLATITUDE temperaturasSulMAXLATITUDE int nTemperaturasNorte 0 nTemperaturasSul 0 float mediaNorte 00f mediaSul 00f Lê as leituras while scanfd f leiturasnLeituraslatitude leiturasnLeiturastemperatura 2 nLeituras Calcula as médias das latitudes for int i 0 i nLeituras i int latitude leiturasilatitude float temperatura leiturasitemperatura if latitude 0 temperaturasNortelatitude 1 temperatura nTemperaturasNorte else temperaturasSullatitude 1 temperatura nTemperaturasSul Imprime a tabela for int latitude 1 latitude MAXLATITUDE latitude if nTemperaturasNortelatitude 1 0 mediaNorte temperaturasNortelatitude 1 nTemperaturasNortelatitude 1 printfd 1f latitude temperaturasNortelatitude 1 nTemperaturasNortelatitude 1 else printfd sem dados latitude if nTemperaturasSullatitude 1 0 mediaSul temperaturasSullatitude 1 nTemperaturasSullatitude 1 printfd 1f latitude temperaturasSullatitude 1 nTemperaturasSul latitude 1 else printfd sem dados latitude Calcula as médias dos hemisférios mediaNorte nTemperaturasNorte mediaSul nTemperaturasSul Determina o hemisfério mais quente char hemisferioMaisQuente10 Norte if mediaSul mediaNorte strcpyhemisferioMaisQuente Sul Imprime as médias dos hemisférios e o hemisfério mais quente printfHemisfério Norte 1f mediaNorte printfHemisfério Sul 1f mediaSul printfHemisfério mais quente s hemisferioMaisQuente return 0 123 R include stdioh define MAXLOJAS 20 define MAXITENS 10 int main int vendasMAXLOJASMAXITENS 0 int totalVendasMAXITENS 0 int totalGeral 0 Lê as vendas de cada loja for int loja 0 loja MAXLOJAS loja for int item 0 item MAXITENS item scanfd vendaslojaitem totalVendasitem vendaslojaitem totalGeral vendaslojaitem Imprime a tabela de vendas printfLoja for int item 0 item MAXITENS item printfItemd item 1 printfTOTAL for int loja 0 loja MAXLOJAS loja printfd loja 1 for int item 0 item MAXITENS item printfd vendaslojaitem printfd totalVendasloja printfTOTAL for int item 0 item MAXITENS item printfd totalVendasitem printfd totalGeral return 0 124 R struct estadojogo int tabuleiro64 int vezjogador 0 para brancas 1 para pretas int posicaoreibranco int posicaoreipreto void imprimirjogadaspossiveisint tabuleiro int vezjogador Loop por todas as casas do tabuleiro for int i 0 i 64 i Se a casa estiver ocupada por uma peça preta if tabuleiroi 0 Obtenha a peça que ocupa a casa int peca tabuleiroi Loop por todos os movimentos possíveis da peça for int j 0 j 8 j Se o movimento for válido if movimentovalidotabuleiro vezjogador i j Imprima o movimento printfcd cd a i 8 8 i 8 a j 8 8 j 8 int main int tabuleiro64 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Imprimir todas as jogadas possíveis para o preto imprimirjogadaspossiveistabuleiro 1 return 0 125 R include stdioh void printarint a100 int m int n int i j k l Imprimir cabeçalho for i 0 i n i printfCOL d i printf Imprimir linhas for i 0 i m i Imprimir número da linha printfROW d i Imprimir subvetor for j 0 j n j printfd aij Nova linha printf Imprimir página seguinte a cada 50 linhas if i 1 50 0 Imprimir cabeçalho for k 0 k n k printfCOL d k printf int main int a100100 m n Ler tamanho do vetor scanfd d m n Ler valores do vetor for int i 0 i m i for int j 0 j n j scanfd aij Imprimir vetor printara m n return 0 126 R Item Endereço a10 140 a100 600 a21 1764 a1000 8000 a110 1160 a51 524 a53 604 a210 1160 a919 8756 127 R void listoffint range int sub int n int i j offset 0 Loop para cada índice em sub for i 0 i n i Verificar se o índice está dentro da faixa if subi 0 subi rangei Se não estiver imprimir os deslocamentos até agora for j 0 j i j printfd offset offset rangej Parar o loop break Se estiver atualizar o deslocamento offset subi rangei Se todos os índices estavam dentro da faixa imprimir o deslocamento final if i n printfd offset printf int main int range 35 10 6 3 int sub 1 3 1 2 listoffrange sub 4 return 0 128 R int aNN int getelementint i int j if i j return 0 Elemento não existe return an1ini2 j include stdioh define N 3 int main int aNN Armazenando elementos no vetor triangular inferior for int i 0 i N i for int j 0 j N j if i j aii12 j i j else aii12 j 0 Acessando alguns elementos printfa00 d getelement0 0 0 printfa11 d getelement1 1 2 printfa22 d getelement2 2 4 printfa10 d getelement1 0 0 return 0 131 R typedef struct complexo double real double imag complexo complexo somacomplexocomplexo c1 complexo c2 complexo resultado resultadoreal c1real c2real resultadoimag c1imag c2imag return resultado complexo multiplicacomplexocomplexo c1 complexo c2 complexo resultado resultadoreal c1real c2real c1imag c2imag resultadoimag c1real c2imag c1imag c2real return resultado complexo negacomplexocomplexo c complexo resultado resultadoreal creal resultadoimag cimag return resultado 132 a R include stdioh struct realtype int left int right void inserirNumeroRealstruct realtype numero Leitura da parte inteira printfDigite a parte inteira do número scanfd numeroleft Leitura da parte decimal printfDigite a parte decimal do número scanfd numeroright 132 b R float obterNumeroRealstruct realtype numero float valorReal numeroleft Concatenando a parte decimal valorReal floatnumeroright 1000f return valorReal 132 c R void adicionarstruct realtype resultado struct realtype numero1 struct realtype numero2 int somaEsquerda numero1left numero2left int somaDireita numero1right numero2right Ajustando o caso de transporte na parte decimal if somaDireita 100 somaDireita 100 somaEsquerda resultadoleft somaEsquerda resultadoright somaDireita void subtrairstruct realtype resultado struct realtype numero1 struct realtype numero2 int diferencaEsquerda numero1left numero2left int diferencaDireita numero1right numero2right Ajustando o caso de empréstimo na parte decimal if diferencaDireita 0 diferencaDireita 100 diferencaEsquerda resultadoleft diferencaEsquerda resultadoright diferencaDireita void multiplicarstruct realtype resultado struct realtype numero1 struct realtype numero2 int produtoEsquerda numero1left numero2left int produtoDireita numero1right numero2right int produtoIntermediario numero1left numero2right numero1right numero2left Ajustando o caso de transporte na parte decimal if produtoIntermediario 100 resultadoleft produtoEsquerda produtoIntermediario 100 resultadoright produtoIntermediario 100 else resultadoleft produtoEsquerda resultadoright produtoIntermediario 133 R Expressão Endereço inicial p10 100 10 sizeofstruct person p200 namem idinit 100 200 sizeofstruct person 1 p20 income 100 20 sizeofstruct person 4 sizeofchar sizeofint sizeofstruct nametype sizeofint p20 address 5 100 20 sizeofstruct person 4 sizeofchar sizeofint sizeofstruct nametype sizeofint 5 p5 parents1 last10 1 134 R include stdioh include stdlibh include stringh Estrutura para armazenar dados de um aluno typedef struct aluno char sobrenome50 char nome50 float pontosgraduacao Aluno Estrutura para armazenar dados de um funcionário typedef struct funcionario char sobrenome50 char nome50 float salario Funcionario Função para comparar dois alunos por sobrenome e nome int compararalunosconst void a const void b const Aluno aluno1 const Aluno a const Aluno aluno2 const Aluno b int cmpsobrenome strcmpaluno1sobrenome aluno2sobrenome if cmpsobrenome 0 return cmpsobrenome return strcmpaluno1nome aluno2nome Função para comparar dois funcionários por sobrenome e nome int compararfuncionariosconst void a const void b const Funcionario funcionario1 const Funcionario a const Funcionario funcionario2 const Funcionario b int cmpsobrenome strcmpfuncionario1sobrenome funcionario2sobrenome if cmpsobrenome 0 return cmpsobrenome return strcmpfuncionario1nome funcionario2nome Função para conceder um aumento de 10 a um funcionário void concederaumentoFuncionario funcionario funcionariosalario 11 Função principal int main Leitura do número de alunos e funcionários int nalunos nfuncionarios scanfd d nalunos nfuncionarios Alocação de memória para os vetores de alunos e funcionários Aluno alunos mallocsizeofAluno nalunos Funcionario funcionarios mallocsizeofFuncionario nfuncionarios Leitura dos dados dos alunos for int i 0 i nalunos i scanfs s f alunosisobrenome alunosinome alunosipontosgraduacao Leitura dos dados dos funcionários for int i 0 i nfuncionarios i scanfs s f funcionariosisobrenome funcionariosinome funcionariosisalario Ordena os vetores de alunos e funcionários por sobrenome e nome qsortalunos nalunos sizeofAluno compararalunos qsortfuncionarios nfuncionarios sizeofFuncionario compararfuncionarios Percorre os alunos e funcionários em paralelo int ialuno 0 ifuncionario 0 while ialuno nalunos ifuncionario nfuncionarios Compara os sobrenomes e nomes dos alunos e funcionários int cmpsobrenome strcmpalunosialunosobrenome funcionariosifuncionariosobrenome int cmpnome strcmpalunosialunonome funcionariosifuncionarionome Se o aluno e o funcionário forem a mesma pessoa concede um aumento de 10 ao funcionário if cmpsobrenome 0 cmpnome 0 if alunosialunopontosgraduacao 30 concederaumentofuncionariosifuncionario ialuno ifuncionario else if cmpsobrenome 0 ialuno else ifuncionario Imprime os dados dos funcionários com aumento for int i 0 i nfuncionarios i printfs s 2f funcionariosisobrenome funcionariosinome funcionariosisalario Libera a memória alocada freealunos freefuncionarios return 0 135 R include stdioh include stdlibh include stringh Estrutura para armazenar dados de um aluno typedef struct aluno char nome50 char sobrenome50 char curso50 int dianascimento int mesnascimento int anonascimento Aluno Função para comparar dois alunos por nome int compararalunosconst void a const void b const Aluno aluno1 const Aluno a const Aluno aluno2 const Aluno b return strcmpaluno1nome aluno2nome Função principal int main Leitura do nome do arquivo char nomearquivo50 scanfs nomearquivo Leitura do mês e ano de nascimento int mesbusca anobusca scanfd d mesbusca anobusca Abertura do arquivo FILE arquivo fopennomearquivo r if arquivo NULL printfErro ao abrir o arquivo return 1 Alocação de memória para um vetor de alunos Aluno alunos mallocsizeofAluno 100 int nalunos 0 Leitura dos dados dos alunos while fscanfarquivo s s s d d d alunosnalunosnome alunosnalunossobrenome alunosnalunoscurso alunosnalunosdianascimento alunosnalunosmesnascimento alunosnalunosanonascimento EOF nalunos Fechamento do arquivo fclosearquivo Ordena o vetor de alunos por nome qsortalunos nalunos sizeofAluno compararalunos Percorre os alunos e imprime os que nasceram no mês e ano especificados for int i 0 i nalunos i if alunosimesnascimento mesbusca alunosianonascimento anobusca printfs s alunosinome alunosisobrenome Libera a memória alocada freealunos return 0 136 R struct racional int numerador int denominador struct racional somaracionalstruct racional r1 struct racional r2 struct racional resultado resultadonumerador r1numerador r2denominador r2numerador r1denominador resultadodenominador r1denominador r2denominador return resultado struct racional subtrairacionalstruct racional r1 struct racional r2 struct racional resultado resultadonumerador r1numerador r2denominador r2numerador r1denominador resultadodenominador r1denominador r2denominador return resultado struct racional divideracionalstruct racional r1 struct racional r2 struct racional resultado resultadonumerador r1numerador r2numerador resultadodenominador r1denominador r2denominador return resultado 137 R include stdioh Função para calcular o máximo divisor comum MDC int mdcint a int b while b 0 int temp a b a b b temp return a Função para comparar dois números racionais int equal2int r1num int r1den int r2num int r2den Reduzir r1 e r2 a termos mínimos int mdc1 mdcr1num r1den r1num mdc1 r1den mdc1 int mdc2 mdcr2num r2den r2num mdc2 r2den mdc2 Multiplicar o denominador de cada número pelo numerador do outro int produto1 r1num r2den int produto2 r2num r1den Testar a igualdade dos dois produtos return produto1 produto2 int main int r1num r1den r2num r2den Ler os valores dos números racionais printfDigite o numerador do primeiro número racional scanfd r1num printfDigite o denominador do primeiro número racional scanfd r1den printfDigite o numerador do segundo número racional scanfd r2num printfDigite o denominador do segundo número racional scanfd r2den Chamar a função equal2 para comparar os números int resultado equal2r1num r1den r2num r2den Exibir o resultado da comparação if resultado printfOs números racionais são iguais else printfOs números racionais não são iguais return 0 O método que utiliza o MDC é preferível quando a precisão é importante O método de multiplicação dos denominadores pode ser utilizado quando a performance é a principal prioridade e a precisão não é crítica Exercícios capítulo 1 111 R a analogia entre o tamanho de uma linha e o número de bits de informação em uma string de bits é inadequada porque não leva em consideração a complexidade da informação a codificação a redundância a compactação e a necessidade de um esquema de mapeamento claro entre os dois conceitos 112 R Exemplos de Tipos de Dados de Hardware Processador O tipo de processador CPU como Intel Core i5 ou AMD Ryzen 5 determina a capacidade de processamento do computador Memória A quantidade de memória RAM Random Access Memory disponível determina a quantidade de dados que o computador pode processar simultaneamente Armazenamento O tipo e a capacidade do dispositivo de armazenamento como disco rígido HDD ou disco de estado sólido SSD determinam a quantidade de dados que o computador pode armazenar Dispositivos de ES Os dispositivos de entrada e saída ES como teclado mouse monitor impressora e placa de rede permitem que o usuário interaja com o computador e se comunique com outros dispositivos 2 Operações que podem ser Executadas sobre os Dados de Hardware Os dados de hardware podem ser usados para executar diversas operações como Processamento de dados O processador pode realizar cálculos operações lógicas e outras operações matemáticas sobre os dados Armazenamento de dados Os dispositivos de armazenamento podem armazenar dados de forma permanente ou temporária Transferência de dados Os dispositivos de ES podem transferir dados entre o computador e outros dispositivos Controle de dispositivos Os dados de hardware podem ser usados para controlar o funcionamento dos dispositivos de hardware do computador 113 R Para determinar o número de chaves bivalentes necessárias para representar m definições diferentes podemos utilizar a seguinte fórmula Número de chaves 2m Cada definição diferente pode ser representada por uma chave bivalente de m bits Cada bit na chave representa uma escolha binária entre as duas definições possíveis Por exemplo se m 2 então existem duas definições diferentes Uma chave bivalente de 2 bits pode ser usada para representar essas duas definições com 0 representando a primeira definição e 1 representando a segunda definição 114 R Definição Inteiro positivo binário Inteiro binário em complemento de dois Inteiro decimal codificado em binário Observação a 10011001 129 127 99 Válido para todos os tipos b 1001 9 7 1 Válido para todos os tipos c 000100010001 257 255 161 Válido para positivo binário e complemento de dois d 01110111 127 127 79 Válido para todos os tipos e 01010101 85 85 53 Válido para todos os tipos f 100000010101 517 515 341 Válido para positivo binário e complemento de dois 115 R include stdioh include stdlibh include stringh Função para adicionar dois números binários char addchar a char b int lena strlena lenb strlenb int maxlen lena lenb lena lenb int carry 0 char result mallocmaxlen 2 for int i maxlen 1 i 0 i int ai i lena ai 0 0 int bi i lenb bi 0 0 int sum ai bi carry carry sum 2 resulti sum 2 0 if carry resultmaxlen 1 maxlen resultmaxlen 0 return result Função para subtrair dois números binários char subtractchar a char b int lena strlena lenb strlenb int maxlen lena lenb lena lenb int borrow 0 char result mallocmaxlen 2 for int i maxlen 1 i 0 i int ai i lena ai 0 0 int bi i lenb bi 0 0 int diff ai bi borrow if diff 0 diff 2 borrow 1 else borrow 0 resulti diff 0 while maxlen 0 resultmaxlen 1 0 maxlen resultmaxlen 0 return result Função para multiplicar dois números binários char multiplychar a char b int lena strlena lenb strlenb int maxlen lena lenb char result mallocmaxlen 2 for int i 0 i maxlen i resulti 0 for int i 0 i lena i int ai ai 0 for int j 0 j lenb j int bi bj 0 int carry resulti j 0 ai bi resulti j carry 2 0 carry 2 if carry resulti j 1 carry while maxlen 0 resultmaxlen 1 0 maxlen resultmaxlen 0 return result Função principal para ler as strings e imprimir os resultados int main char a100 b100 scanfs s a b printfSoma s adda b printfDiferença s subtracta b printfProduto s multiplya b return 0 116 R Em um computador ternário cada dígito trit pode ter três valores 0 1 ou 2 Para representar inteiros nãonegativos em notação ternária podemos usar um método similar à notação binária Exemplo O número decimal 10 pode ser representado em ternário como 102 2 é a maior potência de 3 menor que 10 31 3 O coeficiente do termo 31 é 0 pois 10 2 3 4 1 é a maior potência de 3 menor que 4 30 1 O coeficiente do termo 30 é 2 pois 4 1 1 3 Assim 10 em decimal é igual a 102 em ternário 2 Inteiros nãorepresentáveis em binário e ternário a Não representáveis em binário Em binário só podemos representar números com potências de 2 Números com potências de 3 que não são potências de 2 não podem ser representados em binário Em ternário podemos representar números com potências de 2 e 3 No entanto números com potências de 5 que não são potências de 2 ou 3 não podem ser representados em ternário 117 R include stdioh int main char binario100 int decimal 0 i j ternario100 k Leitura da string binária scanfs binario Conversão para decimal for i strlenbinario 1 j 0 i 0 i j decimal binarioi 0 1 j Conversão para ternário for i 0 decimal 0 i ternarioi decimal 3 decimal 3 Impressão da string ternária for k i 1 k 0 k printfd ternariok return 0 118 R Operadores Adição a bi c di a c b di Subtração a bi c di a c b di Multiplicação a bi c di ac bd ad bci Divisão a bi c di a bi c di c2 d2 ac bd c2 d2 bc adi c2 d2 Negação a bi a bi Módulo a bi sqrta2 b2 Funções complex createcomplexdouble a double b Cria um novo número complexo a partir de seus componentes real e imaginário double getrealcomplex c Retorna a parte real do número complexo double getimaginarycomplex c Retorna a parte imaginária do número complexo void setrealcomplex c double a Define a parte real do número complexo void setimaginarycomplex c double b Define a parte imaginária do número complexo complex conjugatecomplex c Retorna o conjugado do número complexo double abscomplexcomplex c Retorna o módulo do número complexo complex addcomplexcomplex c1 complex c2 Soma dois números complexos complex subtractcomplexcomplex c1 complex c2 Subtrai dois números complexos complex multiplycomplexcomplex c1 complex c2 Multiplica dois números complexos complex dividecomplexcomplex c1 complex c2 Divide dois números complexos int comparecomplexcomplex c1 complex c2 Compara dois números complexos string tostringcomplexcomplex c Converte um número complexo para string 121 a R include stdioh int main int n i j temp int v100 Leitura do tamanho do vetor printfDigite o tamanho do vetor scanfd n Leitura dos elementos do vetor for i 0 i n i printfDigite o elemento d i 1 scanfd vi Ordenação do vetor em ordem crescente for i 0 i n 1 i for j i 1 j n j if vi vj temp vi vi vj vj temp Cálculo da mediana int mediana if n 2 1 mediana vn 1 2 1 else mediana vn 2 1 vn 2 2 Impressão da mediana printfA mediana do vetor eh d mediana return 0 121 b R int verificamodaint vetor int tamanho int moda int i int frequenciamoda 0 Contar a frequência da moda for i 0 i tamanho i if vetori moda frequenciamoda Imprimir a moda e sua frequência if frequenciamoda 0 return moda else return 1 122 R include stdioh define MAXLATITUDE 90 typedef struct int latitude float temperatura Leitura int main Leitura leiturasMAXLATITUDE 2 int nLeituras 0 float temperaturasNorteMAXLATITUDE temperaturasSulMAXLATITUDE int nTemperaturasNorte 0 nTemperaturasSul 0 float mediaNorte 00f mediaSul 00f Lê as leituras while scanfd f leiturasnLeituraslatitude leiturasnLeiturastemperatura 2 nLeituras Calcula as médias das latitudes for int i 0 i nLeituras i int latitude leiturasilatitude float temperatura leiturasitemperatura if latitude 0 temperaturasNortelatitude 1 temperatura nTemperaturasNorte else temperaturasSullatitude 1 temperatura nTemperaturasSul Imprime a tabela for int latitude 1 latitude MAXLATITUDE latitude if nTemperaturasNortelatitude 1 0 mediaNorte temperaturasNortelatitude 1 nTemperaturasNortelatitude 1 printfd 1f latitude temperaturasNortelatitude 1 nTemperaturasNortelatitude 1 else printfd sem dados latitude if nTemperaturasSullatitude 1 0 mediaSul temperaturasSullatitude 1 nTemperaturasSullatitude 1 printfd 1f latitude temperaturasSullatitude 1 nTemperaturasSullatitude 1 else printfd sem dados latitude Calcula as médias dos hemisférios mediaNorte nTemperaturasNorte mediaSul nTemperaturasSul Determina o hemisfério mais quente char hemisferioMaisQuente10 Norte if mediaSul mediaNorte strcpyhemisferioMaisQuente Sul Imprime as médias dos hemisférios e o hemisfério mais quente printfHemisfério Norte 1f mediaNorte printfHemisfério Sul 1f mediaSul printfHemisfério mais quente s hemisferioMaisQuente return 0 123 R include stdioh define MAXLOJAS 20 define MAXITENS 10 int main int vendasMAXLOJASMAXITENS 0 int totalVendasMAXITENS 0 int totalGeral 0 Lê as vendas de cada loja for int loja 0 loja MAXLOJAS loja for int item 0 item MAXITENS item scanfd vendaslojaitem totalVendasitem vendaslojaitem totalGeral vendaslojaitem Imprime a tabela de vendas printfLoja for int item 0 item MAXITENS item printfItemd item 1 printfTOTAL for int loja 0 loja MAXLOJAS loja printfd loja 1 for int item 0 item MAXITENS item printfd vendaslojaitem printfd totalVendasloja printfTOTAL for int item 0 item MAXITENS item printfd totalVendasitem printfd totalGeral return 0 124 R struct estadojogo int tabuleiro64 int vezjogador 0 para brancas 1 para pretas int posicaoreibranco int posicaoreipreto void imprimirjogadaspossiveisint tabuleiro int vezjogador Loop por todas as casas do tabuleiro for int i 0 i 64 i Se a casa estiver ocupada por uma peça preta if tabuleiroi 0 Obtenha a peça que ocupa a casa int peca tabuleiroi Loop por todos os movimentos possíveis da peça for int j 0 j 8 j Se o movimento for válido if movimentovalidotabuleiro vezjogador i j Imprima o movimento printfcd cd a i 8 8 i 8 a j 8 8 j 8 int main int tabuleiro64 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Imprimir todas as jogadas possíveis para o preto imprimirjogadaspossiveistabuleiro 1 return 0 125 R include stdioh void printarint a100 int m int n int i j k l Imprimir cabeçalho for i 0 i n i printfCOL d i printf Imprimir linhas for i 0 i m i Imprimir número da linha printfROW d i Imprimir subvetor for j 0 j n j printfd aij Nova linha printf Imprimir página seguinte a cada 50 linhas if i 1 50 0 Imprimir cabeçalho for k 0 k n k printfCOL d k printf int main int a100100 m n Ler tamanho do vetor scanfd d m n Ler valores do vetor for int i 0 i m i for int j 0 j n j scanfd aij Imprimir vetor printara m n return 0 126 R Item Endereço a10 140 a100 600 a21 1764 a1000 8000 a110 1160 a51 524 a53 604 a210 1160 a919 8756 127 R void listoffint range int sub int n int i j offset 0 Loop para cada índice em sub for i 0 i n i Verificar se o índice está dentro da faixa if subi 0 subi rangei Se não estiver imprimir os deslocamentos até agora for j 0 j i j printfd offset offset rangej Parar o loop break Se estiver atualizar o deslocamento offset subi rangei Se todos os índices estavam dentro da faixa imprimir o deslocamento final if i n printfd offset printf int main int range 35 10 6 3 int sub 1 3 1 2 listoffrange sub 4 return 0 128 R int aNN int getelementint i int j if i j return 0 Elemento não existe return an1ini2 j include stdioh define N 3 int main int aNN Armazenando elementos no vetor triangular inferior for int i 0 i N i for int j 0 j N j if i j aii12 j i j else aii12 j 0 Acessando alguns elementos printfa00 d getelement0 0 0 printfa11 d getelement1 1 2 printfa22 d getelement2 2 4 printfa10 d getelement1 0 0 return 0 131 R typedef struct complexo double real double imag complexo complexo somacomplexocomplexo c1 complexo c2 complexo resultado resultadoreal c1real c2real resultadoimag c1imag c2imag return resultado complexo multiplicacomplexocomplexo c1 complexo c2 complexo resultado resultadoreal c1real c2real c1imag c2imag resultadoimag c1real c2imag c1imag c2real return resultado complexo negacomplexocomplexo c complexo resultado resultadoreal creal resultadoimag cimag return resultado 132 a R include stdioh struct realtype int left int right void inserirNumeroRealstruct realtype numero Leitura da parte inteira printfDigite a parte inteira do número scanfd numeroleft Leitura da parte decimal printfDigite a parte decimal do número scanfd numeroright 132 b R float obterNumeroRealstruct realtype numero float valorReal numeroleft Concatenando a parte decimal valorReal floatnumeroright 1000f return valorReal 132 c R void adicionarstruct realtype resultado struct realtype numero1 struct realtype numero2 int somaEsquerda numero1left numero2left int somaDireita numero1right numero2right Ajustando o caso de transporte na parte decimal if somaDireita 100 somaDireita 100 somaEsquerda resultadoleft somaEsquerda resultadoright somaDireita void subtrairstruct realtype resultado struct realtype numero1 struct realtype numero2 int diferencaEsquerda numero1left numero2left int diferencaDireita numero1right numero2right Ajustando o caso de empréstimo na parte decimal if diferencaDireita 0 diferencaDireita 100 diferencaEsquerda resultadoleft diferencaEsquerda resultadoright diferencaDireita void multiplicarstruct realtype resultado struct realtype numero1 struct realtype numero2 int produtoEsquerda numero1left numero2left int produtoDireita numero1right numero2right int produtoIntermediario numero1left numero2right numero1right numero2left Ajustando o caso de transporte na parte decimal if produtoIntermediario 100 resultadoleft produtoEsquerda produtoIntermediario 100 resultadoright produtoIntermediario 100 else resultadoleft produtoEsquerda resultadoright produtoIntermediario 133 R Expressão Endereço inicial p10 100 10 sizeofstruct person p200 namemidinit 100 200 sizeofstruct person 1 p20 income 100 20 sizeofstruct person 4 sizeofchar sizeofint sizeofstruct nametype sizeofint p20 address5 100 20 sizeofstruct person 4 sizeofchar sizeofint sizeofstruct nametype sizeofint 5 p5 parents1last 10 1 134 R include stdioh include stdlibh include stringh Estrutura para armazenar dados de um aluno typedef struct aluno char sobrenome50 char nome50 float pontosgraduacao Aluno Estrutura para armazenar dados de um funcionário typedef struct funcionario char sobrenome50 char nome50 float salario Funcionario Função para comparar dois alunos por sobrenome e nome int compararalunosconst void a const void b const Aluno aluno1 const Aluno a const Aluno aluno2 const Aluno b int cmpsobrenome strcmpaluno1sobrenome aluno2sobrenome if cmpsobrenome 0 return cmpsobrenome return strcmpaluno1nome aluno2nome Função para comparar dois funcionários por sobrenome e nome int compararfuncionariosconst void a const void b const Funcionario funcionario1 const Funcionario a const Funcionario funcionario2 const Funcionario b int cmpsobrenome strcmpfuncionario1sobrenome funcionario2sobrenome if cmpsobrenome 0 return cmpsobrenome return strcmpfuncionario1nome funcionario2nome Função para conceder um aumento de 10 a um funcionário void concederaumentoFuncionario funcionario funcionariosalario 11 Função principal int main Leitura do número de alunos e funcionários int nalunos nfuncionarios scanfd d nalunos nfuncionarios Alocação de memória para os vetores de alunos e funcionários Aluno alunos mallocsizeofAluno nalunos Funcionario funcionarios mallocsizeofFuncionario nfuncionarios Leitura dos dados dos alunos for int i 0 i nalunos i scanfs s f alunosisobrenome alunosinome alunosipontosgraduacao Leitura dos dados dos funcionários for int i 0 i nfuncionarios i scanfs s f funcionariosisobrenome funcionariosinome funcionariosisalario Ordena os vetores de alunos e funcionários por sobrenome e nome qsortalunos nalunos sizeofAluno compararalunos qsortfuncionarios nfuncionarios sizeofFuncionario compararfuncionarios Percorre os alunos e funcionários em paralelo int ialuno 0 ifuncionario 0 while ialuno nalunos ifuncionario nfuncionarios Compara os sobrenomes e nomes dos alunos e funcionários int cmpsobrenome strcmpalunosialunosobrenome funcionariosifuncionariosobrenome int cmpnome strcmpalunosialunonome funcionariosifuncionarionome Se o aluno e o funcionário forem a mesma pessoa concede um aumento de 10 ao funcionário if cmpsobrenome 0 cmpnome 0 if alunosialunopontosgraduacao 30 concederaumentofuncionariosifuncionario ialuno ifuncionario else if cmpsobrenome 0 ialuno else ifuncionario Imprime os dados dos funcionários com aumento for int i 0 i nfuncionarios i printfs s 2f funcionariosisobrenome funcionariosinome funcionariosisalario Libera a memória alocada freealunos freefuncionarios return 0 135 R include stdioh include stdlibh include stringh Estrutura para armazenar dados de um aluno typedef struct aluno char nome50 char sobrenome50 char curso50 int dianascimento int mesnascimento int anonascimento Aluno Função para comparar dois alunos por nome int compararalunosconst void a const void b const Aluno aluno1 const Aluno a const Aluno aluno2 const Aluno b return strcmpaluno1nome aluno2nome Função principal int main Leitura do nome do arquivo char nomearquivo50 scanfs nomearquivo Leitura do mês e ano de nascimento int mesbusca anobusca scanfd d mesbusca anobusca Abertura do arquivo FILE arquivo fopennomearquivo r if arquivo NULL printfErro ao abrir o arquivo return 1 Alocação de memória para um vetor de alunos Aluno alunos mallocsizeofAluno 100 int nalunos 0 Leitura dos dados dos alunos while fscanfarquivo s s s d d d alunosnalunosnome alunosnalunossobrenome alunosnalunoscurso alunosnalunosdianascimento alunosnalunosmesnascimento alunosnalunosanonascimento EOF nalunos Fechamento do arquivo fclosearquivo Ordena o vetor de alunos por nome qsortalunos nalunos sizeofAluno compararalunos Percorre os alunos e imprime os que nasceram no mês e ano especificados for int i 0 i nalunos i if alunosimesnascimento mesbusca alunosianonascimento anobusca printfs s alunosinome alunosisobrenome Libera a memória alocada freealunos return 0 136 R struct racional int numerador int denominador struct racional somaracionalstruct racional r1 struct racional r2 struct racional resultado resultadonumerador r1numerador r2denominador r2numerador r1denominador resultadodenominador r1denominador r2denominador return resultado struct racional subtrairacionalstruct racional r1 struct racional r2 struct racional resultado resultadonumerador r1numerador r2denominador r2numerador r1denominador resultadodenominador r1denominador r2denominador return resultado struct racional divideracionalstruct racional r1 struct racional r2 struct racional resultado resultadonumerador r1numerador r2numerador resultadodenominador r1denominador r2denominador return resultado 137 R include stdioh Função para calcular o máximo divisor comum MDC int mdcint a int b while b 0 int temp a b a b b temp return a Função para comparar dois números racionais int equal2int r1num int r1den int r2num int r2den Reduzir r1 e r2 a termos mínimos int mdc1 mdcr1num r1den r1num mdc1 r1den mdc1 int mdc2 mdcr2num r2den r2num mdc2 r2den mdc2 Multiplicar o denominador de cada número pelo numerador do outro int produto1 r1num r2den int produto2 r2num r1den Testar a igualdade dos dois produtos return produto1 produto2 int main int r1num r1den r2num r2den Ler os valores dos números racionais printfDigite o numerador do primeiro número racional scanfd r1num printfDigite o denominador do primeiro número racional scanfd r1den printfDigite o numerador do segundo número racional scanfd r2num printfDigite o denominador do segundo número racional scanfd r2den Chamar a função equal2 para comparar os números int resultado equal2r1num r1den r2num r2den Exibir o resultado da comparação if resultado printfOs números racionais são iguais else printfOs números racionais não são iguais return 0 O método que utiliza o MDC é preferível quando a precisão é importante O método de multiplicação dos denominadores pode ser utilizado quando a performance é a principal prioridade e a precisão não é crítica