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

Ошибка при использовании указателей

17.12.2017, 22:31. Просмотров 414. Ответов 2
Метки нет (Все метки)

Задание

Составить программу, которая заполняет массив случайными целыми числами из
диапазона, введенного пользователем (в диапазон могут входить отрицательные числа).
Вывести массив на экран в виде таблицы
Найти число m – среднее арифметическое всех элементов массива, индексы которых
кратны числу a, задаваемому пользователем. Определить сумму элементов, значения
которых меньше m. Реализовать данную часть задания двумя способами: а) с
использованием индексов, б) при помощи указателей и адресной арифметики.

программа выдаёт неверные результаты в пункте б


Никак не могу понять как исправить мою ошибку.



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
49
50
51
52
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define n 10
 
int main (void)
{
    srand(time(NULL));
    int x[n], *X;
    int i, b, k, a, s, *S;
    float m, *M;
    printf("input range\n");
    scanf("%d%d", &b, &k);
    for (i=1; i<=n; i++) printf("%4d", i);
    printf("\n");
    a = k-b+1;
    for (i=1; i<=n; i++)
    {
        x[i-1] = b + rand() %a;
        printf("%4d", x[i-1]);
    }
    printf("\n");
    printf("input А\n");
    scanf("%d", &a);
    k = s = 0;
    for (i=1; i<=n; i++)
    {
        if (i%a == 0)
        {
            k++;
            s += x[i-1];
        }
    }
    m = (float)s/k;
    printf("mean value= %4.2f\n", m);
    s = 0;
    for (i=1; i<=10; i++)
        if (x[i-1] < m) s += x[i-1];
    printf("sum of elements= %i\n", s);
    
    S = &s;
    M = &m;
    X = &x[n];
    for (i=1; i<=10; i++)
        if (X[i-1] < m) S += X[i-1];
    printf("sum of elements= %p\n", S);
 
 
 
    return 0;
}
Добавлено через 1 час 53 минуты
C
1
2
3
4
5
6
S = &s;
M = &m;
X = &x[n];
for (i=1; i<=10; i++)
if (X[i-1] < m) S += X[i-1];
printf("sum of elements= %p\n", S);
здесь
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2017, 22:31
Ответы с готовыми решениями:

Определение индекса массива в цикле при использовании указателей
Добрый день! Вопрос, в общем-то, ламерский, но что-то сам дотумкать не могу. Есть код, где...

Ошибка при использовании Clrscr
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include&lt;iostream&gt; double SumD(int a) { double s=a;...

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

Ошибка при использовании strlen
scanf(&quot;%s&quot;,&amp;s); d=strlen(s); чего ошибка?

Ошибка при использовании delete
#include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; void main() { char *ar=new...

2
stake-k26
934 / 552 / 402
Регистрация: 25.04.2016
Сообщений: 1,595
18.12.2017, 12:41 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define n 10
 
int main (void)
{
    srand(time(NULL));  // новая точка отсчета rnd
 
    int x[n];
    int *X;
    int *S;
    int i, b, k, a, s;
 
    float m;
    float *M;
 
    // получаем диапазон значений для генератора случайных чисел:
    printf("input range\n");
    scanf("%d%d", &b, &k);
 
    // печатаем номера элементов массива:
    for (i=1; i<=n; i++) printf("%4d", i);
    printf("\n");
 
    // заполняем массив случайными значениями и выводим на экран
    a = k-b+1;
    for (i=0; i<n; i++)
    {
        x[i] = b + rand() %a;
        printf("%4d", x[i]);
    }
    printf("\n");
 
    printf("input А\n");
    scanf("%d", &a);
 
    // находим среднее арифметическое элементов, номера которых кратны A:
    k = s = 0;
    for (i=1; i<=n; i++)
    {
        if (i%a == 0)
        {
            k++;
            s += x[i-1];
        }
    }
    m = (float)s/k;
    printf("mean value= %4.2f\n", m);
 
    // находим сумму элементов массива, что меньше среднего арифметического:
    s = 0;
    for (i=1; i<=10; i++)
        if (x[i-1] < m) s += x[i-1];
    printf("sum of elements= %i\n", s);
 
    // предыдущий цикл, но на этот раз мы арбайте с указателями:
    S = &s; // новая сумма (равна предыдущей...)
    M = &m; // новое арифметическое среднее
    X = x;  // имя массива само по себе уже является указателем...
    for (i=1; i<=10; i++)
        if (X[i-1] < *M) *S = *S + X[i-1];
    printf("sum of elements= %d\n", *S);    // (.. поэтому результат вдвое больше)
 
    return 0;
}
А там глядишь заодно и ошибки найдутся и исправятся.

Добавлено через 18 минут
И кстати у вас довольно интересная формула определения границ генератора используется. Это вам такая по заданию дана? Я тут буквально на днях сталкивался с чем-то похожим, приходилось на пальцах примерно объяснять как это все работает и откуда формулы берутся, почитайте, если интересно:

В общем случае команда генерации случайного числа выглядит так:

a = b + rand() %n;

где
a - получившееся случайное число;
b - минимальное значение диапазона случайных чисел;
n - смещение для команды rand();

т.е. сначала выполняется rand() %n, а затем полученный результат прибавляется к b, и получившаяся сумма записывается в a.

Каким образом работает rand() ?

Она всегда генерирует число, начиная с 0 с заданным смещением, при этом число 0 тоже учитывается в смещении.

Допустим у нас задано смещение 1:

_смещение: 1
число num: 0

т.е. команда
C
1
a = rand() %1;
всегда будет давать результат 0

Допустим, у нас задано другое смещение 5:

_смещение: 1 2 3 4 5
число num: 0 1 2 3 4

т.е. команда
C
1
a = rand() %5;
будет генерировать число >= 0 и <= 4.

Т.е. из-за этой особенности максимальное число, которое генерирует rand(), всегда на 1 меньше, чем заданное смещение.

Если смещение 25, максимальный результат всегда 24.
Если смещение 100, максимальный результат всегда 99.

И так далее.

И как теперь посчитать макимум?

a(max) = b + (n - 1);

Вот и все.

И если b = 66 и n = 601, максимум всегда будет:
66 + (601 - 1) = 66 + 600 = 666.

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

Например:

a = 10 + rand() %9;

(смещение) n: 1 2 3 4 5 6 7 8 9
___(число) z: 0 1 2 3 4 5 6 7 8

т.е.
z(max) = 8

теперь
a(max) = 10 + z(max)

таким образом
a(max) = 10 + 8 = 18

... и никакая математика тут не нужна, это все можно на пальцах посчитать. Если только ты понимаешь как это работает.

Если у нас команда для генерации случайного числа выглядит как

C
1
a = rand() %n;
То в этом случае, у нас b всегда равно 0, т.е.

C
1
a = 0 + rand() %n;
И a(max) = n-1;

Добавлено через 5 минут
И еще один момент, если уж у вас адресная арифметика, то вместо
C
1
if (X[i-1] < *M) *S = *S + X[i-1];
стоит писать
C
1
if (*(X+i-1) < *M) *S = *S + *(X+i-1);
1
Easycore
0 / 0 / 0
Регистрация: 01.10.2017
Сообщений: 14
18.12.2017, 22:19  [ТС] 3
Теперь все прекрасно работает
Благодарю за то, что объяснили
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2017, 22:19

Ошибка при при использовании realloc
В методе AddItem вылетает ошибка доступа к памяти... С чем это может быть связано? #pragma...

Ошибка при использовании пользовательской библиотеки
Уважаемые программисты, помогите найти причину ошибки! float a,b,c; int i,n,j; ...

Ошибка при использовании аргумента по умолчанию
Не пойму, почему ошибка? #include &lt;stdio.h&gt; int arav(int amount=5) { return ++amount; }...


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

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

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