Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите доделать массив и найти ошибки / 18 сообщений из 18, страница 1 из 1
01.04.2014, 17:03
    #38602142
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
Добрый день, товарищи программисты.
Собственно вот само задание:
Задать массив из 20 целых четырёхзначных чисел с помощью датчика случайных чисел. Определить элементы, кратные 3, создать массив из индексов найденных элементов, вывести его на экран. Заменить каждый найденный элемент суммой предыдущего и последующего элемента. Например, если найденный элемент имеет индекс 5, то его заменяют суммой четвертого и шестого элементов.
На экран вывести как исходный, так и результирующий массивы.

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

Код: plaintext
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.
#include "stdafx.h"
#include <time.h>
#include <clocale>
#include <iostream>
#include <iomanip>


int _tmain(int argc, _TCHAR* argv[])
{
	int znak, i, x[20];
	for (i=0; i<20; i++)
	{
		x[i]=1000+rand()%9000;
		printf("%i\n", x[i]);
	}
	int xnew[20];
int j=0;
for (i=0; i<20; i++)
      if(x[i]%3==0)
	  {
            cout<<x[i]<<" ";
            xnew[j++]=x[i];
			printf("%\n", x[i]%3);
      }
	return 0;
}
...
Рейтинг: 0 / 0
01.04.2014, 17:06
    #38602148
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
SergeyVD,

Ошибка только одна — не выполнено задание.
...
Рейтинг: 0 / 0
01.04.2014, 17:11
    #38602161
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
MasterZiv, спасибо, это я знаю, проблемма в том, что не могу понять, как массив из элементов создать)
...
Рейтинг: 0 / 0
01.04.2014, 17:49
    #38602204
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
SergeyVD,

У тебя уже создано два массива элементов.
...
Рейтинг: 0 / 0
01.04.2014, 17:53
    #38602213
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
MasterZiv, но все равно на экран выводятся числа НЕ кратные 3, в чем проблема, не подскажете?
...
Рейтинг: 0 / 0
01.04.2014, 18:08
    #38602228
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
SergeyVD...как сделать массив из индексов найденных элементов.

Код: plaintext
1.
2.
3.
4.
5.
int xnew_ind=0;

for (i=0; i<20; i++)
    if(x[i]%3==0)
        xnew[xnew_ind++] = i;
...
Рейтинг: 0 / 0
01.04.2014, 19:33
    #38602324
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
а почему пишет, что не объявлена cout (error C2065: 'cout' : undeclared identifier)?
...
Рейтинг: 0 / 0
01.04.2014, 19:41
    #38602329
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
а вообще получается что-то вроде:
Код: plaintext
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.
#include "stdafx.h"
#include <time.h>
#include <clocale>
#include <iostream>
#include <iomanip>


int _tmain(int argc, _TCHAR* argv[])
{
	int znak, i, x[20];
	for (i=0; i<20; i++)
	{
		x[i]=1000+rand()%9000;
		printf("%i\n", x[i]);
	}
	int xnew[20];
int j=0;
int xnew_ind=0;
for (i=0; i<20; i++)
      if(x[i]%3==0)
	  {
            cout<<x[i]<<" ";
            xnew[j++]=x[i];
for (i=0; i<20; i++)
    if(x[i]%3==0)
        xnew[xnew_ind++] = i;
 printf("\nind elementa ",i);
      }
	return 0;
}
...
Рейтинг: 0 / 0
01.04.2014, 20:11
    #38602354
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
SergeyVDа почему пишет, что не объявлена cout (error C2065: 'cout' : undeclared identifier)?Потому что std::cout.

И вообще, если у тебя есть cout, не надо использовать printf. Если ты используешь printf - забудь про cout.
...
Рейтинг: 0 / 0
01.04.2014, 20:47
    #38602377
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
White Owl, спасибо, сделал, как Вы сказали, только теперь вообще что-то непонятное получилось...
код:
Код: plaintext
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.
#include "stdafx.h"
#include <time.h>
#include <clocale>
#include <iostream>
#include <iomanip>


int _tmain(int argc, _TCHAR* argv[])
{
	int znak, i, x[20];
	for (i=0; i<20; i++)
	{
		x[i]=1000+rand()%9000;
	}
	int xnew[20];
int j=0;
int xnew_ind=0;
for (i=0; i<20; i++)
      if(x[i]%3==0)
	  {

            std::cout<<x[i]<<" ";
            xnew[j++]=x[i];
for (i=0; i<20; i++)
    if(x[i]%3==0)
        xnew[xnew_ind++] = i;

      }
	return 0;
}
...
Рейтинг: 0 / 0
01.04.2014, 20:48
    #38602379
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
...
Рейтинг: 0 / 0
02.04.2014, 00:17
    #38602465
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
SergeyVDWhite Owl, спасибо, сделал, как Вы сказали, только теперь вообще что-то непонятное получилось...И что там такого непонятного?
Ты хотел узнать какие элементы массива x делятся на 3 без остатка? Узнал - один единственный 1041. Остальные не делятся.
Все.


Не ленись ставить фигурные скобки. Да частенько можно прожить без них, но пока у тебя чушь в коде и ты ее не видишь потому что нету фигурных скобок и код написан не лесенкой.
Отформатируй код. Прямо сейчас.
После этого ты во первых сразу увидишь вопиющую фигню. Во вторых, догадаешься куда впихнуть еще одну процедуру печати.
Потом можно будет уже думать над алгоритмом.
...
Рейтинг: 0 / 0
07.04.2014, 19:50
    #38607658
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
Раз топикстартер пропал, можно померяться "решениями".

Код: plaintext
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.
#include <iostream>
#include <random>
#include <algorithm>

using namespace std;

int main()
{
    constexpr int sz = 20;
    int i[sz];

    {// fill with random data
      std::random_device rd;
      std::mt19937 mt(rd());
      std::uniform_int_distribution<int> dist(-9999, 9999);
      for(auto &x : i)
          x = dist(mt);
    }

    cout << "Random array is " << endl;
    //print random array
    for(auto x : i)
      cout << x << ' ';
    cout << endl;

    int idx[sz];    // to save indexes
    // set init values to -1
    fill(begin(idx), end(idx), -1);

    // scan array to find div by 3
    int *ptr = idx;
    for(auto &x : i)
      if(!(x%3)) // ?div -write index to idx
        *ptr++ = &x - begin(i);

    // print found indexes
    cout << "Indexes of the elements found " << endl;
    for(int j = 0 ; (j < sz ) && (idx[j] != -1); ++j)
          cout << idx[j] << " ";
    cout << endl;

    int ii[sz]; // here we put new - modified array
    copy(begin(i), end(i), begin(ii));
    //calculate new values
    for(int j = 0 ; (j < sz ) && (idx[j] != -1); ++j)
    {
        // exclude elements on the borders
        if((idx[j]>0)&&(idx[j]<(sz-1)))
            ii[idx[j]] = i[idx[j]-1]+i[idx[j]+1];
        else
            cout << "Most left or most right element skipped" << endl;
    }

    // print old values
    for_each(begin(i), end(i),   [](const int j){cout << j << " ";});
    cout << endl;

    // print new values
    for_each(begin(ii), end(ii), [](const int j){cout << j << " ";});
    cout << endl;

   return 0;
}
...
Рейтинг: 0 / 0
08.04.2014, 02:35
    #38607810
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
Не оговаривается работа с крайними элементами. Не оговаривается что нужно делать если все элементы кратны трём, либо соседние кратны. Также возникает проблема переполнения буфера при сумме двух целых чисел. В первом приближении у меня получилось следующее решение

Код: plaintext
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 <stdlib.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
	int a[20], index[20];
	//Заполнение двух массивов
	for (int i = 0; i < 20; i++)
	{
		*(a + i) = rand();
		*(index + i) = (*(a + i) % 3 == 0) ? i : -1;
	}
	//Вывод на экран двух массивов до изменения
	printf("array_start: \n");
	for (int i = 0; i < 20; i++)
	{
		printf("%i %i \n", i, *(a + i));
	}
	printf("\narray_indices: \n");
	for (int i = 0; i < 20; i++)
	{
		if (*(index + i) != -1) printf("%i \n", *(index + i));	
	}
	//Изменение основного массива и вывод на экран
	printf("\narray_result \n");
	for (int i = 0; i < 20; i++)
	{
		if (*(index+i)!=-1)
		{
			if (i == 0) *(a + i) = *(a + i + 1);
			else if (i == 19) *(a + i) = *(a + i - 1);
			else *(a + i) = *(a + i - 1) + *(a + i + 1);
		}
		printf("%i %i \n", i, *(a + i));
	}
	return 0;
}
...
Рейтинг: 0 / 0
08.04.2014, 02:44
    #38607812
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
BagaBaga, мне не очень понравился ваш код, на мой взгляд неудачное именование переменных. Да и в целом. Некоторые моменты вы усложнили, в данном случае это не требуется
...
Рейтинг: 0 / 0
08.04.2014, 08:10
    #38607893
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
SashaMercury,
хотелось написать как можно меньше своего кода и как можно больше из STL.

Конечно, использовать i/ii в качестве имени массива - моветон (т.к. имена типа i, j, k ... обычно используются для итераций в циклах.). Адресная арифметика (для определения индекса), наверное, перебор - с индексной переменной было бы привычнее.

Что не понравилось у Вас:
- магические числа ( 20, 19 и т.п.)
- использование -1 как флага неделимости (вместо привычного 0 = false, всё остальное - true. У меня используется -1 как значение инвалидного индекса, т.к. ноль использовать не могу - вполне законный индекс :)
- использование printf (мы вроде как о С++, а не С).
- несоответствие заданию, вероятно, по невнимательности ( массив из 20 целых четырёхзначных чисел). Хотя, у меня вроде тоже не соответсвует (не ограничивает снизу :)
- использование адресной арифметики для индексации массива (Вы тоже "Некоторые моменты ... усложнили")
- не совсем "корректно" работает с идущими подряд кратными (даже если они не "краевые", когда поведение не определено).
- совмещённый цикл заполнения и поиска (простановки флага) делимости на три (но это на вкус и цвет все фломастеры разные :).
...
Рейтинг: 0 / 0
08.04.2014, 08:35
    #38607908
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
понял вас )

BagaBaga - не совсем "корректно" работает с идущими подряд кратными (даже если они не "краевые", когда поведение не определено).

могу согласить, ибо задача решена в первом приближении
...
Рейтинг: 0 / 0
13.04.2014, 17:35
    #38613661
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите доделать массив и найти ошибки
SashaMercury, BagaBaga
Спасибо за ваши варианты! =)
Эту лабу уже сдал, к сожалению нет возможности прикрепить код...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите доделать массив и найти ошибки / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]