Ajuda em C

perinhas

What is folding?
Bem tenho que fazer um programa que dadas 10 cidades, imprimir algo como isto:

Vila Real
V. R.


Cidade e iniciais seguidas de um .

Já consegui armazenar as cidades e mostra-las, mas o problema está nas iniciais, que só consigo imprimir a primeira. Se alguém me puder ajudar...

Código:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define LINHAS 10
#define COLUNAS 50

typedef struct
{
        char nome [LINHAS][COLUNAS];
}CIDADE;

CIDADE armazenar_dados (CIDADE cidades[LINHAS][COLUNAS]);
CIDADE iniciais (CIDADE cidades[LINHAS][COLUNAS]);

int main (void)
{
    CIDADE cidades[LINHAS][COLUNAS];
    int i;
    armazenar_dados(cidades);
    system("cls");
    for (i=0;i<LINHAS;i++)
    {
    printf ("%s\n", cidades[i]);
    }
    iniciais (cidades);
    getch();
}

CIDADE armazenar_dados (CIDADE cidades[LINHAS][COLUNAS])
{
       int i;
       
for (i=0;i<LINHAS;i++)
{
    printf("Introduza a %da cidade.\n", i+1);
    fflush(stdin);
    gets(cidades[i]);
}
}

CIDADE iniciais (CIDADE cidades[LINHAS][COLUNAS])
{
int i;
for (i=0;i<LINHAS;i++)
{
    printf("%c.\n", cidades[i][0]);
    if (cidades[i] == ' ')
       printf("%c", cidades[i+1]);
}
}
 
Acho que estás a complicar o problema em demasia. Precisavas mesmo de fazer aquela struct? Sugeria que pusesses o nome de cada cidade dentro de um simples string, que depois poderias tratar com um strtok com token ' '. Assim partias a String por espaços, e cada vez que a partisses, imprimias o primeiro caracter dessa partição...
 
Acho que estás a complicar o problema em demasia. Precisavas mesmo de fazer aquela struct? Sugeria que pusesses o nome de cada cidade dentro de um simples string, que depois poderias tratar com um strtok com token ' '. Assim partias a String por espaços, e cada vez que a partisses, imprimias o primeiro caracter dessa partição...

Sim, o exercício diz para criarmos uma estrutura que armazene 10 cidades...
 
Código:
CIDADE iniciais (CIDADE cidades[LINHAS][COLUNAS])
{
int i;
for (i=0;i<LINHAS;i++)
{
    printf("%c.\n", cidades[i][0]);
    if (cidades[i] == ' ')
       printf("%c", cidades[i+1]);
}
}
tu aki so estas a percorrer as linhas ... deves tb percorrer as colunas ate encontrares um espaço e imprimir o ke esta asseguir...***** do genero

Código:
for (i=0;i<LINHAS;i++)
{
    printf("%c .", cidades[i][0]);
    for (j=0;j<colunas;j++){
       if (cidades[i][j] == ' ')  printf("%c .", cidades[i][j+1]);
       if (cidades[i][j] == ' \0') j=50;
    }
   printf("\n");
}
acho k assim da ;)...espero ke tenha ajudado
 
Dá-me estes erros:

C:\U...: In function `iniciais':
C:\U...:48: error: invalid operands to binary ==
C:\U...:50:31: warning: multi-character character constant
C:\U...:50: error: invalid operands to binary ==

Não percebo porquê...já vi todas as linhas de código e não falta nada.
 
Continua a dar este erro...

C:\...:48: error: invalid operands to binary ==

C:\...:49: error: invalid operands to binary ==

Será que é por estar a comparar uma estrutura com algo?
 
Código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define LINHAS 10
#define COLUNAS 50

typedef struct CIDADES_ {
    char nome [LINHAS][COLUNAS];
    char iniciais [LINHAS][COLUNAS];
} CIDADES;

void armazenar_dados (CIDADES *c);
void iniciais (CIDADES *c);
void NullTerminator(char *string);

int main (void) {
    CIDADES *c;
    int i,j;
    armazenar_dados(c);
    iniciais (c);
    printf("Lista de cidades e suas iniciais:\n");
    for (i=0;i<LINHAS;i++) {
        j=0;
        printf ("%s\n", c->nome[i]);
        while (c->iniciais[i][j]!= '\0')
            printf ("%c.",c->iniciais[i][j++]);
        printf ("\n");
    }
    getch();
    return 0;
}

void armazenar_dados (CIDADES *c) {
    int i;
    for (i=0;i<LINHAS;i++) {
        printf("Introduza a %da cidade.\n", i+1);
        fgets (c->nome[i],COLUNAS,stdin);
        NullTerminator(c->nome[i]);
        fflush(stdin);
    }
}

void NullTerminator(char *string) {
    if (strchr(string,'\n'))
        *strchr(string,'\n')='\0';
}

void iniciais (CIDADES *c) {
    int i,j;
    char *str;
    char tmp[COLUNAS];
    for (i=0;i<LINHAS;i++) {
        j=0;
        strcpy(tmp,c->nome[i]);
        str=strtok (tmp," ");
        while (str != NULL) {
            c->iniciais[i][j++]=toupper(str[0]);
            str = strtok (NULL, " ");
        }
        c->iniciais[i][j]='\0';
    }
}
 
eu tenho aqui uma duvida que nao sei se é possivel realizar... :P
tenho um programa que está a correr sob forma de um processo que tanto pode receber coisas da linha de comandos como coisas vindas de uma socket, alguem me sabe explicar como faço isto sem ter de parar o processo ciclico ???????
 
BUMP...precisava disto para hoje por favor :005:
Não tenho tido tempo para experimentar isso a sério, mas vi que esta implementação apenas dá problemas em windows durante a leitura do nome das cidades para a estrutura. Sugestão: esquece Windows. C + Linux e xau problemas.

eu tenho aqui uma duvida que nao sei se é possivel realizar... :P
tenho um programa que está a correr sob forma de um processo que tanto pode receber coisas da linha de comandos como coisas vindas de uma socket, alguem me sabe explicar como faço isto sem ter de parar o processo ciclico ???????

Se o que queres é multitasking vais ter que criar ou processos filhos ou threads. No teu caso, e se bem entendi essa explicação um bocado confusa, queres que o programa trate ao mesmo tempo de um socket e de inputs pelo stdin. Isso pode-se fazer com um select em simultaneo ao stdin e ao socket ou então tendo um processo/thread para cada um. No entanto, para tratar as ligações ao socket vais ter sempre que usar ou processos ou threads porque caso contrário, só podes ter 1 cliente ligado de cada vez.
 
Se o que queres é multitasking vais ter que criar ou processos filhos ou threads. No teu caso disse:
confuso não me parece, enfim, mas obrigado já percebi que só existe essas 2 formas, vou ter de ir pesquisar para ver como posso fazer isso
 
Back
Topo