Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Localhost

Setar elementos entre arrays

Recommended Posts

Localhost

Olá pessoal, estou nos problemas da USACO e agora preciso duma coisa que é tipo setar elementos de um vector para o outro, do género, tenho um vector com primeiros nomes desordenado e tenho outro vector com últimos nomes, como é que eu posso setar um elemento (o primeiro nome) de um vector para outro elemento (ultimo nome) de outro vector? Calculo que seja com ponteiros mas não estou a ver como o posso fazer  :dontgetit:


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Sim, apontar  :P

Exemplo:

vector que contem primeiros nomes:

Joao, David, Antonio, Manuel

vector que contem ultimos nomes:

Fonseca, Flores, Moreira, outro qualquer

Agora como é que eu relaciono, por exemplo, o Manuel com o Fonseca?


here since 2009

Share this post


Link to post
Share on other sites
Metaluim

mas com que critérios associas o primeiro nome ao último nome? Isso há várias maneiras de fazer, depende do o que quiseres depois fazer com os nomes e como queres mexer com os dados. Talvez um map?


typedef struct strMap 
{
     char *val;
     char *key;
}_strMap;

//exemplo
strMap pessoa;
pessoa.val = primeiroNome[3];
pessoa.key = segundoNome[0];

Share this post


Link to post
Share on other sites
Localhost

Eu quero fazer isto para poder alterar os dados de um vector mas sem perder a "identidade" do mesmo ou seja, quero por exemplo alterar o último nome mas não quero perder o primeiro nome ou seja, quero tê-lo relacionado na mesma com o primeiro nome

Edit: Sim, era mesmo isso que eu queria, vou tentar aplicar, obrigado.


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Bem, aqui está o meu programa, alguém me podia ajudar? Não estou a conseguir neste caso:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

int main(void){
FILE *in, *out;
if(!(in = fopen("gift1.in","rb"))){
	printf("Error\n");
	exit(1);
}
if(!(out = fopen("gift1.out","wb"))){
	printf("Error\n");
	exit(1);
}
int n;
fscanf(in,"%d",&n);
struct map{
	char *name;
	int *money;
} people[n];
int i;
char name[n][100];
int money[n];
for(i=0;i<n;i++){
	money[i] = 0;
}
for(i=0;i<n;i++){
	fscanf(in,"%s",name[i]);
	people[i].name = name[i];
	people[i].money = &money[i];
}
for(i=0;i<n;i++){
	printf("%s\n", people[i].name);
}
fclose(in);
fclose(out);
return 0;
}

Já consegui fazer qualquer coisa, se eu depois tiver dúvidas venho cá


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Pessoal, já tenho 90% do meu código terminado, agora o que eu queria fazer era fazer um loop para verificar se o ficheiro acabou só que me dá um segmentation fault  :(

O código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

int main(void){
FILE *in, *out;
if(!(in = fopen("gift1.in","rb"))){
	printf("Error\n");
	exit(1);
}
if(!(out = fopen("gift1.out","wb"))){
	printf("Error\n");
	exit(1);
}
int n;
fscanf(in,"%d",&n);
struct map{
	char *name;
	int *money;
} people[n];
int i;
char name[n][100];
int money[n];
for(i=0;i<n;i++){
	money[i] = 0;
}
for(i=0;i<n;i++){
	fscanf(in,"%s",name[i]);
	people[i].name = name[i];
	people[i].money = &money[i];
}
char nome[100];
int mon;
int j = 0;
fscanf(in,"%s",nome);
fscanf(in,"%d",&mon);
while(strcmp(nome,name[j])){
	j++;
}
*people[j].money = -mon;
int numdoac;
fscanf(in,"%d",&numdoac);
int z;
j=0;
char recebe[100];
for(z=0;z<numdoac;z++){
	fscanf(in,"%s",recebe);
	while(strcmp(recebe,name[j])){
		j++;
	}
	*people[j].money = mon/numdoac;
}
for(j=0;j<=numdoac;j++){
	printf("%s\n", people[j].name);
	printf("%i\n", *people[j].money);
}
fclose(in);
fclose(out);
return 0;
}

Alguém me podia ajudar?

Alguém?  :P


here since 2009

Share this post


Link to post
Share on other sites
Metaluim

para ver se estás no final do ficheiro?

if(ftell(in) == SEEK_END)
{
     //you're at the end!
}

Share this post


Link to post
Share on other sites
Localhost

Bem, tive de começar o meu programa de novo, desta vez de uma maneira melhor, no entanto continua-me a dar o erro de segmentation fault, eu não percebo porque que é que isso acontece, eu quero criar um loop e estar a fazer as instruções até chegar ao final do ficheiro:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

int main(void){
FILE *in, *out;
int num=0,control=0,mondoac=0;
char guy[100];
int numdoac=0;
if(!(in=fopen("gift1.in","rb"))){
	puts("Error opening\n");
	exit(1);
}
if(!(out=fopen("gift1.out","wb"))){
	puts("Error opening\n");
	exit(1);
}
fscanf(in,"%d",&num);
struct person{
	char name[100];
	int money;
} people[num];
for(control=0;control<num;control++){
	fscanf(in,"%s",people[control].name);
	people[control].money = 0;
}
control = 0;
NOVO:
	fscanf(in,"%s",guy);
	fscanf(in,"%d",&mondoac);
	fscanf(in,"%d",&numdoac);
	while(strcmp(guy,people[control].name)){
		control++;
	}
	int j = 0;
	people[control].money -= mondoac;
	char recebe[100];
	for(control=0;control<numdoac;control++){
		fscanf(in,"%s",recebe);
		while(strcmp(recebe,people[j].name)){
			j++;
		}
		people[j].money = mondoac/numdoac;
	}
	for(j=0;j<num;j++){
		printf("%s %d\n", people[j].name,people[j].money);
	}
	if(!(ftell(in) == SEEK_END)){
		goto NOVO;
	}
fclose(in);
fclose(out);
return 0;
}

Ajuda por favor  :P


here since 2009

Share this post


Link to post
Share on other sites
TheDark

A utilização de um goto raramente se justifica. Chamar-lhe "melhor" ainda é mais raro. Um do { ... } while() tinha precisamente o mesmo efeito.

O número de linhas do ficheiro está descrito no próprio ficheiro, não precisas de "ler até terminar o ficheiro". Sabes quantas pessoas existem no grupo, e sabes quantos presentes cada um deles dá. Quando se esgotarem os presentes da última pessoa, paras de ler.


Desaparecido.

Share this post


Link to post
Share on other sites
Localhost

Bem, eu pensei que já tinha resolvido tudo deste problema mas afinal não e eu não consigo perceber este erro.

Eles no exemplo em que dão do problema dois dizem que o Dave ganhou 302, e eu tenho 300, fiz as contas aqui e dá-me 300, não consigo perceber porque é que dá 302 a eles , será um problema de arredondamentos?


here since 2009

Share this post


Link to post
Share on other sites
TheDark

O resto da divisão inteira de 200 (o dinheiro que o Dave dá) por 3 (número de pessoas a quem o Dave dá presentes) dá quanto?


Desaparecido.

Share this post


Link to post
Share on other sites
TheDark

Larga a máquina de calcular e faz a divisão à mão! :P

dividendo |divisor 

    resto  quociente

200 |3 

  ?  66


Desaparecido.

Share this post


Link to post
Share on other sites
Localhost

Pá, vou-te ser sincero, já não me lembro de como se faz isso  😳

Mas para que é que é necessário isso, para resolver o problema?

Edit: Talvez 0,6 xD


here since 2009

Share this post


Link to post
Share on other sites
Localhost

lol, agora fizeste de proposito  :P

Mas quanto ao problema, em que é que eu posso melhorar com isso?


here since 2009

Share this post


Link to post
Share on other sites
TheDark

Fizeste as contas e deu-te 300. Faltou-te levares em consideração esta frase:

Each person sets aside a certain amount of money to give and divides this money evenly among all those to whom he or she is giving a gift. No fractional money is available, so dividing 3 among 2 friends would be 1 each for the friends with 1 left over -- that 1 left over stays in the giver's "account".

Daí a conversa sobre divisão inteira e resto.


Desaparecido.

Share this post


Link to post
Share on other sites
Localhost

Hey, pois é  :P

Podes-me ajudar a fazer uma implementação disso nisto:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

int main(void){
FILE *in, *out;
int num=0,control=0,mondoac=0;
char guy[100];
int z=0;
int j = 0;
int ctrl;
int numdoac=0;
if(!(in=fopen("gift1.in","rb"))){
	puts("Error opening\n");
	exit(1);
}
if(!(out=fopen("gift1.out","wb"))){
	puts("Error opening\n");
	exit(1);
}
fscanf(in,"%d",&num);
struct person{
	char name[100];
	int money;
} people[num];
for(control=0;control<num;control++){
	fscanf(in,"%s",people[control].name);
	people[control].money = 0;
}
control = 0;
for(ctrl=0;ctrl<num;ctrl++){
	fscanf(in,"%s",guy);
	fscanf(in,"%d",&mondoac);
	fscanf(in,"%d",&numdoac);
	control = 0;
	while(strcmp(guy,people[control].name)){
		control++;
	}
	people[control].money -= mondoac;
	char recebe[100];
	for(z=0;z<numdoac;z++){
		fscanf(in,"%s",recebe);
		j=0;
		while(strcmp(recebe,people[j].name)){
			j++;
		}
		people[j].money += mondoac/numdoac;
	}
}
for(j=0;j<num;j++){
	fprintf(out,"%s %d\n", people[j].name,people[j].money);
}
fclose(in);
fclose(out);
return 0;
}


here since 2009

Share this post


Link to post
Share on other sites
TheDark

Posso dizer-te que o resto da divisão inteira se obtém com mondoac % numdoac, e que só precisas de acrescentar uma linha ao código para somar esse valor ao money do ofertante.


Desaparecido.

Share this post


Link to post
Share on other sites
Localhost

Bem, fiz isso, agora deu-me um resultado engraçado, 306  :P

Vê:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

int main(void){
FILE *in, *out;
int num=0,control=0,mondoac=0;
char guy[100];
int z=0;
int j = 0;
int ctrl;
int numdoac=0;
if(!(in=fopen("gift1.in","rb"))){
	puts("Error opening\n");
	exit(1);
}
if(!(out=fopen("gift1.out","wb"))){
	puts("Error opening\n");
	exit(1);
}
fscanf(in,"%d",&num);
struct person{
	char name[100];
	int money;
} people[num];
for(control=0;control<num;control++){
	fscanf(in,"%s",people[control].name);
	people[control].money = 0;
}
control = 0;
for(ctrl=0;ctrl<num;ctrl++){
	fscanf(in,"%s",guy);
	fscanf(in,"%d",&mondoac);
	fscanf(in,"%d",&numdoac);
	control = 0;
	while(strcmp(guy,people[control].name)){
		control++;
	}
	people[control].money -= mondoac;
	char recebe[100];
	for(z=0;z<numdoac;z++){
		fscanf(in,"%s",recebe);
		j=0;
		while(strcmp(recebe,people[j].name)){
			j++;
		}
		people[j].money += mondoac/numdoac;
		people[control].money += mondoac%numdoac;
	}
}
for(j=0;j<num;j++){
	fprintf(out,"%s %d\n", people[j].name,people[j].money);
}
fclose(in);
fclose(out);
return 0;
}


here since 2009

Share this post


Link to post
Share on other sites
Localhost

É que isto é uma coisa tão minima  :dontgetit:

Alguém me pode ajudar?

Edit: Eu já mudei o sitio onde está somo o resto da divisão para dentro da variável do dinheiro do que dá as prendas mas dá-me um erro: Floating point exception, isto em tempo de execução, em tempo de compilação ele compila sem um único warning  :angry1:


here since 2009

Share this post


Link to post
Share on other sites
Localhost

E onde é que está a dividir por zero? A única divisão que eu tenho é:

people[j].money += mondoac/numdoac;

E é claro, a do resto, indirectamente. Mas eu tenho valores nessas variáveis aqui:

fscanf(in,"%d",&mondoac);
fscanf(in,"%d",&numdoac);

Não percebi.


here since 2009

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.