·
Engenharia Mecânica ·
Linguagens de Programação
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
32
Linguagem C: Fundamentos de Sistemas de Computadores e Tipos de Arquivos
Linguagens de Programação
CEFET/RJ
39
Structs e Unions em C: Fundamentos de Estruturas de Dados Compostos
Linguagens de Programação
CEFET/RJ
39
Structs e Unions em C: Fundamentos de Estruturas de Dados Compostas
Linguagens de Programação
CEFET/RJ
32
Arquivos em C - Fundamentos e Tipos de Arquivos
Linguagens de Programação
CEFET/RJ
7
Exploração do Firebase Cloud Messaging com Flutter
Linguagens de Programação
CEFET/RJ
Texto de pré-visualização
Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Estrutura de Dados Compostos Structs e Unions 1 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Definição Uma estrutura struct ou registro em C é uma coleção de um ou mais valores agrupados sob um único nome Estruturas constituem um recurso importante para organizar os dados utilizados por um programa graças à possibilidade de tratar um grupo de valores como uma única variável 2 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Estruturas anônimas O exemplo abaixo cria uma estrutura chamada de estrutura anônima Esse tipo de estrutura não pode ser referenciada em outras partes do programa struct int dia int mes int ano hoje Serve somente para declaração de variáveis do tipo da estrutura Não será possível declarar outras variáveis do mesmo tipo da variável hoje Para resolver isso devese declarar estruturas usando rótulos 3 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Exemplo de criação de estrutura rotulada struct ponto int x int y struct funcionario int registro char nome30 char depto5 float salario O rótulo dessas estruturas são ponto e funcionário e usase eles para declaração de variáveis 4 As variáveis variáveis que fazem parte de uma estrutura são denominadas membros e são identificadas por nomes Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Exemplo de uso As declarações de ponto e funcionario definem os respectivos tipos de dados que podem ser utilizados em declarações de variáveis Exemplos struct ponto p1 p2 p3 struct funcionario Joao Na primeira declaração estão sendo declaradas as variáveis p1 p2 e p3 do tipo ponto Na segunda declaração é declarada a variável Joao do tipo funcionário 5 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Exemplo de uso Para uma variável do tipo ponto dizemos que x e y são seus campos ou membros Os campos de uma variável podem ser acessados individualmente como variáveis usandose o nome da variável seguido de e o nome do campo Exemplos p1x 10 p1y 20 p2x p1x 5 p2y p2y 5 Além disso é possível atribuir a uma estrutura o valor de outra estrutura do mesmo tipo Exemplos funcionario f Joao p3 p2 6 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Estruturas complexas Os campos de uma estrutura podem ser de qualquer tipo tipos simples int char float etc vetores ou até mesmo estruturas Exemplo struct retangulo struct ponto pa struct ponto pb 7 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Declaração com valores iniciais Ao declararmos uma estrutura podemos também definir o seu valor inicial de forma análoga a aquela utilizada para vetores Exemplos struct ponto origem 00 struct ponto trapezio 55 5 10 105 1013 8 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Exemplo de programa usando estruturas include conioh include stdioh include stringh uma estrutura Pessoa struct Pessoa char nome20 int idade char fone9 int main declara uma variável do tipo struct struct Pessoa cliente fflushstdin printfDigite o nome getsclientenome clienteidade 60 printf Digite o no do telefone getsclientefone obtém os dados printf O nome do cliente e s clientenome printfA idade do cliente e d clienteidade printfO no do telefone e putsclientefone return 0 Cap09Prog01 9 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Observe que cada posição do vetor armazena um conjunto de informações diferentes Neste exemplo cada posição está armazenando um tipo string nome da pessoa um tipo inteiro idade e um tipo float salário A declaração da estrutura ficará da seguinte forma 1 2 3 4 5 6 typedef struct char nome200 int idade float salario Funcionario Funcionario func10 Observe que a linha 6 é a que cria de fato o vetor 1 2 3 4 5 fori0 i10 i strcpyfuncinome NULL funciidade 0 funcisalario 00 Vetor de Struct 10 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Comando Typedef O comando typedef permite ao programador definir um novo nome para um determinado tipo O comando typedef também pode ser utilizado para dar nome a tipos complexos como as estruturas As estruturas criadas poderiam ser definidas como tipos através do comando typedef O exemplo ficaria include stdioh typedef struct tipoendereco char rua 50 int numero char bairro 20 char cidade 30 char siglaestado 3 long int CEP TEndereco typedef struct fichapessoal char nome 50 long int telefone TEndereco endereco TFicha void mainvoid TFicha ex 11 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Buscando um elemento no Vetor de Estruturas printf Digite um nome scanfsc nome fori0 i10 i if strcmpnome funcinome 0 printf Registro encontrado posicao i else posicao 1 If posicao 1 printf Registro não encontrado else printf Registro Encontrado printf O nome do funcionário é s funcposicaonome printf A idade do funcionário é d funcposicaoidade printf O salário do funcionário é 2f funcposicaosalario 12 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh include conioh include stringh include stdlibh typedef struct char nome10 int idade float salario Funcionario int mainvoid Funcionario func3 int i posicao achei char nome10 systemcls for i0 i3i printf Digite o nome do funcionario n d i1 scanfsfuncinome printf Idade do funcioario n d i1 scanfdfunciidade printf Salario do funcionario n d i1 scanfffuncisalario systemcls printf Digite um nome scanfsc nome i 0 achei 0 posicao 1 while i 3 achei 0 if strcmpnome funcinome 0 posicao i achei 1 else posicao 1 i if posicao 1 printf Registro não encontrado else printf Registro Encontrado printf O nome do funcionario s funcposicaonome printf A idade do funcionario d funcposicaoidade printf O salário do funcionario 2f funcposicaosalario return0 Cap09Prog01A 13 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Estruturas rotuladas e nomeadas É possível criar um tipo baseado em uma estrutura Para isso utilizase typedef na declaração como mostrado anteriomete struct tipodata int dia mes ano typedef struct tipodata DATA Para criar uma estrutura rotulada e nomeada podese usar typedef struct tipodata int dia mes ano DATADOMES ATENÇÃO DATA é o nome to tipo Agora pode ser declarada uma variável dessa forma DATADOMES d Não existe mais a necessidade de struct tipodata d Forma mais comum de declarar 14 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C 15 include stdioh include conioh int mainvoid Criando a struct struct fichadealuno char nome50 char disciplina30 float notaprova1 float notaprova2 Criando a variável aluno que será do tipo struct fichadealuno struct fichadealuno aluno printf Cadastro de aluno n printfNome do aluno fflushstdin fgetsalunonome 40 stdin printfDisciplina fflushstdin fgetsalunodisciplina 40 stdin printfInforme a 1a nota scanff alunonotaprova1 printfInforme a 2a nota scanff alunonotaprova2 printf Lendo os dados da struct printfNome s alunonome printfDisciplina s alunodisciplina printfNota da Prova 1 2f alunonotaprova1 printfNota da Prova 2 2f alunonotaprova2 getch return0 Cap09Prog02 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C 16 include stdioh include stdlibh include stringh include localeh include stringh include conioh include ctypeh define TotAlu 2 typedef struct int codigo char nome20 float nota Aluno Aluno dadosaluTotAlu char nome20 int posicao int main char resp int i 0 achei setlocaleLCALLportuguese fori0 iTotAlu i dadosaluicodigo 0 strcpydadosaluinome NULL dadosaluinota 00 fori0 iTotAlu i printf O cód do aluno é d dadosaluicodigo printf O nome do aluno é s dadosaluinome printf A nota do aluno é 2f dadosaluinota printf getch printf fori0 iTotAlu i systemcls printf Digite o código do aluno scanfdc dadosaluicodigo printf Digite o nome do aluno scanfsc dadosaluinome printf Digite a nota do aluno scanffc dadosaluinota printf fori0 iTotAlu i printf O cód do aluno é d dadosaluicodigo printf O nome do aluno é s dadosaluinome printf A nota do aluno 2f dadosaluinota printf getch printf do systemcls printf Digite um nome scanfsc nome i 0 posicao 1 achei 0 do ifstrcmpnome dadosaluinome 0 printf Registro encontrado posicao i achei 1 getch i while achei 1 i TotAlu ifachei 1 printf Registro não encontrado getch else printf Nome é s nome printf O cód do aluno é d dados aluposicaocodigo printf O nome do aluno é s dados aluposicaonome printf A nota do aluno é 2f dados aluposicaonota printf getch achei 0 printf Alunos com notas entre 4 e 7 posicao 1 fori0 iTotAlu i ifdadosaluinota4dadosaluinota7 achei 1 printf O código do aluno é d dados aluicodigo printf O nome do aluno é s dadosaluinome printf A nota do aluno é 2f dadosaluinota printf achei 1 ifachei 0 printf Não há alunos com notas dentro desse faixa printf Deseja pesquisar mais sn resp touppergetche while resp S return 0 Exemplo de Vetor de Struct Cap09Prog03 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Funções e structs Passagem de uma struct como parâmetro para função struct data int dia int mes int ano void imprimestruct data d printfd d d ddia dmes dano Int main struct data d ddia 10 dmes 12 dano 1500 imprimed return0 17 Cap09Prog04D0 Cap09Prog04D include conioh include stdioh struct data int dia int mes int ano void imprimestruct data mae printfd d d maedia maemes maeano int main struct data pai paidia 10 paimes 12 paiano 1500 imprimepai return0 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include conioh include stdioh struct data int dia int mes int ano struct data data1 tatu void imprimestruct data d printf d d d ddia dmes dano int main tatudia 10 tatu data1 printf Entre com o dia scanfd data1dia data1mes 12 data1ano 1500 printfddata1dia getch imprimetatu return0 Cap09Prog04 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh include stdlibh include conioh typedef struct int matricula float nota tAluno int main void tAluno a1 tAluno ptrAluno a1 a1matricula 555 a1nota 80 printfmatricula d nota 2f a1matricula a1nota 19 podemos atribuir ou acessar um valor usando o ponteiro ptrAluno ptrAlunonota 85 portanto ptrAlunonota é o mesmo que usar prtAlunonota printf matricula d nota 2f ptrAlunomatricula ptrAlunonota ptrAluno substitui a notação ptrAluno de forma mais intuitiva atribuindo um novo valor para a nota usando ptrAlunonota ptrAlunonota 90 portanto ptrAlunonota é o mesmo que usar prtAlunonota printf matricula d nota 2f ptrAlunomatricula ptrAlunonota systempause return 0 Cap09Prog04C Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Funções e structs struct tamanho int t char letra struct tamanho defineint valor char teste struct tamanho a at valor teste C aletra teste return a int main struct tamanho a char ch ch B a define 10 ch a recebe a struct resultante da função printfd at vai imprimir 10 printf caletra vai imprimir A return0 20 Retorno de uma struct a partir de uma função Cap09Prog05 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include conioh include stdioh struct tamanho int t struct tamanho petecaint valor struct tamanho a at valor return a int main struct tamanho a a peteca 10 a recebe a struct resultante da função printfd at vai imprimir 10 return0 21 Cap09Prog06 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C struct data int dia int mes int ano Funções e structs Uso de ponteiros 22 Definindo uma variável do tipo data struct data dt Definindo um ponteiro para dt struct data pdtdt Fazendo referência a um elemento da estrutura dtdia ou pdtdia ou pdtdia dtmes ou pdtmes ou pdtmes dtano ou pdtano ou pdtano Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh include conioh include stringh include stdlibh include ctypeh struct Funcionario char nome10 int idade float salario struct Funcionario dados2 func void lervetor Funcionario mae int tot void imprimeFuncionario mae int tot int mainvoid Funcionario func int i posicao achei totelem char nome10 resp systemcls totelem 2 func dados lervetorfunc totelem imprimefunc totelem getch Cap09Prog01B 23 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C do systemcls printf Digite um nome scanfsc nome i 0 achei 0 posicao 1 func dados while i totelem achei 0 if strcmpnome funcnome 0 posicao i achei 1 else posicao 1 func i if posicao 1 printf Registro não encontrado else printf Registro Encontrado printf O nome do funcionario s funcnome printf A idade do funcionario d funcidade printf O salário do funcionario 2f funcsalario printf Quer testar outro SN resp touppergetch while resp S return0 24 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C void lervetor struct Funcionario mae int total int i systemcls for i0 itotal i printf Digite o nome do funcionario n d i1 scanfsmaeinome printf Idade do funcionario n d i1 scanfdmaeiidade printf Salario do funcionario n d i1 scanffmaeisalario void imprimestruct Funcionario mae int total int i systemcls for i0 itotal i printf Nome do funcionario nd si1 maeinome printf Idade do funcionario nd di1 maeiidade printf Salario do funcionario nd 2f i1 maeisalario 25 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh include stdlibh include conioh include stringh Este programa utiliza o Metodo Insert Sort mas há vários métodos quem podem ser utilizados entre eles o Buble Sort o Quick Sort o Select Sort e o trocas de trocas sucessivas Use aquele que você se sentir mais à vontade Mas é sempre bom saber um método de para qualquer situação onde houver necessidade de fazer uma ordenação struct aluno int matric char nome30 float n1n2n3 struct aluno V4 float medias4 void PrintPosicaoInicial struct aluno V int N void InsertSortMatricula struct aluno V int N float medias void PrintSortMatricula struct aluno V int N float medias void PrintMaiorMenorMedia struct aluno V int N void InsertSortNome struct aluno V int N void PrintSortNome struct aluno V int N int main int i struct aluno V4 2 Andre 95 78 85 4 Ricardo 75 87 68 1 Bianca 97 67 84 3 Ana 57 61 74 PrintPosicaoInicial V 4 InsertSortMatricula V 4 medias PrintSortMatricula V 4 medias InsertSortNome V 4 PrintSortNome V 4 PrintMaiorMenorMedia V 4 systempause return0 void PrintPosicaoInicial struct aluno V int N int i j float media struct aluno aux printfImpressao como foi criado o Vetor de Estrutura for i 0 i 4 i media Vin1 Vin2 Vin33 printfd 8s media 2f Vimatric Vinome media printf Cap09Prog11B Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C void PrintMaiorMenorMedia struct aluno V int N int i j indmaior indmenor float maiormed 1 menormed 11 media for i 0 i 4 i media Vin1 Vin2 Vin33 if media maiormed maiormed media indmaior i if media menormed menormed media indmenor i printfImpressao da maior media pela Matricula printfd 8s media 2f Vindmaiormatric Vindmaiornome maiormed printfImpressao da menor media pela Matricula printfd 8s media 2f Vindmenormatric Vindmenornome menormed printf void InsertSortMatricula struct aluno V int N float medias int i j struct aluno aux for i 1 i N i aux Vi for j i 0 auxmatric V j1 matric j Vj Vj 1 Vj aux for i0 i N i medias i V i n1 V i n2 V i n3 3 saida strcmp str1str2 0 str1 eh igual a str2 0 str1 vem depois de str2 0 vem antes de str2 lembremse que não se pode comparar duas strings usando simplesmente um if forma errada if string1 string2 isso não pode Use a função strcmp associada a um if como sitado acima Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C void InsertSortNomestruct aluno V int N int i j struct aluno aux for i 1 i N i aux Vi for ji j 0 strcmpauxnome Vj 1nome 0 j V j V j 1 Vj aux void PrintSortMatricula struct aluno V int N float medias int i j struct aluno aux printfImpressao ordenada pela Matricula for i 0 i 4 i printfd 8s media 1f V i matricV i nome medias i printf void PrintSortNome struct aluno V int N int i j struct aluno aux printfImpressao ordenada pelo Nome for i 0 i 4 i printfd s VimatricVinome printf void CalcMedia struct aluno V int N int i j struct aluno aux for i 1 i N i aux Vi for ji j 0 strcmpauxnome Vj 1nome 0 j V j V j 1 Vj aux Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Uma estrutura pode ser passada como parâmetro por referência numa função Quando se usa uma referência ponteiro o acesso aos campos da mesma é feito através do operador seta ao invés de ponto Exemplo void movePstruct ponto p int dx int dy p x dx ou p x p x dx p y dy Observe o uso de ao invés de Funções e structs Passagem por referência 29 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Alocação dinâmica de estruturas A alocação dinâmica de uma struct é feita exatamente igual ao demais tipos Única diferença é usar o sizeof adequandoo para o tipo struct E fazer o casting para um ponteiro para o tipo struct Exemplo no próximo slide 30 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh typedef struct tipodata int dia mes ano DATA int main void DATA d d DATA malloc sizeof DATA ddia 31 dmes 12 dano 2021 ou scanfddd ddia dmes dano printfData d d d ddia dmes dano freed return 0 31 Cap09Prog07 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Union Uma union determina uma única localização de memória onde podem estar armazenadas várias variáveis diferentes A declaração de uma união é semelhante à declaração de uma estrutura union nomedotipodaunion tipo1 nome1 tipo2 nome2 tipon nomen variáveisunion 32 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Union Exemplo union angulo float graus float radianos As variáveis graus e radianos que apesar de terem nomes diferentes ocupam o mesmo local da memória Isto quer dizer que só gastamos o espaço equivalente a um único float 33 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh define GRAUS G define RAD R union angulo int graus float radianos void main union angulo ang char op printf Numeros em graus ou radianos scanfcop Exemplo de uso de union Cap09Prog08 34 if op GRAUS anggraus 180 printf Angulo d anggraus else if op RAD angradianos 31415 printf Angulof nangradianos else printf Entrada invalida Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh union numero char Ch int I float F main void union numero N NF 123 printf 2fNF NI 22 printf dNI NI A printf cNCh return 0 O programa acima é muito perigoso pois você está lendo uma região da memória que foi gravada como um inteiro como se fosse um ponto flutuante Tome cuidado O resultado pode não fazer sentido CUIDADO Cap09Prog09 35 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Enumerações Numa enumeração podemos dizer ao compilador quais os valores que uma determinada variável pode assumir Sua forma geral é enum nomedotipodaenumeração listadevalores listadevariáveis Vamos considerar o seguinte exemplo enum diasdasemana segunda terca quarta quinta sextasabado domingo O programador diz ao compilador que qualquer variável do tipo diasdasemana só pode ter os valores enumerados 36 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh enum diasdasemana segunda terca quarta quinta sexta sabado domingo main void enum diasdasemana d1d2 d1segunda d2sexta if d1d2 printf O dia e o mesmo else printf São dias diferentes return 0 O compilador pega a lista de valores e associa a cada um um número inteiro Então ao primeiro da lista é associado o número zero o segundo ao número 1 e assim por diante As variáveis declaradas são então variáveis int Cap09Prog10 37 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Enumerações Podese criar um enum com valores incrementados com valores iniciais diferentes de zero Exemplo enum ARGENTINA 3 ITALIA BRASIL Aqui Italia 4 e Brasil 5 38 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh enum diasdasemana segunda terca quarta quinta sexta sabado domingo main void enum diasdasemana d1d2 int i d2sexta printf Digite 0 seg 1 ter 2qua 3 qui 4sex 5 sab 6 dom scanfdd1 printf d2 dd2 i d1 switch i case 0 printf d1 segunda break case 1 printf d1 terca break case 2 printf d1 quarta break case 3 printf d1 quinta break case 4 printf d1 sexta break case 5 printf d1 sabado break case 6 printf d1 domingo break return 0 Cap09Prog11 39
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
32
Linguagem C: Fundamentos de Sistemas de Computadores e Tipos de Arquivos
Linguagens de Programação
CEFET/RJ
39
Structs e Unions em C: Fundamentos de Estruturas de Dados Compostos
Linguagens de Programação
CEFET/RJ
39
Structs e Unions em C: Fundamentos de Estruturas de Dados Compostas
Linguagens de Programação
CEFET/RJ
32
Arquivos em C - Fundamentos e Tipos de Arquivos
Linguagens de Programação
CEFET/RJ
7
Exploração do Firebase Cloud Messaging com Flutter
Linguagens de Programação
CEFET/RJ
Texto de pré-visualização
Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Estrutura de Dados Compostos Structs e Unions 1 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Definição Uma estrutura struct ou registro em C é uma coleção de um ou mais valores agrupados sob um único nome Estruturas constituem um recurso importante para organizar os dados utilizados por um programa graças à possibilidade de tratar um grupo de valores como uma única variável 2 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Estruturas anônimas O exemplo abaixo cria uma estrutura chamada de estrutura anônima Esse tipo de estrutura não pode ser referenciada em outras partes do programa struct int dia int mes int ano hoje Serve somente para declaração de variáveis do tipo da estrutura Não será possível declarar outras variáveis do mesmo tipo da variável hoje Para resolver isso devese declarar estruturas usando rótulos 3 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Exemplo de criação de estrutura rotulada struct ponto int x int y struct funcionario int registro char nome30 char depto5 float salario O rótulo dessas estruturas são ponto e funcionário e usase eles para declaração de variáveis 4 As variáveis variáveis que fazem parte de uma estrutura são denominadas membros e são identificadas por nomes Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Exemplo de uso As declarações de ponto e funcionario definem os respectivos tipos de dados que podem ser utilizados em declarações de variáveis Exemplos struct ponto p1 p2 p3 struct funcionario Joao Na primeira declaração estão sendo declaradas as variáveis p1 p2 e p3 do tipo ponto Na segunda declaração é declarada a variável Joao do tipo funcionário 5 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Exemplo de uso Para uma variável do tipo ponto dizemos que x e y são seus campos ou membros Os campos de uma variável podem ser acessados individualmente como variáveis usandose o nome da variável seguido de e o nome do campo Exemplos p1x 10 p1y 20 p2x p1x 5 p2y p2y 5 Além disso é possível atribuir a uma estrutura o valor de outra estrutura do mesmo tipo Exemplos funcionario f Joao p3 p2 6 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Estruturas complexas Os campos de uma estrutura podem ser de qualquer tipo tipos simples int char float etc vetores ou até mesmo estruturas Exemplo struct retangulo struct ponto pa struct ponto pb 7 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Declaração com valores iniciais Ao declararmos uma estrutura podemos também definir o seu valor inicial de forma análoga a aquela utilizada para vetores Exemplos struct ponto origem 00 struct ponto trapezio 55 5 10 105 1013 8 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Exemplo de programa usando estruturas include conioh include stdioh include stringh uma estrutura Pessoa struct Pessoa char nome20 int idade char fone9 int main declara uma variável do tipo struct struct Pessoa cliente fflushstdin printfDigite o nome getsclientenome clienteidade 60 printf Digite o no do telefone getsclientefone obtém os dados printf O nome do cliente e s clientenome printfA idade do cliente e d clienteidade printfO no do telefone e putsclientefone return 0 Cap09Prog01 9 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Observe que cada posição do vetor armazena um conjunto de informações diferentes Neste exemplo cada posição está armazenando um tipo string nome da pessoa um tipo inteiro idade e um tipo float salário A declaração da estrutura ficará da seguinte forma 1 2 3 4 5 6 typedef struct char nome200 int idade float salario Funcionario Funcionario func10 Observe que a linha 6 é a que cria de fato o vetor 1 2 3 4 5 fori0 i10 i strcpyfuncinome NULL funciidade 0 funcisalario 00 Vetor de Struct 10 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Comando Typedef O comando typedef permite ao programador definir um novo nome para um determinado tipo O comando typedef também pode ser utilizado para dar nome a tipos complexos como as estruturas As estruturas criadas poderiam ser definidas como tipos através do comando typedef O exemplo ficaria include stdioh typedef struct tipoendereco char rua 50 int numero char bairro 20 char cidade 30 char siglaestado 3 long int CEP TEndereco typedef struct fichapessoal char nome 50 long int telefone TEndereco endereco TFicha void mainvoid TFicha ex 11 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Buscando um elemento no Vetor de Estruturas printf Digite um nome scanfsc nome fori0 i10 i if strcmpnome funcinome 0 printf Registro encontrado posicao i else posicao 1 If posicao 1 printf Registro não encontrado else printf Registro Encontrado printf O nome do funcionário é s funcposicaonome printf A idade do funcionário é d funcposicaoidade printf O salário do funcionário é 2f funcposicaosalario 12 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh include conioh include stringh include stdlibh typedef struct char nome10 int idade float salario Funcionario int mainvoid Funcionario func3 int i posicao achei char nome10 systemcls for i0 i3i printf Digite o nome do funcionario n d i1 scanfsfuncinome printf Idade do funcioario n d i1 scanfdfunciidade printf Salario do funcionario n d i1 scanfffuncisalario systemcls printf Digite um nome scanfsc nome i 0 achei 0 posicao 1 while i 3 achei 0 if strcmpnome funcinome 0 posicao i achei 1 else posicao 1 i if posicao 1 printf Registro não encontrado else printf Registro Encontrado printf O nome do funcionario s funcposicaonome printf A idade do funcionario d funcposicaoidade printf O salário do funcionario 2f funcposicaosalario return0 Cap09Prog01A 13 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Estruturas rotuladas e nomeadas É possível criar um tipo baseado em uma estrutura Para isso utilizase typedef na declaração como mostrado anteriomete struct tipodata int dia mes ano typedef struct tipodata DATA Para criar uma estrutura rotulada e nomeada podese usar typedef struct tipodata int dia mes ano DATADOMES ATENÇÃO DATA é o nome to tipo Agora pode ser declarada uma variável dessa forma DATADOMES d Não existe mais a necessidade de struct tipodata d Forma mais comum de declarar 14 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C 15 include stdioh include conioh int mainvoid Criando a struct struct fichadealuno char nome50 char disciplina30 float notaprova1 float notaprova2 Criando a variável aluno que será do tipo struct fichadealuno struct fichadealuno aluno printf Cadastro de aluno n printfNome do aluno fflushstdin fgetsalunonome 40 stdin printfDisciplina fflushstdin fgetsalunodisciplina 40 stdin printfInforme a 1a nota scanff alunonotaprova1 printfInforme a 2a nota scanff alunonotaprova2 printf Lendo os dados da struct printfNome s alunonome printfDisciplina s alunodisciplina printfNota da Prova 1 2f alunonotaprova1 printfNota da Prova 2 2f alunonotaprova2 getch return0 Cap09Prog02 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C 16 include stdioh include stdlibh include stringh include localeh include stringh include conioh include ctypeh define TotAlu 2 typedef struct int codigo char nome20 float nota Aluno Aluno dadosaluTotAlu char nome20 int posicao int main char resp int i 0 achei setlocaleLCALLportuguese fori0 iTotAlu i dadosaluicodigo 0 strcpydadosaluinome NULL dadosaluinota 00 fori0 iTotAlu i printf O cód do aluno é d dadosaluicodigo printf O nome do aluno é s dadosaluinome printf A nota do aluno é 2f dadosaluinota printf getch printf fori0 iTotAlu i systemcls printf Digite o código do aluno scanfdc dadosaluicodigo printf Digite o nome do aluno scanfsc dadosaluinome printf Digite a nota do aluno scanffc dadosaluinota printf fori0 iTotAlu i printf O cód do aluno é d dadosaluicodigo printf O nome do aluno é s dadosaluinome printf A nota do aluno 2f dadosaluinota printf getch printf do systemcls printf Digite um nome scanfsc nome i 0 posicao 1 achei 0 do ifstrcmpnome dadosaluinome 0 printf Registro encontrado posicao i achei 1 getch i while achei 1 i TotAlu ifachei 1 printf Registro não encontrado getch else printf Nome é s nome printf O cód do aluno é d dados aluposicaocodigo printf O nome do aluno é s dados aluposicaonome printf A nota do aluno é 2f dados aluposicaonota printf getch achei 0 printf Alunos com notas entre 4 e 7 posicao 1 fori0 iTotAlu i ifdadosaluinota4dadosaluinota7 achei 1 printf O código do aluno é d dados aluicodigo printf O nome do aluno é s dadosaluinome printf A nota do aluno é 2f dadosaluinota printf achei 1 ifachei 0 printf Não há alunos com notas dentro desse faixa printf Deseja pesquisar mais sn resp touppergetche while resp S return 0 Exemplo de Vetor de Struct Cap09Prog03 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Funções e structs Passagem de uma struct como parâmetro para função struct data int dia int mes int ano void imprimestruct data d printfd d d ddia dmes dano Int main struct data d ddia 10 dmes 12 dano 1500 imprimed return0 17 Cap09Prog04D0 Cap09Prog04D include conioh include stdioh struct data int dia int mes int ano void imprimestruct data mae printfd d d maedia maemes maeano int main struct data pai paidia 10 paimes 12 paiano 1500 imprimepai return0 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include conioh include stdioh struct data int dia int mes int ano struct data data1 tatu void imprimestruct data d printf d d d ddia dmes dano int main tatudia 10 tatu data1 printf Entre com o dia scanfd data1dia data1mes 12 data1ano 1500 printfddata1dia getch imprimetatu return0 Cap09Prog04 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh include stdlibh include conioh typedef struct int matricula float nota tAluno int main void tAluno a1 tAluno ptrAluno a1 a1matricula 555 a1nota 80 printfmatricula d nota 2f a1matricula a1nota 19 podemos atribuir ou acessar um valor usando o ponteiro ptrAluno ptrAlunonota 85 portanto ptrAlunonota é o mesmo que usar prtAlunonota printf matricula d nota 2f ptrAlunomatricula ptrAlunonota ptrAluno substitui a notação ptrAluno de forma mais intuitiva atribuindo um novo valor para a nota usando ptrAlunonota ptrAlunonota 90 portanto ptrAlunonota é o mesmo que usar prtAlunonota printf matricula d nota 2f ptrAlunomatricula ptrAlunonota systempause return 0 Cap09Prog04C Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Funções e structs struct tamanho int t char letra struct tamanho defineint valor char teste struct tamanho a at valor teste C aletra teste return a int main struct tamanho a char ch ch B a define 10 ch a recebe a struct resultante da função printfd at vai imprimir 10 printf caletra vai imprimir A return0 20 Retorno de uma struct a partir de uma função Cap09Prog05 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include conioh include stdioh struct tamanho int t struct tamanho petecaint valor struct tamanho a at valor return a int main struct tamanho a a peteca 10 a recebe a struct resultante da função printfd at vai imprimir 10 return0 21 Cap09Prog06 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C struct data int dia int mes int ano Funções e structs Uso de ponteiros 22 Definindo uma variável do tipo data struct data dt Definindo um ponteiro para dt struct data pdtdt Fazendo referência a um elemento da estrutura dtdia ou pdtdia ou pdtdia dtmes ou pdtmes ou pdtmes dtano ou pdtano ou pdtano Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh include conioh include stringh include stdlibh include ctypeh struct Funcionario char nome10 int idade float salario struct Funcionario dados2 func void lervetor Funcionario mae int tot void imprimeFuncionario mae int tot int mainvoid Funcionario func int i posicao achei totelem char nome10 resp systemcls totelem 2 func dados lervetorfunc totelem imprimefunc totelem getch Cap09Prog01B 23 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C do systemcls printf Digite um nome scanfsc nome i 0 achei 0 posicao 1 func dados while i totelem achei 0 if strcmpnome funcnome 0 posicao i achei 1 else posicao 1 func i if posicao 1 printf Registro não encontrado else printf Registro Encontrado printf O nome do funcionario s funcnome printf A idade do funcionario d funcidade printf O salário do funcionario 2f funcsalario printf Quer testar outro SN resp touppergetch while resp S return0 24 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C void lervetor struct Funcionario mae int total int i systemcls for i0 itotal i printf Digite o nome do funcionario n d i1 scanfsmaeinome printf Idade do funcionario n d i1 scanfdmaeiidade printf Salario do funcionario n d i1 scanffmaeisalario void imprimestruct Funcionario mae int total int i systemcls for i0 itotal i printf Nome do funcionario nd si1 maeinome printf Idade do funcionario nd di1 maeiidade printf Salario do funcionario nd 2f i1 maeisalario 25 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh include stdlibh include conioh include stringh Este programa utiliza o Metodo Insert Sort mas há vários métodos quem podem ser utilizados entre eles o Buble Sort o Quick Sort o Select Sort e o trocas de trocas sucessivas Use aquele que você se sentir mais à vontade Mas é sempre bom saber um método de para qualquer situação onde houver necessidade de fazer uma ordenação struct aluno int matric char nome30 float n1n2n3 struct aluno V4 float medias4 void PrintPosicaoInicial struct aluno V int N void InsertSortMatricula struct aluno V int N float medias void PrintSortMatricula struct aluno V int N float medias void PrintMaiorMenorMedia struct aluno V int N void InsertSortNome struct aluno V int N void PrintSortNome struct aluno V int N int main int i struct aluno V4 2 Andre 95 78 85 4 Ricardo 75 87 68 1 Bianca 97 67 84 3 Ana 57 61 74 PrintPosicaoInicial V 4 InsertSortMatricula V 4 medias PrintSortMatricula V 4 medias InsertSortNome V 4 PrintSortNome V 4 PrintMaiorMenorMedia V 4 systempause return0 void PrintPosicaoInicial struct aluno V int N int i j float media struct aluno aux printfImpressao como foi criado o Vetor de Estrutura for i 0 i 4 i media Vin1 Vin2 Vin33 printfd 8s media 2f Vimatric Vinome media printf Cap09Prog11B Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C void PrintMaiorMenorMedia struct aluno V int N int i j indmaior indmenor float maiormed 1 menormed 11 media for i 0 i 4 i media Vin1 Vin2 Vin33 if media maiormed maiormed media indmaior i if media menormed menormed media indmenor i printfImpressao da maior media pela Matricula printfd 8s media 2f Vindmaiormatric Vindmaiornome maiormed printfImpressao da menor media pela Matricula printfd 8s media 2f Vindmenormatric Vindmenornome menormed printf void InsertSortMatricula struct aluno V int N float medias int i j struct aluno aux for i 1 i N i aux Vi for j i 0 auxmatric V j1 matric j Vj Vj 1 Vj aux for i0 i N i medias i V i n1 V i n2 V i n3 3 saida strcmp str1str2 0 str1 eh igual a str2 0 str1 vem depois de str2 0 vem antes de str2 lembremse que não se pode comparar duas strings usando simplesmente um if forma errada if string1 string2 isso não pode Use a função strcmp associada a um if como sitado acima Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C void InsertSortNomestruct aluno V int N int i j struct aluno aux for i 1 i N i aux Vi for ji j 0 strcmpauxnome Vj 1nome 0 j V j V j 1 Vj aux void PrintSortMatricula struct aluno V int N float medias int i j struct aluno aux printfImpressao ordenada pela Matricula for i 0 i 4 i printfd 8s media 1f V i matricV i nome medias i printf void PrintSortNome struct aluno V int N int i j struct aluno aux printfImpressao ordenada pelo Nome for i 0 i 4 i printfd s VimatricVinome printf void CalcMedia struct aluno V int N int i j struct aluno aux for i 1 i N i aux Vi for ji j 0 strcmpauxnome Vj 1nome 0 j V j V j 1 Vj aux Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Uma estrutura pode ser passada como parâmetro por referência numa função Quando se usa uma referência ponteiro o acesso aos campos da mesma é feito através do operador seta ao invés de ponto Exemplo void movePstruct ponto p int dx int dy p x dx ou p x p x dx p y dy Observe o uso de ao invés de Funções e structs Passagem por referência 29 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Alocação dinâmica de estruturas A alocação dinâmica de uma struct é feita exatamente igual ao demais tipos Única diferença é usar o sizeof adequandoo para o tipo struct E fazer o casting para um ponteiro para o tipo struct Exemplo no próximo slide 30 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh typedef struct tipodata int dia mes ano DATA int main void DATA d d DATA malloc sizeof DATA ddia 31 dmes 12 dano 2021 ou scanfddd ddia dmes dano printfData d d d ddia dmes dano freed return 0 31 Cap09Prog07 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Union Uma union determina uma única localização de memória onde podem estar armazenadas várias variáveis diferentes A declaração de uma união é semelhante à declaração de uma estrutura union nomedotipodaunion tipo1 nome1 tipo2 nome2 tipon nomen variáveisunion 32 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Union Exemplo union angulo float graus float radianos As variáveis graus e radianos que apesar de terem nomes diferentes ocupam o mesmo local da memória Isto quer dizer que só gastamos o espaço equivalente a um único float 33 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh define GRAUS G define RAD R union angulo int graus float radianos void main union angulo ang char op printf Numeros em graus ou radianos scanfcop Exemplo de uso de union Cap09Prog08 34 if op GRAUS anggraus 180 printf Angulo d anggraus else if op RAD angradianos 31415 printf Angulof nangradianos else printf Entrada invalida Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh union numero char Ch int I float F main void union numero N NF 123 printf 2fNF NI 22 printf dNI NI A printf cNCh return 0 O programa acima é muito perigoso pois você está lendo uma região da memória que foi gravada como um inteiro como se fosse um ponto flutuante Tome cuidado O resultado pode não fazer sentido CUIDADO Cap09Prog09 35 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Enumerações Numa enumeração podemos dizer ao compilador quais os valores que uma determinada variável pode assumir Sua forma geral é enum nomedotipodaenumeração listadevalores listadevariáveis Vamos considerar o seguinte exemplo enum diasdasemana segunda terca quarta quinta sextasabado domingo O programador diz ao compilador que qualquer variável do tipo diasdasemana só pode ter os valores enumerados 36 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh enum diasdasemana segunda terca quarta quinta sexta sabado domingo main void enum diasdasemana d1d2 d1segunda d2sexta if d1d2 printf O dia e o mesmo else printf São dias diferentes return 0 O compilador pega a lista de valores e associa a cada um um número inteiro Então ao primeiro da lista é associado o número zero o segundo ao número 1 e assim por diante As variáveis declaradas são então variáveis int Cap09Prog10 37 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C Enumerações Podese criar um enum com valores incrementados com valores iniciais diferentes de zero Exemplo enum ARGENTINA 3 ITALIA BRASIL Aqui Italia 4 e Brasil 5 38 Prof Almir Silveira CEFET mai 21 Fundamentos Sistemas de Computadores Linguagem C include stdioh enum diasdasemana segunda terca quarta quinta sexta sabado domingo main void enum diasdasemana d1d2 int i d2sexta printf Digite 0 seg 1 ter 2qua 3 qui 4sex 5 sab 6 dom scanfdd1 printf d2 dd2 i d1 switch i case 0 printf d1 segunda break case 1 printf d1 terca break case 2 printf d1 quarta break case 3 printf d1 quinta break case 4 printf d1 sexta break case 5 printf d1 sabado break case 6 printf d1 domingo break return 0 Cap09Prog11 39