powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Одномерный массив
25 сообщений из 36, страница 1 из 2
Одномерный массив
    #38614703
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 <stdlib.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
int A[16], B[26];
     for (int i = 0; i < 16; i++)
	 {
     *(A + i) =rand();
     }
     printf("massiv A: \n");
     for (int i = 0; i < 16; i++)
	 {
     printf("%i %i \n", i, *(A + i));
     }
	 for (int i = 0; i<26; i++)
	 {
	 *(B + i) =rand();
	 }
	 printf ("\n"); 
	 printf ("\n");
	 printf ("\n");
	 printf("massiv B: \n");
	 for (int i = 0; i<26; i++)
	 {
	 printf("%i %i \n", i, *(B + i));
	 }
     return 0;
}


Собственно сформировал массивы, но не понял как создать массив, состоящий из элементов, расположенных между минимальным и максимальным элементами каждого из массивов А и В.
...
Рейтинг: 0 / 0
Одномерный массив
    #38614710
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyVDне понял как создать массив, состоящий из элементов, расположенных между
минимальным и максимальным элементами каждого из массивов А и В.
Сначала надо найти максимальный и минимальный элемент массивов А и В.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Одномерный массив
    #38614724
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максимальный размер массива C равен сумме размеров массивов A и B.
Дальше зависит от интерпретации слова "между".
Если "все значения между позицией минимального и позицией максимального элемента", то пробежаться по массиву A и запомнить позиции максимального и минимального элемента. Откопировать элементы между этими позициями (от нуля до всего массива).
Повторить для массива B.
Вывести реально откопированные в массив C значения.
Если "между" это "все значения между минимальным и максимальным" - тупо копируем весь массив.
Ну и плюс ньюансы включения-исключения граничных индексов/значений :)
...
Рейтинг: 0 / 0
Одномерный массив
    #38614730
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понял, надо писать программу не через printf, а через cout?)
...
Рейтинг: 0 / 0
Одномерный массив
    #38614732
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov, то есть можно не находить макс и мин элементы, а сразу вычислить сумму массивов?
...
Рейтинг: 0 / 0
Одномерный массив
    #38614739
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyVDBasil A. Sidorov, то есть можно не находить макс и мин элементы, а сразу вычислить сумму массивов?Не только можно, но и нужно, т.к. без специальных ухищрений вы не можете задать переменный размер массива.
Если вы об интерпретации термина "между", то: ваша задача - вам и решать.
...
Рейтинг: 0 / 0
Одномерный массив
    #38614740
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или сделать вот так, но у меня debug error вылезает :D
Для массива А:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for (int i=1;i<16;i++)
{
 if (min>A[i])
   min=A[i];
 if (max<A[i])
   max=A[i];
}
 printf("Max=%d\n", max);
 printf("Min=%d\n", max);
...
Рейтинг: 0 / 0
Одномерный массив
    #38614742
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov, хорошо, попробую сделать сумму
...
Рейтинг: 0 / 0
Одномерный массив
    #38614779
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyVD,

ну наконец-то, однострочник:
Код: plaintext
1.
std::copy(std::distance(std::min_element(B, B + 26), std::max_element(B, B + 26)) < 0 ? std::min_element(B, B + 26) : std::max_element(B, B + 26), std::distance(std::min_element(B, B + 26), std::max_element(B, B + 26)) < 0 ? std::max_element(B, B + 26) : std::min_element(B, B + 26), std::copy(std::distance(std::min_element(A, A + 16), std::max_element(A, A + 16)) < 0 ? std::min_element(A, A + 16) : std::max_element(A, A + 16), std::distance(std::min_element(A, A + 16), std::max_element(A, A + 16)) < 0 ? std::max_element(A, A + 16) : std::min_element(A, A + 16), C));
...
Рейтинг: 0 / 0
Одномерный массив
    #38615040
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozok, да вы человек-тернарь ;)
SergeyVD, это у него такой юмор, не пугайтесь. Через 5 часов попробую помочь вам
...
Рейтинг: 0 / 0
Одномерный массив
    #38615263
Фотография 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.
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.
#include <stdio.h>
#include <stdlib.h>

int extremum(int* a,int power, char* min_or_max)
{
	int* ex=a;
	int* s_a=a;
	if (min_or_max=="min")
	{
		for(int i=1;i<power;i++)	ex=(*ex<=*(a+i))?ex:(a+i);
	}
	else if (min_or_max=="max")
	{
		for(int i=1;i<power;i++)	ex=(*ex>=*(a+i))?ex:(a+i);
	}
	//добавить обработку исключения
	return ex-s_a;
}


int main(int argc, char* argv[])
{
	int a[16],b[26];
	//Заполняем массивы
	for(int i=0;i<16;i++)
	{
		*(a+i)=rand()%100;
		printf("%i ",*(a+i));
	}
	printf("\n");
	for(int i=0;i<26;i++)
	{
		*(b+i)=rand()%100;
		printf("%i ",*(b+i));
	}

	printf("\n %i %i",extremum(a,16,"min"),extremum(a,16,"max"));
	printf("\n%i %i \n",extremum(b,26,"min"),extremum(b,26,"max"));
	//Заполняем результирующий массив
	//алгоритм оптимизируйте, либо измените
	int st_a=(extremum(a,16,"max")>=extremum(a,16,"min"))?extremum(a,16,"min"):extremum(a,16,"max");
	int e_a=(extremum(a,16,"max")>=extremum(a,16,"min"))?extremum(a,16,"max"):extremum(a,16,"min");
	int st_b=(extremum(b,26,"max")>=extremum(b,26,"min"))?extremum(b,26,"min"):extremum(b,26,"max");
	int e_b=(extremum(b,26,"max")>=extremum(b,26,"min"))?extremum(b,26,"max"):extremum(b,26,"min");
	
	int c[42];
	int i=0;
	for(;i<=e_a-st_a+1;i++)
	{
		*(c+i)=*(a+st_a+i);
	}
	for(int j=0;j<=e_b-st_b;j++)
	{
		*(c+i+j-1)=*(b+st_b+j);
	}

	for(int i=0;i<42;i++)
	{
		printf("%i ",*(c+i));
	}
	//В нём пожалуй не просто разобраться, и он не в общем виде. Перепишите.
	//Задача решена в первом приближении. Проверьте.
	while(1){}
	return 0;
}
...
Рейтинг: 0 / 0
Одномерный массив
    #38615275
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int extremum(int* a,int power, char* min_or_max)
{
	if (min_or_max=="min")
...
}
...
	printf("\n %i %i",extremum(a,16,"min"),extremum(a,16,"max"));


Так нельзя писать, если это и заработало, то благодаря компилятору, который всем "min" дал один адрес.
В таких случаях делают константы дефайнами
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#define EXTREMUM_MIN 1
#define EXTREMUM_MAX 2

int extremum(int* a,int power, int min_or_max)
{
	if (min_or_max==EXTREMUM_MIN)
}

printf("\n %i %i",extremum(a,16,EXTREMUM_MIN),extremum(a,16,EXTREMUM_MAX));
...
Рейтинг: 0 / 0
Одномерный массив
    #38615364
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оу. Теперь понятно зачем нужны #define
Спасибо :)
а почему нельзя ? Неграмотно ?
...
Рейтинг: 0 / 0
Одномерный массив
    #38615376
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа почему нельзя ?
Подумай что произойдет при таком использовании твоей функции
Код: plaintext
1.
2.
char oper[] = "max";
extremum(a,16,oper);
...
Рейтинг: 0 / 0
Одномерный массив
    #38615393
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял вроде. По факту я не сравниваю две строки, я сравниваю два адреса в своей программе. Функция вернёт 0.
Не проверял, это мои логические рассуждения.

Да, это очень серьёзная ошибка, особенно учитывая сколько я разбирал strcmp, и зачем она нужна.
...
Рейтинг: 0 / 0
Одномерный массив
    #38615411
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил, и правда 0 возвращает. Спасибо C:
Переписал
Код: 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.
64.
65.
66.
67.
68.
// SergeyVD.cpp: определяет точку входа для консольного приложения.
//

#include <stdio.h>
#include <stdlib.h>
#define EXTREMUM_MIN 1
#define EXTREMUM_MAX 2
int extremum(int* a,int power, int min_or_max)
{
	int* ex=a;
	int* s_a=a;
	if (min_or_max==EXTREMUM_MIN)
	{
		for(int i=1;i<power;i++)	ex=(*ex<=*(a+i))?ex:(a+i);
	}
	else if (min_or_max==EXTREMUM_MAX)
	{
		for(int i=1;i<power;i++)	ex=(*ex>=*(a+i))?ex:(a+i);
	}
	//добавить обработку исключения
	return ex-s_a;
}


int main(int argc, char* argv[])
{
	int a[16],b[26];
	//Заполняем массивы
	for(int i=0;i<16;i++)
	{
		*(a+i)=rand()%100;
		printf("%i ",*(a+i));
	}
	printf("\n");
	for(int i=0;i<26;i++)
	{
		*(b+i)=rand()%100;
		printf("%i ",*(b+i));
	}
	printf("\n %i %i",extremum(a,16,EXTREMUM_MIN),extremum(a,16,EXTREMUM_MAX));
	printf("\n%i %i \n",extremum(b,26,EXTREMUM_MIN),extremum(b,26,EXTREMUM_MAX));
	//Заполняем результирующий массив
	//алгоритм оптимизируйте, либо измените
	int st_a=(extremum(a,16,EXTREMUM_MAX)>=extremum(a,16,EXTREMUM_MIN))?extremum(a,16,EXTREMUM_MIN):extremum(a,16,EXTREMUM_MAX);
	int e_a=(extremum(a,16,EXTREMUM_MAX)>=extremum(a,16,EXTREMUM_MIN))?extremum(a,16,EXTREMUM_MAX):extremum(a,16,EXTREMUM_MIN);
	int st_b=(extremum(b,26,EXTREMUM_MAX)>=extremum(b,26,EXTREMUM_MIN))?extremum(b,26,EXTREMUM_MIN):extremum(b,26,EXTREMUM_MAX);
	int e_b=(extremum(b,26,EXTREMUM_MAX)>=extremum(b,26,EXTREMUM_MIN))?extremum(b,26,EXTREMUM_MAX):extremum(b,26,EXTREMUM_MIN);
	
	int c[42];
	int i=0;
	for(;i<=e_a-st_a+1;i++)
	{
		*(c+i)=*(a+st_a+i);
	}
	for(int j=0;j<=e_b-st_b;j++)
	{
		*(c+i+j-1)=*(b+st_b+j);
	}

	for(int i=0;i<42;i++)
	{
		printf("%i ",*(c+i));
	}
	//В нём пожалуй не просто разобраться, и он не в общем виде. Перепишите.
	//Задача решена в первом приближении. Проверьте.
	while(1){}
	return 0;
}
...
Рейтинг: 0 / 0
Одномерный массив
    #38615423
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПроверил, и правда 0 возвращает. Спасибо C:
Переписал ...
Я бы просто сделал две функции extremum_max() и extremum_min(), тогда не надо будет лишних if(), #define, а главное проверки корректности min_or_max и головоломки что делать если оно некорректно. Это сугубо мое мнение. В том виде как ты написал работать будет.
...
Рейтинг: 0 / 0
Одномерный массив
    #38615445
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждая из этих функций будет работать быстрее, чем одна. Хотя может быть и нет.
Вот интересно, при разработке какого-либо проекта, с точки зрения "грамотности"(я не знаю как правильно назвать то, о чём я думаю) или качества проекта, как лучше было бы поступить ? Подсознательно думаю что две функции, но доказать не могу.
Мне пора идти. Всего доброго )
...
Рейтинг: 0 / 0
Одномерный массив
    #38615481
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКаждая из этих функций будет работать быстрее, чем одна. Хотя может быть и нет.
Быстрее будет одна считающая мин и макс за один проход массива :)

SashaMercuryВот интересно, при разработке какого-либо проекта, с точки зрения "грамотности"(я не знаю как правильно назвать то, о чём я думаю) или качества проекта, как лучше было бы поступить ?
Это называется "архитектура приложения", есть другие синонимы. Тут однозначных ответов нет, т.к. одну и туже задачу можно решить по-разному и не всегда главный критерий "чтобы быстрее работала". Есть книги на тему "проектирование приложений", почитай, а дальше сам для себя выводы сделаешь. Только тут на эту тему вопросы не поднимай, будет много мата :)
...
Рейтинг: 0 / 0
Одномерный массив
    #38615683
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercury, спасибо большое за помощь, сейчас попробую по аналогии доделать свою программу, ну а если не получится сегодня (время поджимает, к сожалению) возьму ваш вариант.
И спасибо всем, кто откликнулся, помог в решении задачки :)
...
Рейтинг: 0 / 0
Одномерный массив
    #38615709
SergeyVD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercury, только в вашей программе какая-то ошибка в вычислении массива С ( я про мистические -85899...)
...
Рейтинг: 0 / 0
Одномерный массив
    #38615732
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyVDSashaMercury, только в вашей программе какая-то ошибка в вычислении массива С ( я про мистические -85899...)Инициализировать массив не пробовали? Будут заданные вами мистические значения.
...
Рейтинг: 0 / 0
Одномерный массив
    #38615769
luislom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
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.
#include <iostream>
#include <algorithm>
#define N 800
#define M 1800 

int cmp(int* a, int* b){ return *a<*b; };

int main () {

 int A[N];
 int* Ap[N];
 
int B[M];
 int* Bp[M]; /* Чтоб стек/крышу не сорвало лучше делать malloc, но в треде принято.. */

int i;
int n;
int m;
int* A_p;
int* B_p;

i=N;
 do{ --i; Ap[i]=&A[i]; A[i]=random(); }while(i>0);
i=M;
 do{ --i; Bp[i]=&B[i]; B[i]=random(); }while(i>0);
 
 std::sort(Ap, Ap+N, cmp);
 std::sort(Bp, Bp+M, cmp); /* У кого С-11 могут такую красоту: std::sort(Bp, Bp+M, [](int* a, int* b){ return *a < *b; });*/

  i=0; n=0;

  if((i=Ap[N-1]-Ap[0]-1)<0){ i=Ap[0]-Ap[N-1]-1; A_p=Ap[N-1]; }else{ A_p=Ap[0]; };
  if((n=Bp[M-1]-Bp[0]-1)<0){ n=Bp[0]-Bp[M-1]-1; B_p=Bp[M-1]; }else{ B_p=Bp[0]; }

  m=i+n;

int* C;

try{

 C=new int[m]; /* или int C[m] */

 }catch(std::bad_alloc& c){ std::cout<<"Yob\n"; exit(-1); };

 while(i>0){ --m; --i; C[m]=*(A_p++); };
                                             
while(n>0){ --m; --n; C[m]=*(B_p++); };
/*

..................................................................................

*/
  delete [] C;

};
...
Рейтинг: 0 / 0
Одномерный массив
    #38615896
luislom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пацаны облом.
Вместо

Код: plaintext
1.
2.
3.
 while(i>0){ --m; --i; C[m]=*(A_p++); };
                                             
while(n>0){ --m; --n; C[m]=*(B_p++); };



Делаем по фэн-шую

Код: plaintext
1.
2.
3.
 while(i>0){ --m; --i; C[m]=*(++A_p); };
                                             
while(n>0){ --m; --n; C[m]=*(++B_p); };
...
Рейтинг: 0 / 0
Одномерный массив
    #38615976
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyVD, писал что задача решена в первом приближении. Как вам правильно подсказали, это непроинициализированные объекты.
luislom, весёлый, поднимающий настроение код и комментарии :D Только жаль вы использовали #include <algorithm>
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Одномерный массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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