Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Центр помощи > [C] Обработка файла |
Автор: Hersio 5.12.2006, 14:58 |
Дана информация о владельцах автомобилей одного города в файле А1. Элемент файла включает фамилию, имя, отчество владельца, марку автомобиля, год его выпуска и номер автомобиля(номер задаётся 4 цифрами) Найти: Число автомобилей каждой марки с учётом года выпуска. Эти сведения должны включать марку автомобиля, год выпуска, число автомобилей. С файлами пока не работал и даже вообще незнаю что делать, помогите? |
Автор: Mercator 5.12.2006, 16:38 |
Взять книжку по си и почитать, что делать с файлами. |
Автор: Hersio 5.12.2006, 17:44 |
Книга есть по С++ но там слишком замудрено и непонятно. Вообще алгоритм какой? Открыть файл записать в массив а - фамилию, в б - Имя, в с- отчество, потом две переменые для года и номера. Вот как дальше то ? Потом сравнивать строки и искать на повторение марки и года выпуска, далее создать новый файл и туа записать результаты? |
Автор: Mercator 6.12.2006, 10:53 |
Hersio, пожалуйста, уточните, надо ли вам на си или си++, потому что у них файловый ввод-вывод разный. И если надо все-таки на си, то читайте книжку по си. И надо скорее всего пользоваться структурами, то есть информацию по каждому владельцу хранить в каждом отдельном экземпляре объявленной вами соответствующей структуры, то есть объявить стуктуру, создать массив структур и в него и читать (про структуры тоже в книжке). К сожалению, сейчас не имею доступа к конкретным материалам, поэтому только даю совет. |
Автор: Hersio 8.12.2006, 12:34 |
мне нужно на си, вот я понять не могу, мне весь файл в массив а потом посимвольно проверять, или каждую строку? помогите объясните как хоть делать?![]() |
Автор: Mercator 8.12.2006, 16:57 |
Hersio, так, давайте следующим образом. Тут два главных аспекта я вижу для вас в задаче: первое - как организовать структуры для хранения данных, второе - непосредственно алгоритм подсчета чего вам надо (кстати, объясните, пожалуйста, более подробно, что именно надо посчитать). Вижу вам никто не пишет, так хоть я чего скажу. К сожалению, на си писала давно и сейчас ничего нет под рукой, поэтому могу только дать направление, куда идти. Начнем с первого. Не знаю, какие у вас есть книжки по Си, я зашла сюда: http://forum.vingrad.ru/topic-33456.html и скачала книжку номер 8 (на русском, естественно). Керниган и Ритчи знают, о чем говорят, когда пишут про Си. Там читаем раздел "структуры" и создаем свою структуру (н-р, autoOwner) с 6 полями, вам нужными. Скорее всего, строковые поля будут указателями на массив символов. Обращайтесь к книжке, там много полезной информации. Ну а год выпуска и номер автомобиля обычные инты. Я не знаю, как у вас организован файл. Допустим, каждое новое значение в новой строке. У нас должен быть массив структур того типа, какой вы определили. Тогда открываем файл и построчно функцией fgets из нее читаем. Значения первых 6 строчек присваиваем соответствующим полям в первой структурке в массиве, следующих 6 строчек - второй и т.д., пока не кончатся строчки, то бишь, файл. Это вам придется самому подумать, как организовать. Наверное, будет проблема, как прочитанную строчку привести к типу инт для года и номера авто. К сожалению, не помню, как это делается. Поищите сами. Про файлы написано у Кернигана доступно в отдельной главе (открыли файл на чтение, прочитали, закрыли файл. Не забывайте закрывать)). Если я правильно поняла, то надо посчитать для каждого года число автомобилей каждой марки. Я бы наверно сделала так (что-то более простое в голову не пришло). Как бы это объяснить попонятнее... Мне понадобится еще один массив строк (назовем его "Марка" и массив целых чисел ("Год"). А в описание структуры я ввожу еще два целочисленных поля, типа марка_id и год_выпуска_id. Фактически каждой отдельной марке (это же строка, да?) я хочу поставить в соответствие целое число, назовем его идентификатором марки, а каждому встречающемуся году - свой идентификатор года. Таким образом в дополнительном массиве строк "Марка" у меня на i-том месте будет записана какая-то марка машины (все марки, естественно, по одному разу), то же самое для года выпуска. Будем считать, что у нас есть уже готовый массив структур с данными, прочитанными из файла. Теперь мне надо в цикле просмотреть все структуры и заполнить эти поля идентификаторы, то есть привести к виду, что например если 3-им элементом у меня в массиве "Марка" идет марка "Хонда", то все структуры с "Хондой" должны в поле марка_id иметь 3, то же самое с годом выпуска. Это можно сделать за один проход массива структур, одновременно заполняя поля-идентификаторы и формируя нужные массивы. Фактически я "проиндексировала" марки и года выпуска. Далее я делаю квадратную матрицу m*n, где m - число разных марок (фактически количество строк в массиве "Марка"), n - число разных годов выпуска. Пусть это будет матрица А и она вся нулевая. Потом еще раз просматриваю массив структур и для каждой увеличиваю А[марка_id][год_выпуска_id] на единицу. В результате получаю матрицу с нужным количеством машин i-той марки j-того года выпуска. Далее тупо просматриваю матрицу и если элемент больше 0 (А[i][j]>0)пишу в файл, что мол в год[j] было А[i][j] машинок марки Марка[i] (то есть как бы обратная замена: вместо индексов - реальные значения). Вот мне как-то так видится.... А для сравнения строк скорее всего придется написать отдельную функцию посимвольного сравнения, на вход подаете две строки (по-видимому, два указателя на char) и на выходе "истина" или "ложь" Прошу прощения, если что не так))) |
Автор: Hersio 10.12.2006, 12:01 |
Mercator Большое вам спасибо, сам принцип я понел, а вот как это организовать?![]() Олегыч помоги сделаю всё что хочешь ![]() |
Автор: Oleg_Ci 10.12.2006, 16:14 | ||
Тут наверно на курсовик потянет ![]()
|
Автор: Oleg_Ci 10.12.2006, 17:44 | ||
Ну если создавать файл не надо, то так мажно попробовать
|
Автор: Hersio 10.12.2006, 18:33 |
Вот большое тебе спасибо и респект, ты мозг![]() ![]() ![]() |