thegoodfellas/blogset-br huggingface dataset:
Agora que ja conhecemos as matrizes, vamos ver algumas operacoes com matrizes.Transpondo uma matriz quadradaVamos comecar criando uma matriz transposta de uma matriz quadrada 3x3. Nao sabe o que e matriz transposta? Veja aqui.Olhando a primeira vista podemos pensar que seria so trocar a posicao dos elementos. Algo que o fragmento de codigo abaixo faria sem problemas. for(i = 0; i < colunas; i++) for(j = 0; j < colunas; j++){ aux = mat[i][j]; mat[i][j] = mat[j][i]; mat[j][i] = aux; }Se voce tiver a curiosidade pode implementar este codigo. E vai ter uma triste surpresa (rsrs).Sera que voce pode dizer por que este codigo nao funciona?Como voce ja descobriu, este codigo funciona (compila e executa), mas nao faz o que se esperava que fizesse. Na verdade, ele troca a posicao dos elementos do vetor e, depois, os retorna para as posicoes iniciais. Ele nao sabe quando os elementos nao precisam ser trocados, ou porque ja foram, ou porque realmente nao e necessario, como e o caso dos elementos da diagonal principal da matriz.No caso da diagonal principal e facil, basta saber se o numero da coluna e igual ao da linha. E no outros casos? Como evitar que a troca seja feita novamente, fazendo o elemento voltar para a sua posicao inicial?Vamos fazer um teste de mesa (ou chines, como preferirem) e ver como as trocas sao feitas.Linha = 0, Coluna = 0 => Diagonal principal, nao precisa trocar;Linha = 0, Coluna = 1 => Troca o elemento com o da Linha = 1, Coluna = 0; Linha = 0, Coluna = 2 => Troca o elemento com o da Linha = 2, Coluna = 0; Linha = 1, Coluna = 0 => A troca ja foi feita, nao precisa trocar;Linha = 1, Coluna = 1 => Diagonal principal, nao precisa trocar;Linha = 1, Coluna = 2 => Troca o elemento com o da Linha = 2, Coluna = 1;Linha = 2, Coluna = 0 => A troca ja foi feita, nao precisa trocar;Linha = 2, Coluna = 1 => A troca ja foi feita, nao precisa trocar;Linha = 2, Coluna = 2 => Diagonal principal, nao precisa trocar;Observando as linhas em negrito, que mostram as trocas que precisam ser realmente feitas, podemos encontrar algo em comum entre elas. Ja percebeu?O numero da linha e menor que o da coluna! Agora ficou facil, ne?Veja abaixo como fica o codigo completo que faz a transposicao de uma matriz quadradra 3x3.#include <stdio.h>#include <stdlib.h> const int LINHAS = 3;const int COLUNAS = 3; void preenche_mat_int(int [][3]);void exibe_mat_int(int [][3]);void transpor_mat_int(int [][3]); int main(){ int matriz[3][3]; preenche_mat_int(matriz); exibe_mat_int(matriz); transpor_mat_int(matriz); exibe_mat_int(matriz); system("pause");} int ler_int(){ int digitado; printf("Digite um valor inteiro: "); scanf("%d",&digitado); return digitado;} void mostra_int(int num){ printf("%d ",num);} void preenche_mat_int(int mat[][3]){ int i, j; printf("\nPREENCHENDO A MATRIZ:\n"); for(i = 0; i < LINHAS; i++) for(j = 0; j < COLUNAS; j++) mat[i][j] = ler_int();} void exibe_mat_int(int mat[][3]){ int i, j; printf("\n"); for(i = 0; i < LINHAS; i++){ for(j = 0; j < COLUNAS; j++) mostra_int(mat[i][j]); printf("\n"); } printf("\n\n");} void transpor_mat_int(int mat [][3]){ int i, j, aux;
printf("\nTRANSPOSICAO DA MATRIZ:\n"); for(i = 0; i < LINHAS; i++) for(j = 0; j < COLUNAS; j++) if((i != j) && (i < j)){ aux = mat[i][j]; mat[i][j] = mat[j][i]; mat[j][i] = aux; }}Determinante de uma matriz quadrada 2x2Outra funcao comum no trabalho com matrizes e o calculo do seu determinante. Veja o que e, e como e feito aqui.O codigo abaixo calcula o determinante de uma matriz quadrada 2x2.#include <stdio.h>#include <stdlib.h> const int LINHAS = 2;const int COLUNAS = 2; void preenche_mat_int(int [][2]);void exibe_mat_int(int [][2]);int determ_mat_int_2x2(int [][2]); int main(){ int matriz[2][2], det; preenche_mat_int(matriz); exibe_mat_int(matriz); det = determ_mat_int_2x2(matriz); printf("O determinante da matriz informada = %d\n", det); system("pause");} int ler_int(){ int digitado; printf("Digite um valor inteiro: "); scanf("%d",&digitado); return digitado;} void mostra_int(int num){ printf("%d ",num);} void preenche_mat_int(int mat[][2]){ int i, j; printf("\nPREENCHENDO A MATRIZ:\n"); for(i = 0; i < LINHAS; i++) for(j = 0; j < COLUNAS; j++) mat[i][j] = ler_int();} void exibe_mat_int(int mat[][2]){ int i, j; printf("\n"); for(i = 0; i < LINHAS; i++){ for(j = 0; j < COLUNAS; j++) mostra_int(mat[i][j]); printf("\n"); } printf("\n\n");} int determ_mat_int_2x2(int mat[][2]){ return (mat[0][0] * mat[1][1]) - (mat[0][1] * mat[1][0]);}E possivel calcular o determinante de uma matriz quadrada de qualquer ordem, mas para isto precisamos ver um conceito que ainda nao vimos. Voltarei a este assunto mais a frente.Ate o proximo post.
Hoje vamos ver mais a fundo os conceitos que falamos no post anterior.Alocando memoria em CA funcao especifica em C para alocar memoria e a malloc (memory allocation). Esta funcao aloca (reserva) uma area sequencial na memoria heap com a quantidade de bytes especificada, e retorna o endereco da mesma. A sua sintaxe e esta: malloc (tamanho);onde tamanho e a quantidade de bytes que se deseja alocar.No entanto, devemos lembrar, que os tipos de dados basicos do C ocupam mais de 1 byte, com a excessao do tipo char. Como nao temos como precisar quantos bytes exatamente cada computador (micro, celular, etc.) utiliza para armazenar cada um destes tipos basicos, e necessario fazer uma operacao chamada de conversao de tipo (type casting) explicita.Convertendo tiposJa vimos que a divisao de 2 inteiros, nem sempre retorna 1 outro inteiro (por exemplo: 2/3).Para resolver este problema, a solucao mais simples seria declarar as variaveis envolvidas nesta divisao como floats ao inves de inteiros. Mas ha casos em que esta alteracao de tipos nem sempre e possivel, como e o caso da funcao malloc, por exemplo.Esta funcao retorna, a grosso modo, o endereco de um vetor de char com a quantidade especificada. Nao temos como alterar esta funcao, mas temos como alterar o seu retorno.Veja no codigo abaixo como podemos resolver a questao da divisao usando uma conversao de tipos.#include "stdio.h"#include "stdlib.h" int main(){ int a = 3, b = 2; float c; c = (float)a/b; printf("%.2f\n", c); system("pause");}Observe a linha 8. Esta e a forma de converter um tipo explicitamente em C. Neste caso estamos alterando o tipo da variavel a de inteiro para float, o que garante que o resultado da divisao tambem sera um float.Voltando a alocacao dinamica...Agora que sabemos como e feita uma alteracao de tipos em C, podemos alterar a forma de chamar a funcao malloc. (<tipo de retorno> *) malloc (tamanho * sizeof(<tipo que sera armazenado>);Duas coisas chamam a nossa atencao no comando acima.A primeira e o * dentro dos () que fazem a alteracao do tipo de retorno. Ele e necessario porque a funcao malloc nao retorna um tipo basico, mas sim um endereco que aponta para um bloco de memoria que ira armazenar variaveis deste tipo basico, ou seja, um ponteiro para este bloco.A segunda e o uso da funcao sizeof dentro dos () onde e informado o tipo dos dados que serao armazenados. A funcao sizeof nos retorna o numero de bytes necessarios, no computador utilizado, para armazenar o tipo de dado especificado.Se quisermos alocar um espaco suficiente para conter 30 inteiros e atribuir este espaco a um vetor, os comandos usados seriam: int* vet; vet = (int *) malloc (30 * sizeof(int));E se o espaco ainda nao for suficiente?Nao haveria sentido em se chamar alocacao dinamica, se nao pudessemos alterar dinamicamente o tamanho do vetor. E como fazer isto?A resposta esta na funcao realloc (reallocation). Ela e funciona basicamente como a funcao malloc. A diferenca e que ela altera o tamanho de um bloco ja alocado pela funcao malloc. Observe bem isto! Nao e possivel alterar
o tamanho de um bloco com a funcao realloc se antes ele nao tiver sido alocado com a funcao malloc!Para alterar o tamanho do vetor do comando acima, de 30 para 50 inteiros, o comando seria este: vet = (int *) realloc (vet, 50 * sizeof(int)); Observe que a diferenca basica e que informamos qual o bloco que sera alterado dentro dos () antes de informarmos o novo valor.Um detalhe interessante, e que se ja houverem valores armazenados no bloco/vetor que tera seu tamanho alterado, eles nao serao perdidos, desde que o bloco tenha o seu tamanho aumentado. Se o tamanho for reduzido, serao perdidos os valores armazenados no final do bloco.Recolhendo o lixo.Nos vimos que as variaveis locais so existem enquanto as funcoes estao em execucao, e que depois disso elas sao eliminadas. As variaveis globais so existem enquanto o programa esta em execucao, e depois disto elas tambem sao eliminadas. Ja com as variaveis alocadas dinamicamente isto nao ocorre.Estas variaveis ficam na memoria mesmo depois que todas funcoes sao encerradas, inclusive a main. Isso quer dizer que elas ficam na memoria mesmo depois que o programa termina. Isto causa uma perda de memoria. Dependendo da quantidade de memoria disponivel no sistema isto pode fazer com que o sistema pare.(Algumas linguagens de programacao se encarregam de eliminar essas variaveis quando o programa se encerra. Isto e chamado de coletor de lixo (garbage colletor). Nao e o caso de C/C++.) So existem duas formas de recuperar esta memoria.A primeira forma, e mais drastica, e reiniciando o sistema. Mas, assim que o programa for executado novamente, a memoria sera perdida novamente.A segunda forma, e correta, e usando a funcao free.A funcao free desaloca um bloco de memoria alocado pela funcao malloc, marcando esta area como memoria livre.Para desalocar o vetor que estamos usando como exemplo, o comando seria este: free(vet);No proximo e, acredito, ultimo post desta serie, veremos isto funcionando na pratica. Ate la.
Antes de mais nada, gostaria de desejar um 2010 de muitas realizacoes e conquistas!Vamos comecar o ano falando sobre algo muito importante. Eu estava esperando alguem perguntar. Mas ja que ninguem perguntou... Eu pergunto.E possivel que uma funcao retorne um vetor?A resposta e SIM e NAO (rsrs).Vamos entender o porque disto.No exemplo sobre vetores e funcoes que vimos ate agora (aqui) sempre declaramos o vetor na funcao main e passamos por referencia para as outras funcoes.O que aconteceria se fizermos o contrario?NAO FUNCIONARIA!Quando declaramos uma variavel dentro de uma funcao (inclusive vetores), ela e local a funcao e nao e visivel por nenhuma outra funcao e, mais ainda, ela so existe enquanto a funcao esta 'ativa'. Mas por que funciona com a funcao main?A funcao main e especial. Ela e quem coordena o funcionamento de todas as outras funcoes, e e a unica funcao que esta disponivel do inicio ao fim da execucao do programa (podemos ter varias chamadas a outras funcoes, mas a main so e chamada uma unica vez, no inicio do programa, que comeca por ela). Uma variavel declarada na main (inclusive vetores) pode ser passada para qualquer outra funcao por referencia, se assim for a vontade do programador.Uma forma de contornar esta limitacao imposta pela modularidade seria armazenando as variaveis em um local onde elas pudessem ser acessadas mesmo sendo declaradas dentro de uma funcao. Isso existe! Para entender como isso e feito temos que explicar como o C trata a memoria do computador. Observe a figura abaixo: Olhando a figura podemos notar que o C 'divide' a memoria que e usada por um programa em 3 partes distintas.- A pilha, onde sao armazenadas as variaveis locais;- A memoria estatica, onde sao armazenadas as variaveis globais;- O heap, onde sao armazenadas as variaveis alocadas dinamicamente. (???)Variaveis alocadas dinamicamenteImagine que tenhamos que armazenar um vetor que nao sabemos que tamanho tera? Ja vimos que geralmente se escolhe um tamanho que se considere razoavel, que na grande maioria dos casos, e maior que o tamanho necessario.Para resolver isto foi criada a alocacao dinamica.Alocacao dinamica nada mais e que obter espaco na memoria para uma variavel (leia-se estrutura de dados) a medida que ele for necessario.Como vimos na figura acima, o espaco onde essas variaveis ficam armazenadas e um espaco separado.Como ja falamos, se sabemos o endereco de uma variavel podemos ter acesso a ela, e o nome de um vetor 'corresponde' ao seu endereco.No proximo post veremos como isto e feito na pratica. Ate la Hoje, para encerrar a nossa serie sobre matrizes, vamos ver a matriz de strings.Matriz de StringsUma matriz de string e uma matriz de caracteres de duas dimensoes, onde a 1a dimensao e a quantidade de strings e a 2a dimensao e o tamanho maximo de cada string. char matrstr[5][30];Na linha acima, definimos uma matriz capaz de armazenar 5 strings que tenham no maximo 29 caracteres cada (o ultimo caracter e o \0, o finalizador da string).Se quisermos nos referir a cada string individualmente, e so nos referir a uma unica dimensao. printf("%s\n", matrstr[2]);O comando acima
< qtdstr; i++) if(!((i+1)%2)) printf("palavra %d: %s\n", i+1, *(matrstr+i)); break; case 2: for(i = 0; i < qtdstr; i++) if((i+1)%2) printf("palavra %d: %s\n", i+1, matrstr[i]); break; case 3: break; default: printf("OPCAO INVALIDA!!! Digite novamente.\n"); } system("pause"); system("cls"); }while(opcao != 3); for(i = 0; i < *qtd; i++){ free(matrstr[i]); free(matrstr);} char** preenche_matrstr(int* qtd, int* tam){ char** matriz; int i; printf("Digite a quantidade de strings da matriz: "); scanf("%d", qtd); printf("Digite o tamanho maximo de cada string: "); scanf("%d", tam); matriz = (char **) malloc (*qtd); if (!matriz){ printf("NAO FOI POSSIVEL ALOCAR A MATRIZ.\n"); exit(0); } else for(i = 0; i < *qtd; i++){ *(matriz + i) = (char*) malloc (*tam); if (!(*(matriz + i))){ printf("NAO FOI POSSIVEL ALOCAR A STRING %d.\n", i+1); exit(i); } } printf("PREENCHENDO UMA MATRIZ DE STRINGS:\n\n"); setbuf(stdin, NULL); for(i = 0; i < *qtd; i++){ printf ("Digite uma palavra para a posicao %d: ", i+1); gets(matriz [i]); } system("cls"); return matriz;}Como a matriz sera armazenada dinamicamente, demos ao usuario a possibilidade de escolher quantas serao e qual o tamanho maximo das strings da matriz.Observe que em alguns pontos do codigo eu usei matriz[i] e em outros eu usei *(matriz+i). Foi simplesmente para mostrar que os 2 sao equivalentes. Nao e pratico, misturar duas notacoes diferentes em um mesmo codigo. Escolha uma delas e use em todo o codigo.OBS: Existe um comando novo neste codigo (setbuf), mas nao comentarei sobre ele agora. No proximo post falaremos detalhadamente sobre ele.Ate o proximo post.
linha 37, aumenta o tamanho do vetor com um valor tambem definido pelo usuario, usando a funcao realloc. Observe que usando um ponteiro para a variavel tamanho, podemos alterar o seu valor dentro da propria funcao.A ultima funcao nova, na linha 55, diminui o tamanho do vetor de forma semelhante a funcao que o aumenta, usando a funcao realloc com um valor definido pelo usuario. A diferenca entre elas e a verificacao da validade do valor informado pelo usuario, evitando um erro ao tentar alterar o tamanho do vetor para 0 ou um valor negativo.Observe que na linha 90, ja na funcao main, desalocamos o bloco de memoria usado pelo vetor. Isto e muito importante, se nao este espaco ficara 'ocupado' mesmo apos o termino do programa.Com isto encerramos a nossa serie sobre funcoes que retornam vetores e como isto e possivel utilizando a alocacao dinamica.Alguma duvida?
Em Brasilia, Dilma Rousseff foi empossada; as mulheres que cuidaram de sua seguranca, empocadas.Sera que o exagero da agora ex-governadora do Rio Grande do Sul, a tucana Yeda Crusius, durante a posse do atual chefe do Executivo daquele Estado, o petista Tarso Genro, enquanto era tocado o Hino Nacional Brasileiro (a mulher deu pinta horrores ao cantar), foi para compensar o silencio do ex-ministro da Justica do governo Lula? Sera que Genro nao conhece a letra do hino?E, especialmente para os colegas de Faetec e SindpeFaetec: estaria a perigo o cargo do atual presidente da Fundacao, Celso Pansera? Hoje, bem antes do ato por meio do qual Sergio Cabral Filho foi reempossado governador do Rio de Janeiro, quando pouca gente havia chegado a frente do predio da ALERJ, Pansera ja estava la, a postos.Meninos, eu vi. Envolvido nos ultimos dias com a organizacao e divulgacao de paralisacoes e assembleias do SindpeFaetec, como a anunciada na nota abaixo, alem de, obviamente, continuar a cumprir suas funcoes de professor e sindicalista (para nao falar nas domesticas), o blogueiro tem tido pouco tempo para este veiculo. Sobre a nota "Jane Nunes quer saber", varios comentarios ja foram postados. Antes de libera-los, no entanto, este Soprador de Vidro pretende publicar um texto com consideracoes a respeito do assunto, o que deve ocorrer ate o final da semana. Aos que compreenderem, ele agradece. A jornalista e blogueira Jane Nunes publicou um comentario a uma das postagens deste veiculo. Sabe-se la por qual motivo, ao tentar libera-lo, este Soprador de Vidro deve te-lo apagado sem querer. As escusas ja foram enviadas para a ultima nota que saiu no veiculo da colega ("Balanco Geral"). Mas, ao ler boa parte do que a ex-secretaria de Promocao Social vem escrevendo com suas companheiras no Estou procurando o que fazer..., este escriba verificou que o tal comentario foi tambem lancado la, sob a forma de nota, e resolveu que deveria publica-lo aqui. Ei-lo:"QUINTA-FEIRA, 10 DE JUNHO DE 2010Acabaram com a Bienal ?E a Bienal do Livro? Ha alguns meses postamos aqui que embora a Prefeitura nao tivesse se pronunciado sobre o assunto no site da Associacao Nacional de Livrarias (aqui) a 6a Bienal estava agendada para acontecer no periodo de 28 de maio a 6 de junho. Hoje ja sao 10 e nada. Que nao venham dizer que acabaram com a Bienal em funcao da possivel perda dos royalties.Postado por Jane Nunes as 22:27" Se bem se lembra, este blogueiro ja leu algo sobre o periodo em que o evento ora em questao vai ocorer este ano. Mas prefere deixar a cargo do presidente da Fundacao Cultural Jornalista Oswaldo Lima (FCJOL), Avelino Ferreira, responder, se ele entender que deve. Como em todas as vezes em que se afastou de sua ocupacao de desocupado, este Soprador de Vidro programou voltar numa data especial - mas nao exatamente neste primeiro dia de 2011. Desde 22 de junho, quando foram publicadas aqui as ultimas postagens antes desta, esteve entre o sofrimento e o gozo. Um por nao escrever - e tambem nao curtir, como gostaria,
tudo aquilo que aprecia: cinema, literatura, musica... Outro por apostar que todo seu sacrificio teria, um dia, alguma recompensa: a de fruir, um pouco mais como pretendia, o que tanto lhe apetece. Esse dia nao so ainda nao chegou como talvez nunca chegara para quem, como o autor destas linhas, e perfeccionista e tem obsessao por metodos. Mas, sem o bla-bla-bla das justificativas expostas aqui em todas (ou quase todas) as outras ocasioes em que redator deste blog retomou (ou tentou retomar) suas atividades como responsavel pelo veiculo, quica baste dizer que lhe faltava espaco vital para que ele se sentisse melhor. Isto mesmo: a despeito da conotacao pejorativa de tal expressao (em alemao -lebensraum- um dia tao cara aos nazistas -e que, neste caso, fique o nao-dito pelo dito), era bem de espaco fisico mesmo que este escriba parecia precisar. Em 2011 ele ocupara, finalmente, um comodo novo, de quatro metros por oito, nos fundos de sua casa e dara adeus a um quartinho no qual seus pertences de intelectual disputavam lugar com cestos de roupas sujas e limpas, uma tabua de passar, bolsas de viagem etc. etc. Fazer de Soprador de Vidro um espaco virtual analogo a tal comodo - um espaco de reflexao, portanto - sempre foi uma pretensao almejada pelo humilde responsavel pelo blog. Trata-se, certamente, de um sonho similar ao que tem e merece realizar todo proletario (ou pequeno-burgues) inconformado com um mundo onde telenovelas e programas de auditorio estao entre os unicos oasis encontraveis apos o percurso diario dos desertos intelectuais em que vem se transformando locais de trabalho como as escolas e universidades. Como as linhas deste texto de retorno (mais um) do blogueiro terminam quando ainda espocam os fogos de artificio comemorando o inicio de 2011, ele deseja, inspirado pelo tema global de fim de ano de Marcos e Paulo Sergio Valle e pela letra de uma cancao de Lulu Santos, que neste novo ano eu, voce e todos nos tornemos verdade ao menos os pequenos sonhos, pois, apesar dos pesadelos diarios, que temos no sono ou na vigilia, ainda viveremos dias de leite e mel aqui na terra e nao depois no ceu.
[Jardel do Cavaco]: E samba puro19- Luiz Lyrio: O amor de Deus20- Magid Abud: O canto poetico de Magid21- Orquestra Sinfonica do VI Femusica (Centro Cultura Musical): Alexandre Levy - Guerra-Peixe22- Padre Manoel Henrique: Reflexoes e cancoes para a confianca, pela fe23- Padre Paulo Henriques: Pregacao24- Paulo Ciranda: Mata Atlantica25- Pepinho: A Banda do P.26- Planeta Terra (coletanea do Centro Norte Fluminense para Conservacao da Natureza - CNFCN)27- Poeta Manoel Junqueira: Meus momentos (vol. 1)28- Ronaldo Lopes: Outra vez29- Tribalion: Reggae Roots (demo)30- Zazal e Seus Teclados: Volume 5
fossem a uma festa e nao a uma ocasiao de fruicao estetica, acorrem hoje ao Trianon figuras da sociedade campista menos avidas por teatro que por frequentar colunas sociais e se manter em dia com o universo das celebridades. Figuras que, antes do surgimento da televisao -e sobretudo das telenovelas- prestigiariam em casas de teatro apenas aquilo que as divertisse e, por catarse -apresentando conflitos do mundo burgues a serem resolvidos ao longo da trama desenrolada no palco-, as reconfortasse quanto sua condicao ao final da apresentacao. Inegavelmente, podem haver meritos esteticos em producoes de qualquer matiz ideologico. E o que comprova, por exemplo, O triunfo da vontade, filme de 1934 de Leni Riefenstahl, que mais que simplesmente um documentario sobre um congresso do Partido Nacional Socialista Alemao, como queria sua diretora, funcionou como veiculo de propaganda nazista, mas e tambem uma obra-prima do cinema. Neste sentido, embora a frequencia cada vez maior de atores de telenovelas em montagens do chamado teatro burgues tenda a comprometer a qualidade de producoes do genero, o maior merito de A marca do Zorro talvez esteja justamente num dos aspectos mais valorizados em espetaculos marcados pela ideologia ora em questao: os exercicios fisicos, por assim dizer, desempenhados pelos atores em cena.Trama clara e simples, estrelada por atores famosos trajando suntuosos figurinos de epoca - todos esses elementos, relacionados como tipicos do teatro burgues por quem o estudou, podem ser identificados na peca em cartaz no Trianon. Mas o trabalho de corpo dos atores, explorado na execucao de danca flamenca e das coreografias de lutas de esgrima, e o que da maior brilho ao espetaculo, a despeito de toda critica que possa ser dirigida a trabalhos calcados na apresentacao mais convencional de numeros desse tipo. Considerando esse aspecto, vale a pena conferir a pena conferir A marca do Zorro.Atualizacao (17:46): Insercao de marcadores.