После чтения и заполнения массива структур из текстового файла, программа должна:
- Используйте функцию для вывода
данные о поезде.
- Используйте функцию для расчета и отчета об общем количестве вагонов в поезде.
- Используйте функцию для расчета и отчета об общем количестве лошадиных сил, необходимых для поезда.
- Используйте функцию для расчета и отчета
длина поезда
- Предполагая, что локомотив вырабатывает 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