|
Вопрос # 4 827/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
И снова вопрос: нужно организовать поиск дома, у которого наибольшая задолженность за аренду квартир... Приблизительный алгоритм:
1) Идет заполнение файла информацией;
2) Нужно найти дом с данным критерием (сумма задолженностей за квартиру одного дома должна быть максимальной);
3) Затем вывести информацию о жителях этого дома, отсортированной по алфавиту...
Прилагаю код, помогите завершить его!!! Благодарю)
Приложение: Переключить в обычный режим- #include <stdio.h>
- typedef struct _Base
- {
- char LastName[20];
- int Number;
- int Borg;
- } Base;
- int InData(FILE *f);
- int main()
- {
- FILE *f;
- int k;
- Base data;
-
- f = fopen("/home/ghaiklor/Anjuta-projects/Diam/Laba_14/files/file","ab");
- k = InData(f);
- fclose(f);
- f = fopen("/home/ghaiklor/Anjuta-projects/Diam/Laba_14/files/file","rb");
- while (!feof(f))
- {
- fread(&data,sizeof(data),1,f);
-
- }
- return (0);
- }
- int InData(FILE *f)
- {
- Base data;
- int k=0;
-
-
-
- if (data.LastName[1] != '$')
- {
- fwrite(&data,sizeof(data),1,f);
- k++;
- InData(f);
- }
- return k;
- }
 |
Вопрос задал: Жикльор (статус: 5-ый класс)
Вопрос отправлен: 16 декабря 2010, 21:13
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 24; последнее сообщение — 18 декабря 2010, 16:39; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
min@y™ (статус: Доктор наук), 16 декабря 2010, 21:20 [#1]:
Не надо так делать (предлагать завершить код).
Любой программист тебе скажет, что вместо того, чтобы копаться в чужом коде и править его, гораздо быстрее написать всё с нуля.
Что у тебя не получается, ты так и не сказал. А это ещё хуже, чем выкладывать свой бажный код на публику.
Просто скажи, что тебе нужно, а там посмотрим.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Жикльор (статус: 5-ый класс), 16 декабря 2010, 21:24 [#2]:
Мне нужно после вноса информации найти дом, который задолжал больше всех... В файле находиться вся информация с долгами и номером дома. Например:
1-ый дом: долг 2000 у.е.;
2-ой дом: долг 1500 у.е.;
1-ый дом: долг 500 у.е;
Макс. задолженность за 1-ый дом 2500, а за второй 1500... Вот это мне нужно найти, а затем за номером этого дома вывести всю инфу о его жителях (фамилии за алфавитом)...
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
min@y™ (статус: Доктор наук), 16 декабря 2010, 21:37 [#3]:
Цитата (Жикльор):
после вноса информации
Каким образом вносится информация?
Цитата (Жикльор):
В файле находиться
У тебя родной язык какой?
Цитата (Жикльор):
информация с долгами и номером дома.
Какой формат файла? Этот?
typedef struct _Base
{
char LastName[20]; // <-- что это?
int Number; // <-- что это?
int Borg; // <-- что это?
} Base;
Почему именно так?
И ни грамма комментариев!
Это нормально?
Самое интересное, что всё это дело ещё и под Linux. Обращайся, уж, к Вадиму К из Одессы.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Жикльор (статус: 5-ый класс), 16 декабря 2010, 21:45 [#4]:
Цитата (min@y™):
Каким образом вносится информация?
Ф-ция InData обеспечивает ввод информации и запись в файл
void InData(FILE *f)
{
Base data;
scanf("Введите фамилию: %s",data.LastName); //фамилия жителя
scanf("Введите номер дома: %d",&data.Number); //номер дома
scanf("Введите долг за квартиру: %d",&data.Borg); //борг за квартиру
if (data.LastName[1] != '$') //если не стоит символ конца ввода
{
fwrite(&data,sizeof(data),1,f); //записываю в бинарный файл
InData(f); //вызываю еще раз ф-цию записи
}
}
Цитата (min@y™):
У тебя родной язык какой?
А ты за какой язык спрашиваешь? Разговорный или программирования? Я где-то допустил ошибку в грамматике?Цитата (min@y™):
Какой формат файла? Этот?
Формат файла бинарый, который содержит в себе структуру Base.
Цитата (min@y™):
всё это дело ещё и под Linux
Но это не меняет кардинально суть дела. Весь С так и остается с его синтаксисом и т.д.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Вадим К (статус: Академик), 16 декабря 2010, 22:40 [#5]:
код пишем на си с плюсами или на с++? (тонкая ирония, которая подразумевает - пишем на примитивном с++, который не отличается от с или можно использовать различные стандартный классы?)
А то что то что это под Линукс, абсолютно ничего не меняет.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Жикльор (статус: 5-ый класс), 16 декабря 2010, 22:47 [#6]:
Используем чистый консольный С... Но вроде подсчет нужный сделал и все отфильтровал, теперь проблема в другом... Не считывается информация...
printf("Для окончания ввода введите $\n");
f = fopen("/home/ghaiklor/Anjuta-projects/Diam/Laba_14/files/file","ab");
count = InData(f); //ф-ция возвращает количество записей
Выводится только строка "Для окончания ввода ......" и стоит режим ожидания (ввод инфы), хотя должно потом вывести еще 3 строки, вот здесь они выводятся, в самой ф-ции:
int InData(FILE *f)
{
Base data;
int k = 0;
scanf("Введите фамилию: %s",data.LastName);
scanf("Введите номер дома: %d",&data.Number);
scanf("Введите долг за квартиру: %d",&data.Borg);
if (data.LastName[1] != '$') //если введут доллар, то значит конец записи и начало обработки
{
fwrite(&data,sizeof(data),1,f);
k++;
InData(f);
}
return k;
}
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
min@y™ (статус: Доктор наук), 17 декабря 2010, 08:17 [#7]:
В файл-то номально инфа записывается? Посмотри в НЕХ-редакторе, сравни размер: sizeof(Data) * Count.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 17 декабря 2010, 10:46 [#8]:
Хвостовая рекурсия при вводе - это конечно хороший метод. Но не в случае С. Не все компиляторы могут нормально развернуть ее.
И как результат - переполнение стека. Хотя в данном случае оно не скоро наступит - по моим оценкам, под 32битным линуксом где то за 74000 вызовов.
Дальше, в этой функции есть ещё одна ошибка.
Припустим, я решил, что все, хватит и ввел $, но программа меня спросит "Введите номер дома" и "Введите долг за квартиру". А что же вводить?
Но и это ещё не все. возвращать то она будет всегда 0. сколько записей бы не ввели. А вот почему - попробуйте сами догадаться, нет - расскажу.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 17 декабря 2010, 11:06 [#9]:
А зачем тут вообще рекурсия? Чем плох обычный цикл по while или do ... while?
Цитата (Вадим К):
А вот почему - попробуйте сами догадаться
Это очевидно. Исправляется заменой "+;" на "+=".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 17 декабря 2010, 11:20 [#10]:
Цитата (min@y™):
Это очевидно. Исправляется заменой "+;" на "+=".
точно? вот здесь k++; или где?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 17 декабря 2010, 11:34 [#11]:
Цитата (Вадим К):
точно? вот здесь k++; или где?
А больше и негде.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 17 декабря 2010, 11:38 [#12]:
и что же получиться, если заменить +; на += ?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 17 декабря 2010, 11:44 [#13]:
Цитата (Вадим К):
и что же получиться, если заменить +; на += ?
k += InData(f);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 17 декабря 2010, 11:49 [#14]:
будет тоже возвращать 0.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 17 декабря 2010, 12:02 [#15]:
Цитата (Вадим К):
будет тоже возвращать 0.
Вообще, да, херню я написал...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Жикльор (статус: 5-ый класс), 18 декабря 2010, 14:02 [#16]:
Переделал ввод информации на цикл вайл:
while (choise != 0)
{
scanf("Введите фамилию: %s",data.LastName);
scanf("Введите номер дома: %d",&data.Number);
scanf("Введите долг за квартиру: %d",&data.Borg);
fwrite(&data,sizeof(data),1,f);
count++;
scanf("Продолжить? Да - 1, Нет - 0 ------- %i",&choise);
}
Все так же, выводится только "Для окончания ввода...", потом происходит цикличный ввод информации, даже если нажму "0" - он все равно что-то считывает...
Посмотрел размер файла - 856 Мб О_о
Не вижу здесь зацикливания...
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
min@y™ (статус: Доктор наук), 18 декабря 2010, 14:55 [#17]:
while (true)
{
scanf("Введите фамилию: %s",data.LastName);
scanf("Введите номер дома: %d",&data.Number);
scanf("Введите долг за квартиру: %d",&data.Borg);
fwrite(&data,sizeof(data),1,f);
count++;
scanf("Продолжить? Да - 1, Нет - 0 ------- %d",&choise);
if (!choise) break;
}
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Жикльор (статус: 5-ый класс), 18 декабря 2010, 15:58 [#18]:
Заработало только так:
while (1 == 1)
{
printf("Введите фамилию: ");
scanf("%s",data.LastName);
printf("Введите номер дома: ");
scanf("%d",&data.Number);
printf("Введите долг за квартиру: ");
scanf("%d",&data.Borg);
fwrite(&data,sizeof(data),1,f);
count++;
printf("Продолжить ввод? Да - 1, Нет - 0 ----- ");
scanf("%i",&choise);
if (!choise) break;
}
Так все работает, но все равно не пойму, почему тогда не работал форматированный ввод?? О_о
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
min@y™ (статус: Доктор наук), 18 декабря 2010, 16:04 [#19]:
А чо, while (true) не заработало, штоле?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Жикльор (статус: 5-ый класс), 18 декабря 2010, 16:22 [#20]:
На чистой сишке нету булеановских типов, приходится выкручиваться... Теперь вторая проблема, неправильно считает номер дома и его макс. борг:
for (i = 0; i < count; i++)
summa[i] = 0; //инициализация массива
fseek(f,0,SEEK_SET); //в начало файла
while (!feof(f))
{
fread(&data,sizeof(Base),1,f);
summa[data.Number] += data.Borg; //заполняю массив макс. боргом за каждый дом (индекс массива - это номер дома)
}
for (i = 0; i < count; i++)
if (maxborg < summa[i])
{
maxborg = summa[i]; //нахожу максимум
maxdom = i; //запоминаю номер дома
}
printf("\n%d\n%d",maxborg,maxdom);
В чем проблема?? Макс. борг выходит всегда равен нулю, а номер дома всегда числа заграничные - что-то не так с индексами массива и самого массива, но что - не вижу(
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|