Projeto final em linguagem C

Programar em C# no trabalho, C e PHP na faculdade não é legal para a saúde mental. Entre C e C# até que as coisas fluem legal, mas no PHP dá uma revolta não poder usar um update panel nem ter uma IDE potente ao seu dispor.

O bom foi que descobri o que diabos o New do C# esconde de nós quando instanciamos uma classe. Eu acho.

Alocar memória “na mão”, fazer o “garbage collection” manualmente é fods. Cada vez mais gosto do C#! Mas ainda assim os desafios de C acabam sendo interessantes.

Por exemplo, esse trabalho que nosso professor de estrutura de dados passou. Criamos um array de ponteiros de estruturas, salvamos/recuperamos dados de arquivos binário e texto. Deram muitos problemas durante o caminho, mas venci!

Download trabalho estruturas, ponteiros e arquivo binário.

Linguagem C: Matrizes, parte 2

Pedrinho tem duas maçãs

e Joãozinho duas matrizes. Coitado do Joãozinho.

Algumas operações entre matrizes

No artigo anterior sobre matrizes, vimos como declarar, preencher in code, via input do usuário e como mostrar na tela. De quebra vimos que passamos matrizes por referência numa função, com a função sãoTomé.

O objetivo deste é realizar operações entre as duas matrizes.

Saca só o esquema!

Linguagem C: Matrizes, parte 1

A união faz a força

e as matrizes.

Quando utilizamos vetores, não existe muita confusão. É uma linha com N espaços para determinados valores. Claro, podemos perder uns bons minutos pensando em algoritmos eficazes para ordenação, busca e outros.

vetor

Mas e quando jogamos um vetor em cima do outro, colamos e dizemos que é uma coisa só?

Clique para continuar lendo…

Triângulo de Pascal e a linguagem C

Quando meu professor de matemática (professor, doutor Pedro Grosso) mostrou a sala sobre o triângulo de pascal (que, segundo algumas pesquisas que fiz, não é exatamente de pascal) achei muito legal e interessante.

Tá, na verdade achei legal não o triângulo, mas o fato de um desocupado fiadamãe ter ficado fazendo números em forma de pirâmide e no final ser reconhecido mundialmente.

omg!

Podemos fazê-lo de duas maneiras. Ou você vai alegremente colocando 1 no topo e nas laterais, realizando a soma se tiver números acima, ou fazendo a formula da combinatória.

Detalhe que a primeira linha não é 1, é 0. A primeira coluna também é 0.

Muito bonito, é intimamente ligado ao binómio de newton, MAS E DAÍ?

Pô, bate o olho no esquema, manow. Tem uma sequencia lógica, podemos criar um programinha pra printar automaticamente as linhas do triângulo =D. E foi isso que o professor pediu.

Acho que devo muito ao professor por ter pedido isso, pois me fez parar para pensar antes de sair programando. Foi nisso também que percebi ser muitas vezes necessário jogar o que temos num papel, analisar, e só depois programar.

A maior parte é fácil e até já temos outros códigos prontos na web. Quando lidamos com linhas e colunas, basicamente usamos dois laços de repetição. Um gera as linhas, e o outro as colunas nessas linhas.

O numero correto das linhas é mais fácil de se encontrar usando a combinatório, já que ensinar o computador a “olhar as linhas anteriores” e fazer uma soma entre os dois numeros seria bem complexo (precisaríamos salvar todos os resultados anteriores em vetores, além de varre-los e somá-los, por ex).

Até ai belezinha. Mas e pra alinhar a desgraça?

What?!

What?!

Joguei o triangulo num papelzinho de loto antigo e fui colocando quadrados para cada espaço do triangulo. Notei que na ultima linha não tinha nenhum. Na penultima um. Na ante-penultima dois, e assim por diante.

Perceba que a primeira linha tem, de espaços, a quantidade de linhas!

A segunda tem a quantidade de linhas, menos um. O decremento ocorre em função da linha que estamos, portanto, o alinhamento do triangulo é dado por total de linhas – numero da linha atual.

Simples né? Demorou um bocado para eu entender isso. Mas pelo menos aprendi a importância de esboços e anotações, elas clarificam o pensamento.

Por fim, o código da versão 2.0 (que tive de fazer de novo, no segundo semestre xD por questão de orgulho, não olhei no fonte e fiz do zero XDD ficou mais organizado dessa vez)

#include
#include

int fatorial(int n);
int comb(int a, int b);
void tab(int n);

int main(int argc, char *argv[])
{
//para deixar genérico, precisaríamos perguntar o user
//o valor de num
int i=0,i2=0,num=8;

for(i = 0; i <= num; i++) { //inicio de linha //tabulamos nela, é o numero total de linhas - o num da linha atual tab(num-i); for(i2 = 0; i2 <= i; i2++) { //usamos 2 pois só vamos até 2 digitos printf("%2d  ",comb(i,i2)); } //fim da linha printf("\n"); } getch(); return 0; } void tab(int n) { int i=0; for(i=0; i <= n; i++) printf("  "); } int fatorial(int n) { if(n == 0) return 1; return (n*fatorial(n-1)); } int comb(int a, int b) { //s2 return complexos //C(a,b) //fat(a) / (fat(b) * fat(a-b)) return (fatorial(a) / (fatorial(b) * fatorial(a-b))); } [/sourcecode] Cya! Que seja útil aos próximos sistemeiros da informática e programadores desafiados.

Binário para decimal

Outro dia na faculdade começamos a ver sobre as base numéricas e conversões entre si. Foi interessante e até divertido, porém não consegui enxergar muita utilidade, pelo menos para mim.

Sempre soube que era possível representar qualquer número inteiro em binário, mas nunca parei para pensar nos com casas decimais. Nesse ponto o professor lançou um desafio valendo um ponto: converter 3.76 para binário.

25 em decimal nós todos sabemos o método para converter em binário (usar a calculadora do windows divisões sucessivas por dois).

Mas e 25,11?

Descobri, com ajuda do oráculo e da wikipédia, como converter decimais fracionários em binários.

Obtendo o método, tudo beleza, certo? Comecei a fazer.

5 linhas de cálculo…

8 linhas de cálculo…

12 linhas de cálculo…

Cansei, hora de programar isso!

#include
#include

int main() {
double numero,frac,inteira,auxiliar;
char nInt[15];
int nums[100],i=0,i2=0;

printf(“Digite o numero: “);
scanf(“%lf”,&numero);

//modf é uma função q separa inteiro de fracionario
frac = modf(numero, &inteira);

//nInt agora possui a parte inteira em binário
itoa((int)inteira,nInt,2);
//imprimimos o lado inteiro convertido para binario
printf(“%s.”,nInt);

while(frac != 0) {
//multiplicamos a parte fracionaria por 2
frac *= 2;
//separamos o fracionario do inteiro (0 ou 1)
frac = modf(frac, &auxiliar);
//guardamos o inteiro no array de nums (cast de double para int)
nums[i] = (int)auxiliar;
//incrementamos i
i++;
}

//impressão dos numeros
for(i2 = 0; i2 < i; i2++) { printf("%d",nums[i2]); } getch(); return 0; } [/sourcecode] Fui descobrir que 3.76 era... 11.1100001010001111010111000010100011110101110000101 FUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU- uma dízima. Isso pode ocorrer nesse tipo de conversão. Depois o professor ainda não acreditou que eu tinha feito o programa, "pegou da net mas pelo menos procurou né?". Disse que ia conferir o resultado antes de me dar o ponto.

O duro é que eu não sei a resposta…
Pois é, amo muito tudo isso. Fica a díca de conversão ai!

Cya!

Bugs e Erros: no final é engraçado…

…Mas sempre desagradável.

Será?

Será?

Estudando para a minha prova de C, percebi que os exercícios recmendados estavam sendo mais simples do que costumavam. Resolvi, por medo de que a prova fosse mais complexa, me aventurar mais adiante e mexer com leitura e escrita de arquivos. Se eu conseguisse me virar nessa parte, estaria pronto pra prova, em teoria.

q=c+files

Com ajuda do Google, a tarefa estava feita na mesma noite. Porém, com um bug que persistia desde a 3º aula de C: Espaços em branco. Se eu escrevia “Eu amo C”, só era copiado “Eu”.

Parti do princípio que havia errado o código de gravação. Talvez por colocar um if aguardando um NULL, o espaço em branco estivesse confundindo as coisas. Apesar de que espaço em branco não é null, mas tudo bem…

  • fwrite
  • putc
  • fputs

E nada funcionava. A esta altura já estava xingando as mães de Kenneth e Ritchie. Quando estava desistindo e deixando para falar com a professora, me lembrei das aulas e como o espaço em branco dava problemas com todos.

DOUP

Dei um printf (cadê você debug?? até hoje não achei!) na string que eu lia e estava provado: O scanf era o “culpado”. Juro que ouvi o scanf se defender:

Mas mas mas mas o culpado é você, programador imbecil!

Vira-se a página e lá vamos nós de novo

Morram, espaços em branco!

(na verdade eu queria que eles ‘vivessem’, mas é só pra ficar chamativo)

Achei a resposta no Viva o Linux. Foi necessário “pescar” nos comentários, mas está lá. Sintetizo abaixo a solução:

fflush(stdin);
scanf(“%[^\n]”,&suaVariavel);

Para alguns, basta o scanf com esses parâmetros, para mim foi necessário o fflush, que, “Serve para limpeza de buffer de teclado“. Esse link (do mesmo site!) explica com detalhes. Resumidamente, a função garante a integridade das informações vindas do teclado, pelo que entendi.

Em tempo: O scanf maluco ali possuí uma expressão regular. aparentemente não é o bastante usar o %s, deve-se dizer para o bendito: “LEIA TUDO ATÉ O [SEM NOÇÃO] USUÁRIO PARTIR PRA PRÓXIMA LINHA”.

Com essa manha, fiz o programinha funcionar. Alegria :) Pude dormir em paz.

…Mas com certeza você não veio aqui pra ver minha alegria, então vamos aos prints da desgraça!

Pequeno, porém grande

Pequeno, porém grande

Muitos detalhes, mas significa o seguinte: "Deu merda, velho."

Muitos detalhes, mas significa o seguinte: "Deu merda, velho."

Já que tirei poucas screens de erros durante a codificação, mando mais algumas de outros aplicativos e de um site mesmo:

Não fiz nenhum dos dois e continua funcionando.

Não fiz nenhum dos dois e continua funcionando.

(about:crash no Chrome) » Me lembra o "Sad Mac"

(about:crash no Chrome) » Me lembra o "Sad Mac"

Sql Injection safe? NOWAI

Sql Injection safe? NOWAI!

E no fim, todos nos deparamos com AQUELA outra tela.

relatorio

Mas é a vida né.

Até a próxima!