powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си/поменять два элемента массива местами
25 сообщений из 25, страница 1 из 1
Си/поменять два элемента массива местами
    #39222788
JaCoOps
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, собственно что мне нужно описано в название темы, пытался реализовать но как то не очень получилось, меняет только два элемента из всего массива, вот мои попытки задание а ):
Код: 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.
/*laba4v8_3.c - Создать массив из n чисел. И 
 a) поменять местами элементы: a0 c a2, a4 и a6 и тд
 б) удалить из массива последовательности подряд идущих одинаковых элементов, оставить от каждой такой последовательности по одному элементу
 в) сформировать новый массив, состоящий из локальных минимумов первого массива, те таких xi, что xi-1 > xi M xi+1*/
#include <stdio.h>

main()
{
  int i = 0;
  int n;
printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: %c[%d;%dmВведите n =%c[%dm ", 27, 8, 33, 27, 0);
      scanf("%d", &n);
  int mass[n];
//массив
printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: %c[%d;%dmВведите массив:%c[%dm\n", 27, 8, 33, 27, 0);
      for(i = 0; i < n; i++){
	printf("::: a[%d] = ", i);
	  scanf("%d", &mass[i]);
      }
printf(":::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: Входной массив:\t");
      for(i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
      }
    printf("\n::: Обработанный массив:");
      for (i = 0; i < n+1; i++){
	  int temp = mass[i];
	  mass[i] = mass[i + 2];
	  mass[i + 2] = temp;
      for (i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
	}
      }
printf("\n:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
}
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39222963
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaCoOps,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// вывод элементов до перестановки
// перестановка:
for (i = 2; i < n; i += 3) {
  temp = mass[i - 2];
  mass[i - 2] = mass[i];
  mass[i] = temp;
}
// вывод после
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39224062
JaCoOps
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanJaCoOps,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// вывод элементов до перестановки
// перестановка:
for (i = 2; i < n; i += 3) {
  temp = mass[i - 2];
  mass[i - 2] = mass[i];
  mass[i] = temp;
}
// вывод после



получаются те же самые выходные данные что и были при первом коде

Код: sql
1.
2.
3.
::: [А] :::::::::::::::::::::::::::::::::::::::::::
::: Входной массив:      [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
::: Обработанный массив: [3] [2] [1] [4] [5] [6] [7] [8] [9] [10]
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39224103
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaCoOps,

Значение n должно быть равно количеству элементов в массиве.
Последний вариант кода в студию! (:
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39224105
JaCoOps
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена) поставил вывод массива в цикле // перестановка:
Код: sql
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.
/*laba4v8_3.c - Создать массив из n чисел. И 
 a) поменять местами элементы: a0 c a2, a4 и a6 и тд
 б) удалить из массива последовательности подряд идущих одинаковых элементов, оставить от каждой такой последовательности по одному элементу
 в) сформировать новый массив, состоящий из локальных минимумов первого массива, те таких xi, что xi-1 > xi M xi+1*/
#include <stdio.h>
main(){
  int i = 0;
  int n;
printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: %c[%d;%dmВведите n =%c[%dm ", 27, 8, 33, 27, 0);
      scanf("%d", &n);
  int mass[n];
//массив
printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: %c[%d;%dmВведите массив:%c[%dm\n", 27, 8, 33, 27, 0);
      for(i = 0; i < n; i++){
	printf("::: a[%d] = ", i);
	  scanf("%d", &mass[i]);
      }
printf("::: %c[%d;%dm[А]%c[%dm :::::::::::::::::::::::::::::::::::::::::::\n", 27, 8, 33, 27, 0);
// Задание а)
    printf("::: Входной массив:\t");
      for(i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
      }
    printf("\n::: Обработанный массив:");
// перестановка:
      for (i = 2; i < n; i += 3) {
	int temp = mass[i - 2];
	mass[i - 2] = mass[i];
	mass[i] = temp;
      }
      for(i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
      }
printf("\n::: %c[%d;%dm[Б]%c[%dm :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", 27, 8, 33, 27, 0);
// Задание б)
    printf("\n::: Обработанный массив:");
  int j=0;
      for (i = 0; i < n-1; i++){
	if(mass[i] == mass[i+1]){
	  for(j=i;j<n-2;j++)
	    mass[j]=mass[j+2];
	    n-=2;
	}
	printf(" [%d]", mass[j]);
      }
printf("\n::: %c[%d;%dm[В]%c[%dm :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n", 27, 8, 33, 27, 0);
// Задание в)
    printf("::: Обработанный массив:");
      for(i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
      }    
      printf("\n");
}
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39228773
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaCoOps,

Код: plaintext
1.
2.
3.
int n;
scanf("%d", &n);
int mass[n];



и этот участок кода у вас компилируется ?
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229042
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryJaCoOps,

Код: plaintext
1.
2.
3.
int n;
scanf("%d", &n);
int mass[n];



и этот участок кода у вас компилируется ?


теперь можно...
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229225
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivтеперь можно...
всего 50 лет с небольшим прошло (Algol, PL/1,....)
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229240
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercuryJaCoOps,

Код: plaintext
1.
2.
3.
int n;
scanf("%d", &n);
int mass[n];



и этот участок кода у вас компилируется ?


теперь можно...

В последнем стандарте описана такая возможность?
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229243
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZivпропущено...



теперь можно...

В последнем стандарте описана такая возможность?С99, вроде
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229248
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8 лет понадобилось чтобы сделать C-like printf (..) в Java
начиная с JDK 1.0 (23 января 1996) до анонса "Тигра"
J2SE 5.0 (30 сентября 2004).

Мдя... ох уж эти консерваторы.
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229249
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZivпропущено...



теперь можно...

В последнем стандарте описана такая возможность?
Вроде как есть в С99
Читай про Variable-length arrays
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229266
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanSashaMercuryпропущено...


В последнем стандарте описана такая возможность?С99, вроде

И всё-таки, это написано в стандарте или это расширение стандарта? Судя по тому, что я читал ранее в стандарте ISO/IEC 14882:2011 такой возможности не было. В данном случае n должна быть константой. Может быть что-то путаю конечно. Меня поправят. Но вообще, если это было в стандарте 99 года, не факт что это сохранилось в стандарте 11 года.


Если я ошибаюсь тогда, судя по тому, что написано по той ссылке, на стеке выделяется некий сегмент на момент декларации. Наверняка не маленький. А как быть в том случае, если потребуется создать массив размером MAX_VALUE_SIZE_T(здесь псевдомакроимя)? Или выделяется максимально возможный размер сегмента? Чем не угодили указатели? Неужели из-за безопасности?
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229273
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА как быть в том случае, если потребуется создать массив размером MAX_VALUE_SIZE_T
а кто сказал, что на стеке?
кто сказал, что стек один и является непрерывной областью памяти?
кто сказал, что у стека имеется аппаратная поддержка?
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229277
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропила кто сказал, что на стеке?
http://www.cplusplus.com/articles/iz3hAqkS/ Variable-length arrays
The variable-length arrays (or VLA's) are arrays that can be declared by using a variable, instead of a compile-time constant, for their size. They do not have variable length as in being able to resize.

VLA's are infamous because they're allocated on the stack and not the heap. The stack area is used for local variables, and is more limited in size than the heap. If the size of the VLA is too big, a stack overflow will occur, resulting in a crash.
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229284
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли я ошибаюсь тогда, судя по тому, что написано по той ссылке, на стеке выделяется некий сегмент на момент декларации. Наверняка не маленький. А как быть в том случае, если потребуется создать массив размером MAX_VALUE_SIZE_T(здесь псевдомакроимя)? Или выделяется максимально возможный размер сегмента? Чем не угодили указатели? Неужели из-за безопасности?
Думаю просто правится вершина стэка.

ИМХУ Сделали для удобства, т.к. часто бывает надо объявить локальный массив, размер которого заранее не известен.

Безопасность тут ни при чем, точнее она даже страдает из-за того что можно случайно переполнение стэка устроить.
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229287
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо вообще, если это было в стандарте 99 года, не факт что это сохранилось в стандарте 11 года.В C11 ее вынесли как необязательную языковую фичу. Для "подключения" использовать макрос __STDC_NO_VLA__

см. https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229291
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли я ошибаюсь тогда, судя по тому, что написано по той ссылке, на стеке выделяется некий сегмент на момент декларации. Наверняка не маленький. А как быть в том случае, если потребуется создать массив размером MAX_VALUE_SIZE_T(здесь псевдомакроимя)? Или выделяется максимально возможный размер сегмента?см. https://en.wikipedia.org/wiki/Variable-length_array
см. alloca (еще тынц )
SashaMercuryЧем не угодили указатели? Неужели из-за безопасности? malloc() видать поднадоел (:
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229294
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanсм. alloca
Интересно что на языке Гавайцев аллоха означает и "привет
и "прощай".... что как-бе говорит нам..
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229298
Гость123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanВ C11 ее вынесли как необязательную языковую фичу. Для "подключения" использовать макрос __STDC_NO_VLA__


Не для подключения, а для определения поддерживает компилятор или нет.
C11 draft n1570__STDC_NO_VLA_ _ The integer constant 1, intended to indicate that the implementation does not support variable length arrays or variably modified types.
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229302
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость123,

Да, ашыпся (:
Спасибо.

P.S.
Кто Вы? Не узнаю Вас в гримме
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229511
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСудя по тому, что я читал ранее в стандарте ISO/IEC 14882:2011 такой возможности не было.так это стандарт С++, а в треде речь о С идёт.
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229529
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanSSЧем не угодили указатели? Неужели из-за безопасности? malloc() видать поднадоел (:

Свежо придание да верится с трудом. Usman, спасибо вам за ссылки на w, однако доверять им нельзя, это ни в коем случае не достоверный источник

egorych так это стандарт С++, а в треде речь о С идёт.

В ISO/IEC 9899:2011 не встречал такого, сейчас проверю ещё раз
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229531
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanSashaMercuryНо вообще, если это было в стандарте 99 года, не факт что это сохранилось в стандарте 11 года.В C11 ее вынесли как необязательную языковую фичу. Для "подключения" использовать макрос __STDC_NO_VLA__

см. https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features

Доступ к элементу массиву с использованием оператора [] - 'необязательная языковая фича', а это существенная возможность языка. На мой взгляд, ничего хорошего в такой возможности нет
...
Рейтинг: 0 / 0
Си/поменять два элемента массива местами
    #39229533
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ISO/IEC 9899:2011 If the size is not present, the array type is an incomplete type. If the size is * instead of
being an expression, the array type is a variable length array type of unspecified size,
which can only be used in declarations or type names with function prototype scope;143)
such arrays are nonetheless complete types. If the size is an integer constant expression
and the element type has a known constant size, the array type is not a variable length
array type; otherwise, the array type is a variable length array type. (Variable length
arrays are a conditional feature that implementations need not support; see 6.10.8.3.)


143) Thus, * can be used only in function declarations that are not definitions (see 6.7.6.3).


ISO/IEC 9899:2011, p.132, example
Код: plaintext
1.
void fvla(int m, int C[m][m]); // valid: VLA with prototype scope
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си/поменять два элемента массива местами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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