Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1028
от 19.03.2008, 04:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 482, Экспертов: 59
В номере:Вопросов: 3, Ответов: 3

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 127102: Как ввести данные в массив построчно (в консоли, с помощью scanf) ? Т.е. ввёл первую строку нажал Enter, вторую строку и т.д....
Вопрос № 127109: Уважаемые эксперты, В Borland C++ 3.1 в справке есть пример получения инфы о размере свободного дискового пространства. Его код кладу в приложение. Почему-то размер этого пространства никак не хочет совпадать с моим реальным. Прога выдает 1Гб...
Вопрос № 127119: Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, написать программу для решения этой задачи на языке С. "Написать функцию ИРОНИЯ СУДЬБЫ (С), которая печатает фамилии двух (любых) жителей из списка С, живущих в разных городах по одному...

Вопрос № 127.102
Как ввести данные в массив построчно (в консоли, с помощью scanf) ? Т.е. ввёл первую строку нажал Enter, вторую строку и т.д.

Приложение:

Отправлен: 13.03.2008, 10:34
Вопрос задал: Юрий Анатольевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сандров Алекс
Здравствуйте, Юрий Анатольевич!

Нету ошибки.
Но, данные вводить надо тут не построчно, а поэлементно.
Чтобы вводить данные построчно, с какими-нибудь разделителями, нужно считывать строку, потом делать её разбор на элементы, согласно разделителям, потом элементы переводить в числа.

Или, если размер строки массива заранее известен, то, к примеру, можно так:

scanf("%d %d %d %d %d",&a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4]);

но тут надо чтобы формат строки чётко соответсвовал введённым данным (всмысле наоборот, данные строке соответсвовали)
Ответ отправил: Сандров Алекс (статус: 6-ой класс)
Ответ отправлен: 13.03.2008, 10:58


Вопрос № 127.109
Уважаемые эксперты,
В Borland C++ 3.1 в справке есть пример получения инфы о размере свободного дискового пространства. Его код кладу в приложение.
Почему-то размер этого пространства никак не хочет совпадать с моим реальным. Прога выдает 1Гб, а на самом деле у меня свободных 50 Гб.

Переполнения вроде нет, т.к. пробовал перемножать в типе double.

Приложение:

Отправлен: 13.03.2008, 11:29
Вопрос задал: Warobushek (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Sergijj
Здравствуйте, Warobushek!

Если Вы внимательно посмотрите на структуру dfree:

struct dfree {
unsigned df_avail; /* Available clusters */
unsigned df_total; /* Total clusters */
unsigned df_bsec; /* Bytes per sector */
unsigned df_sclus; /* Sectors per cluster */
};

, то увидите, что поле df_avail имеет тип unsigned short int (16 бит), т.е. значение этого поля может изменяться в диапазоне 0..65535.

Давайте проверим вводные данные:

1. Раз у Вас 50ГБ свободного пространства (и если ОС - Windows), то значит файловая система - NTFS, т.к. раздел FAT32 не может быть больше 32ГБ.
2. Типиное поведение для NTFS: 512 байт в секторе и 127 секторов в кластере.
3. 50ГБ = 50 * 1024 * 1024 * 1024 = 53687091200 байт
4. 53687091200 / (512 * 127) = 53687091200 / 65024 = 825651 (приблизительно) - это число должна возвратить функция getdfree() в df_avail.
5. Но в поле df_avail значения могут меняться только 0..65535, т.к. это 16-битное число, значит лишние биты (16-й и старше) в числе 825651 отсекаются: 11001001100100110011b & FFFFh = 1001100100110011b = 39219. Вот она - ошибка! Она происходит ещё до перемножения в double, поэтому переполнения Вы и не видите.
6. 39219 * 512 * 127 = 2550176256, - это число которое Вы рассматриваете как signed (по-умолчанию) long int (это вторая - уже Ваша ошибка), следовательно (unsigned long int) 2550176256 = (signed long int) 1275088127, т.к. старший бит рассматривается как знаковый.
7. 1275088127 - это и есть Ваш один гигабайт, который честно и выдаёт printf().

После ответа на Ваш вопрос "почему", хотел бы предупредить Ваше негативное отношение к поведению функции getdfree(): Она находится в модуле "DOS.H", а следовательно умеет выполнять только то, что умеет выполнять DOS, а MS-DOS в 1990-м году и подумать не могла о существовании файловой системы NTFS; кроме того, обращаю Ваше внимание, что винчестер, ёмкостью 1ГБ был даже не пределом мечты, а почти фантазией...;-)

P.S.: Если что осталось не понятым - спрашивайте.

P.P.S.: Рекомендую повнимательнее относится к типам данных.

Успехов!

---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: Студент)
Ответ отправлен: 13.03.2008, 14:44
Оценка за ответ: 5
Комментарий оценки:
спасибо за ответ, а как мне можно вычислить объем свободного пространства в консольном приложении? нашел функцию getfat, но она наверно мне тоже не поможет?


Вопрос № 127.119
Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, написать программу для решения этой задачи на языке С.
"Написать функцию ИРОНИЯ СУДЬБЫ (С), которая печатает фамилии двух (любых) жителей из списка С, живущих в разных городах по одному адресу...Структура Информация о жителе: фамилия, город- символьный тип; address- структура, улица- символьный тип; дом, квартира- перечислимый тип ". Помогите, пожалуйста!
Отправлен: 13.03.2008, 12:29
Вопрос задал: Vesel4 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Терсков Сергей
Здравствуйте, Vesel4!
Вариант решения вашей задачи смотрите в приложении.

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 14.03.2008, 06:11


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.72.5 от 17.03.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное