/* */
/* LEMBRETES IMPORTANTES DA LINGUAGEM C: */
/* - divisao de inteiros eh inteiro */
/* - divisao de float eh divisao real */
/* - ult caracter de string eh \0 */
/* - strings nao podem ser igualadas, usar strcpy */
/* if (k=w) ... nao eh comparacao */
/* As constantes hexadecimais começam com 0x. As constantes octais começam em 0.*/

#include <stdio.h> 
#define GRAUS 'G'
#define RADIANOS 'R'

struct tipo_endereco {
  char rua[50];
  int numero;
  char bairro[20];
  char cidade[30];
  char sigla_estado[3];
  long int CEP;
};
struct ficha_pessoal {
  char nome[50];
  long int telefone;
  struct tipo_endereco endereco;
};
typedef struct ficha_pessoal TFicha;

union angulo {
  float graus;
  float radianos;
};

int main(int argc, char *argv[]) 
{ 
 char str1[100],str2[100];
 int size;
 int mes; 
 char *nomemes [] = {"Janeiro", "Fevereiro", "Março", "Abril", "Maio", 
                    "Junho", "Julho", "Agosto", "Setembro", "Outubro", 
                    "Novembro", "Dezembro"}; 
 int opcao;
 int matrixnum[10];
 char strings [5][100];
 int count;
 int count2;
 char Ch;
 char string[100]; 
 int i, cont,num; 
 float f;
 int count3=10;
 int *pt;
 pt=&count3;
 int *endereco;
 int (*endereco_funcao)(const char *);
 int conteudo[10];
 endereco=conteudo;
 conteudo[0]=0; 
 char *buffer, *tmp1;
 int *i_buffer, *tmp2;
  register int fastcount;
  int slowcount;
  TFicha ficha;
  TFicha *pont_ficha;
  pont_ficha=&ficha;

 if(argc == 4) /* Testa se o numero de parametros fornecidos esta' correto 
                o primeiro parametro e' o nome do programa, o segundo o dia 
                o terceiro o mes e o quarto os dois ultimos algarismos do ano */ 
 { 
  mes = atoi(argv[2]);  /* argv contem strings. A string referente ao mes deve ser 
                             transformada em um numero inteiro. A funcao atoi esta 
                             sendo usada para isto: recebe a string e transforma no 
                             inteiro equivalente */ 

  if (mes<1 || mes>12)  /* Testa se o mes e' valido */ 
    printf("Erro!\nUso: data dia mes ano, todos inteiros"); 
  else printf("\n%s de %s de %s\n", argv[1], nomemes[mes-1], argv[3]); 
  } else {
   printf("Erro!\nUso: data dia mes ano, todos inteiros\n"); 
  }

 printf("Programacao em C\n"); 
 printf("Uso de while, switch, continue e break\n"); 
 while (opcao != 5) {
  printf("\n\n Escolha uma opcao entre 1 e 5: ");
  scanf("%d", &opcao);
  if ((opcao > 5)||(opcao <1)) continue;  /* Opcao invalida: volta ao inicio do loop */
  switch (opcao) { 
  case 1: 
   printf("\n --> Primeira opcao..");
  break; 
  case 2: 
   printf("\n --> Segunda opcao..");
  break; 
  case 3: 
   printf("\n --> Terceira opcao..");
  break; 
  case 4: 
   printf("\n --> Quarta opcao..");
  break; 
  case 5: 
   printf("\n --> Abandonando..");
  break; 
  } 
 }
 matrixnum[2]=100;
 printf ("Alocacao de memoria para variaveis\n"); 
 printf ("%d\n",matrixnum[0]);
 printf ("%d\n",matrixnum[1]);
 printf ("%d\n",matrixnum[2]);
 printf ("%d\n",matrixnum[100]);
 printf ("%d\n",matrixnum[-100]);
 printf ("\n\nMatrizes de strings\n"); 
 for (count=0;count<5;count++) {
  printf ("\n\nDigite uma string: ");
  gets (strings[count]);
 }
 printf ("\n\n\nAs strings que voce digitou foram:\n\n");
 for (count=0;count<5;count++) printf ("%s\n",strings[count]);

 printf ("Impressao de variavel char \n\n");
 Ch='D';
 printf ("%c\n",Ch);

 printf ("Impressao de string obtida com gets \n\n");
 printf ("Digite uma string: "); 
 gets (string); 
 printf ("\n\nVoce digitou %s\n\n",string); 

 printf ("Contagem de caracteres c numa string \n\n");
 printf("\n\nDigite uma frase: "); 
 gets(string); /* Le a string */ 
 printf("\n\nFrase digitada:\n%s", string);
 cont = 0; 
 for (i=0; string[i] != '\0'; i=i+1) { 
  if ( string[i] == 'c' )/* Se for a letra 'c' */ 
  cont = cont +1; /* Incrementa o contador de caracteres */ 
 } 
 printf("\nNumero de caracteres c = %d\n", cont);

 printf("\nEfeito de modelador (float)\n");
 num=10;
 /* f=(float)num/7; */
 f=num/7;

 printf("\nLoop\n");
 for (count=1; count<=50; count++) {
  printf ("%d",count);
  for (count2=1; count2<=count;count2++) {
   printf ("%c",'=');
  }
  printf ("\n");
 }
 do {
  printf("\n======================MENU======================\n");
  printf ("\n\nEscolha a fruta pelo numero:\n\n");
  printf ("\t(1)...Mamao\n");
  printf ("\t(2)...Abacaxi\n");
  printf ("\t(3)...Laranja\n\n");
  scanf("%d", &i); 
 } while ((i<1)||(i>3));

 switch (i) {
  case 1:
   printf ("\t\tVoce escolheu Mamao.\n");
  break;
  case 2:
   printf ("\t\tVoce escolheu Abacaxi.\n");
  break;
  case 3:
   printf ("\t\tVoce escolheu Laranja.\n");
  break;
 }

 printf("\nStrings\n");
	printf ("Entre com uma string: ");
	gets (str1);
	strcpy (str2,"Voce digitou a string ");
	strcat (str2,str1);	/* str2 armazenara' Voce digitou a string + o conteudo de str1 */
	printf ("\n\n%s\n",str2);
	size=strlen (str1);
	printf ("\n\nA string que voce digitou tem tamanho %d\n\n",size);
	printf ("Entre com uma string: ");
	gets (str1);
	printf ("\n\nEntre com outra string: ");
	gets (str2);
	if (strcmp(str1,str2))
        	printf ("\n\nAs duas strings são diferentes.\n\n");
	else printf ("\n\nAs duas strings são iguais.\n\n");

  /* operador & obtem o endereco da variavel */
  /* operador * obtem o valor apontado pelo endereco */
	printf("\nteste de ponteiros 1\n");
 printf("\ncount3 -> %d\n",count3);
 printf("&count3 -> %d\n",&count3);
 printf("pt -> %d\n",pt);
 printf("*pt -> %d\n",*pt);
	printf("\nteste de ponteiros 2\n");
  printf("\n%d -> %d\n",endereco,*endereco); 
 endereco++;
 conteudo[1]=1; 
 printf("\n%d -> %d\n",endereco,*endereco); 
 endereco++;
 printf("\n%d -> %d\n",endereco,*endereco); 
 endereco_funcao=puts;
 printf("\nfuncao: %d -> %d\n",endereco_funcao,*endereco_funcao); 
 printf("\nalocacao de memoria\n");
 buffer=(char *)malloc(20000*sizeof(char));
 i_buffer=(int *)malloc(80000000*sizeof(int));
 if(!buffer) {
   printf("Erro malloc\n");
   exit(-1);
 }
 if(!i_buffer) {
   printf("Erro malloc\n");
   exit(-1);
 }
 tmp1=buffer;
 tmp2=i_buffer;
 printf("Endereco inicial de buffer %p\n",tmp1);
 printf("Endereco inicial de i_buffer %p\n",tmp2);
 tmp1++;
 tmp2++;
 printf("Endereco atual de buffer %p\n",tmp1);
 printf("Endereco atual de i_buffer %p\n",tmp2);
 malloc_stats();
 free(buffer);
 free(i_buffer);
 tmp1=buffer;
 tmp2=i_buffer;
 printf("Endereco atual de buffer %p\n",tmp1);
 printf("Endereco atual de i_buffer %p\n",tmp2);
 malloc_stats();
 printf("\nteste de contador com register\n");
  for(fastcount=0;fastcount<100000;fastcount++) { printf ("F");}
  printf("\nteste de contador sem register\n");
  for(slowcount=0;slowcount<100000;slowcount++) { printf ("S");}

  /* ficha.nome="C";*/
 pont_ficha->telefone=1000;
 printf("\n%s - %f\n",pont_ficha->nome,pont_ficha->telefone);
}
1