Веб программирование

Лаб. по С: Одномерные массивы

 
 

Вступление

   С недавних пор меня пару раз посетила мысль: "Отчего бы не выложить лабораторки, которые я писал? Возможно, они смогут кому-нибудь помочь." Итак, поехали!

Имеется задача

   Даны натуральное число N (N<=30), массив A(2N), два числа X и Y. Первые N элементов массива А содержат значения аргумента некоторой функции (они упорядочены по возрастанию). Следующие N элементов – соответствующие значения функции. Данные X(i) и Y(i) – это значение аргумента и соответствующее ему значение функции. Необходимо вставить в первую половину массива А аргумент X (сохранив упорядоченность по возрастанию) и на соответствующее место во вторую половину массива - Y.

Первые впечатления и решение

   После того, как вы подумали: "%Зачем% мне это нужно" и "Что это за %задача%", отбросим страхи и сомнения и начнем в этом разбираться более подробно.

   Имеется некий массив размера 2*n, в который нужно добавить еще 2 элемента, поэтому итоговый размер массива будет равняться 2*n+2. Поскольку размер массива в Си изменять нельзя, зададим максимальный размер равным 62 (30*2+2).

   Каким же образом выглядит внутреннее устройство этого массива? Продемонстрирую:

   Остается лишь написать код, который:

  1. Находит позицию вставки аргумента;
  2. Смещает элементы, освобождая место под X и Y (удобнее реализовать с конца массива);
  3. Выводит результат.

Итог:


#include <stdio.h>

void main(void) {
	int array[62], x, y;
	int i = 0, n, startindex = -1;

	do {
		printf("nВведите N (2...30) >>n");
		scanf("%d", &n);
	} while(n < 2 || n > 30);

	printf("nВведите элементы массива [%d] >>n", n*2);
	for(; i < n*2; i++) scanf("%d", (array + i));

	printf("nВведите X, Y >>n");
	scanf("%d%d", &x, &y);

  //нахождение позиции вставки аргумента
	for(i = 0; i < n; i++) {
		printf("n%d / %d", x, array[i]);
		if(x < array[i]) {
			startindex = i;
			printf(" startindex = %d", startindex);
			break;
		}
	}
	if(startindex == -1) startindex = n;

  //вставка аргумента, смещения массива
	for(i = n*2+1; i >= (n + startindex); i--) array[i] = array[i-2];
	array[n + startindex + 1] = y;
	
	for(i = n+startindex; i >= startindex; i--) array[i] = array[i-1];
	array[startindex] = x;

	printf("nРезультат:n");
	for(i = 0; i < n*2+2; i++) printf("%d  ", array[i]);

	printf("nДля выхода из программы введите любой символ и нажмите Enter >> ");
	scanf("%d", &n);
} //main func

О неосмысленном и непонятном для вас мусоре в коде прошу отписываться в комментариях. Удачи!


Есть вопросы? Спроси на нашем форуме!!
admin1310 [21.03.2013 14:23]

Идея интересная, тем более на сайте много учащихся ))
Может отдельный раздел сделать для студентов ? )

Coolhacker770 [21.03.2013 14:36]

Мой дорогой друг, да ты болен. И все симптомы налицо!
С сожалением констатирую: у тебя разделофилия :D :D

admin1310 [21.03.2013 15:23]

Не знаю не знаю )) Когда я учился постоянно искал такие лабораторки ) Особенно перед сессией, и по дибильным языкам типа пролога или лиспа.

Coolhacker770 [21.03.2013 15:50]

Прекрасен лисп, не трожь его) И все же у тебя разделофилия. Пихай в С++.

admin1310 [21.03.2013 15:55]

Ох и попил кровушки на сессии мне твой лисп )))))))))
---
Ну как хочешь ))) Выложил С++

admin1310 [21.03.2013 15:56]

Я бы туда свой диплом по PHP выложил ))))

EverybodyLies280 [21.03.2013 15:57]

Лишь пара лаб да одинокий диплом)



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.