Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
web_holostyak
13 / 1 / 0
Регистрация: 05.09.2013
Сообщений: 24
1

Найти наибольше и наименьшие значения функции для целых аргументов от 1 до 50

05.09.2013, 21:01. Просмотров 1261. Ответов 11
Метки нет (Все метки)

Здравствуйте! Нужна помощь в корректировке кода, застрял на месте и не могу сдвинуться)
Задание 2-е, первое для логической связи:

1) Найти наибольше и наименьшие значения функции для целых аргументов от 1 до 50. Для этого использовать конструкцию выбора внутри цикла (номер задания равен остатку от деления номера варианта на 10):
0. sin(2*3.14*i/15)/i
1. cos(2*3.14*i/15)/i
2. sin(2*3.14*i/50)/cos(2*3.14*i/50)
3. cos(2*3.14*i/50+3.14/2)/sin(2*3.14*i/50+3.14/2)
4. i*i-50*i
5. sqrt(50*i)-i
6. sin(2*3.14*i/25)
7. cos(2*3.14*i/25)
8. tan(2*3.14*i/50)
9. pow(i,2)-50*i

2) Нарисовать график функции из 1 задания. График представляет собой изображение из 50 символов по горизонтали и 50 символов по вертикали. Для отображения графика нужно организовать вложенные циклы. Внешний цикл выполняется 50 раз и рисует 50 строк. Внутренний цикл повторяется 50 раз и рисует 50 столбцов. Во внутреннем цикле проверяется, какой символ нужно нарисовать.
Для определения отображаемого символа используется следующее услов-ное выражение. Если ceil(((func)-min)*50/(max-min))==50-j, то пе-чатается символ "*", иначе печатается символ " " (пробел). В условном выраже-нии max и min это максимум и минимум функции, найденные в предыдущем задании. Func – это отображаемая функция. Функция сeil находит наименьшее целое, не большее аргумента. Все выражение масштабирует диапазон значений функций (от min до max) на диапазон от 0 до 50 и определяет, в какой строке функция пересекает соответствующий столбец.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void main()
{
    int i,j;
    float a,n,m;
    printf ("postroim grafik funkcii\n");
    a=1;
    i=1;
    j=1;
    n=m=0;
   while (i!=50)
    {
        a=sin(2*3.14*i/50)/cos(2*3.14*i/50);
        //printf("%f\n",a);
        if (n>a) n=a;
        if (m<a) m=a;
        while (j!=50)
        {
            if (ceil(((sin(2*3.14*i/50)/cos(2*3.14*i/50))-n)*50/(m-n))==50-j) printf("*");
            else printf("!");
            j++;
        }
        printf ("\n");
        i++;
    }
    printf ("min = %f\nmax = %f", n,m);
    getch();
}
Проблема в прорисовке функции, как сказано в задании... вроде есть вложенный цикл, проверял, работает выражение в нем, есть внешний цикл, по истине, должна быть строка, заполненная "!" и одной "*" и так 50 строчек (в задании написано " " и "*" - я заменил на знак восклицания для видимости). Помогите разобраться, где ошибка. Тематика "Циклы" - т.е. функции, массивы не предлагать)))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 21:01
Ответы с готовыми решениями:

Найти наибольше и наименьшие значения функции для целых аргументов от 1 до 50
Всем привет!Нужна помощь в выполнении задания!Где-то закралась ошибка! Задание: Найти наибольше и...

Рекурсия: нахождение значения данной функции для любых целых неотрицательных аргументов
Не уверена в правильности выполненной программы, буду очень благодарна, если знающие люди проверят...

Найдите значение функции для любых целых неотрицательных аргументов
Доброго времени суток) Будьте добры, помогите, пожалуйста, с заданием c использованием рекурсии:...

Найдите значение функции для любых целых неотрицательных аргументов
Найдите значение функции для любых целых неотрицательных аргументов. Функция в прикрепленной...

Найти наибольше значение функции на промежутке [a,b]
Дана функция y=(2x+3)/(2x^2-3x+4). Найдите наибольшее значение данной функции на промежутке .

11
Catstail
Модератор
24555 / 12471 / 2275
Регистрация: 12.02.2012
Сообщений: 20,242
05.09.2013, 21:35 2
У тебя неверная логика. Здесь нужно 2 цикла:

- в первом определяешь макс и мин (у тебя n и m)
- во втором снова вычисляешь значении функции, считаешь, сколько пробелов пропустить и печатаешь *
0
web_holostyak
13 / 1 / 0
Регистрация: 05.09.2013
Сообщений: 24
05.09.2013, 23:42  [ТС] 3
во вложенном цикле, как раз, и идет тот счет, сколько должно быть пробелов и где будет "*"

Добавлено через 1 час 21 минуту
Нашел проблему, но пока не знаю как устранить. В общем, получается, что вложенный цикл работает 1 раз (прокрутил 50 и загнулся), далее, не знаю каким образом, работает внешний цикл, минуя вложенный (знаю, что бурду написал, но так есть).

Добавлено через 8 минут
разобрался)) у меня "j" - присвоено по истечении цикла значением 50 и цикл просто не запускался из-за этого... поставил обнуление j и все работает)
0
ValeryS
Модератор
7747 / 5756 / 748
Регистрация: 14.02.2011
Сообщений: 19,709
Завершенные тесты: 1
05.09.2013, 23:50 4
Цитата Сообщение от web_holostyak Посмотреть сообщение
у меня "j" - присвоено по истечении цикла значением 50 и цикл просто не запускался из-за этого...
а чтобы такого не было используй цикл for
C++
1
2
3
4
5
6
7
for(i=0;i<50;i++)
{
....................
 
 for(j=0;j<50;j++)
   {
..............
0
05.09.2013, 23:50
Catstail
Модератор
24555 / 12471 / 2275
Регистрация: 12.02.2012
Сообщений: 20,242
06.09.2013, 11:25 5
web_holostyak, все равно, твой код неверен. Соответственно, и график у тебя получается неверный (см. картинку 1). У тебя одна из ветвей превратилась в прямую. Правильный вид графика показан на карт. 2. Правильный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void main()
{
    int i,j,k;
    double a,n,m;
 
    // определяем максимум и минимум
    
    n=sin(2*3.14/50)/cos(2*3.14/50);
    m=n;
 
    for (i=2; i<50; i++)
    {
        a=sin(2*3.14*i/50)/cos(2*3.14*i/50);
        if (n > a) n=a;
        if (m < a) m=a;
    }
 
    // Выводим график
 
    for (i=2; i<50; i++)
    {
        a=sin(2*3.14*i/50)/cos(2*3.14*i/50);
                k=(a-n)/(m-n)*80;
        for (j=1; j<=k; j++) printf(" ");
        printf("*\n");
    }
}

И график, построенный этим кодом - на картинке 3
1
Миниатюры
Найти наибольше и наименьшие значения функции для целых аргументов от 1 до 50   Найти наибольше и наименьшие значения функции для целых аргументов от 1 до 50   Найти наибольше и наименьшие значения функции для целых аргументов от 1 до 50  

web_holostyak
13 / 1 / 0
Регистрация: 05.09.2013
Сообщений: 24
06.09.2013, 14:37  [ТС] 6
Catstail, это понятно, но у вас уже изменения видны самого задания... по заданию, у меня должен быть 1 цикл внешний и вложенный. Задание нужно выполнить в двух вариантах (только с циклом while и только с циклом for). Я знаю учебную программу, которую мне дали, что мешает выполнять задания на том уровне, на котором требуется от меня).

Но за отзывчивость, спасибо!
0
Catstail
Модератор
24555 / 12471 / 2275
Регистрация: 12.02.2012
Сообщений: 20,242
06.09.2013, 16:32 7
Цитата Сообщение от web_holostyak Посмотреть сообщение
должен быть 1 цикл внешний и вложенный
- тут вложенный цикл нужен только для печати пробелов. Без него можно обойтись (сделав отдельную функцию).
Циклы вложенными быть не должны (т.к. для определения максимума и минимума нужно пройти по всей области определения; второй цикл обеспечивает вывод). Какой цикл - for, while - не важно.
0
web_holostyak
13 / 1 / 0
Регистрация: 05.09.2013
Сообщений: 24
06.09.2013, 16:48  [ТС] 8
Catstail, Для преподавателя, у которого я взял задания, важно все то, что перечислено в задании и моем последнем сообщении.
0
DannyConnor
2 / 2 / 0
Регистрация: 11.10.2015
Сообщений: 39
Завершенные тесты: 1
14.10.2015, 22:18 9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void main()
{
    float y, max, min, h;
    int i, j;
   for (i=0;i<50;i++)
    {
    y= sin(2*3.14*i/50)/cos(2*3.14*i/50); 
        if(y>max)
        {
            max=y;
        }
        if(y<min)
        {
            min=y;
        }
    }
    
    for (i=0;i<50;i++)
    {
        for (i=0;j<50;j++)
        {
            h=ceil(((sin(2*3.14*i/50)/cos(2*3.14*i/50))-min)*50/(max-min))==50-j;
            if(h==50-j)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }
    printf("\n");
    }
    printf ("min = %f\nmax = %f", min,max);
}
При запуске бесокнечная пустота. В чем дело?
0
ValeryS
Модератор
7747 / 5756 / 748
Регистрация: 14.02.2011
Сообщений: 19,709
Завершенные тесты: 1
14.10.2015, 22:26 10
Цитата Сообщение от DannyConnor Посмотреть сообщение
max, min,
чему изначально равны?
Цитата Сообщение от DannyConnor Посмотреть сообщение
y= sin(2*3.14*i/50)/cos(2*3.14*i/50);
почему сразу тангенс не взять?
Цитата Сообщение от DannyConnor Посмотреть сообщение
if(h==50-j)
плавающие так не сравнивают
0
DannyConnor
2 / 2 / 0
Регистрация: 11.10.2015
Сообщений: 39
Завершенные тесты: 1
16.10.2015, 18:33 11
Цитата Сообщение от ValeryS Посмотреть сообщение
чему изначально равны?
мы же их таким образом вычисляем, присваивая различные значения y, инициализация изначально не нужна. ответ получаем как минимум равен -16.533129, максимум равен 15.702974.
Цитата Сообщение от ValeryS Посмотреть сообщение
почему сразу тангенс не взять?
разницы же нет, так требует задание
Цитата Сообщение от ValeryS Посмотреть сообщение
плавающие так не сравнивают
да, там больно сложная система, но не думаю, что это по нашему универскому курсу. выше у человека, как я понял, график какой-никакой выходит. а у меня...

изменил код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void main()
{
    double max, min, y;
    int i=0;
    int j=0;
    while(i<50)
    { 
    y=sin(2*3.14*i/50)/cos(2*3.14*i/50);
        if(y>max)
        {
            max=y;
        }
        if(y<min)
        {
            min=y;
        }
            while(j<50)
            {
             if (ceil(((sin(2*3.14*i/50)/cos(2*3.14*i/50))-min)*50/(max-min))==50-j)
             {
                 printf("*");
             }
             else 
             {
                printf("!"); 
             }
             j++;
            }
        i++;
    }
    printf("\n");
    printf("%f\n", min);
    printf("%f", max);
}
также дл удобства заменил пробелы воскл. знаками.

компилирую через mingw, запускаю чз командную строку, если это важно.
результат - строка из восклицательных знакофф вместо графика. Чую, недочет глупый совсем. или нет, чувствую себя идиотом уже
0
ValeryS
Модератор
7747 / 5756 / 748
Регистрация: 14.02.2011
Сообщений: 19,709
Завершенные тесты: 1
16.10.2015, 18:50 12
Цитата Сообщение от DannyConnor Посмотреть сообщение
мы же их таким образом вычисляем,
где вычисляем?
Цитата Сообщение от DannyConnor Посмотреть сообщение
double max, min, y;
* ............;
* * * * if(y>max)
*...............* * *
* if(y<min)
*
у тебя идет сначала сравнение с неинициализированой переменной

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
16.10.2015, 18:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2015, 18:50

Вычислить значения функции у= х1 and x2 для всех сочетаний аргументов х1, х2
1.Вычислить значения функции у= х1 and x2 для всех сочетаний аргументов х1, х2 и распечатать в виде...

Вычислить значения функции F(x,y) для случайных значений аргументов
Вычислить значения функции F(x,y) для значений аргументов x и y, выданных случайным образом в...

Создать таблицу для расчета значения функции от нескольких аргументов
Два дня убила, остальные 7 заданий сделала, а эти три не могу. Не получается, и все тут. Ребят,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru