powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите доделать массив и найти ошибки
18 сообщений из 18, страница 1 из 1
Помогите доделать массив и найти ошибки
    #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
Помогите доделать массив и найти ошибки
    #38602148
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyVD,

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

У тебя уже создано два массива элементов.
...
Рейтинг: 0 / 0
Помогите доделать массив и найти ошибки
    #38602213
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, но все равно на экран выводятся числа НЕ кратные 3, в чем проблема, не подскажете?
...
Рейтинг: 0 / 0
Помогите доделать массив и найти ошибки
    #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
Помогите доделать массив и найти ошибки
    #38602324
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а почему пишет, что не объявлена cout (error C2065: 'cout' : undeclared identifier)?
...
Рейтинг: 0 / 0
Помогите доделать массив и найти ошибки
    #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
Помогите доделать массив и найти ошибки
    #38602354
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyVDа почему пишет, что не объявлена cout (error C2065: 'cout' : undeclared identifier)?Потому что std::cout.

И вообще, если у тебя есть cout, не надо использовать printf. Если ты используешь printf - забудь про cout.
...
Рейтинг: 0 / 0
Помогите доделать массив и найти ошибки
    #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
Помогите доделать массив и найти ошибки
    #38602379
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Помогите доделать массив и найти ошибки
    #38602465
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyVDWhite Owl, спасибо, сделал, как Вы сказали, только теперь вообще что-то непонятное получилось...И что там такого непонятного?
Ты хотел узнать какие элементы массива x делятся на 3 без остатка? Узнал - один единственный 1041. Остальные не делятся.
Все.


Не ленись ставить фигурные скобки. Да частенько можно прожить без них, но пока у тебя чушь в коде и ты ее не видишь потому что нету фигурных скобок и код написан не лесенкой.
Отформатируй код. Прямо сейчас.
После этого ты во первых сразу увидишь вопиющую фигню. Во вторых, догадаешься куда впихнуть еще одну процедуру печати.
Потом можно будет уже думать над алгоритмом.
...
Рейтинг: 0 / 0
Помогите доделать массив и найти ошибки
    #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
Помогите доделать массив и найти ошибки
    #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
Помогите доделать массив и найти ошибки
    #38607812
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga, мне не очень понравился ваш код, на мой взгляд неудачное именование переменных. Да и в целом. Некоторые моменты вы усложнили, в данном случае это не требуется
...
Рейтинг: 0 / 0
Помогите доделать массив и найти ошибки
    #38607893
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
хотелось написать как можно меньше своего кода и как можно больше из STL.

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

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

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

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


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