Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 105
1

Как реализовать условие: Числа должны вводиться, пока не будет введен 0?

25.01.2018, 20:45. Показов 2873. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пробую сделать программу, которая управляет массивами.

Программа должна предлагать меню

(1) Ввести числа ( Числа должны вводиться, пока не будет введен 0, 0 в памяти сохраняться не должен)
(2) Вычислить абсолютное значение
(3) Наибольшее число
(4) Сортировка
(5) Реверс (Числа должны выводиться в обратном порядке только с абсолютными значениями, абсолютные значения должны копироваться в другой массив)
(6) Конец программы


Проблемы такие: Как реализовать условие в первом пункте насчет нуля?
И в 5 насчет реверса и копирования, мне кажется, что я абсолют не совсем верно задал.

Правильно ли задано обращение к функциям в case?

Заранее спасибо за любые комментарии

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <math.h>
 
void read_number ()
 
{
    int num [10];
   int i;
    for (i=0; i< 10; i++)
     do{
    printf("Number:\n");
                scanf("%d", &num[i]);
    } while(num !=0);
}
 
int average (int num)
 
{
    int i;
    float sum=0;
    float averageNum=0;
 
    sum+=num[i];
    sum/i==averageNum;
    printf("Average is %f", averageNum);
}
 
int maximal (int num[])
{
    int max = num[0];
 
for(size_t i = 1; i < 10; ++i)
{
    if(num[i] > max) {
 
        max = num[i];
    }
    printf("Maximal is %f", max);
}
 
}
 
 
void bubbleSort (int num[])
 
{
    int i,j,tmp;
 
    for (i = 0; i < 10 ; i++)
   {
      for (j = i; j < 10 ; j++)
      {
          if (num[i] > num[j])
          {
              tmp = num[i];
              num[i] = num[j];
              num[j] = tmp;
          }
      }
   }
   printf("Sort: %i", num[i]);
 
}
 
void reverse (int num[])
 
{
   int absolut[10];
      int n, i;
    for (i = n - 1; i > 0; i--)
    absolut= abs (num[i]);
    printf("%d\n ",  absolut[i]);     // как сделать реверс?
 
 
 
}
 
void int main (){
     int choice;
 
    do{
        printf("(1) Ввести числа \n");
        printf("(2) Вычислить абсолютное значение \n");
        printf("(3) Наибольшее число \n");
        printf("(4) Сортировка \n");
        printf("(5) Реверс \n");
        printf("(6) Конец программы \n");
                printf("Ваш выбор: ");
        scanf("%d", &choice);
        fflush(stdin);
        switch (choice)
        {
            case 1: readString (); break;
            case 2: average(); break;
            case 3: maximal(); break;
            case 4: bubbleSort(); break;
            case 5: reverse(); break;
            case 6: printf(" До свидания! \n"); break;
            default : printf("Неверные данные\n");
 
        }
 
    }while (choice!=6);
    return 0;
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2018, 20:45
Ответы с готовыми решениями:

Вводить различные числа, пока не будет введен 0
b) Вводить различные числа. Когда будет введен 0, то программа выходит из цикла Не могли бы решить...

Подпрограмма: Вводить числа до тех пор пока не будет введен 0, после ввода 0, вывести все введенные числа
Вводить числа до тех пор пока не будет введен 0. Если будет введен 0, то вывести все введенные...

Складывать числа, введенные с клавиатуры, пока не будет введен 0
напишите программу которая вводит целые числа с клавиатуры и складывает их пока не будет введено...

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

14
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
26.01.2018, 12:01 2
RednexRampage,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int ReadData(int * arr, int size)
{
      int data;
      for(int i = 0; i < size; i++)
      {
             printf("\nNumber %d: ", i+1);
             scanf("%d", &data);
             if(data)
                 arr[i] = data;
             else
                 return i+1;
       }
       return size; 
}
Функция принимает указатель на массив куда будут записываться данные и размер массива, дальше читает элементы по одному и проверяет их на 0. Если ноль то функция возвращает количество записанных элементов. Если нулей не обнаружено, то она вернет размер массива.
0
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 105
29.01.2018, 19:43  [ТС] 3
Спасибо) Сейчас гляну)
0
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 105
31.01.2018, 16:18  [ТС] 4
Привет)
Вот на

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <stdio.h>
#include <math.h>
 
int ReadData(int * arr, int size)
{
      int data;
      for(int i = 0; i < size; i++)
      {
             printf("\nNumber %d: ", i+1);
             scanf("%d", &data);
             if(data)
                 arr[i] = data;
             else
                 return i+1;
       }
       return size;
}
 
int average (int num[])
 
{
    int i;
    float sum=0;
    float averageNum=0;
 
    sum+=num[i];
    sum/i==averageNum;
    printf("Average is %f", averageNum);
}
 
int maximal (int num[])
{
    int max = num[0];
 
for(size_t i = 1; i < 10; ++i)
{
    if(num[i] > max) {
 
        max = num[i];
    }
    printf("Maximal is %f", max);
}
 
}
 
 
void bubbleSort (int num[])
 
{
    int i,j,tmp;
 
    for (i = 0; i < 10 ; i++)
   {
      for (j = i; j < 10 ; j++)
      {
          if (num[i] > num[j])
          {
              tmp = num[i];
              num[i] = num[j];
              num[j] = tmp;
          }
      }
   }
   printf("Sort: %i", num[i]);
 
}
 
void reverse (int num[])
 
{
   int absolut[10];
      int n, i;
    for (i = n - 1; i > 0; i--)
    absolut= abs (num[i]);
    printf("%d\n ",  absolut[i]);     // как сделать реверс?
 
 
 
}
 
void int main (){
     int choice;
 
    do{
        printf("(1) Ввести числа \n");
        printf("(2) Вычислить абсолютное значение \n");
        printf("(3) Наибольшее число \n");
        printf("(4) Сортировка \n");
        printf("(5) Реверс \n");
        printf("(6) Конец программы \n");
                printf("Ваш выбор: ");
        scanf("%d", &choice);
        fflush(stdin);
        switch (choice)
        {
            case 1: ReadData (); break;
            case 2: average(); break;
            case 3: maximal(); break;
            case 4: bubbleSort(); break;
            case 5: reverse(); break;
            case 6: printf(" До свидания! \n"); break;
            default : printf("Неверные данные\n");
 
        }
 
    }while (choice!=6);
    return 0;
 
}
Ругается error to few arguments.

не совсем еще понял, как реализовать реверс, причем, как говорил, числа должны выводиться в обратном порядке только с абсолютными значениями, абсолютные значения должны копироваться в другой массив. На этом запутался несколько.
Может кто помочь?
0
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
31.01.2018, 16:55 5
Лучший ответ Сообщение было отмечено RednexRampage как решение

Решение

RednexRampage, так вы используете функции без аргументов
C++
1
2
3
4
5
            case 1: ReadData (); break;
            case 2: average(); break;
            case 3: maximal(); break;
            case 4: bubbleSort(); break;
            case 5: reverse(); break;
когда они все с аргументами
C++
1
2
3
int ReadData(int * arr, int size)
int average (int num[])
int maximal (int num[]])
Я бы вам посоветовал почитать литературу по Си. Например Кернигана и Ритчи
1
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 105
31.01.2018, 19:17  [ТС] 6
Я как раз эту книгу читаю) Я когда туда эти аргументы ставлю, он точно так же ругается.

Добавлено через 6 минут
Я как раз эту книгу читаю) Я когда туда эти аргументы ставлю, он точно так же ругается.

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
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 
void readString (char * str1, char *str2)
 
{
 
    printf("Введите название первой фирмы:  ");
    scanf("%s", &str1[0]);
    printf("Введите название второй фирмы  ");
    scanf("%s", &str2[0]);
 
 
}
 
int equal (char * str1, char *str2)
{
    if ((strmp(str1,str2))==0)
        return 1;
    else
        return 0;
}
 
 char *StringConcentrate(char * str1, char * str2)
{
     char *str3 = (char*)malloc(strlen(str1)+strlen(str2)+4);
     strcpy(str3, str1);
     strcat(str3, " & ");
     strcat(str3, str2);
     return str3;
}
 
void output (char *str1, char *str2)
{
    if(equal(str1, str2) == 1)
         printf("Status : %s Конкуренты\n",  StringConcentrate(str1, str2));
    else
         printf("Status: %s  Не конкуренты\n", StringConcentrate(str1, str2));
}
 
int main()
 
{ char str1 [100];
    char str2 [100];
     int choice;
 
    do{
        printf("(1) Ввести названия фирм \n");
        printf("(2) Сравнить названия \n");
        printf("(3) Конец программы \n");
                printf("Ваш выбор: ");
        scanf("%d", &choice);
        fflush(stdin);
        switch (choice)
        {
            case 1: readString (str1, str2); break;
            case 2: output(str1,str2); break;
            case 3: printf(" До свидания! \n"); break;
            default : printf("Неверные данные\n");
 
        }
 
    }while (choice!=3);
    return 0;
}
Выдает in function 'equal'
Line 18 warning: implicit declaration of function 'strmp'
Undiefined reference to 'strmp'

А как ее иначе декларировать лучше?

Добавлено через 6 минут
Не туда)

Вот эта программа:
Что я упускаю еще?

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
int ReadData(int * arr, int size)
{
      int data;
      for(int i = 0; i < size; i++)
      {
             printf("\nNumber %d: ", i+1);
             scanf("%d", &data);
             if(data)
                 num[i] = data;
             else
                 return i+1;
       }
       return size;
}
 
int average (int num[])
 
{
    int i;
    float sum=0;
    float averageNum=0;
 
    sum+=num[i];
    sum/i==averageNum;
    printf("Average is %f", averageNum);
}
 
int maximal (int num[])
{
    int max = num[0];
 
for(size_t i = 1; i < 10; ++i)
{
    if(num[i] > max) {
 
        max = num[i];
    }
    printf("Maximal is %f", max);
}
 
}
 
 
void bubbleSort (int num[])
 
{
    int i,j,tmp;
 
    for (i = 0; i < 10 ; i++)
   {
      for (j = i; j < 10 ; j++)
      {
          if (num[i] > num[j])
          {
              tmp = num[i];
              num[i] = num[j];
              num[j] = tmp;
          }
      }
   }
   printf("Sort: %i", num[i]);
 
}
 
void reverse (int num[])
 
{
   int absolut[10];
      int n, i;
    for (i = n - 1; i > 0; i--)
    absolut= abs (num[i]);
    printf("%d\n ",  absolut[i]);     // как сделать реверс?
 
 
 
}
 
void int main (){
     int choice, arr, size;
     int num[];
 
 
 
 
    do{
        printf("(1) Ввести числа \n");
        printf("(2) Вычислить абсолютное значение \n");
        printf("(3) Наибольшее число \n");
        printf("(4) Сортировка \n");
        printf("(5) Реверс \n");
        printf("(6) Конец программы \n");
                printf("Ваш выбор: ");
        scanf("%d", &choice);
        fflush(stdin);
        switch (choice)
        {
            case 1: ReadData (arr,size); break;
            case 2: average( num); break;
            case 3: maximal( num); break;
            case 4: bubbleSort( num); break;
            case 5: reverse( num); break;
            case 6: printf(" До свидания! \n"); break;
            default : printf("Неверные данные\n");
 
        }
 
    }while (choice!=6);
    return 0;
 
}
0
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
31.01.2018, 19:57 7
RednexRampage, что вы сюда подставляете?
C++
1
ReadData (arr,size)
надо вопервых объявить массив и его размер глобально или в main
C++
1
2
int size = 100;
int arr[size];
и тогда можно подставлять так в функцию

Добавлено через 1 минуту
или объявить так
C++
1
int arr[100];
и передавать в функцию
C++
1
ReadData (arr,100);
0
2306 / 1132 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
31.01.2018, 20:34 8
Да много чего, например:
Цитата Сообщение от RednexRampage Посмотреть сообщение
printf("Maximal is %f", max);
попытка распечатать float, при том, что число int

Цитата Сообщение от RednexRampage Посмотреть сообщение
void int main
что такое void int????

Вы с ходу взялись за динамический массив, т.е. условие "Числа должны вводиться, пока не будет введен 0",- предполагает, что размер массива заранее не известен и будет определяться по ходу работы программы, а значит размер массива может быть и 80, и 800 000, второе вызовет переполнение стека, однако у вас по этому поводу в коде тишь да гладь.

Далее, функционал программы составлен... скажем так, плохо. Что если пользователь не захочет вводить элементы массива и захочет их сразу же отсортировать? Каким образом вы собираетесь определять есть что-то в массиве или нет?

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

И да, условие "вводить, пока не поступил 0"... вам пока рановато, лучше просто задайте массив на 5 или там 7 элементов и развлекайтесь с передачей массива в функции.

Добавлено через 24 минуты
Т.е. что-то вроде вот такого:
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
68
#include <stdio.h>
/* ************************************
 * Программа НЕ должна предлагать меню
 * (1) Ввести числа
 * (4) Сортировка
 * (3) Наибольшее число
 * ***********************************/
 
void Fill_Array (int *, int);
void Max_Matrix (int *, int);
void Sort_Array (int *, int);
void Printf_Arr (int *, int);
 
 
int main (void)
{
    int num[5];
    int n = 5;
 
    Fill_Array (num, n);        // заполняем
    Printf_Arr (num, n);        // печатаем
 
    Sort_Array (num, n);        // сортируем
    Printf_Arr (num, n);        // печатаем
 
    Max_Matrix (num, n);        // находим максимум
    return 0;
}
// ---------------- Заполняем массив числами с клавиатуры -----------------
void Fill_Array (int * arr, int size)
{
    int i;
    for (i=0; i<size; i++)
    {
        printf("a[%d] = ");
        scanf("%d", &arr[i]);
    }
}
// --------------------- максимальное число в массиве ---------------------
void Max_Matrix (int * arr, int n)
{
    int i, max = 0;
    for (i=1; i<n; i++)
        if (arr[i] > arr[max]) max = i;
    printf("max = %d\n", max);
}
// --------------------------- сртируем массив ----------------------------
void Sort_Array (int * arr, int n)
{
    int i, j, temp;
    for (i=0; i<n; i++)
        for (j=1; j<(n-i); j++)
            if (arr[j-1] > arr[j])
            {
                temp = arr[j-1];
                arr[j-1] = arr[j];
                arr[j] = temp;
            }
}
// -------------------- Выводим массив на экран ---------------------------
void Printf_Arr (int * arr, int n)
{
    int i;
    printf("\n");
    for (i=0; i<n; i++)
        printf("%4d", arr[i]);
    printf("\n");
}
это вам сейчас вполне по силам
0
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 105
31.01.2018, 20:54  [ТС] 9
Спасибо за подсказки)
С main была тупо ошибка при редакции. Понимаю, что в чем-то рановато, но мне с этой программой разобраться надо и чтобы нормально все работало и отрабатывать ошибки(

Все не пойму, как там реверс сделать.
0
2306 / 1132 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
31.01.2018, 21:15 10
Цитата Сообщение от RednexRampage Посмотреть сообщение
Все не пойму, как там реверс сделать.
По сути:
1. взять последний элемент массива (arr[n-1]) и поменять его местами с первым (arr[0])
2. взять предпоследний элемент массива (arr[n-2]) и поменять его местами с первым (arr[1])
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
#include <stdio.h>
int main (void)
{
    int size = 6;       // размер массива
    int a[6];           // массив
 
    // заполняем по порядку
    int i, c=1;
    for (i=0; i<size; i++)
    {
        a[i] = c++;
        printf("%4d", a[i]);
    }
    printf("\n");
 
    // реверс
    for (i=0, c=size-1; i<c; i++, c--)
    {
        a[i] = a[i] + a[c];     // a = a+b;
        a[c] = a[i] - a[c];     // b = a-b;
        a[i] = a[i] - a[c];     // a = a-b;
    }
 
    // снова на экран
    for (i=0; i<size; i++)
        printf("%4d", a[i]);
    printf("\n");
    return 0;
}
Добавлено через 4 минуты
или менять элементы через привычный tmp:

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
#include <stdio.h>
int main (void)
{
    int size = 5;       // размер массива
    int a[5];           // массив
 
    // заполняем по порядку
    int i, c=1;
    for (i=0; i<size; i++)
    {
        a[i] = c++;
        printf("%4d", a[i]);
    }
    printf("\n");
 
    // реверс
    for (i=0, c=size-1; i<c; i++, c--)
    {
        //a[i] = a[i] + a[c];       // a = a+b;
        //a[c] = a[i] - a[c];       // b = a-b;
        //a[i] = a[i] - a[c];       // a = a-b;
        int tmp = a[i];
        a[i] = a[c];
        a[c] = a[i];
    }
 
    // снова на экран
    for (i=0; i<size; i++)
        printf("%4d", a[i]);
    printf("\n");
    return 0;
}
1
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 105
31.01.2018, 22:04  [ТС] 11
Теперь понял) спасибо) Все-таки попробую это как-то в ту задачу вкрутить, я принцип-то понимаю, просто проблема в том, что хотя я понимаю, как это нужно сделать, пока не умею это правильно в коде выразить.

Добавлено через 23 минуты
И все-таки как это с меню реализовать? Проблему в том, что динамический массив, понимаю. Например, если предположить, что числа-таки есть и пользователь уже после ввода сортирует, то как сделать вот реализацию с нулем и программу в целом. Просто мучаюсь и никак не получается, а неймется(.
0
2306 / 1132 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
31.01.2018, 22:11 12
пока выполняется некий цикл {
1. получаем число с клавиатуры
2. если это число не 0:
- - рассчитываем размер массива
- - объявляем массив заданного размера (или меняем размер уже имеющегося)
- - записываем число в массив
иначе выходим из цикла
}
если размер массива > 0 возвращаем новый размер массива, иначе сообщаем об ошибке

alloc(), realloc(), free() и sizeof() вам в помощь
1
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 105
01.02.2018, 00:33  [ТС] 13
В общем, я все заново переписать попробовал и в этом случае попробовал, как будет если сделать как проект и разделить на 3 файла

1. Основной
2. С функциями
3. header

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

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
Main 
#include <stdio.h>
#include "arrayFunctionsRus.h"
#define arrayMaximal 40
 
int main(void){
 
 
    int numberArr[arrayMaximal];
    int destinArr[arrayMaximal];
    int quantity = 0;
    int x;
 
    for (x=0; x < arrayMaximal; x++){
 
    numberArr[x]=0;
    destinArr[x]=0;
 
    }
 
    printf("Программа для массивов\n");
    
    int choice;
if (quantity>0){
   do {
printf("\Опции: \n (1) Ввести числа  \n (2) Average \n (3) Biggest number \n (4) Bubblesort  \n (5) Reverse  \n  (6)Program end \n");
   scanf("%i",&choice);
 
   switch (choice){
       case 1: {
        getIntArray(numberArr, &quantity);
        printIntArray(numberArr, quantity);
         } break;
        case 2: {
            printf("Average:  %.2lf\n", average(numberArr, quantity));
         } break;
        case 3: {
            printf("Biggest int:  %i\n", biggest(numberArr, quantity));
         } break;
         case 4: {
             printf("Bubblesort \n", bubblesort(numberArr, quantity));
         } break;
         case 5: {
              printf("Abs reverse:\n", absreverse(numberArr, destinArr, quantity));
         printIntArray(destinArr, quantity);
         } break;
 
 
    }while (choice!=6); break;
    return 0;
    }
 
 
}

Функции
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdio.h>
#include "arrayFunctionsRus.h"
#define arrayMaximal 40
 
void printIntArray(int numberArr[], int quantity){
    int x;
    for (x=0;x<quantity;x++){
        printf("%i:%i\n", x+1, numberArr[x]);
    }
}
 
int getNumber(int number){
    int choice;
    fflush(stdin);
    printf("Введите, пожалуйста число:%i: ", number);
    scanf("%i", &choice);
    return choice;
}
 
void getIntArray(int numberArr[], int *quantity){
    int input;
 
    *quantity=0;
 
 
    while( ((input = getNumber(*quantity+1)) != 0) && (*quantity<arrayMaximal) ){
        numberArr[*quantity] = input;
        *quantity = *quantity+1;
    }
 
    if (*quantity == (arrayMaximal-1)){
    printf("Вы достигли предела  количества чисел.\n");
    }
}
 
 
double average(int numberArr[], int quantity){
    int x;
    int sum=0;
 
    if (quantity!=0){
 
        for (x=0; x<quantity; x++){
            sum = sum + numberArr[x];
        }
 
 
        return ((double) sum / quantity);
    }
    else{
        return 0;
    }
}
 
int absolute(int number){
    if (number<0) return -1 * number;
    else return number;
}
 
int absreverse(int numberArr[], int destinArr[], int quantity){
    int x;
    for (x=0; x<quantity; x++){
 
        destinArr[(quantity-1)-x] = absolute(numberArr[x]);
 
    }
}
 
 
int biggest(int numberArr[], int quantity){
    int biggest, x;
    biggest = 0;
    if (quantity>0){
 
    biggest = numberArr[0];
 
    for (x=1; x<quantity; x++){
            if (numberArr[x]>biggest) biggest = numberArr[x];
        }
    }
 
    return biggest;
}
 
 
int bubblesort (int numberArr[], int quantity){
 
    int i, j, tmp;
    for (i = 0; i < quantity ; i++)
   {
      for (j = i; j < quantity ; j++)
      {
          if (numberArr[i] > numberArr[j])
          {
              tmp = numberArr[i];
              numberArr[i] = numberArr[j];
              numberArr[j] = tmp;
          }
      }
   }
 
    }
Заголовок

C
1
2
3
4
5
6
7
8
void printIntArray(int[], int);
int getNumber(int);
void getIntArray(int[], int *);
double average (int[], int);
int biggest(int[], int);
int bubblesort(int[], int);
int absreverse(int[], int[], int);
int absolute(int);
0
2306 / 1132 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
01.02.2018, 04:47 14
В main:
int quantity = 0;
и после этого выполняется условие
if (quantity>0)

т.е. все, что в условии, никогда не будет выполнено

Немного изменил main, чтобы программа заработала, попробуйте:
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
//Main 
#include <stdio.h>
#include "arrayFunctionsRus.h"
#define arrayMaximal 40
 
int main (void)
{
 
    int numberArr[arrayMaximal];
    int destinArr[arrayMaximal];
    int quantity = 0;
    int x;
 
    for (x=0; x < arrayMaximal; x++)
            numberArr[x] = destinArr[x] = 0;
 
    printf("Программа для массивов\n");
 
    int choice = 0;
    while (choice != 6)
    {
        printf("Опции:\n (1) Ввести числа  \n (2) Average\n (3) Biggest");
        printf(" number\n (4) Bubblesort\n (5) Reverse\n (6)Program end\n");
        scanf("%i", &choice);
 
        switch (choice)
        {
            case 1:
                getIntArray(numberArr, &quantity);
                printIntArray(numberArr, quantity);
                break;
            case 2:
                printf("Average:  %.2lf\n", average(numberArr, quantity));
                break;
            case 3:
                printf("Biggest int:  %i\n", biggest(numberArr, quantity));
                break;
            case 4:
                printf("Bubblesort \n", bubblesort(numberArr, quantity));
                break;
            case 5:
                printf("Abs reverse:\n", absreverse(numberArr, destinArr, quantity));
                printIntArray(destinArr, quantity);
        }
    }
 
    return 0;
}
Добавлено через 3 часа 42 минуты
Но даже сейчас программа будет работать неизвестно как, если пользователь решит бежать впереди паровоза, и скажем решит отсортировать массив до того, как введет значения. Поэтому я бы изменил идею меню на что-нибудь вроде этого:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <stdio.h>
 
#define N 100                               // максимальный размер массива
int array_input (int *, int);           // получаем значения с клавиатуры
void printf_arr (int *, int);           // массив на экран
int print_menu (void);                  // главное меню
/* функции для обработки массива */
int absolute (int);                     // число по модулю
void average (int *, int);              // среднее арифметическое
void maximum (int *, int);              // максимальный по модулю элемент
void sort_arr (int *, int);         // сортировка пузырьком
void reverse (int *, int);              // разворот массива
 
int main (void)
{
    int arr[N];         // массив на 100 элементов
    int size = 0;       // текущий размер массива
    size = array_input(arr, N);     // получаем значения элементов массива с клавиатуры
    if (!size) return -1;               // если размер массива 0, выходим
    printf_arr(arr, size);              // массив на экран
 
    int choice = 0;
    while (choice != 6)
    {
        choice = print_menu();          // меню на экран
        switch(choice)
        {
            case 1:
                printf_arr(arr, size);  // массив на экран
                break;
            case 2:
                printf_arr(arr, size);
                average(arr, size);     // среднее арифметическое
                break;
            case 3:
                printf_arr(arr, size);
                maximum(arr, size);     // максимальный эелемент массива по модулю
                break;
            case 4:
                sort_arr(arr, size);        // сортировка пузырьком
                printf_arr(arr, size);
                break;
            case 5:
                reverse(arr, size);     // разворот массива
                printf_arr(arr, size);
            default:
                break;
        }
    }
    
    return 0;
}
// -------------- элементы массива с клавиатуры --------------
int array_input (int * buffer, int size)
{
    int d, n = 0, go = 1;
    printf("Для завершения ввода введите 0\n");
    while (go)
    {
        // получаем число с клавиатуры
        printf("a[%i] = ", n);
        scanf("%i", &d);
        fflush(stdin);
        // записываем число в массив
        if (d && n+1 < size) buffer[n++] = d;
        else go = 0;
    }
    return n;
}
// ----------------- Выводим массив на экран -----------------
void printf_arr (int * a, int n)
{
    int i;
    for (i=0; i<n; i++)
        printf("%4d", i);           // номера элементов
    printf("\n");
    for (i=0; i<n; i++)
        printf("%4d", a[i]);        // элементы массива
    printf("\n");
}
// ----------------------- Главное меню ----------------------
int print_menu (void)
{
    int n;
    printf("\nМеню:\n");
    printf("(1) Массив на экран\n");
    printf("(2) Вычислить среднее арифметическое\n");
    printf("(3) Максимальный элемент массива по модулю\n");
    printf("(4) Отсортировать массив по возрастанию\n");
    printf("(5) Развернуть массив задом наперед\n");
    printf("(6) Конец программы\n");
    printf("---------------------------------------\n");
    printf("Ваш выбор?: ");
    scanf("%d", &n);
    fflush(stdin);
    printf("\n");
    return n;
}
int absolute (int n)
{
    return (n < 0) ? -n : n;
}
// ----------------- Среднее арифметическое ------------------
void average (int * a, int n)
{
    int i, s=0;
    for (i=0; i<n; i++)
        s += a[i];
    printf("average: %.2f\n", (float)s/n);
}
// --------- Максимальный по модулю элемент массива ----------
void maximum (int * a, int n)
{
    int i, c, d, m=0;
    for (i=1; i<n; i++)
        if (absolute(a[i]) > absolute(a[m]))
            m = i;
    printf("Maximum element: a[%i] = %d\n", m, a[m]);
}
// ------------- Сортируем массив по возрастанию -------------
void sort_arr (int * a, int n)
{
    int i, j, c, tmp;
    for (i=0; i<n; i++)
    {
        for (j=1; j<(n-i); j++)
        {
            c = j-1;
            if (a[c] > a[j])
            {
                tmp = a[c];
                a[c] = a[j];
                a[j] = tmp;
            }
        }
    }
}
// ----------- Разворачиваем массив задом наперед ------------
void reverse (int * a, int n)
{
    int i, c, tmp;
    for (i=0, c=n-1; i<c; i++, c--)
    {
        tmp = a[i];
        a[i] = a[c];
        a[c] = tmp;
    }
}
0
0 / 0 / 0
Регистрация: 10.01.2018
Сообщений: 105
01.02.2018, 12:56  [ТС] 15
Огромное спасибо) Теперь работает)

У меня только вопрос, все вроде правильно, но в average выдает нули, и bubblesort у меня не печатается, хотя без меню прекрасно сортировал.

Добавлено через 1 час 30 минут
Ой, с пузырьком ступил, тупо вывод не заметил, что не написал, а вот Average что-то глбчит(
0
01.02.2018, 12:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2018, 12:56
Помогаю со студенческими работами здесь

Последовательно вводятся числа a (до тех пор, пока не будет введен 0)
Последовательно вводятся числа a (до тех пор, пока не будет введен 0). Для каждого из них вычислить...

С клавиатуры вводятся числа пока не будет введен 0 определить количество четных и нечетных
С клавиатуры вводятся числа пока не будет введен 0 определить количество четных и нечетных

Пользователь вводит целые числа до тех пор, пока не будет введен ноль...
Пользователь вводит целые числа до тех пор, пока не будет введен ноль. Результат работы программы:...

Вводите числа с клавиатуры, пока не будет введен ноль. Посчитать количество и сумму чисел
Вводите числа с клавиатуры, пока не будет введен ноль. Посчитать количество и сумму чисел.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru