Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Beatriz Rachel

código em C trabalho de faculdade

Recommended Posts

Olá pessoal, gostaria de tirar algumas duvidas sobre meu código.
Tenho que entregar hoje esse trabalho de estrutura de dados e estou ferrada.
Isso foi o que consegui fazer.. mas não consigo rodar.. Será que alguém tem alguma dica do que pode estar errado, ou se estou perdida mesmo e não tem mais salvação?
Quem puder ajudar eu agradeço muito!!!!
O "programa" está em (uma tentativa de) C.
Segue código:
(coloquei a especificação do trabalho no comentário)

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct candidato
{
char inscr[10];
char nome[44];
int periodo;
char turno[3];
int posicao;
char curso[30];
};
typedef struct candidato Candidato;

struct Nolista{
char *nomearquivo[14];
struct Nolista *prox;
};

struct NolistaFiles{
FILE *arquivo;
struct Nolista *prox;
};


//Usar uma lista que contém os nomes dos arquivos a ordenar
//A cada passo do algoritmo, retirar os 7 primeiros itens da
//lista, intercalá-los, colocar o arquivo resultante no final da lista
//O algoritmo pára quando a lista tiver apenas 1 arquivo(que será o resultante)

int main(void) {
Nolista *lista_nomearquivo, *lista_nomearquivoatual;
lista_nomearquivoatual = lista_nomearquivo; //ponteiros para lista de nomes de arquivos

NolistaFiles *lista_arquivos, *lista_arquivosatual;
lista_arquivosatual = lista_arquivos; //ponteiros para lista de arquivos

//FILE *saida, *file1, *file2, *file3, *file4, *file5, *file6;
FILE *saida;
saida = fopen("candidatos.txt","a");

char nomearquivo[14]; //guarda nome de cada arquivo no while que constrói os nomes
int numeroarquivo=000; //numero do nome do arquivo que será construido no while que constrói os nomes

int totalarquivos - 68; //total de 68 arquivos
int contadorarquivos = 0; //contador de arquivos lidos
while (contadorarquivos < totalarquivos){ //enquanto ainda existir algum arquivo

//constrói lista dos nomes dos arquivos
int i = 1;
while (i <8) {
nomearquivo = strcat("candidatos.", numeroarquivo);
lista_nomearquivoatual = nomearquivo;
lista_nomearquivoatual = lista_nomearquivoatual.prox;
numeroarquivo++;
i++;
}

//abre 6 arquivos na lista de arquivos
lista_nomearquivoatual = lista_nomearquivo;
lista_arquivosatual = fopen(lista_nomearquivoatual, "r");

lista_nomearquivoatual = lista_nomearquivoatual.prox;
lista_arquivosatual = lista_arquivosatual.prox;
lista_arquivosatual = fopen(lista_nomearquivoatual, "r");

lista_nomearquivoatual = lista_nomearquivoatual.prox;
lista_arquivosatual = lista_arquivosatual.prox;
lista_arquivosatual = fopen(lista_nomearquivoatual, "r");

lista_nomearquivoatual = lista_nomearquivoatual.prox;
lista_arquivosatual = lista_arquivosatual.prox;
lista_arquivosatual = fopen(lista_nomearquivoatual, "r");

lista_nomearquivoatual = lista_nomearquivoatual.prox;
lista_arquivosatual = lista_arquivosatual.prox;
lista_arquivosatual = fopen(lista_nomearquivoatual, "r");

lista_nomearquivoatual = lista_nomearquivoatual.prox;
lista_arquivosatual = lista_arquivosatual.prox;
lista_arquivosatual = fopen(lista_nomearquivoatual, "r");

lista_arquivosatual = lista_arquivos;

while (lista_arquivosatual != NULL) { //Enquanto não chegar ao fim da lista de arquivos,
while(!feof(lista_arquivosatual.arquivo) { //enquanto não encontrar o fim do arquivo atual, ler dados de cada candidato.
Candidato candidato_lido;

fgets(candidato_lido.inscr, 10, lista_arquivosatual);
fgets(candidato_lido.nome, 44, lista_arquivosatual);
fgets(candidato_lido.periodo, 2, lista_arquivosatual);
fgets(candidato_lido.turno, 3, lista_arquivosatual);
fgets(candidato_lido.posicao, 3, lista_arquivosatual);
fgets(candidato_lido.curso, 30, lista_arquivosatual);

fprintf (saida, candidato_lido.inscr, candidato_lido.nome, candidato_lido.periodo, candidato_lido.turno, candidato_lido.posicao, candidato_lido.curso, "\n");
//escreve dados lidos no arquivo saida
}

lista_arquivosatual = lista_arquivosatual.prox; //ler próximo arquivo
}


//fecha 6 arquivos
lista_arquivosatual = lista_arquivos;
fclose(lista_arquivosatual);
lista_arquivosatual = lista_arquivosatual.prox;
fclose(lista_arquivosatual);
lista_arquivosatual = lista_arquivosatual.prox;
fclose(lista_arquivosatual);
lista_arquivosatual = lista_arquivosatual.prox;
fclose(lista_arquivosatual);
lista_arquivosatual = lista_arquivosatual.prox;
fclose(lista_arquivosatual);
lista_arquivosatual = lista_arquivosatual.prox;
fclose(lista_arquivosatual);

contadorarquivos = contadorarquivos+6; //conta +6 arquivos lidos
}

fclose(saida); //fecha arquivo de saida

system("pause");
return 0;
}


especificação do trabalho:

Para este trabalho considere um conjunto de arquivos de entrada binários (partições) cada um
contendo uma quantidade de registros do tipo Candidato, conforme definido a seguir, dispostos em
ordem crescente de acordo com o nome dos candidatos:
struct candidato
{
char inscr[10];
char nome[44];
int periodo;
char turno[3];
int posicao;
char curso[30];
};
typedef struct candidato Candidato;
Os arquivos de entrada estão nomeados da forma “candidatos.NNN”, onde “NNN” é uma
numeração crescente indicando a ordem de criação do arquivo, variando de 000 a 068. Estes
arquivos estão disponíveis no link:
Considerando que o sistema operacional pode manter no máximo 7 arquivos abertos
simultaneamente, implemente um programa em C que realiza a intercalação destes arquivos
empregando a estratégia de intercalação ótima. O arquivo de saída deve ser do tipo texto, conter
todos os registros ordenados de acordo com o nome do candidato e receber o nome
“candidatos.txt”. Além disso, o programa deve determinar e imprimir o tempo decorrido para a
execução da intercalação e calcular e imprimir o número de passos na etapa de intercalação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Explique exatamente o que acontece.

Não compila? Que erro aparece?

Eu mudei algumas coisas no código por sugestão do professor. Ainda nao consegui ajeitar tudo.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct candidato
{
char inscr[10];
char nome[44];
int periodo;
char turno[3];
int posicao;
char curso[30];
};
typedef struct candidato Candidato;
struct vetornomearquivos{
char nomearquivo[14];
};
typedef struct vetornomearquivos VetorNomeArquivos;
struct vetorinscrlidas{
char inscrlida[10];
};
typedef struct vetorinscrlidas VetorInscrLidas;
struct vetornomeslidos{
char nomelido[44];
};
typedef struct vetornomeslidos VetorNomesLidos;
struct vetorarquivos{
FILE *arquivo;
};
typedef struct vetorarquivos VetorArquivos;
int main(void) {
//declarando os vetores
// char vetorNomeArquivos[6];
VetorNomeArquivos vetorNomeArquivos[6];
VetorArquivos vetorArquivos[6];
VetorInscrLidas vetorInscrLidas[6];
VetorNomesLidos vetorNomesLidos[6];
char nomearquivo[14]="candidatos."; //guarda nome de cada arquivo do while que constrói os nomes
int numeroarquivo=0; //numero do nome do arquivo que será construido no while que constrói os nomes
char numeroarquivochar[3]; //numero do nome do arquivo que será construido no while que constrói os nomes tranformado para char
int totalarquivos = 68; //total de 68 arquivos inicialmente
int contadorarquivos = 0; //contador de arquivos lidos
while (contadorarquivos < totalarquivos){ //enquanto ainda existir algum arquivo
//constrói vetor dos nomes dos 6(ou 2 arquivos, se for a ultima passagem da função) arquivos
int i = 0;
while (i < 6 && numeroarquivo <= totalarquivos) {
itoa(numeroarquivo, numeroarquivochar, 10); //transforma o numero do arquivo em char
strcat(nomearquivo, numeroarquivochar);
vetorNomeArquivos.nomearquivo = nomearquivo;
numeroarquivo++;
i++;
nomearquivo[12]=NULL;
nomearquivo[13]=NULL;
nomearquivo[14]=NULL;
}
//abre os 6(ou menos se for a ultima passagem da função) arquivos no vetor de arquivos
for (i=0; i<6; i++ ){
vetorArquivos.arquivo = fopen(vetorNomeArquivos.nomearquivo, "r");
}
for (i=1; i<6; i++ ){ //Enquanto não chegar ao fim da lista de arquivos,
fgets(vetorInscrLidas.inscrlida, 10, vetorArquivos.arquivo); //lê a inscrição do primeiro candidato e guarda no vetor(apenas para passar pelos 10 primeiros caracteres e ir para o proximo passo)
fgets(vetorNomesLidos.nomelido, 44, vetorArquivos.arquivo); //lê o nome do primeiro candidato e guarda no vetor
}
//criando novo arquivo
totalarquivos++; //adiciona 1 ao numero total de arquivos para criar o novo arquivo
char totalarquivoschar[3]; //inicializando o char que quardará o numero total de arquivos a ser concatenado para formar o nome do novo arquivo
itoa(totalarquivos, totalarquivoschar, 10); //transforma o novo numero do total de arquivos em char
char nomeNovoArquivo[14]="candidatos."; //inicializado o char que receberá o nome do novo arquivo (concatenado com totalarquivos char \/
strcat(nomeNovoArquivo, totalarquivoschar); //constrói nome do novo arquivo
FILE *novoArquivo = fopen(nomeNovoArquivo,"a"); //cria novo arquivo com nome construído
//ver qual foi o menor(menor letra = a, maior letra = z) nome lido na ordem alfabética
//enquanto todos os índices do vetor de nomes lidos não apontarem para -1 (fim de todos os arquivos)
char menor[44];
while (vetorNomesLidos[0].nomelido!="nulo" || vetorNomesLidos[1].nomelido!="nulo" || vetorNomesLidos[2].nomelido!="nulo" || vetorNomesLidos[3].nomelido!="nulo" || vetorNomesLidos[4].nomelido!="nulo" || vetorNomesLidos[5].nomelido!="nulo"){
menor =vetorNomesLidos[0].nomelido;
int menorIndice;
int compara;
for (i=1; i<6; i++ ){
if (vetorNomesLidos.nomelido!="nulo"){
compara=strcmp(menor,vetorNomesLidos.nomelido); //compara nomes
if (compara = 1){
menor = vetorNomesLidos.nomelido; //o nome que for menor é guardado
menorIndice = i; //o indice do menor nome também é guardado
}
}
}
Candidato candidato_lido; //cria-se o candidato_lido para armazenar os dados do candidato de menor nome
fgets(candidato_lido.inscr, 10, vetorInscrLidas[menorIndice].inscrlida);
fgets(candidato_lido.nome, 44, vetorNomesLidos[menorIndice].nomelido);
fgets(candidato_lido.periodo, 2, vetorArquivos[menorIndice].arquivo);
fgets(candidato_lido.turno, 3, vetorArquivos[menorIndice].arquivo);
fgets(candidato_lido.posicao, 3, vetorArquivos[menorIndice].arquivo);
fgets(candidato_lido.curso, 30, vetorArquivos[menorIndice].arquivo);
fprintf (novoArquivo, candidato_lido.inscr, candidato_lido.nome, candidato_lido.periodo, candidato_lido.turno, candidato_lido.posicao, candidato_lido.curso, "\n");
if(!feof(vetorArquivos[menorIndice].arquivo) {
fgets(vetorInscrLidas[menorIndice].inscrlida, 10, vetorArquivos[menorIndice].arquivo); //lê a inscrição do primeiro candidato e guarda no vetor
fgets(vetorNomesLidos[menorIndice].nomelido, 44, vetorArquivos[menorIndice].arquivo); //lê o nome do primeiro candidato e guarda no vetor
} else {
vetorNomesLidos[menorIndice].nomelido = "nulo";
}
}
//fecha todos os arquivos
for (i=1; i<6; i++ ){
fclose(vetorArquivos);
}
fclose(novoArquivo);
contadorarquivos = contadorarquivos+6; //conta +6 arquivos lidos
}
FILE *saida;
saida = fopen("candidatos.txt","a"); //cria arquivo saída
//!!!! ***** !!!! **** !!!! **** !!!! **** !!!! fazer função para escrever no arquivo saída !!!! ***** !!!! ***** !!!! **** !!!! **** !!!!
//!!!! ***** !!!! **** !!!! **** !!!! **** !!!! fazer função para escrever no arquivo saída !!!! ***** !!!! ***** !!!! **** !!!! **** !!!!
//!!!! ***** !!!! **** !!!! **** !!!! **** !!!! fazer função para escrever no arquivo saída !!!! ***** !!!! ***** !!!! **** !!!! **** !!!!
//!!!! ***** !!!! **** !!!! **** !!!! **** !!!! fazer função para escrever no arquivo saída !!!! ***** !!!! ***** !!!! **** !!!! **** !!!!
fclose(saida); //fecha arquivo de saida
system("pause");
return 0;
}

Explique exatamente o que acontece.

Não compila? Que erro aparece?

Ele compila, mas aparecem vários erros.

 

Os que estou tentando resolver no momento são esses:

Em várias linhas, por exemplo na linha

vetorNomeArquivos.nomearquivo = nomearquivo;

 

aparece um erro com a seguinte descrição:

" [Error] invalid array assignment"

O que isso quer dizer?

 

E em várias linhas, como nessa:

fgets(candidato_lido.inscr, 10, vetorInscrLidas[menorIndice].inscrlida);

 

aparece esse erro:

[Error] cannot convert 'char*' to 'FILE* {aka _iobuf*}' for argument '3' to 'char* fgets(char*, int, FILE*)'

 

Também não sei o que fazer :(

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em várias linhas, por exemplo na linha

vetorNomeArquivos.nomearquivo = nomearquivo;

 

aparece um erro com a seguinte descrição:

" [Error] invalid array assignment"

O que isso quer dizer?

Atribuição para char* deve ser feita usando strcpy

 

 

E em várias linhas, como nessa:

fgets(candidato_lido.inscr, 10, vetorInscrLidas[menorIndice].inscrlida);

 

aparece esse erro:

[Error] cannot convert 'char*' to 'FILE* {aka _iobuf*}' for argument '3' to 'char* fgets(char*, int, FILE*)'

 

Também não sei o que fazer :(

Você deve ter passado char* (o nome do arquivo) em vez de FILE* (o ponteiro para ele, retornado por fopen)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.