Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
DeStrager
1 / 1 / 0
Регистрация: 12.12.2014
Сообщений: 61
1

Создать файл в котором напротив фамилии каждого пассажира указано количество мест его багажа

13.05.2015, 16:30. Просмотров 435. Ответов 7
Метки нет (Все метки)

Дан файл со сведениями о багаже пассажиров авиа-рейса. В
каждой строке указаны данные об одном багажном месте: фамилия
пассажира и вес багажного места. Данные о багаже одного и того
же пассажира не обязательно располагаются в подряд идущих
строках. Создать новый файл, в котором напротив фамилии
каждого пассажира указаны количество мест его багажа и их
суммарный вес.
Прошу помочь вас с алгоритмом к решению данной задачи!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2015, 16:30
Ответы с готовыми решениями:

Определить класс со следующими данными-членами : фамилия пассажира, номер рейса, стоимость билета, вес багажа
Определить класс со следующими данными-членами : фамилия пассажира, номер...

Вычислить суммарное количество мест и количество мест в гостинице
Написать программу работы с массивом из 10 объектов Объекты - номера в отеле....

В файле хранится информация о пассажирах и багаже. Получить средний вес багажа каждого пассажира
Форумчане помогуте пожалуйста с такой задачей. В файле храниться информация...

Файл: Создать новый файл, в котором будут содержаться фамилии с итоговой оценкой
Дан файл со списком класса и несколькими оценками на каждого в виде: Иванов 3...

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

7
UnsKneD
алкокодер
155 / 151 / 41
Регистрация: 27.12.2012
Сообщений: 550
13.05.2015, 19:06 2
1. Пишешь в файл с каким нибудь разделителем, как писать в файл надеюсь знаешь?
2. Перемещаешь указатель на начало файла.
3. Создай какую нибудь структура для хранения информации и массив этих структур.
C++
1
2
3
4
5
6
7
8
9
10
struct bag{
    int n; //количество мест
    std::string fam;
    int m; //масса 
    bag(){
        n = 0; 
        m = 0;
        fam = "\0";
    };
};
4. Понадобиться какая нибудь простая функция считающая хэш значение фамилии, либо функция проверяющая массив структур на существование записи с заданной фамилией. Но мой тебе совет юзать хэш.

5. Считываешь всю строку из файла, и разбиваешь её на слова до символа разделителя.
6. Считаешь хэш фамилии и вставляешь новый объект структуры в массив, либо добавляешь к количеству мест и к массе багажа.
7. Переписываешь стуктуру в файл.

p.s.
C++
1
2
3
#include <fstream>
std::fstream f("file1.txt");
    f << 0 << "|" << "фамилия1" << "|" << 100;
p.p.s. хэш функция считает какое то число, которое должна вернуть, это будет индексом массива.
0
DeStrager
1 / 1 / 0
Регистрация: 12.12.2014
Сообщений: 61
25.06.2015, 16:00  [ТС] 3
Задача:
Дан файл со сведениями о багаже пассажиров авиа-рейса. В
каждой строке указаны данные об одном багажном месте: фамилия
пассажира и вес багажного места. Данные о багаже одного и того
же пассажира не обязательно располагаются в подряд идущих
строках. Создать новый файл, в котором напротив фамилии
каждого пассажира указаны количество мест его багажа и их
суммарный вес
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
 
void main()
{
    setlocale(LC_ALL, "Russian");
    char s[30],*p,s1[30];
    int v,v1,cout=1;
    FILE *fInp, *fOut;
    fInp = fopen("Input.txt","r");
    fOut = fopen("Output.txt","w");
    while (1){
    p=fgets(s1,30,fInp);
    if (p == NULL) break;
    fscanf(fInp,"%s %d",&s,&v);
    printf("s=%s,v=%d\n",s,v);
    fprintf(fOut,"%s %d %d\n",s,v,cout);}
    fclose(fInp);
    fclose(fOut);
    getchar();getchar();
}
Тут s - строка фамилии, v - вес багажа. Я не могу сообразить, как сделать так, чтобы он сравнивал фамилии, и если они одинаковые, то суммировал вес после этих фамилий и соответственно записывал это в файл оутпут.
0
Рыжий Лис
Просто Лис
1190 / 513 / 344
Регистрация: 17.05.2012
Сообщений: 2,067
Записей в блоге: 8
25.06.2015, 16:20 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
 
struct Pas {
  char s[30];
  int v;
};
 
void main() {
  setlocale(LC_ALL, "Russian");
  Pas arr[100];
  int index=0;
{
  FILE *fInp = fopen("Input.txt","r");
  char s[30], s1[30];
  int v;
  while (1){
    if (fgets(s1,30,fInp) == NULL) break;
    fscanf(fInp,"%s %d",&s,&v);
    for (int i=0;i<index;i++){
      if (strcmp(arr[i].s,s)==0) {
       arr[i].v+=v;
       continue;
      }
    }
    strcpy(arr[index].s,s) ;
    arr[index] = v;
    index++;
  }
  fclose(fInp);
}
  FILE *fOut = fopen("Output.txt","w");
  for (int i=0;i<index;i++){
    printf("s=%s,v=%d\n",arr[i].s,arr[i].v);
    fprintf(fOut,"%s %d\n",arr[i].s,arr[i].v);
  }
  fclose(fOut);
  getchar();
}
0
DeStrager
1 / 1 / 0
Регистрация: 12.12.2014
Сообщений: 61
25.06.2015, 16:31  [ТС] 5
Спасибо конечно, но можно ли это сделать , не используя структуру? Это просто лаб.работа по теме "файлы", и в ней нельзя использовать структуру.
0
Рыжий Лис
Просто Лис
1190 / 513 / 344
Регистрация: 17.05.2012
Сообщений: 2,067
Записей в блоге: 8
25.06.2015, 16:36 6
Конечно можно. Вместо
C++
1
Pas arr[100];
используйте два массива:
C++
1
2
char arr_s[100][30];
int arr_v[100];
0
DeStrager
1 / 1 / 0
Регистрация: 12.12.2014
Сообщений: 61
25.06.2015, 16:59  [ТС] 7
Спасибо большое за помощь.

Добавлено через 16 минут
Рыжий Лис, Не могли бы вы не много пояснить, почему мы используем двумерный строковый массив char arr_s[100][30]; ?

Добавлено через 5 минут
P.P.S.
Изменил код без структуры, программа не работает. Он просто показывает весь список фамилий с весом и записывает его в output.txt
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
 
 
 
void main() {
  setlocale(LC_ALL, "Russian");
  int index=0;
  char arr_s[100][30];
  int arr_v[100];
{
  FILE *fInp = fopen("Input.txt","r");
  char s[30], s1[30];
  int v;
  while (1){
    if (fgets(s1,30,fInp) == NULL) break;
    fscanf(fInp,"%s %d",&s,&v);
    for (int i=0;i<index;i++){
      if (strcmp(arr_s[i],s)==0) {
       arr_v[i]+=v;
       continue;
      }
    }
    strcpy(arr_s[index],s) ;
    arr_v[index] = v;
    index++;
  }
  fclose(fInp);
}
  FILE *fOut = fopen("Output.txt","w");
  for (int i=0;i<index;i++){
    printf("s=%s,v=%d\n",arr_s[i],arr_v[i]);
    fprintf(fOut,"%s %d\n",arr_s[i],arr_v[i]);
  }
  fclose(fOut);
  getchar();
}
0
Рыжий Лис
Просто Лис
1190 / 513 / 344
Регистрация: 17.05.2012
Сообщений: 2,067
Записей в блоге: 8
25.06.2015, 20:08 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <string.h>
 
int main() {
  //setlocale(LC_ALL, "Russian");
  int index=0;
  char arr_s[100][30];
  int arr_v[100];
{
  FILE *fInp = fopen("Input.txt","r");
  char s[30], s1[30];
  int v;
  puts("load...");
  while (1){
    if (fgets(s1,30,fInp) == NULL) break;
    sscanf(s1,"%s %d",(char*)&s,&v);
    printf("s=%s,v=%d\n",s,v);
    bool flag=true;
    for (int i=0;i<index;i++){
      if (strcmp(arr_s[i],s)==0) {
       arr_v[i]+=v;
       flag=false;
       break;
      }
    }
    if (flag){
      strcpy(arr_s[index],s);
      arr_v[index] = v;
      index++;
    }
  }
  fclose(fInp);
}
  FILE *fOut = fopen("Output.txt","w");
  puts("\nsave...");
  for (int i=0;i<index;i++){
    printf("s=%s,v=%d\n",arr_s[i],arr_v[i]);
    fprintf(fOut,"%s %d\n",arr_s[i],arr_v[i]);
  }
  fclose(fOut);
  getchar();
}
Добавлено через 3 минуты
Цитата Сообщение от DeStrager Посмотреть сообщение
двумерный строковый массив char arr_s[100][30]; ?
Это не СТРОКОВЫЙ двухмерный массив. Это СИМВОЛЬНЫЙ массив.

В данном случае это 100 строк длиной 29 символов (последний символ окончание строки '\0')
0
25.06.2015, 20:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2015, 20:08

Создать файл, в котором фамилии будут записаны в одну строку и разделены запятыми
Текстовый файл содержит несколько строк с фамилиями. Создать файл, в котором...

Обязательно ли в c# напротив каждого поля или метода указывать его модификатор доступа?
Например у меня несколько public полей, тогда обязательно ли для каждого писать...

Определите общий вес всего багажа и пассажира с наиболее тяжелым багажом.
Файл содержит сведения о пассажирах самолета: фамилия, имя, отчество, число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru