Форум программистов, компьютерный форум CyberForum.ru

без цикла. - C++

Восстановить пароль Регистрация
 
ghjas
2 / 2 / 0
Регистрация: 19.11.2009
Сообщений: 66
14.10.2011, 02:15     без цикла. #1
мучаюсь несколько дней.
есть такая задача:
с клавиатуры ввели 10 чисел. не используя операторов цикла найти 2 крупнейших числа.
и еще одна задача: в массиве из 10 чисел найти значения 2-х самых малых чисел. (здесь уже с использованием циклов).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.10.2011, 02:31     без цикла. #2
Цитата Сообщение от ghjas Посмотреть сообщение
с клавиатуры ввели 10 чисел. не используя операторов цикла найти 2 крупнейших числа.
Вы можете проверять при вводе числа с клавиатуры является ли число больше чем предыдущее и если да то сохранять его. В итоге у вас останентся самое больше число.

Второй вариант это использование рекурсивной функции которая пройдет по массиву.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
14.10.2011, 02:33     без цикла. #3
Цитата Сообщение от ghjas Посмотреть сообщение
и еще одна задача: в массиве из 10 чисел найти значения 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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define N 10
 
int main()
{
    int arr[N], i, min1, min2;
 
    srand(time(NULL));
    printf("array:\n");
    for (i = 0; i < N; i++) {
        printf("%d ", arr[i] = rand() % 21 - 10);
        if (i == 0)
            min1 = min2 = *arr;
        if (arr[i] < min1) {
            min2 = min1;
            min1 = arr[i];
        }
    }
    printf("\nmin1 = %d\nmin2 = %d\n", min1, min2);
    return 0;   
}
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.10.2011, 03:24     без цикла. #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
void findMax(float myArray[], const int arraySize, int iter,  float *max1, float *max2){
    if(iter==arraySize){
        cout << "MAX1 is : " << *max1 << "\nMAX2 is : " << *max2;
    } else {
        if(*max1 < myArray[iter]){ 
            *max2 = *max1;
            *max1 = myArray[iter];
        }
        findMax(myArray, arraySize, (iter+1), max1, max2);
    }
 
}
 
int main()
{
    int iter = 0;
    float max1 = 0, max2;
    const int arraySize = 10;
    float myArra[arraySize] = {12,1,34,56,7,89,5,43,10,22};
 
    findMax(myArra, arraySize, iter, &max1, &max2);
    _getch();       
    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
int main(){
    float b, c, d, e, f, g, h, i, j, k;
    float max1 = 0;
    float max2 = 0;
 
    cout << "Vvedite 10 chisel cherez probel\n";
    cin >> b;
    if(b>max1) {max1 = b;}
    cin >> c;
    if(c>max1) {max2 = max1; max1 = c;}
    cin >> d;
    if(d>max1) {max2 = max1; max1 = d;}
    cin >> e;
    if(e>max1) {max2 = max1; max1 = e;}
    cin >> f;
    if(f>max1) {max2 = max1; max1 = f;}
    cin >> g;
    if(g>max1) {max2 = max1; max1 = g;}
    cin >> h;
    if(h>max1) {max2 = max1; max1 = h;}
    cin >> i;
    if(i>max1) {max2 = max1; max1 = i;}
    cin >> j;
    if(j>max1) {max2 = max1; max1 = j;}
    cin >> k;
    if(k>max1) {max2 = max1; max1 = k;}
 
    cout << "MAX1 is : " << max1 << "\nMAX2 is :" << max2;
    _getch(); 
        return 0;
}

Не по теме:

после ctr+c и ctr+v не забудьте добавить необходимый #include

alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.10.2011, 03:54     без цикла. #5
ну вот собственно рекурсивно с массивом
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
#include <stdio.h>
 
void num_in(int *arr, int size)
{
    if(size)
    {
        scanf("%d", *&arr);
        num_in(arr + 1, size - 1);
    }
    return size;
}
 
void print_arr(int *arr, int size)
{
    if (size)
    {
        printf("%d ", *arr);
        print_arr(arr + 1, size - 1);
    }
}
 
int find_max(int *arr, int size, int max)
{
    int tmp = max;
 
    if (size)
    {
        if (tmp < *arr)
            tmp = *arr;
        tmp = find_max(arr + 1, size - 1, tmp);
    }
    return tmp;
}
 
int find_index_max(int *arr, int size, int max, int count)
{
    int tmp = count;
    if (size)
    {
        if (*arr == max)
            return tmp;
        else
            find_index_max(arr + 1, size - 1, max, count + 1);
    }
}
 
void change_value(int *arr, int max, int count)
{
    int tmp1 = *arr, tmp2 = *(arr + count);
    *arr = tmp2;
    *(arr + count) = tmp1;
}
 
int main()
{
    int *x, n = 10, max = 0, max2 = 0, count = 0;
    x = (int *) malloc(n * sizeof(int));
 
    num_in(x, n);
    print_arr(x, n);
 
    max = find_max(x, n, max);
    printf("\n max = %d \n", max);
 
    count = find_index_max(x, n, max, count);
    change_value(x, max, count);
 
    max2 = find_max(x + 1, n - 1, max2);
    printf("\n max2 = %d \n", max2);
 
    free(x);
    return 0;
}
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.10.2011, 03:59     без цикла. #6
alkagolik, У меня вопрос сугубо для собственно просвещения. вот тут:
C++
1
2
3
4
5
6
7
8
9
void num_in(int *arr, int size)
{
    if(size)
    {
        scanf("%d", *&arr);
        num_in(arr + 1, size - 1);
    }
    return size;
}
return size; уместно ? Вроде как VOID. Если до то почему? Спасибо!
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.10.2011, 04:14     без цикла. #7
greeezz, да это очепятка просто. она изначально была инт, а потом стала воид. спасибо что заметили. надо ретурн убрать

Добавлено через 11 минут
greeezz, но для просвещения вам что в Си такой фокус проходит. коряво тут нацарапаю немного, вы поймете.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void *f(int size)
{
    void *t;
    t = (void*)malloc(size * sizeof(void));
    return t;
}
 
int main()
{
    int *x;
    float *y;
 
    x = f(10);
    y = f(20);
}
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.10.2011, 04:26     без цикла. #8
Цитата Сообщение от alkagolik Посмотреть сообщение
но для просвещения вам что в Си такой фокус проходит.
Оригинально. Интересно, насколько целесообразно (или необходимо) использование таких конструкций.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.10.2011, 05:43     без цикла. #9
Цитата Сообщение от greeezz Посмотреть сообщение
насколько целесообразно (или необходимо) использование таких конструкций.
конфликт типов конечно не факт что так делать нужно (void **func()) для выделения памяти, однако... факт есть

Добавлено через 1 час 5 минут
вообще я в #7 немного попутал (время сказывается видимо). вот сейчас писал и наткнулся на пример в манах
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void *
       thread_start(void *arg)
       {
           struct thread_info *tinfo = (struct thread_info *) arg;
           char *uargv, *p;
 
           printf("Thread %d: top of stack near %p; argv_string=%s\n",
                   tinfo->thread_num, &p, tinfo->argv_string);
 
           uargv = strdup(tinfo->argv_string);
           if (uargv == NULL)
               handle_error("strdup");
 
           for (p = uargv; *p != '\0'; p++)
               *p = toupper(*p);
 
           return uargv;
       }
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
14.10.2011, 05:58     без цикла. #10
Цитата Сообщение от greeezz Посмотреть сообщение
float b, c, d, e, f, g, h, i, j, k;
На мой взгляд можно обойтись с одной переменной вместо 10.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 06:58     без цикла.
Еще ссылки по теме:

C++ Посчитать сумму без цикла
C++ Как обойти массив без использования цикла
Рендер без цикла C++

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

Или воспользуйтесь поиском по форуму:
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.10.2011, 06:58     без цикла. #11
Евгений М.,
Вы правы.

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
int main(){ 
        float b, max1 = 0, max2;
 
    cout << "Vvedite 10 chisel cherez probel\n";
    cin >> b;
    if(b>max1) {max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
    cin >> b;
    if(b>max1) {max2 = max1; max1 = b;}
 
    cout << "MAX1 is : " << max1 << "\nMAX2 is :" << max2;   
    _getch();       
    return 0;
}
Yandex
Объявления
14.10.2011, 06:58     без цикла.
Ответ Создать тему
Опции темы

Текущее время: 16:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru