Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 827

Раздел: C++
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
И снова вопрос: нужно организовать поиск дома, у которого наибольшая задолженность за аренду квартир... Приблизительный алгоритм:
1) Идет заполнение файла информацией;
2) Нужно найти дом с данным критерием (сумма задолженностей за квартиру одного дома должна быть максимальной);
3) Затем вывести информацию о жителях этого дома, отсортированной по алфавиту...
Прилагаю код, помогите завершить его!!! Благодарю)

Приложение:
  1. #include <stdio.h>
  2. typedef struct _Base
  3. {
  4. char LastName[20];
  5. int Number;
  6. int Borg;
  7. } Base;
  8. int InData(FILE *f);
  9. int main()
  10. {
  11. FILE *f;
  12. int k;
  13. Base data;
  14.  
  15. f = fopen("/home/ghaiklor/Anjuta-projects/Diam/Laba_14/files/file","ab");
  16. k = InData(f);
  17. fclose(f);
  18. f = fopen("/home/ghaiklor/Anjuta-projects/Diam/Laba_14/files/file","rb");
  19. while (!feof(f))
  20. {
  21. fread(&data,sizeof(data),1,f);
  22.  
  23. }
  24. return (0);
  25. }
  26. int InData(FILE *f)
  27. {
  28. Base data;
  29. int k=0;
  30.  
  31.  
  32.  
  33. if (data.LastName[1] != '$')
  34. {
  35. fwrite(&data,sizeof(data),1,f);
  36. k++;
  37. InData(f);
  38. }
  39. return k;
  40. }


Жикльор Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Жикльор (статус: 5-ый класс)
Вопрос отправлен: 16 декабря 2010, 21:13
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 24; последнее сообщение — 18 декабря 2010, 16:39; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

min@y™

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™

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™

min@y™ (статус: Доктор наук), 17 декабря 2010, 08:17 [#7]:

В файл-то номально инфа записывается? Посмотри в НЕХ-редакторе, сравни размер: sizeof(Data) * Count.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 17 декабря 2010, 10:46 [#8]:

Хвостовая рекурсия при вводе - это конечно хороший метод. Но не в случае С. Не все компиляторы могут нормально развернуть ее.
И как результат - переполнение стека. Хотя в данном случае оно не скоро наступит - по моим оценкам, под 32битным линуксом где то за 74000 вызовов.
Дальше, в этой функции есть ещё одна ошибка.
Припустим, я решил, что все, хватит и ввел $, но программа меня спросит "Введите номер дома" и "Введите долг за квартиру". А что же вводить?:)
Но и это ещё не все. возвращать то она будет всегда 0. сколько записей бы не ввели. А вот почему - попробуйте сами догадаться, нет - расскажу.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 17 декабря 2010, 11:06 [#9]:

А зачем тут вообще рекурсия? Чем плох обычный цикл по while или do ... while?

Цитата (Вадим К):

А вот почему - попробуйте сами догадаться

Это очевидно. Исправляется заменой "+;" на "+=".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 17 декабря 2010, 11:20 [#10]:

Цитата (min@y™):

Это очевидно. Исправляется заменой "+;" на "+=".

точно? вот здесь k++; или где?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 17 декабря 2010, 11:34 [#11]:

Цитата (Вадим К):

точно? вот здесь k++; или где?

А больше и негде.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 17 декабря 2010, 11:38 [#12]:

и что же получиться, если заменить +; на += ?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 17 декабря 2010, 11:44 [#13]:

Цитата (Вадим К):

и что же получиться, если заменить +; на += ?

k += InData(f);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 17 декабря 2010, 11:49 [#14]:

будет тоже возвращать 0.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

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™

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™

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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:32
Выполнено за 0.05 сек.