Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Visual_Studio_2010

.pdf
Скачиваний:
71
Добавлен:
03.03.2016
Размер:
5.94 Mб
Скачать

3.Сгенерируйте массив целых чисел размера N из интервала кодов строчных букв латинского алфавита, где N – число букв Вашей фамилии. Из сформированного массива выведите коды полученных букв и сами буквы. Отсортируйте полученные буквы по возрастанию их кодов с помощью указателей.

Пример 3. Написать программу заполнения матрицы по спирали натуральными числами с помощью массива указателей.

Программный код решения примера

#include <stdio.h> #include <conio.h>

#define n 15

int

main(void) {

int

i = 1, I, j, k,

p =

n/2;

int

M[n][n], *ptr[n*n];

// Обнуление матрицы и инициализация указателя for (I = 0; I < n; ++I)

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

{ M[I][j] = 0; ptr[I*n + j] = &M[I][j];}

for (k = 1; k <= p; k++) // Число спиралей

{

//Верхний горизонтальный столбец for (j = (k-1); j < (n-k+1); j++) *ptr[(k-1)*n + j] = i++;

//Правый верхний столбец

for (j = k; j < (n-k+1); j++) *ptr[j*n + (n-k)] = i++;

//Нижний горизонтальный столбец for (j = (n-k-1); j >= (k-1); --j)

*ptr[(n-k)*n + j] = i++;

//Левый верхний столбец

for (j = (n-k-1); j >= k; j--) *ptr[j*n + (k-1)] = i++; }

if ( n % 2 ) *ptr[p*n + p] = n*n;

printf("\n\t Spiral matrix of dimention (%d x %d):\n\n",n,n);

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

{if (n*n < 20*20){ printf("%4d", *ptr[i*n + j]); if (j == (n-1)) printf("\n");}

131

else if (n*n >= 20*20) goto mes;

}

mes: if (n > 19)

printf("\n\t It is a large matrix. Can not to see on display.\n");

printf("\n Press any key: "); _getch();

return 0;

}

Результат выполнения программы показан на рис.8.3.

Рис.8.3. Пример заполнения матрицы по спирали

В программе использован оператор безусловного перехода goto, чтобы выйти из вложенных циклов, когда размерность матрицы велика и не может быть размещена на экране дисплея.

Задание3

1.Проверьте программу при размерности матрицы от 3 до 19 и более.

2.Выведите на дисплей матрицу M[n][n]. Объясните результат.

3.Дополните программу: создайте матрицу и заполните ее по спирали натуральными числами с помощью массива указателей, который использовался для взятия адресов элементов исходной матрицы М[n][n]. Объявите матрицу с начальной буквой Вашей фамилии (набранной латиницей). Выведите матрицу на дисплей.

4.Напишите программу заполнения матрицы по спирали и против часовой стрелки натуральными числами с помощью массива указателей.

132

5.Дополните программу расчетом количества четных элементов выше главной диагонали матрицы и количества нечетных элементов ниже главной диагонали, не включая саму диагональ, с помощью указателей.

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

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

8.Дополните программу подсчетом суммы элементов диагонали матрицы. Осуществите вывод результата на дисплей.

Пр и м е ч а н и е . Сумма диагональных элементов квадратной матрицы называется следом (шпуром) матрицы.

Пример 4. Написать программу заполнения целочисленной прямоугольной матрицы размером не более 15× 14 из интервала [–12; 12] с помощью операции разыменования.

Программный код решения примера

#include <stdio.h> #include <conio.h>

#include <stdlib.h>

#include <time.h>

#define N 15

#define M 14

const int Left = -12; const int Right = 12;

int main(void) { int i, j, n, m; int matr[N][M];

time_t t; // переменная системного времени

srand((unsigned)time(&t)); // для рандомизации случайных чисел

printf("\n Enter the number of lines of the matrix is not more than %d: ", N);

scanf_s("%d", &n);

printf(" Enter the number of columns of the matrix is not more than %d: ", M);

scanf_s("%d", &m);

// Контроль ввода допустимой размерности if (n > N || m > M || n < 1 || m < 1)

{

printf("\n\t Data error! Repeat please.\n Press any key: ");

_getch(); return -1;

}

133

for (i = 0; i <

n; ++i)

for (j = 0; j

< m; ++j)

*(*(matr +

i) + j) = 0;

for (i = 0; i <

n; ++i)

 

 

for (j = 0; j

< m; ++j)

*(*(matr +

i) + j) = (rand() % (2*Right+1)) + Left;

 

 

printf("\n The matrix of random whole numbers from the entire [%d, %d]:\n", Left, Right);

for (i = 0; i < n; ++i) { printf("\n ");

for (j = 0; j < m; ++j) printf("%5d", *(*(matr + i) + j));

}

printf("\n\n Press any key: ");

_getch(); return 0;

}

В программе использованы спецификаторы const для объявления неизменяемых переменных.

Возможный результат выполнения программы представлен на рис.8.4.

Рис. 8.4. Матрица случайных целых чисел

Задание4

1.Проверьте режим ошибочного ввода размерности матрицы.

2.Осуществите перевод значений сформированной матрицы n × m на новую строку на основе оператора условия ?.

3.Подсчитайте количество отрицательных и положительных чисел. Учтите также подсчет количества нулей.

134

4.Предусмотрите изменение интервала последовательности случайных чисел, генерируемой функцией rand(), для чего осуществите ввод границ интервала с клавиатуры.

5.В сформированной матрице найдите минимальные и максимальные числа с определением их индексов расположения в матрице.

Пример 5. Написать программу умножения целочисленных матриц с использованием указателей [5].

Условием перемножения двух матриц А и В является равенство числа столбцов матрицы А и числа строк матрицы В. Если первая матрица А имеет размер n × k, то вторая матрица В должна иметь размер k × m. В результате перемножения получим матрицу С размера n × m. Приведем схему по размерностям:

C = AB = (m k) (k n) = m n.

Поэлементное перемножение двух матриц в стандартной математической форме имеет вид

n

 

 

Cij aik bkj ,

i 1, 2, , n,

j 1, 2, , m.

k1

Сучетом синтаксиса формирования массивов в языке С индексация должна начинаться с нуля, поэтому формулу перепишем в следующем виде:

n 1

 

 

Cij aik bkj ,

i 0,1, 2, , n 1,

j 0, 1, 2, , m 1.

k 0

 

 

Программный код решения примера

#include <stdio.h>

#include <conio.h>

#define n 7 #define k 12

#define m 4

int main(void) { int i, j, p;

int A[n*k], B[k*m]; long int *C[n*m];

// Обнуление матриц for (i = 0; i < n; ++i)

for(j = 0; j < m; ++j) C[i*m + j] = 0;

135

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

A[i*k + j] = 0;

for (i = 0; i < k; ++i) for (j = 0; j < m; ++j)

B[i*m + j] = 0;

// Заполнение матриц целыми числами for (i = 0; i < n; ++i)

for (j = 0; j < k; ++j) A[i*k + j] = i + j - 6;

for (i = 0; i < k; ++i) for (j = 0; j < m; ++j)

B[i*m + j] = i + j - 11;

// Циклы перемножения с накоплением суммы for (i = 0; i < n; ++i)

for (j = 0; j < m; ++j) { C[i*m + j] = 0; for (p = 0; p < k; ++p)

C[i*m + j] += (A[i*k + p] * B[p*m + j]);

}

printf("\n\t The result of multiplying the two matrices:\n\t\t C = A*B (%dx%d = %dx%d * %dx%d)\n", n, m, n, k, k, m);

for (i = 0; i < n; ++i) { printf("\n\t");

for (j = 0; j < m; ++j) printf("%6ld", C[i*m + j]);

}

printf("\n\n Press any key: "); _getch();

return 0;

}

Обнуление матриц и массива указателей позволяет заранее выделить память. Для вывода результата перемножения предусмотрен спецификатор ld.

Результат выполнения программы показан на рис.8.5.

Рис.8.5. Результат перемножения двух матриц

136

Задание5

1.Промежуточный размер k примите за 5Х, где Х – номер компьютера, на котором выполняется лабораторная работа. Предусмотрите корректный вывод результата перемножения двух матриц.

2.Вывод результата перемножения выполните на основе операции разыменования.

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

4.Включите нумерацию строк и столбцов (слева от матрицы и вверху над ней).

5.Проверьте работу программы без предварительного обнуления.

Пример 6. Написать программу формирования трех массивов, состоящих из матриц размерностей 4×8 и заполненных натуральными числами. Заполнение матриц выполнить по строкам последовательно для каждого из массивов. Предусмотреть вывод на консоль всех трех массивов и одного из массивов, номер которого задается пользователем с клавиатуры.

Для решения примера сформируем трехмерный массив размером 3 ×4×8 с помощью указателя, в котором левый размер будет равен 3, центральный – 4, а крайний правый – 8, например *PTR[3*4*8].

Программный код решения примера

#include <stdio.h>

#include <conio.h>

#define p 3 // количество "подшитых" матриц #define n 4 // число строк матрицы

#define m 8 // число столбцов матрицы

int main (void)

{

int i, j, k, r;

int *PTR[p*n*m], *M2[n*m];

// Заполнение одномерного массива for (i = 0; i < p*n*m; ++i)

PTR[i] = (int*)(i + 1);

printf("\n An array of dimension %dx%dx%d:\n", p, n, m); puts("===========================================");

// Разбивка массива

for (k = 0; k < p; ++k){ printf("\n"); for (i = 0; i < n; ++i) { printf(" ");

for (j = 0; j < m; ++j){

printf(" %3d ",PTR[k*n*m + i*m + j]);

}

printf("\n");

}

}

137

puts("===========================================");

printf("\n Select the number of arrays of a series of numbers

(%d...%d): ",1, p);

scanf_s("%d", &r);

printf("\n Matrix number %d from three-dimensional array:\n", r);

// Выбор матрицы из 3-мерного массива for (k = 0; k < p; ++k)

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

if ( k == (r-1))

{

M2[i*m + j] = PTR[k*n*m + i*m + j];

}

// Распечатка выбранной матрицы

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

{

printf("\n ");

for (j = 0; j < m; ++j) printf(" %3d ", M2[i*m + j]);

}

printf("\n\n Press any key: "); _getch();

return 0;

}

Трехмерный массив можно рассматривать как книгу с заданным количеством страниц (p = 3), размер которых определяется как матрица с заданным числом строк (n = 4) и заданным количеством столбцов ( m = 8). Страницы (матрицы) «сшиваются». С помощью указателя *PTR сначала формируется одномерный массив, который затем разбивается на заданное количество матриц. С помощью функций printf("\n") оcуществляется перевод на новую строку с помощью символа форматирования \n.

Заполнение одномерного массива указателей выполнено с приведением типов. Следует обратить внимание на выбор матрицы из трехмерного массива. В одномерном массиве указателя *PTR применена операция индексации так, чтобы обеспечить распечатку трехмерного массива.

138

Результат выполнения программы представлен на рис.8.6.

Рис. 8.6. Пример вывода данных трехмерного массива

Задание6

1.В программу включите проверку вводимого номера матрицы, т. е. чтобы число r принадлежало отрезку [1; 3].

2.В программу введите указатели с многоуровневой адресацией, например

***ptr3, **ptr2. Проверьте работу программы.

3.Количество строк матрицы примите равным 2Х, где Х – номер компьютера, на котором выполняется лабораторная работа.

4.Трехмерный массив заполните вещественными числами, равномерно распределенными в интервале [–3X; 3X], где Х – номер компьютера, на котором выполняется лабораторная работа.

5.С учетом предыдущего пункта определите минимальный и максимальный элементы трехмерного массива. Определите также индексы (k,i,j) этих элементов. Результаты выведите на консоль.

Пример 7. Написать программу поиска подстроки в строке, сформированной по случайному закону из 15 букв латинского алфавита, с помощью функции strstr(). В качестве подстроки принять первые три буквы своей фамилии.

Для работы с функцией strstr() требуется подключение заголовочно-

го файла string.h.

139

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h>

#include <stdlib.h> #include <time.h>

int main (void)

{

int i,

k = 0, n, in;

int numSTR; int N = 1000; int numA, numZ; char str[16]; char sub[4]; char *ptr;

srand((unsigned)time(NULL)); numA = (int)'a';

numZ = (int)'z';

printf("\n Enter the three letters: "); in = scanf_s("%s", sub, sizeof(sub)); if (in == 0)

{

printf("\n Error input. Press any key: ");

_getch(); exit(1);

}

printf("\n\t substring is \"%s\"\n", sub);

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

str[i] = numA + rand() % (numZ - numA) + 1;

str[i] = '\0'; // завершение строки нулевым символом

ptr = strstr(str, sub);

if (ptr != NULL)

{

numSTR = (int)(ptr - str +1); k++;

break;

}

}

if (k == 0)

printf("\n\t Substring \"%s\" not found", sub);

140

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]