Практика программирования (Бейсик, Си, Паскаль)



         

Задачи, советы и ответы - часть 31


begin show(b[j],2);

break;

end;

m2: input; { Ввод последующих ходов игрока }

step345; { Последующие ходы программы }

goto m2;

end.

Задание 4.13. Слияние массивов

Составить процедуру, которая объединяет два предварительно упорядоченных по возрастанию массива, получая в результате массив с возрастающими по величине элементами.

Совет 1 (общий)

Если в объединяемых массивах находится соответственно тип элементов, то процедура слияния потребует m+n шагов. На первом шаге сравниваются первые элементы сливаемых массивов и меньший из них переписывается в результирующий массив. Перед очередным сравнением необходимо переместить

текущий указатель в массиве, из которого на предыдущем шаге был выбран минимальный элемент. Однако предварительно разумно проверить, не исчерпан ли уже один из массивов.

Программа 4_13.bas

DECLARE SUB MERGE (A%(),NA%,B%(),NB%,C%())

DEFINT A-Z

CLS

NA=3:

DIM A(NA)

DATA 0,2,4

FOR K=0 TO NA-1: READ A(K): PRINT A(K); : NEXT K: PRINT

NB=4

DIM B(NB)

DATA 1,3,5,7

FOR K=0 TO NB-1: READ B(K): PRINT B(K); : NEXT K: PRINT

DIM C(NA+NB)

MERGE A(),NA,B(),NB,C()

FOR K=0 TO NA+NB-1: PRINT C(K); : NEXT К

END

SUB MERGE(A(),NA,В(),NB,С())

JA=0: JB=0

FOR JC=0 TO NA+NB-1

IF JA=NA THEN GOTO MB

IF JB=NB THEN GOTO MA

IF A(JA)<B(JB) THEN GOTO MA MB: C(JC)=B(JB): JB=JB+1: GOTO M1 MA: C(JC)=A(JA): JA=JA+1: Ml:

NEXT JC

END SUB

Программа 4_13.с

#include <stdio.h>

#include <conio.h>

void merge(int *a,int ka,int *b,int kb,int *c);

main() {

#define na 3

#define nb 4

int j,a[na]={0,2,4},b[nb]={l,3,5,7},c[na+nb];

clrscr();

for(j=0; j<na; j++)

printf("%4d",a[j]);

printf("\n");

for(j=0; j<nb; j++)

printf("%4d",b[j]);

printf("\n");

merge(a,na,b,nb,c);

for(j=0; j<na+nb; j++)

printf("%4d",с[j]);

getch(); }

void merge(int *a,int ka,int *b,int kb,int *c) {

int ja=0,jb=0,jc;

for(jc=0; jc<ka+kb; jc++) {

if (ja==ka) goto mb;




Содержание  Назад  Вперед