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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

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

Чемпионы рейтинга экспертов в этой рассылке

Гаряка Асмик
Статус: Профессионал
Рейтинг: 4467
∙ повысить рейтинг »
lamed
Статус: Профессионал
Рейтинг: 2783
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2481
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1560
Дата выхода:13.07.2010, 16:30
Администратор рассылки:Verena, Профессионал
Подписчиков / экспертов:360 / 168
Вопросов / ответов:1 / 1
IRC-канал по теме:#C

Вопрос № 179435: Известны рост и пол каждого из 22 человек. Найти средний рост мужчин. (решение должно быть оформлено через записи). Заранее огромное спасибо и респект администратарам, а также программистам (экспертам) этого сайта!!!...



Вопрос № 179435:

Известны рост и пол каждого из 22 человек. Найти средний рост мужчин. (решение должно быть оформлено через записи).
Заранее огромное спасибо и респект администратарам, а также программистам (экспертам) этого сайта!!!

Отправлен: 07.07.2010, 17:16
Вопрос задал: Викол Василий, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает amnick, Профессионал :
Здравствуйте, Викол Василий.

Решение задачи приведено ниже. Сначала массив заполняется псевдослучайными данными, а затем вычисляется средний рост мужчин.
Код:
/*
Известны рост и пол каждого из 22 человек.
Найти средний рост мужчин.
(решение должно быть оформлено через записи).
*/

#include <stdlib.h>
#include <time.h>

#include <iostream>
#include <iomanip>
using namespace std;

enum e_sex { sxMale, sxFemale }; // пол

struct t_person {
e_sex sex; // пол
int height; // рост
};

const int nCount = 22;

int main()
{
// инициализируем генератор псевдослучайных чисел
srand( time(0) );

t_person data[nCount]; // массив с данными (пол/рост)
// заполняем массив псевдослучайными данными
for( int i = 0; i < nCount; ++i ) {
data[i].sex = (e_sex)(rand() & 1);
data[i].height = 160 + rand()%30; // рост в диапазоне 160..189
}

// находим средний рост мужчин
int nMales = 0; // число мужчин
unsigned long sum = 0;
for( i = 0; i < nCount; ++i )
if( data[i].sex == sxMale ) {
++nMales;
sum += data[i].height;
}

if( !nMales )
cout << "\nНет ни одного мужчины!\n";
else // рост выводится с 4-мя значащими цифрами (1 цифра после запятой)
cout << "\nВсего мужчин: " << nMales
<< "\nСредний рост = " << setprecision(4) << (float)sum/nMales << endl;

system( "pause" );
return 0;
}

Программа протестирована в MSVC++ 6.0 и Code::Blocks 10.05 (gcc, с опцией "- fpermissive").

Дополнительно, по просьбе задавшего вопрос, представлен вариант с вводом данных из файла (in.txt) и записью результата в файл out.txt. Поскольку не было уточнения, каким должен быть исходный файл — текстовый или бинарный, ввод осуществляется из текстового файла (так нагляднее, хотя и несколько сложнее для чтения). Информация о каждом человеке должна быть записана на отдельной строке, пустые строки пропускаются. Первый символ строки обозначает пол ('M' или 'm' для мужчин, 'F' или 'f' для женщин), затем, через запятую — рост.

Код:
/*
Известны рост и пол каждого из 22 человек.
Найти средний рост мужчин.
Решение должно быть оформлено через записи.
Ввод/вывод необходимо осуществлять в файл

Дополнительно реализована генерация файла с данными,
если программа запущена с параметром /i или -i.
*/


#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <ctype.h>

enum e_sex { sxMale, sxFemale }; // пол

struct t_person {
e_sex sex; // пол
int height; // рост
};

const int nMaxCount = 22;

const char szInName[] = "in.txt";
const char szOutName[] = "out.txt";

int main( int argc, char* argv[] )
{
t_person data[nMaxCount]; // массив для данных (пол/рост)

// если программа запущена с параметром -i или /i,
// то генерируем файл с данными
if( argc == 2 ) {
char* p = argv[1];
if( (*p == '/' || *p =='-') && _toupper( p[1] ) == 'I' ) {
// инициализируем генератор псевдослучайных чисел
sr and( time(0) );

// заполняем массив псевдослучайными данными
for( int i = 0; i < nMaxCount; ++i ) {
data[i].sex = (e_sex)(rand() & 1);
data[i].height = 160 + rand()%30; // рост в диапазоне 160..189
}

// создаем и записываем файл
FILE* f = fopen( szInName, "wt" );
if( !f ) {
printf( "Ошибка при создании файла \"%s\"\n", szInName );
return 4;
}

static char chSex[2] = { 'M', 'F' };
for( i = 0; i < nMaxCount; ++i )
fprintf( f, "%c,%d\n", chSex[data[i].sex], data[i].height );

fclose( f );
}
}

// открываем файл
FILE* f = fopen( szInName,"rt" );
if( !f ) {
printf( "Ошибка при открытии файла \"%s\"\n", szInName );
return 1;
}

int count = 0; // кол-во элементов в массиве

// читаем данные (пол,рост) из файла до тех пор, пока не заполнен массив
// и не достигнут конец файла или не встретилась нераспознаваемая строка
// (в обоих случаях fscanf() вернет значение, отличное от 2)
char ch;
while( count < nMaxCount && fscanf( f, "%c , %d\n", &ch, &data[count].height ) == 2 ) {
switch( ch ) {
case 'M':
case 'm':
data[count].sex = sxMale;
break;
case 'F':
case 'f':
data[count].sex = sxFemale;
break;
default: // неверно указан пол, пропускаем строку
continue;
}
++count;
}
fclose( f ); // закрываем исходный файл

if( !count ) {
printf( "Нет данных.\n" );
return 2;
}

// находим средний рост мужчин
int nMales = 0; // число мужчин
unsigned long sum = 0;
for( int i = 0; i < nMaxCount; ++i )
if( data[i].sex == sxMale ) {
++nMales;
sum += data[i].height;
}

// создаем результирующий файл
f = fopen( szOutName,"wt" );
if( !f ) {
printf( "Ошибка при создании файла \"%s\"\n", szOutName );
ret urn 3;
}

if( !nMales )
fprintf( f, "Нет ни одного мужчины!\n" );
else // рост выводится с 4-мя значащими цифрами (1 цифра после запятой)
fprintf( f,
"Всего мужчин: %d\n"
"Средний рост = %.1f\n",
nMales, (float)sum/nMales );
/*
Замечание: точность вычислений не может превышать точности измерений.
Рост измеряется и задан в файле с точностью до 1 см, поэтому следует
округлять средний рост до 1 см. Вывод результата с точностью до 0.1см
сделан только для примера!
*/
return 0;
}

Программа протестирована в MSVC++ 6.0

Успехов!

Ответ отправил: amnick, Профессионал
Ответ отправлен: 07.07.2010, 19:14
Номер ответа: 262447

Оценка ответа: 5
Комментарий к оценке:
Спасибо ОГРОМНОЕ за помощь!!!

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262447 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

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

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

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное