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

Не могу разобраться с указателями - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
12.10.2011, 17:57     Не могу разобраться с указателями #1
Здраствуйте все вот короче мне задали задачки на Си написать вот они собствено :
1.Даны два массива, упорядоченных по возрастанию: А[n] и B[m]. Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию.
2.Даны два массива : А[n] и B[m]. Необходимо создать третий массив, в котором нужно собрать:
- Элементы обоих массивов;
- Общие элементы двух массивов;
- Элементы массива A, которые не включаются в B;
- Элементы массива B, которые не включаются в A;
- Элементы массивов A и B, коотрые не являются общими дял них (то есть объединение результатов двух - предыдущих вариантов).
Помогите как и счего начать программу ?

 Комментарий модератора 
Не выделяем так больше, глаза болят.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
12.10.2011, 18:39     Не могу разобраться с указателями #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
#include<iostream>
 
using namespace std;
 
 
 
int main()
{
    int A[]={1,3,5,7}, B[]={2,4,5,6}, *pArray,a;
 
    a=(sizeof A+sizeof B) /sizeof A[1];
 
    pArray = new int[a];
 
    int i=-1,j=-1;
    for(int g=0; g<a; g++)
        if(B[j]<=A[i])
        {
            j++;
            pArray[g] = B[j];
            
        }
        else
        {
            i++;
            pArray[g]=A[i];
                
        }
 
    for(int i=0;i<a;i++)
        cout<<pArray[i]<<" ";
 
 
    delete [] pArray;
 
}
Вот код первой задачи, тока на С++
FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
12.10.2011, 21:02  [ТС]     Не могу разобраться с указателями #3
спс я постараюсь переделать сам под Си благодарствую

Добавлено через 28 минут
А со второй поможет ктото ?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.10.2011, 21:24     Не могу разобраться с указателями #4
Ree.exe, исходные массивы могут иметь различные размерности. У вас алгоритм не верный, проанализируйте его. Например,
A: 1 2 3
B: 10 20
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
12.10.2011, 21:26     Не могу разобраться с указателями #5
FRATER1234, для задачи 2 все ее подзадачи собираются в один массив или это 4 разных массива?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.10.2011, 21:46     Не могу разобраться с указателями #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
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#define NA 5
#define NB 7
#define NC 12
 
void Init(int *a, int n)
{
   int i;
   a[0] = rand()%10;
   for(i = 1; i < n; i++)
      a[i] = a[i-1] + rand()%10;
}
 
void Print(int *a, int n)
{
   int i;
   for(i = 0; i < n; i++)
      printf("%d ", a[i]);
   puts("\n");
}
 
void Sort(int *a, int na, int *b, int nb, int *c, int *nc)
{
   int i, j, k;
   i = j = k = 0;
   while (i < na && j < nb)
      if (a[i] < b[j])
         c[k++] = a[i++];
      else
         c[k++] = b[j++];
 
   if (i < na)
      for(j = i; j < na; j++)
         c[k++] = a[j];
   else
      for(i = j; i < nb; i++)
         c[k++] = b[i];
   *nc = na + nb;
}
 
int main()
{
   int a[NA], b[NB], c[NC], nc;
   srand(time(NULL));
   Init(a, NA);
   Init(b, NB);
   Print(a, NA);
   Print(b, NB);
   Sort(a, NA, b, NB, c, &nc);
   Print(c, nc);
   getch();
   return 0;
}
FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
12.10.2011, 23:55  [ТС]     Не могу разобраться с указателями #7
Спс ато думал в чом косяк уменя чото не то делает

Добавлено через 5 минут
А вторую может помочь сделать? ибо там я не могу понять
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
13.10.2011, 00:24     Не могу разобраться с указателями #8
FRATER1234, ответь на вопрос #5 и напишу
FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
13.10.2011, 00:36  [ТС]     Не могу разобраться с указателями #9
Четыре разных масива тоесть 4 рззных задачи ) все те под задачи во второй ненадо в один делать масив просто сделать по одтельности
Jupiter
13.10.2011, 01:29
  #10

Не по теме:

Цитата Сообщение от FRATER1234 Посмотреть сообщение
Не могу разобраться с указателями
так бы и написал что не хочешь разбираться, а то заходишь в тему, а тут
Цитата Сообщение от FRATER1234 Посмотреть сообщение
мне задали
Цитата Сообщение от FRATER1234 Посмотреть сообщение
Помогите как и счего

FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
13.10.2011, 01:38  [ТС]     Не могу разобраться с указателями #11
Ну просто поймите для меня освоение даёться тяжело по началу я сам писал а шас толку я пишу оно то куча ошибок то ишо чтото не так построил алгоритм и т.д вот почему и прошу помочь (
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
13.10.2011, 02:59     Не могу разобраться с указателями #12
FRATER1234, а вы думаете что сможете разобрать чужую программу? успехов. за бесплатно представляю без комментариев и пояснений, за работу не отвечаю (хотя и уверен почти совершенно), за читабельность тоже. С последним пунктом - Элементы массивов A и B, коотрые не являются общими дял них (то есть объединение результатов двух - предыдущих вариантов). разберетесь самостоятельно.
код
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
//output.c
#include <stdio.h>
 
void my_error(int *point_array, const int num)
{
    if (!point_array){
        printf("\nerror of memory\n");
        exit(num);
    }
}
 
void print (const int num, const int choise)
{
    switch(choise)
    {
        case 1: printf("%d ", num);
            break;
        case 2: printf("\n\n");
            break;
        case 3: printf("\nsourse array %x\n", num);
            break;
        case 4: printf("\narray a + array b: \n");
            break;
        case 5: printf("\nintersection array a and b\n");
            break;
        case 6: printf("\nintersection is 0\n");
            break;
        case 7: printf("\nelements of array a and not array b: \n");
            break;
        case 8: printf("\nelements of array b and not array a: \n");
            break;
    }
}
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
//main.c
 
#include <stdlib.h>
#include <time.h>
 
int *create_array(int size)
{
    int *tmp = 0, i = 0;
    tmp = (int*)malloc(size * sizeof(int));
    my_error(tmp, 4);
    for (i; i < size; ++i)
        tmp[i] = rand() % 100;
    return tmp;
}
 
void output_array(int * tmp, const int size, const int choise)
{
    int i = 0;
    for (i; i < size; ++i)
        print(tmp[i], choise);
}
 
void double_array(int *a, int *b, int *c, int n, int m)
{
    int i = 0, j;
    for (i; i < n; ++i)
        *(c + i) = *(a + i);
    j = i;
    for (i = 0; i < m; ++i)
        *(c + j++) = *(b + i);
}
 
int find(const int *c, const int num, const int size)
{
    int i = 0;
    for (i; i < size; ++i)
        if (c[i] == num)
            return 1;
    return 0;
}
 
void resize_array(int *c, const int size)
{
    int tmp = 0;
    tmp = realloc(c, size * sizeof(int));
    if (!tmp) exit(-1);
}
 
int intersection(const int *a, const int *b, int *c, const int n, const int m)
{
    int i = 0, j, tmp = 0, size = 0;
 
    for (i; i < n; ++i)
        for (j = 0; j < m; ++j)
        {
            if (!size)
            {
                if (a[i] == b[j])
                {
                    ++size;
                    c = create_array(size);
                    c[0] = a[i];
                }
            }
            else
            {
                if (a[i] == b[j])
                {
                    tmp = find(c, a[i], size);
 
                    if (!tmp)
                    {
                        ++size;
                        resize_array(c, size);
                        c[size - 1] = a[i];
                    }
                }
 
            }
        }
    return size;
}
 
void array_copy(int *in, int *out, const int size)
{
    int i = 0;
 
    for (i; i < size; ++i)
        in[i] = out[i];
}
 
void inclusive_not(const int *a, int *c, const int *tmp, const int n, const int tmp_size)
{
    int i = 0, j, k = 0, check, temp = 0;
 
    for (i; i < n; ++i)
    {
        check = 1;
 
        for (j = 0; j < tmp_size; ++j)
            if (a[i] == tmp[j])
            {
                check = 0; ++temp;
                break;
            }
        if (check)
            c[k++] = a[i];
    }
 
    if (temp > tmp_size)
        resize_array(c, temp - tmp_size);
}
 
int main()
{
    int *a_array = 0, *b_array = 0, *c_array = 0, *tmp_array;
    int n = 10, m = 20, tmp_size, tmp;
 
    srand(time(0));
    a_array = create_array(n);
    my_error(a_array, 1);
    b_array = create_array(m);
    my_error(b_array, 2);
    c_array = create_array(n + m);
    my_error(c_array, 3);
    double_array(a_array, b_array, c_array, n, m);
 
    print(10, 3);
    output_array(a_array, n, 1);
    print(n, 2); print(11, 3);
    output_array(b_array, m, 1);
    print(n, 2); print(n, 4);
    output_array(c_array, n + m, 1);
    free(c_array);
 
    tmp_size = intersection(a_array, b_array, c_array, n, m);
 
    if (!tmp_size)
    {
        print(n, 6);
        c_array = create_array(n + m);
        my_error(c_array, 5);
        double_array(a_array, b_array, c_array, n, m);
        print(n, 2); print(n, 4);
        output_array(c_array, n + m, 1);
        print(n, 2);
    }
    else
    {
        print(n, 2); print(n, 5);
        output_array(c_array, tmp_size, 1);
        tmp_array = create_array(tmp_size);
        array_copy(tmp_array, c_array, tmp_size);
        free(c_array);
 
        c_array = 0;
        c_array = create_array(n - tmp_size);
        my_error(c_array, 6);
 
        inclusive_not(a_array, c_array, tmp_array, n, tmp_size);
        print(n, 2); print(n, 7);
        output_array(c_array, n - tmp_size, 1);
        free(c_array);
 
        c_array = 0;
        c_array = create_array(m - tmp_size);
        my_error(c_array, 7);
 
        inclusive_not(b_array, c_array, tmp_array, m, tmp_size);
        print(n, 2); print(n, 8);
        output_array(c_array, m - tmp_size, 1);
        print(n, 2);
        free(tmp_array);
    }
 
    free(a_array);
    free(c_array);
    free(b_array);
    return 0;
}
консоль

sourse array a
6 77 99 41 75 9 97 9 20 41


sourse array b
16 27 47 95 89 9 66 57 91 18 8 13 87 44 26 21 81 0 5 14


array a + array b:
6 77 99 41 75 9 97 9 20 41 16 27 47 95 89 9 66 57 91 18 8 13 87 44 26 21 81 0 5 14


intersection array a and b
9


elements of array a and not array b:
6 77 99 25 0 97 20 41 73


elements of array b and not array a:
16 27 47 95 89 66 57 91 18 8 13 87 44 26 21 81 0 5 14
FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
15.10.2011, 20:30  [ТС]     Не могу разобраться с указателями #13
В итоге короче вэтом коде
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
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#define NA 5
#define NB 7
#define NC 12
 
void Init(int *a, int n)
{
   int i;
   a[0] = rand()%10;
   for(i = 1; i < n; i++)
      a[i] = a[i-1] + rand()%10;
}
 
void Print(int *a, int n)
{
   int i;
   for(i = 0; i < n; i++)
      printf("%d ", a[i]);
   puts("\n");
}
 
void Sort(int *a, int na, int *b, int nb, int *c, int *nc)
{
   int i, j, k;
   i = j = k = 0;
   while (i < na && j < nb)
      if (a[i] < b[j])
         c[k++] = a[i++];
      else
         c[k++] = b[j++];
 
   if (i < na)
      for(j = i; j < na; j++)
         c[k++] = a[j];
   else
      for(i = j; i < nb; i++)
         c[k++] = b[i];
   *nc = na + nb;
}
 
int main()
{
   int a[NA], b[NB], c[NC], nc;
   srand(time(NULL));
   Init(a, NA);
   Init(b, NB);
   Print(a, NA);
   Print(b, NB);
   Sort(a, NA, b, NB, c, &nc);
   Print(c, nc);
   getch();
   return 0;
}
От пользователя Thinker, не до дуплил как его переделать ибо я не знаю что это такое за
C
1
 #define
команда я тока понял что она придает значение а в итоге я попытался изменить оно тупо без этой команды валиться вся прога а как бы по простецкому написать бы не понял я короче может кто то по проще напишет ибо простите но переделать я этот код не могу( а сам я голову ломаю но оно по порядку выстраивает а упорядочить в сумме по возрастанию не могу((
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
15.10.2011, 20:37     Не могу разобраться с указателями #14
FRATER1234, вместо
C++
1
#define NA 5
можно писать
C++
1
const int NA=5;
на том же месте или в самом начале функции main
FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
15.10.2011, 20:49  [ТС]     Не могу разобраться с указателями #15
Ага шас попробую пределать спс за предоставленую помощь благодарствую вам
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.10.2011, 20:54     Не могу разобраться с указателями #16
Цитата Сообщение от FRATER1234 Посмотреть сообщение
Ага шас попробую пределать спс за предоставленую помощь благодарствую вам

Не по теме:

вот и помогай людям, не нравится код, переделывают, а потом удивляются почему криво работает. Я вам написал ОЧЕНЬ оптимальный вариант

FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
15.10.2011, 21:01  [ТС]     Не могу разобраться с указателями #17
Чем можно заменить эти две команды
C
1
2
printf("%d ", a[i]);
   puts("\n");
ибо через cout<<a[i]<<endl; не катит как можно заменить?

Добавлено через 1 минуту
Thinker,
Я вам благодарен очень я ничего вам не говорил что вы зря написал спс огромнешое просто поймите унас препод ишо такого не преподавал половину умного написанно для меня тоесть он знает примерно мои знания и он просто подумает что я якобы списал вот и всё почему я и хочу переделать а вам ищо рас огромнешое спс и прошу без обид
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
15.10.2011, 21:04     Не могу разобраться с указателями #18
FRATER1234, чтобы был cout, нужно подключать библиотеку iostream вместо stdio
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.10.2011, 21:06     Не могу разобраться с указателями #19
FRATER1234, но у вас же написано, что задачи на Си, а cout это уже из С++
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2011, 21:08     Не могу разобраться с указателями
Еще ссылки по теме:

C++ Не могу разобраться с указателями!
Как создать 2-ое дерево со значениями 1-го? Не могу разобраться с указателями C++
Разобраться с указателями и ссылками. Совсем запутался C++

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

Или воспользуйтесь поиском по форуму:
FRATER1234
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 224
15.10.2011, 21:08  [ТС]     Не могу разобраться с указателями #20
aeshes,
Я это сделал я подключил #include<iostream> и написал using namespace std;

Добавлено через 55 секунд
Thinker,
cout это С++?? круто однако а он говорит что это норм )) якобы относиться к Си
Yandex
Объявления
15.10.2011, 21:08     Не могу разобраться с указателями
Ответ Создать тему
Опции темы

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