Как создать несколько функций для запуска итогов из текстового файла в c? - PullRequest
0 голосов
/ 21 мая 2019

После чтения и заполнения массива структур из текстового файла, программа должна:

  1. Используйте функцию для вывода данные о поезде.
  2. Используйте функцию для расчета и отчета об общем количестве вагонов в поезде.
  3. Используйте функцию для расчета и отчета об общем количестве лошадиных сил, необходимых для поезда.
  4. Используйте функцию для расчета и отчета длина поезда
  5. Предполагая, что локомотив вырабатывает 1000 лошадиных сил, рассчитайте и укажите количество локомотивов, необходимое для движения поезда (округление вверх). Дело в том, что я никогда не делал этого раньше, и я даже не могу понять, с чего начать. Использование strsub () обязательно, даже если sscanf () сделает все намного проще.

Я пытался передать тип train[] data и создать цикл для итоговой суммы train[i].amount, но, очевидно, я делаю что-то не так.

Из traindata.txt

Boxcar    D 44000 55 16 45
Hopper    B 23000 62 18 33
Tanker    G 15000 45 30 12
Autocar   A 30000 37 23 6
Livestock L 56500 50 18 19
Coalcar   C 49300 53 22 100
Flatcar   F 18000 66 15 25

с поезда.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX 100
FILE *fpIn;

typedef struct {
    char name[10];
    char type;
    float weight;
    int length;
    int power;
    int amount;
}data;

void strsub(char buf[], char sub[], int start, int end);
int readFile();
int numOfCars(data *, int);
int horsePower(data *, int);
int trainLen(data *, int);
int engNeed(int);

// Substring extractor function from book
void strsub(char buf[], char sub[], int start, int end){
    int i, j;

    for (j = 0, i = start; i <= end ; i++, j++){
        sub[j] = buf[i];
    }
    sub[j] = '\0';
}

// Prints out file
void outFile(data* train) {
    printf(" Name: %s ", train->name);
    printf(" Type: %c ", train->type);
    printf(" Weight: %.2f ", train->weight);
    printf(" Length: %d ", train->length);
    printf(" Horsepower: %d ", train->power);
    printf(" Number in Train: %d ", train->amount);

}

// Reads file
int readFile(){
    int count = 0;
    data train[MAX];

    // Opens file
    if(!(fpIn = fopen("traindata.txt", "r"))){
        printf("Error. File can not be opened. \n");
    }

    // Reads each line of text in file
    while (!feof(fpIn)){
        char buf[MAX+2];
        char weightbuf[7];
        char lengthbuf[4];
        char powerbuf[4];
        char amountbuf[6];

        fgets(buf, MAX, fpIn);
        strsub(buf, train[count].name, 0, 8);
        train[count].type = buf[10];
        strsub(buf, weightbuf, 11, 16);
        strsub(buf, lengthbuf, 17, 19);
        strsub(buf, powerbuf, 20, 22);
        strsub(buf, amountbuf, 23, 26);
        train[count].weight = atof(weightbuf);
        train[count].length = atoi(lengthbuf);
        train[count].amount = atoi(amountbuf);
        train[count].power = atoi(powerbuf);
        ++count;

        // where to make those additions
    }

    for (int i = 0; i < count; ++i){
        data* trains = &train[i];
        outFile(trains);
    }
}

int numOfCars(data train[],int len){
    int i,total_cars=0;

    for(i=0;i<len;++i){
        total_cars+=train[i].amount;
    }
    return total_cars;
}

int main(int argc, char *argv[]) {
    data train[20];
    printf("This table shows the current Train Cars\n");
    printf("---------------------------------------\n\n");

    int len = readFile();
    printf("\n\nThere are %d Cars in the train.\n", numOfCars(train,len));

    return 0;
}

Эта таблица показывает текущие вагоны

Name: Boxcar     Type: D  Weight: 44000.00  Length: 55  Horsepower: 16  Number in Train: 45 
Name: Hopper     Type: B  Weight: 23000.00  Length: 62  Horsepower: 18  Number in Train: 33 
Name: Tanker     Type: G  Weight: 15000.00  Length: 45  Horsepower: 30  Number in Train: 12  
Name: Autocar    Type: A  Weight: 30000.00  Length: 37  Horsepower: 23  Number in Train: 6  
Name: Livestock  Type: L  Weight: 56500.00  Length: 50  Horsepower: 18  Number in Train: 19  
Name: Coalcar    Type: C  Weight: 49300.00  Length: 53  Horsepower: 22  Number in Train: 100  
Name: Flatcar    Type: F  Weight: 18000.00  Length: 66  Horsepower: 15  Number in Train: 25 

There are 240 Cars in the train.
The total length of the train is 13183
Total horsepower needed to pull train is 4729
The number of engines need to pull the train is 5

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Большая проблема здесь:

int readFile(){
    int count = 0;
    data train[MAX];  // Local value used for storing data read from the file

Когда вы читаете из файла и сохраняете данные в переменной local , эти данные будут потеряны, когда функция вернется.Другими словами - ваша переменная train внутри функции main не будет хранить данные, прочитанные из файла.

Чтобы исправить это, вам нужно передать переменную train из main в функцию,Например:

int readFile(data train[]){
    int count = 0;
    // delete this line !! data train[MAX];
    ...

и в main назовите его следующим образом:

int len = readFile(train);

Обратите внимание, что хорошей идеей будет также передать максимальное количество элементов, которое может содержать массив.Поэтому рассмотрим:

int readFile(data train[], int max){
    int count = 0;

и назовите его следующим образом:

data train[20];
int len = readFile(train, sizeof(train) / sizeof(data));

или, альтернативно:

data train[MAX];
int len = readFile(train, MAX);
0 голосов
/ 22 мая 2019

Спасибо @ 4386427, это был последний кусок кода.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX 100
FILE *fpIn;

typedef struct {
    char name[10];
    char type;
    float weight;
    int length;
    int power;
    int amount;
}data;

void strsub(char buf[], char sub[], int start, int end);
int readFile(data train[]);
void outFile(data train[]);
int numOfCars(data train[], int num);
int horsePower(data train[], int num);
int trainLen(data train[], int num);

// Substring extractor function from book
void strsub(char buf[], char sub[], int start, int end){
    int i, j;

    for (j = 0, i = start; i <= end ; i++, j++){
        sub[j] = buf[i];
    }
    sub[j] = '\0';
}

// Prints out file
void outFile(data train[]) {
    printf(" Name: %s ", train->name);
    printf(" Type: %c ", train->type);
    printf(" Weight: %.2f ", train->weight);
    printf(" Length: %d ", train->length);
    printf(" Horsepower: %d ", train->power);
    printf(" Number in Train: %d ", train->amount);

}

// Reads file
int readFile(data train[]){
    int count = 0;

    // Opens file
    if(!(fpIn = fopen("traindata.txt", "r"))){
        printf("Error. File can not be opened. \n");
    }

    // Reads each line of text in file
    while (!feof(fpIn)){
        char buf[MAX+2];
        char weightbuf[7];
        char lengthbuf[4];
        char powerbuf[4];
        char amountbuf[6];

        fgets(buf, MAX, fpIn);
        strsub(buf, train[count].name, 0, 8);
        train[count].type = buf[10];
        strsub(buf, weightbuf, 11, 16);
        strsub(buf, lengthbuf, 17, 19);
        strsub(buf, powerbuf, 20, 22);
        strsub(buf, amountbuf, 23, 26);
        train[count].weight = atof(weightbuf);
        train[count].length = atoi(lengthbuf);
        train[count].amount = atoi(amountbuf);
        train[count].power  = atoi(powerbuf);
        ++count;
    }

    for (int i = 0; i < count; ++i){
        data* trains = &train[i];
        outFile(trains);
    }

    numOfCars(train, count);
    trainLen(train, count);
    horsePower(train, count);

    return 0;
}

int numOfCars(data train[], int num){
    int i, totalCars = 0;

    for(i = 0; i < num; i++)
        totalCars += train[i].amount;

    printf("\n\nThere are %d Cars in the Train.", totalCars);
    return totalCars;
}

int trainLen(data train[], int num){
    int i, totalLen = 0;

    for(i = 0; i < num; i++)
        totalLen += (train[i].length * train[i].amount);

    printf("\nThe total length of the train is: %d", totalLen);
    return totalLen;
}

int horsePower(data train[], int num){
    int i, totalHp = 0;

    for (i = 0; i < num; i++)
        totalHp += (train[i].amount * train[i].power);

    printf("\nThe total horsepower need for this train is: %d", totalHp);

    int engNeed = totalHp/1000;
    if (totalHp % 1000 != 0)
        engNeed = engNeed+1;

    printf("\n%d number of engines are needed to pull the train.", engNeed);

    return totalHp, engNeed;
}

int main() {
    data train[MAX];

    printf("This table shows the current Train Cars\n");
    printf("---------------------------------------\n\n");

    readFile(train);

    return 0;
}
...