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