Лабораторная работа №41
.doc
Министерство Образования РФ
Санкт- Петербургский государственный
электротехнический университет “ЛЭТИ”
ФКТИ
Кафедра ВТ
Отчет по лабораторной работе №4
“Указатели и двумерные массивы в языке Си”
По дисциплине “Программирование”
Выполнил:
студент группы 3371,
Артемьев Ю.Г
Проверил:
Сискович Т.И.
Санкт – Петербург
2003
Цель работы:
Изучение указателей и динамической памяти в двумерных массивах в языке Си.
Задание:
Написать программу с использованием указателей с выделением динамической памяти, которая многократно по желанию пользователя выполняет ввод двумерного массива, заданного пользователем, контрольный вывод, обработку массива, вывод результата.
Обработка массива:
Формирование в памяти компьютера нового двумерного массива, который удовлетворяет следующему условию: строки не должны включать заданный пользователем элемент.
Контрольные примеры:
-
Введенный массив:
3 4 7
2 5 9
3 1 24
Введите число, которое не должно содержаться в строке матрицы 4
Новый массив:
2 5 9
3 1 24
-
Введенный массив:
1 3 8
4 2 6
Введите число, которое не должно содержаться в строке матрицы 8
Новый массив:
4 2 6
-
Введенный массив:
3 4 7
2 5 9
3 1 24
Введите число, которое не должно содержаться в строке матрицы 3
Новый массив:
2 5 9
-
Введенный массив:
8 10 76
54 34 67
34 7 57
Введите число, которое не должно содержаться в строке матрицы 77
Новый массив:
8 10 76
54 34 67
34 7 57
Описание данных:
Имя переменной |
Тип переменной |
Назначение |
x |
int |
Указатель на двумерный массив |
c |
int |
Указатель на новый двумерный массива |
i |
int |
Номер строки элемента |
j |
int |
Номер столбца элемента |
m |
int |
Количество строк матрицы |
n |
int |
Количество столбцов матрицы |
b |
int |
Переменная, предназначенная для формирования нового двумерного массива |
a |
int |
Число, не содержащееся в строке новой матрице |
k |
int |
Счетчик строк новой матрицы. |
d |
unsigned char |
Символ, управляющий циклом выполн. всей прогр. |
Текст программы:
#include<conio.h>
#include<stdio.h>
#include<alloc.h>
void main (void)
{
int **x = NULL, **c = NULL, i, j, m, n, b=1, a;
unsigned char d;
do
{
clrscr();
do
{
printf( "\nВведите количество строк матрицы [1...50] " );
scanf ( "%d", &m );
}
while( m < 1 || m > 50 );
do
{
printf( "\nВведите количество столбцов матрицы [1...50] " );
scanf ( "%d", &n);
}
while( n < 1 || n > A );
x=(int**)malloc(n*sizeof(int*));
for( i = 0; i < m; i++ ) //Ввод двумерного массива.
{
x[i]=(int*)malloc(m*sizeof(int));
for( j = 0; j < n; j++ )
{
printf( "\nВведите элемент x[%i][%i] ", i+1, j+1 );
scanf( "%i", x[i]+j );
}
}
printf( "\nВведенный масив:\n");
for( i = 0; i < m; i++ ) //Вывод двумерного массива.
{
for( j = 0; j < n; j++ )
printf( "%6i", *(x[i]+j) );
printf( "\n");
}
//Формирование нового массива.
printf( "\nВведите число, которое не должно содержаться в строке матрицы ");
scanf( "%d", &a);
int k = 0;
for( i = 0; i < m; i++)
{
b = 0;
for( j = 0; j < n && !b; j++ )
{
if( *(x[i]+j) == a )
b = 1;
}
if( !b )
{
if( c == NULL )
c = (int**)malloc( (k+1) * sizeof(int*) );
else
c = (int**)realloc( c, (k+1) * sizeof(int*) );
c[k] = (int*)malloc( n * sizeof(int) );
for( j = 0; j < n; j++ )
*(c[k]+j) = *(x[i]+j);
k++;
}
}
if( k == 0 )
printf( "\nМассив пуст...\n" );
else
{
printf( "\nНовый массив:\n");
for( i = 0; i < k; i++ )
{
for( j = 0; j < n; j++ )
printf( "%6d", *(c[i]+j) );
printf( "\n");
}
}
printf( "Do you want continue to work with programm? y/n" );
d = getch();
}
while( d == 'y' || d == 'Y' );
}
Результат решения задачи:
При многократном вводе двумерного массива и переменной результаты совпали с контрольными примерами.
Заключение:
При выполнении поставленной задачи получены практические навыки в использовании указателей и в выделении динамической памяти в двумерных массивах в языке Си.