Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы_по_проге_Берлин / Книги / учебное пособие ОАиП.pdf
Скачиваний:
49
Добавлен:
11.02.2015
Размер:
947 Кб
Скачать

{printf("Вводите элемент [%d][%d]= ",i,j);

do { fflush(stdin); } while(!scanf("%d",*(p+i)+j));

}

clrscr();

printf("\nВведенный массив"); for(i=0;i<n;i++) // вывод массива

{printf("\n");

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

printf("%3d",*(*(p+i)+j));

}

 

 

k=0;

 

 

s1=*(*p+1);

//для поиска max ст-ца выше диагонали

s2=*(*(p+n-1)+s-2); //для поиска min ст-ца ниже диагонали

j1=1; j2=s-2;

//номера анализируемых ст-цов

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

 

 

{ for(i=0;i<n;i++)

 

 

if(i!=j) k+=*(*(p+i)+j);

//выбран для суммы не элемент диагонали

else

 

 

{ if(s1<k) {s1=k; j1=j;}

// оценка значения выше диагонали

k=0;

 

// т.к. выбран элемент диагонали

}

 

 

if(s2>k && j<s-1) {s2=k; j2=j;} // остальные элементы ниже диагонали k=0; // сброс суммы

}

for(i=0;i<n;i++)

{if(i<j1) *(*(p+i)+j1)=0; if(i>j2) *(*(p+i)+j2)=0;

}

printf("\n\nПреобразованный массив"); for(i=0;i<n;i++) // вывод массива { printf("\n");

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

printf("%3d",*(*(p+i)+j));

}

for(i=0;i<n;i++) free(*(p+i)); free(p); getch();

}

Символьные строки

В С(С++) для работы со строками обычно используются указатели char*: char* str;

Как и обычный указатель, указатель на тип char может быть инициализирован при его описании. Для этого используется строковая константа, при этом адрес ее первого символа будет присвоен указателю, например:

char *str="строка";

При этом выделяется память для строки размером семь байт и указатель инициализируется адресом символа с. Признаком окончания символьной строки является нуль-символ (\0). При его отсутствии информация в массиве будет являться набором символов, но не символьной строкой. В выражениях, где применяется указатель, компилятор подставляет адрес константы. Строковая константа - это любое выражение, заключенное в двойные кавычки. При встрече строковой константы ее символы и символ ’\0’ записываются в последовательные ячейки памяти. Строковые константы размещаются в статической памяти.

Также можно создать массив указателей типа char (массив строк). char *str[5]; // массив из 5-ти указателей

Инициализацию массива строк (массива указателей char*) можно выполнить следующим образом:

char str1[][8]={"строка1","строка2"}; char *str2[2];

str2[0]="строка1"; str2[1]="строка2”;

сhar *str3[2]={ "строка1","строка2"};

Строковая константа, как и любая другая константа в С(С++), может быть также определена с помощью директивы #define, например:

#define st1 ”Минск” #define st2 ”каф. ЭВМ”

В чем состоит отличие объявления символьной строки через указатель на тип char и с использованием массива типа char. Эти два подхода имеют общие стороны: имя массива является также указателем. В то же время имя массива (например, mas) является константным значением. То есть мы не можем изменить значение mas, так как это по существу означало бы изменение адреса массива в памяти. Следовательно, для доступа к очередному элементу массива можно использовать выражение вида mas+1, но не ++mas.

При использовании указателей происходит выделение в статической области не только памяти под строку, но и под переменную str, являющуюся указателем на строку. При этом значение этой переменной может изменяться, таким образом ++str будет указывать на следующий символ строки.

Ввод/вывод строк.

Ранее мы рассматривали функции ввода/вывода информации (scanf(), printf(), getchar(), putcchar()), которые могут быть с успехом использованы при вводе символьных строк. Кроме этих функций, в С(С++) имеется еще одна пара функций (gets(), puts()), предназначенных для ввода/вывода символьных строк. Функция gets читает все символы до тех пор, пока во входном потоке не встретится символ ’\n’ (нажатие клавиши Enter), после этого символ ’\n’ заменяется на ноль-символ (\0) и функция gets передает введеннную строку символов вызывающей функции. Ниже рассмотрен пример с несколькими вариантами использования функции gets():

#include <stdio.h>