Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Tuxoid
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 54
1

Предусловие-цикл-постусловие

02.10.2012, 16:44. Просмотров 1076. Ответов 14
Метки нет (Все метки)

Доброго времени суток.
Хочу обратиться к Вам за помощью.
Нужно решить задачу.

Дано Е
Нужно найти первое n при котором аn будет меньше Е по формуле an=1\n^2 (n - натуральное)

n вывести на экран.
С предусловием и постусловием.

Я пишу под Linux-ом и виндовые библиотеки не использую.

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
40
41
42
43
44
//То, что [S]получилось[/S]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void scan(float a, double n, float E)
{
    for (n; n<=100; n++)
    {
        if (E<=1)
        {
            a=1/(pow(n,2));
 
            return 1;
        }
        else
        {
            printf("Ответ: %f", &n);
        }
    }
 
}
 
int main()
{
    int n;
    float a,E;
 
    n=0;
 
    printf("Введите число E\n");
    scanf("%f",&E);
 
    if (E==0)
    {
        printf("Ответ: 0");
    }
    else
    {
        scan (a,n,E);
//        printf("Ответ: %f", &n-1);
    }
 
}
P.S. Пока знаю только два цикла и не знаю какой использовать...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2012, 16:44
Ответы с готовыми решениями:

Задача на Предусловие,постусловие
Здравствуйте! Сделал задачу,но не работает предусловие,помогите пожалуйста.... procedure...

Переделать предусловие на постусловие
как переделать на постусловие? var i,w,k: integer; f: boolean; begin write('enter w: '); ...

Система уравнений с использованием операторов цикла (счётчк, предусловие, постусловие)
Здравствуйте. Нужно программно решить систему с использованием трёх видов операторов цикла...

Найдите пару значений, при которых предусловие выполняется, а постусловие — нет
int area(int length, int width) // Вычисляет площадь прямоугольника; // предусловия: аргументы...

Цикл с предусловие
С помощью while Найти все числа кратные пяти для чисел от 1 до N.

14
doctor_lecter
283 / 156 / 30
Регистрация: 22.09.2012
Сообщений: 283
02.10.2012, 17:00 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main() {
    float a,e;
    scanf("%f", &e);
    int n=0;
    do {
        ++n;
        a=1/(float)(n*n);
    } while (a >= e);
    printf("%d\n", n);
    return 0;
}
0
Tuxoid
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 54
02.10.2012, 17:01  [ТС] 3
И так тоже не получилось (кажется проблема в цикле)

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
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void scan(float a, double n, float E)
{
 
    do
{
    n++;
    a=1/(pow(n,2));
}
while(a<E);
 
printf("%f",&n);
 
  //for (n; n<=100; n++)
 
 
 
}
 
int main()
{
    int n;
    float a,E;
 
    n=0;
 
    printf("Введите число E\n");
    scanf("%f",&E);
 
    if (E==0)
    {
        printf("Ответ: 0");
    }
    else
    {
        scan (a,n,E);
//        printf("Ответ: %f", &n-1);
    }
 
}
0
doctor_lecter
283 / 156 / 30
Регистрация: 22.09.2012
Сообщений: 283
02.10.2012, 17:05 4
у вас while(a<E); а должно быть while(a>=E);
0
Tuxoid
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 54
02.10.2012, 17:06  [ТС] 5
Цитата Сообщение от doctor_lecter Посмотреть сообщение
у вас while(a<E); а должно быть while(a>=E);
и в функцию scan n нужно передавать по ссылке
Выход нужен когда Аn меньше E
0
doctor_lecter
283 / 156 / 30
Регистрация: 22.09.2012
Сообщений: 283
02.10.2012, 17:09 6
Tuxoid,
Цитата Сообщение от Tuxoid Посмотреть сообщение
Выход нужен когда Аn меньше E
А цикл будет выполняться пока условие истинно, поэтому когда условие a>=E будет ложно, a будет меньше e и цикл завершиться
0
Tuxoid
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 54
02.10.2012, 17:19  [ТС] 7
Что-то не правильно у меня получается(
Опять вернулись нули(

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
40
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void scan(float a, double n, float E)
{
 
    do
    {
        a=1/(float)(n*n);
        ++n;
    }
     while (a >= E);
   // printf("%d\n", n);
    return 1;
}
 
 
 
int main()
{
    int n;
    float a,E;
 
    n=0;
 
    printf("Введите число E\n");
    scanf("%f",&E);
 
    if (E==0)
    {
        printf("Ответ: 0");
    }
    else
    {
        scan (a,n,E);
        printf("Ответ: %f", n);
    }
 
}
0
doctor_lecter
283 / 156 / 30
Регистрация: 22.09.2012
Сообщений: 283
02.10.2012, 17:28 8
тогда в функцию scan нужно передавать адрес n. И a можно не передавать.
C
1
2
3
4
5
6
7
8
9
10
void scan(int* n, float E)
{
     float a = 0.0f;
    do
    {
        a=1/(float)((*n)*(*n));
        ++(*n);
    }
     while (a >= E);
}
и вызывать scan(&n, E);
0
Tuxoid
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 54
02.10.2012, 17:36  [ТС] 9
Возвращается 0...
Хотя при Е=0.114 должен возвращаться 3
0
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,609
02.10.2012, 17:45 10
По-моему не тот случай, чтобы с циклами морочиться, тут проще всё:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <math.h>
 
unsigned func(double e) {
    double ret = sqrt(1.0 / e);
    double n = ceil(ret);
    
    return (unsigned)n + ( n == ret );
}
 
int main(void) {
    double e;
    
    while ( printf("E = ") && scanf("%lf", &e) == 1 && e > 0.0 )
        printf("N = %u\n", func(e));
    
    return 0;
}
0
Tuxoid
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 54
02.10.2012, 17:48  [ТС] 11
Цитата Сообщение от easybudda Посмотреть сообщение
По-моему не тот случай, чтобы с циклами морочиться[/C]
У меня по заданию должен быть цикл(
0
doctor_lecter
283 / 156 / 30
Регистрация: 22.09.2012
Сообщений: 283
02.10.2012, 17:50 12
Покажите код


у меня так работает
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 scan(int* n, float E)
{
     float a = 0.0f;
    do
    {
        ++(*n);
        a=1/(float)((*n)*(*n));
    }
     while (a >= E);
}
 
 
 
int main()
{
    int n;
    float a,E;
 
    n=0;
 
    printf("Введите число E\n");
    scanf("%f",&E);
 
    if (E==0)
    {
        printf("Ответ: 0");
    }
    else
    {
        scan(&n,E);
        printf("Ответ: %d\n", n);
    }
 
}
1
Tuxoid
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 54
02.10.2012, 17:52  [ТС] 13
Цитата Сообщение от doctor_lecter Посмотреть сообщение
Покажите код
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 scan(int* n, float E)
{
    float a = 0.0f;
    do
    {
        a=1/(float)((*n)*(*n));
        ++(*n);
    }
    while (a >= E);
}
 
 
 
int main()
{
    int n;
    float a,E;
 
    n=1;
 
    printf("Введите число E\n");
    scanf("%f",&E);
 
    if (E==0)
    {
        printf("Ответ: 0");
    }
    else
    {
        scan (&n,E);
        printf("Ответ: %f", n);
    }
 
}
0
doctor_lecter
283 / 156 / 30
Регистрация: 22.09.2012
Сообщений: 283
02.10.2012, 17:57 14
В предыдущем сообщении написал свой код.
У вас выводит ноль, потому n имеет тип int а выводится как float.
1
Tuxoid
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 54
03.10.2012, 18:08  [ТС] 15
doctor_lecter, благодарю!
Работает.
Доработаю (когда Е>1) и скину код в общее пользование

Добавлено через 23 часа 59 минут
Вариант с защитой от чисел больше единицы

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
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void scan(int* n, float E)
{
    float a = 0.0f;
 
    if (E<=1)
    {
        do
        {
            a=1/(float)((*n)*(*n));
            ++(*n);
        }
        while (a >= E);
    }
    else
    {
        printf("Вы ввели неверное число \n");
        exit(EOF);
        return 0;
    }
}
 
 
 
int main()
{
    int n;
    float E;
 
    n=0;
 
    printf("Введите число меньше единицы E\n");
    scanf("%f",&E);
 
    if (E==0)
    {
        printf("Ответ: 0");
    }
    else
    {
        scan (&n,E);
        printf("Ответ: %d\n", n-1);
    }
 
}
0
03.10.2012, 18:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2012, 18:08

Отрицательное предусловие в while
Всем привет.Не выходит заставить работать цикл с таким предусловием. $i=0; while($i++&lt;8){...

В каких ситуациях можно НЕ проверять предусловие?
В каких ситуациях можно НЕ проверять предусловие?

Запрос с постусловие
Умнее ни чего не смог придумать кроме как назвать в общем свой вопрос &quot;запрос с постусловием&quot;, так...


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

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

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