Ir ao conteúdo
  • Cadastre-se

hekotes630

Membro Pleno
  • Posts

    38
  • Cadastrado em

  • Última visita

  1. Uma coisa que você tem que tomar cuidado em Objective-C é que esta é uma linguagem dinâmica. Erros são adiados à execução do programa. Felizmente, o compilador avisa por possíveis mensagens que não podem ser respondidas. Porque não declarar em uma classe? @interface Planeta: NSObject typedef struct { float massa, distancia, raio; NSString *nome; } TPlaneta; + (TPlaneta) planeta: (int) i; @end @implementation Planeta static TPlaneta planeta[] = { {3.30E+23, 5.79E+07, 2.44E+03, @"Mercúrio"}, {4.67E+24, 1.08E+08, 6.05E+03, @"Vênus"}, {5.97E+24, 1.50E+08, 6.37E+03, @"Terra"}, {6.39E+23, 2.28E+08, 3.39E+03, @"Marte"}, {1.90E+27, 7.79E+08, 6.99E+04, @"Júpiter"}, {5.68E+26, 1.43E+09, 5.82E+04, @"Saturno"}, {8.68E+25, 2.78E+09, 2.56E+04, @"Urano"}, {1.02E+26, 4.50E+09, 2.46E+04, @"Netuno"} }; + (TPlaneta) planeta: (int) i { return planeta[i]; } @end Se você está programando em Objective-C, o ideal é fazer tudo em classes.
  2. A vantagem está na API Cocoa. A API Cocoa ajuda bastante em aspectos que são mais complexos em C. Por exemplo: dicionários e tabelas hash. Objective-C tem ARC (Automatic Reference Counting). Ao usar @autoreleasepool, a memória alocada para objetos é gerenciada automaticamente. Nunca é necessário usar malloc em Objective-C. Particularmente, eu gosto de Objective-C. É uma linguagem elegante e menos complexa que C++. Diferente de C++, Objective-C é 100% compatível com C.
  3. Já ouviu falar da biblioteca cURL? Provavelmente é o que você precisa.
  4. hekotes630

    C Fazer tabelas em C

    Pode parecer inútil, mas é uma questão de parametrização. Se você usa uma constante em várias partes do programa e pretende mudá-la futuramente, é conveniente parametrizá-la. Isso pode ser visto mais facilmente em meu exemplo de usabilidade do union. Por isso eu usei diretivas de pré-processador. Parametrização. Defina uma vez; use em várias partes. E porque eu definiria desta forma se o propósito é para uso em uma string literal concatenada? Não faz sentido usar para outro propósito.
  5. hekotes630

    C Fazer tabelas em C

    Percebeu que eu não usei vírgulas em t_mon[] e t_wday[]? É uma string literal concatenada. NULL só é atribuído à última concatenação. Se precisar usar apenas uma constante, é só passar o endereço de acordo com o tamanho parametrizado. Para distinguir durante a execução, no entanto, é necessário declarar um array de inteiro, assim como eu fiz. Sobre isso, as declarações t_wday[] e t_mon[] não são necessárias. #include <stdio.h> #include <time.h> #define MON_1 "January\0" #define MON_2 "February\0" #define MON_3 "March\0" #define MON_4 "April\0" #define MON_5 "May\0" #define MON_6 "June\0" #define MON_7 "July\0" #define MON_8 "August\0" #define MON_9 "September\0" #define MON_10 "October\0" #define MON_11 "November\0" #define MON_12 "December" #define WDAY_1 "Sunday\0" #define WDAY_2 "Monday\0" #define WDAY_3 "Tuesday\0" #define WDAY_4 "Wednesday\0" #define WDAY_5 "Thursday\0" #define WDAY_6 "Friday\0" #define WDAY_7 "Saturday" #define MON_1P 0 #define MON_2P sizeof MON_1 - 1 #define MON_3P sizeof MON_2 + MON_2P - 1 #define MON_4P sizeof MON_3 + MON_3P - 1 #define MON_5P sizeof MON_4 + MON_4P - 1 #define MON_6P sizeof MON_5 + MON_5P - 1 #define MON_7P sizeof MON_6 + MON_6P - 1 #define MON_8P sizeof MON_7 + MON_7P - 1 #define MON_9P sizeof MON_8 + MON_8P - 1 #define MON_10P sizeof MON_9 + MON_9P - 1 #define MON_11P sizeof MON_10 + MON_10P - 1 #define MON_12P sizeof MON_11 + MON_11P - 1 #define WDAY_1P 0 #define WDAY_2P sizeof WDAY_1 - 1 #define WDAY_3P sizeof WDAY_2 + WDAY_2P - 1 #define WDAY_4P sizeof WDAY_3 + WDAY_3P - 1 #define WDAY_5P sizeof WDAY_4 + WDAY_4P - 1 #define WDAY_6P sizeof WDAY_5 + WDAY_5P - 1 #define WDAY_7P sizeof WDAY_6 + WDAY_6P - 1 #define MONTH MON_1 MON_2 MON_3 MON_4 \ MON_5 MON_6 MON_7 MON_8 \ MON_9 MON_10 MON_11 MON_12 #define WEEK WDAY_1 WDAY_2 WDAY_3 WDAY_4 \ WDAY_5 WDAY_6 WDAY_7 int main(void) { time_t t = time(NULL); struct tm *t_tm = gmtime(&t); int t_wday[] = { WDAY_1P, WDAY_2P, WDAY_3P, WDAY_4P, WDAY_5P, WDAY_6P, WDAY_7P }, t_mon[] = { MON_1P, MON_2P, MON_3P, MON_4P, MON_5P, MON_6P, MON_7P, MON_8P, MON_9P, MON_10P, MON_11P, MON_12P }; printf("%s %s %d %d:%d:%d %d\n", &WEEK[t_wday[t_tm->tm_wday]], &MONTH[t_mon[t_tm->tm_mon]], t_tm->tm_mday, t_tm->tm_hour, t_tm->tm_min, t_tm->tm_sec, t_tm->tm_year + 1900); }
  6. hekotes630

    C Fazer tabelas em C

    É apenas um exemplo de usabilidade do union. Se você tem várias constantes comuns e quer distinguir qual é maior, use o union. No entanto, se você não quer alocar memória dinamicamente, declare uma constante longa, e declare um array de inteiro para distinguir o local da palavra. #include <stdio.h> #include <time.h> #define MON_1 "January\0" #define MON_2 "February\0" #define MON_3 "March\0" #define MON_4 "April\0" #define MON_5 "May\0" #define MON_6 "June\0" #define MON_7 "July\0" #define MON_8 "August\0" #define MON_9 "September\0" #define MON_10 "October\0" #define MON_11 "November\0" #define MON_12 "December" #define WDAY_1 "Sunday\0" #define WDAY_2 "Monday\0" #define WDAY_3 "Tuesday\0" #define WDAY_4 "Wednesday\0" #define WDAY_5 "Thursday\0" #define WDAY_6 "Friday\0" #define WDAY_7 "Saturday" int main(void) { time_t t = time(NULL); struct tm *t_tm = gmtime(&t); int t_wdayp[] = { 0, sizeof WDAY_1 - 1, sizeof WDAY_2 + t_wdayp[1] - 1, sizeof WDAY_3 + t_wdayp[2] - 1, sizeof WDAY_4 + t_wdayp[3] - 1, sizeof WDAY_5 + t_wdayp[4] - 1, sizeof WDAY_6 + t_wdayp[5] - 1 }, t_monp[] = { 0, sizeof MON_1 - 1, sizeof MON_2 + t_monp[1] - 1, sizeof MON_3 + t_monp[2] - 1, sizeof MON_4 + t_monp[3] - 1, sizeof MON_5 + t_monp[4] - 1, sizeof MON_6 + t_monp[5] - 1, sizeof MON_7 + t_monp[6] - 1, sizeof MON_8 + t_monp[7] - 1, sizeof MON_9 + t_monp[8] - 1, sizeof MON_10 + t_monp[9] - 1, sizeof MON_11 + t_monp[10] - 1 }; char t_wday[] = WDAY_1 WDAY_2 WDAY_3 WDAY_4 WDAY_5 WDAY_6 WDAY_7 , t_mon[] = MON_1 MON_2 MON_3 MON_4 MON_5 MON_6 MON_7 MON_8 MON_9 MON_10 MON_11 MON_12 ; printf("%s %s %d %d:%d:%d %d\n", &t_wday[t_wdayp[t_tm->tm_wday]], &t_mon[t_monp[t_tm->tm_mon]], t_tm->tm_mday, t_tm->tm_hour, t_tm->tm_min, t_tm->tm_sec, t_tm->tm_year + 1900); } Isso pode usar um pouco mais de memória, devido aos arrays de inteiro, mas é um método que não aloca memória dinamicamente. Não é complacente com ANSI C89. Para ANSI C89, defina diretivas de pré-processador. #include <stdio.h> #include <time.h> #define MON_1 "January\0" #define MON_2 "February\0" #define MON_3 "March\0" #define MON_4 "April\0" #define MON_5 "May\0" #define MON_6 "June\0" #define MON_7 "July\0" #define MON_8 "August\0" #define MON_9 "September\0" #define MON_10 "October\0" #define MON_11 "November\0" #define MON_12 "December" #define WDAY_1 "Sunday\0" #define WDAY_2 "Monday\0" #define WDAY_3 "Tuesday\0" #define WDAY_4 "Wednesday\0" #define WDAY_5 "Thursday\0" #define WDAY_6 "Friday\0" #define WDAY_7 "Saturday" #define MON_1P 0 #define MON_2P sizeof MON_1 - 1 #define MON_3P sizeof MON_2 + MON_2P - 1 #define MON_4P sizeof MON_3 + MON_3P - 1 #define MON_5P sizeof MON_4 + MON_4P - 1 #define MON_6P sizeof MON_5 + MON_5P - 1 #define MON_7P sizeof MON_6 + MON_6P - 1 #define MON_8P sizeof MON_7 + MON_7P - 1 #define MON_9P sizeof MON_8 + MON_8P - 1 #define MON_10P sizeof MON_9 + MON_9P - 1 #define MON_11P sizeof MON_10 + MON_10P - 1 #define MON_12P sizeof MON_11 + MON_11P - 1 #define WDAY_1P 0 #define WDAY_2P sizeof WDAY_1 - 1 #define WDAY_3P sizeof WDAY_2 + WDAY_2P - 1 #define WDAY_4P sizeof WDAY_3 + WDAY_3P - 1 #define WDAY_5P sizeof WDAY_4 + WDAY_4P - 1 #define WDAY_6P sizeof WDAY_5 + WDAY_5P - 1 #define WDAY_7P sizeof WDAY_6 + WDAY_6P - 1 int main(void) { time_t t = time(NULL); struct tm *t_tm = gmtime(&t); int t_wdayp[] = { WDAY_1P, WDAY_2P, WDAY_3P, WDAY_4P, WDAY_5P, WDAY_6P, WDAY_7P }, t_monp[] = { MON_1P, MON_2P, MON_3P, MON_4P, MON_5P, MON_6P, MON_7P, MON_8P, MON_9P, MON_10P, MON_11P, MON_12P }; char t_wday[] = WDAY_1 WDAY_2 WDAY_3 WDAY_4 WDAY_5 WDAY_6 WDAY_7 , t_mon[] = MON_1 MON_2 MON_3 MON_4 MON_5 MON_6 MON_7 MON_8 MON_9 MON_10 MON_11 MON_12 ; printf("%s %s %d %d:%d:%d %d\n", &t_wday[t_wdayp[t_tm->tm_wday]], &t_mon[t_monp[t_tm->tm_mon]], t_tm->tm_mday, t_tm->tm_hour, t_tm->tm_min, t_tm->tm_sec, t_tm->tm_year + 1900); }
  7. Eu fiz assim. O único problema é que não aceita números muito grandes. Enviei por anexo pois não tenho o botão de formatação de código. log.txt
  8. hekotes630

    C Fazer tabelas em C

    union também vem a ser útil para distinguir a maior constante. union.txt
  9. Legível é subjetivo. O que é legível para você pode não ser a outras pessoas. Você não responde por todos. Aliás, se você é um bom programador, não vai se preocupar com isso. Se faz o que é pedido, por que se preocupar? O importante é entregar resultado.
  10. Não tenho esse botão. O manual diz que é o resultado de um erro de leitura ou do fim de um arquivo. (Note a conformação com o padrão ANSI C.)
  11. Eu aprendi a lógica de programação orientada a objetos pelo livro da linguagem de programação Smalltalk. Smalltalk é uma linguagem puramente orientada a objetos, e é pai do conceito. Esse livro me ajudou a entender outras linguagens orientadas a objetos, incluindo Java. Leia este livro.
  12. #include <stdio.h> #include <string.h> int main(void) { int s[1000], i = 0, j = 0; char *spre[] = { "ALUNO", "ESCOLA" }; while(1) { if(i == sizeof s / sizeof *s) goto err; if((s[i] = getchar()) == EOF) { fprintf(stderr, "Ocorreu um erro de leitura!\n"); return -1; } if(s[i] == spre[0][j]) { if(++j == strlen(spre[0])) { char cpre[] = "ESTUDANTE"; for(i -= j - 1, j = 0; j < sizeof cpre - 1; i++, j++) { if(i == sizeof s / sizeof *s) goto err; s[i] = cpre[j]; } j = 0; continue; } } else if(s[i] == spre[1][j]) { if(++j == strlen(spre[1])) { char cpre[] = "UNIVERSIDADE"; for(i -= j - 1, j = 0; j < sizeof cpre - 1; i++, j++) { if(i == sizeof s / sizeof *s) goto err; s[i] = cpre[j]; } j = 0; continue; } } else j = 0; if(s[i] == '\n') { s[i] = '\0'; break; } i++; } for(i = 0; s[i]; i++) putchar(s[i]); putchar('\n'); return 0; err: fprintf(stderr, "Há muitos caracteres!\n"); return -1; } Note que eu não faço uso de char. Usar char com getchar() é perigoso, pois nem toda máquina tem char com sinal (signed char).
  13. Não vejo o porque, já que a maioria dos programas em C são escritos, na verdade, com base em implementações históricas da linguagem, por simplicidade e compatibilidade. Muitos compiladores C possuem compatibilidade com implementações históricas. ANSI C ainda remanesce sendo a implementação base para toda nova implementação da linguagem. Certamente, a linguagem mudou muito, mas implementações históricas ainda possuem um alto valor de significância à linguagem. A série é composta por três números, sendo os dois últimos uma soma de três, contados a partir do primeiro número. As vírgulas não fazem parte da série, mas podem ser adicionadas, por conveniência. Na minha implementação, pode-se dizer que dígito 0 = primeira série, portanto, primeira série = 144. A forma correta seria, dígito 0 = nenhuma série, portanto, nenhuma série = 0 ou dígito inválido. Fiz isto por simplicidade, mas, para se obter resultados mais convenientes, pode-se definir 1 à variável posicao e implementar um teste à declaração scanf. Também incluí vírgulas nesta nova implementação, mas, em vez de continuar a contagem, optei por quebrar a linha a cada série que é impressa: #include <stdio.h> #include <stdlib.h> int main() { int n, valor, posicao=1, controle=1, i; printf("Informe até qual posição deseja gerar a lista:\n"); scanf("%d", &n); if (n <= 0) { printf("Por favor, informe um número maior que zero e que não seja negativo."); return 1; } while (posicao <= n) { valor = controle; printf("%d", valor); posicao += 1; valor += 3; for (i = 0; i < 2; i++) { printf(","); printf("%d", valor); posicao += 0; } printf("...\n"); controle += 1; } return 0; } Omitir o header stdlib.h não faria diferença alguma ao programa. Realmente, não há necessidade em incluí-lo, mas qualquer programa real em C faz uso tanto do stdlib.h quanto do stdio.h. Ambos headers, stdlib.h e stdio.h, são essenciais para qualquer programa em C. Apesar disso, em algum de meus testes, omitir o stdlib.h causaria output indesejável.
  14. A propósito, caso queira aprender mais profundamente sobre a linguagem de programação C, há dois livros que recomendo: The C Programming Language First Edition (primeira implementação, conhecida como K&R) The C Programming Language Second Edition (segunda implementação, conhecida como ANSI C) Apesar de ambos estarem escritos em inglês, são ótimas fontes de conhecimento sobre a linguagem de programação C.
  15. Em vez de vírgulas, coloque ponto e vírgula nos parâmetros da declaração for. E não há necessidade em definir a variável i como int, pois já foi definida anteriormente. Tão pouco há necessidade em definir os valores das variáveis valor e posicao, pois são definidas por outras declarações. Eu melhorei seu código por muitas vezes. #include <stdio.h> #include <stdlib.h> int main() { int n, valor, posicao, controle=1, i; printf("Informe ate qual posicao deseja gerar a lista\n"); scanf("%d", &n); while (posicao <= n) { valor = controle; printf("%d", valor); posicao += 1; valor += 3; for (i = 0; i < 2; i++) { printf("%d", valor); posicao += 0; } controle += 1; } return 0; }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...