Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2020, 16:29   #1
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию Язык C работа с массивами. задача.

Доброго времени суток!
Дана след. задача:
В танцевальной группе 60 танцоров в возрасте от 17 - 50.
Входные данные: возраст каждого из танцоров (заполнение массива) массив dancers_age[60]
Выходные данные:1) Возраст в котором меньше всего танцоров
2) Возраст самого старого танцора
3) кол-во старых танцоров (старый танцор -это танцор, возраст которого выше на 3 года чем средний возраст в группе.

Проблема только с 1 вопросом.-> 1) найти возраст в котором меньше всего танцоров.
Логика проста. Взял массив счетчиков, размером в 51, чтобы считать каждый возраст по индексу.
т.е дано что возраст танцора в рамках от 17-50, соответственно буду поднимать счетчик на совпадение.
например массив count_age[dancers_age[i]]++;

Использую CodeBlocks.

Код:
#include <stdio.h>
#define SIZE 6
#define C_SIZE 51
int main()
{
    // #define SIZE 6 чтобы не вводить 60 раз..
    int dancers_age[SIZE];//input
    int count_age[C_SIZE]={0};//counters in range of 17-50
    int c_old_dancers = 0;//counter
    double avg;
    int sum = 0;
    int search_age;
    int min;
    int max = 0;
    int i,j;
    int temp_i; // minimum age

    for(i=0;i<SIZE;i++)//заполнение массива
    {
        printf("Enter the %d age (between 17-50): ",i+1);
        while((scanf("%d",&dancers_age[i])!=1) || (dancers_age[i]>50 || dancers_age[i]<17))

        {
            printf("****Error**** \nPlease try again: \n");
            _flushall();
        }
        //гарантированы правильных вход. данные
        sum+=dancers_age[i];//для посчета среднего знач.
    }
    avg = (double)sum / SIZE;
    printf("\n");

    for(i=0;i<SIZE;i++)//подсчет с помощью массива счетчиков
    {
        search_age = dancers_age[i];
        for(j=0;j<SIZE;j++)
        {
            if(search_age==dancers_age[j])
                count_age[search_age]++;
        }
    }
    //нахождение возраста в котором меньше всего танцоров
    min = count_age[17];
    for(i=18;i<C_SIZE;i++)//проход по массиву счетчиков от 18-50
    {
        if(count_age[i] < min && count_age[i] > 0)
        {
            min = count_age[i];
            temp_i = i;//min age
        }

    }
    printf("The age with lowest amount of dancers is: %d\n",temp_i);

    //нахождение самого старого танцора
    for(i=0;i<SIZE;i++)
    {
        if(dancers_age[i] > max)
            max = dancers_age[i];
    }
    printf("The oldest dancer age is: %d\n",max);

    for(i=0;i<SIZE;i++)//
    {
        if(dancers_age[i] > avg+3)
            c_old_dancers++;
    }
    printf("The average age of dancers is: %lf \n",avg);
    printf("The number of old dancers is: %d\n",c_old_dancers);


    return 0;
}
Решил посмотреть в отладчике...
Не пойму почему заполняется count_age с первых индексов.. рабочие счетчики должны быть с 17-50
(счетчик для каждого возраста)


Помогите пожалуйста разобраться.

Последний раз редактировалось JOFRIF; 16.03.2020 в 02:08.
JOFRIF вне форума Ответить с цитированием
Старый 16.03.2020, 12:19   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

один из вариантов
Код:
#include <iostream>
#include <map>
#include <algorithm>

int main()
{
	int dancers_age[]={17,20,50,17,30,19,35,20,19,20,50,50};
	
	//считаем количество танцоров для каждого возраста
	std::map<int,int> age_count;
	for(auto dancer_age:dancers_age)age_count[dancer_age]++;

	//ищем минимальный элемент (критерий - возраст)
	auto it_min=std::min_element(age_count.begin(),age_count.end(),[](auto& l,auto& r)
	{
		return l.second<r.second;
	});

	if(it_min!=age_count.end())
	{
		//выводим возрасты, где счётчик равен найденному it_min
		std::for_each(age_count.begin(),age_count.end(),[it_min](auto& item)
		{
			if(it_min->second==item.second)
			{
				std::cout<<"age="<<item.first<<", count="<<item.second<<'\n';
			}
		});
	}
}

Последний раз редактировалось Алексей1153; 16.03.2020 в 12:21.
Алексей1153 вне форума Ответить с цитированием
Старый 16.03.2020, 12:59   #3
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Спасибо Алексей1153 за ответ!
Проблема в принципе только с этим моментом:
Код:
    for(i=0;i<SIZE;i++)//подсчет с помощью массива счетчиков
    {
        search_age = dancers_age[i];
        for(j=0;j<SIZE;j++)
        {
            if(search_age==dancers_age[j])
               count_age[search_age]++;
        }
    }
    //нахождение возраста в котором меньше всего танцоров
    min = count_age[17];
    for(i=18;i<C_SIZE;i++)//проход по массиву счетчиков от 18-50
    {
        if(count_age[i] < min && count_age[i] > 0)
        {
            min = count_age[i];
            temp_i = i;//min age
        }

    }
    printf("The age with lowest amount of dancers is: %d\n",temp_i);
Код:
 if(search_age==dancers_age[j])
               count_age[search_age]++;
Отладчик показывает что счетчики поднимаються с первых индексов(т.е [0][1][2][3]...). А так как возраст от 17- 50 мне нужно чтобы только по индексу возраста поднимался счетчик. Т.е если к примеру значение одного из возрастов в массиве dancers_age[5]=22 являеться индексом
для массива count_age[dancers_age[5]] т.е count_age[22]++.
Должно получиться что count_age[0]...по count_age[16] пустые..
Объяснил как мог...

p.s если можно пожалуйста использовать язык C (вместо с++) так мне легче понять.
JOFRIF вне форума Ответить с цитированием
Старый 16.03.2020, 14:00   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Код:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    int size=60;
    int dancers_age[size];
    float age=0;

    int max_age,min_age,imax,imin;




    srand(time(NULL));

    for (int i=0;i<size;i++)
    {
        dancers_age[i]=rand()% (50 - 17 + 1) + 17;

        if (i==0)  min_age=max_age=dancers_age[i];


        if (max_age<dancers_age[i])
        {
            imax=i;
            max_age=dancers_age[i];
        };

        if (min_age>dancers_age[i])
        {
            imin=i;
            min_age=dancers_age[i];
        }

        age+=dancers_age[i];
        printf("%d) %d years;\n",i+1,dancers_age[i]);
    }


    printf("\nRESULT:\n1.");

    age/=size; //средний возраст по всем танцорам

    int count_old=0,count_min_age_people=0;

    for (int i=0;i<size;i++)
    {
        if (dancers_age[i]>=(age+3)) count_old++;
        if (dancers_age[i]==min_age)
        {count_min_age_people++;
        printf("tancor c min age (pos %d): %d\n",i+1,dancers_age[i]);
        }
    }

    printf("Vsego tancorov s vozrastom %d = %d\n",min_age,count_min_age_people);
    printf("2. old tancor year %d \n",max_age);
    printf("3. count old tancor = %f +3 (%f)= %d people",age,age+3,count_old);


    return 0;
}
Вот так вот пойдет?)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 16.03.2020, 14:58   #5
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Спасибо Алексей_2012!
Уверен что есть несколько вариантов для решения этой задачи.
Я пытался использовать массив счетчиков.
Повторюсь не понятен лишь один момент насчет массива счетчиков.
Цитата:
Сообщение от JOFRIF Посмотреть сообщение
count_age[search_age]++;
когда включаю отладчик, то видно что массив счетчиков заполняется неверно.




Подчеркнуты желтым индексы которые вообще не понятно как заполнились...
count_age[0]...count_age[16] //счетчики должны быть пустыми (а по факту они заполняются)
входные данные, т.е возраст ограничен с 17-50.
соответственно только эти счетчики могут подниматься с count_age[17] по count_age[50].
Постарайтесь пожалуйста понять мой вопрос..
JOFRIF вне форума Ответить с цитированием
Старый 17.03.2020, 12:02   #6
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

JOFRIF, я запустил твой код, ввёл значения 18,18,22,35,45,18 . Никаких лишних индексов не заполнилось (см. скрин)

Попробуй полный ребилд сделать
Изображения
Тип файла: png Безымянный.png (8.8 Кб, 9 просмотров)
Алексей1153 вне форума Ответить с цитированием
Старый 17.03.2020, 12:06   #7
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

хех, ну так понятно, где собака порылась. Смотри у себя на скрине - обрати внимание на надпись "repeats 18 times"

в итоге индекс 18 показан как индекс 1 . Это глюк твоей IDE
Алексей1153 вне форума Ответить с цитированием
Старый 17.03.2020, 17:44   #8
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Спасибо Алексей1153!
И в правду похоже на глюк CodeBlocks...у меня по прежнему этот глюк..
Главное нашли где собака зарыта))

*p.s на какой IDE ты тестил мой код? Просто не хочу использовать /геморно-тяжелую IDE типа Visual studio..
JOFRIF вне форума Ответить с цитированием
Старый 17.03.2020, 17:57   #9
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Лично я бы посоветовал бы qt creator)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 17.03.2020, 18:08   #10
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
Лично я бы посоветовал бы qt creator)
хмм... интересно.. она вроде платная и нет поддержки чистого языка C...
JOFRIF вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивами (язык VBA) Иришка89 Помощь студентам 11 14.11.2012 00:34
Работа с массивами и псевдослучайными последовательностями (Pascal). Задача YkkRolex Помощь студентам 0 31.10.2012 08:20
Язык Си (работа с массивами) виталик66 Помощь студентам 5 12.05.2012 19:58
Работа с массивами язык C tesb Помощь студентам 0 18.12.2011 20:58
задача Visual Basic. Работа с массивами ProgramBad Помощь студентам 3 14.02.2009 02:10