Лабораторная работа №4
.docМинистерство образования РФ
Санкт-Петербургский государственный электротехнический университет
“ЛЭТИ”
Кафедра Вычислительной Техники
Лабораторная работа № 4
По дисциплине «Программирование»
«Указатели в языке Си»
Выполнил: Власюк А. В.
Преподаватель:
Сискович Т. И.
Факультет: КТИ
Группа: 3371
Санкт-Петербург
2003
Цель работы:
В ходе выполнения лабораторной работы студент должен научиться применять на практике указатели.
Задание на лабораторную работу:
Написать программу, выполняющую (по желанию пользователя) ввод матрицы размером (n x m), контрольный вывод исходной матрицы и формирование новой из тех столбцов исходной, в которых значения больше сумм их индексов. Вывести результат в виде двумерной матрицы. Память для массивов должна выделяться динамически.
Контрольный пример:
Длина исходного массива |
Высота исходного массива |
Элементы исходного массива |
Результат |
0 |
0 |
отсутствуют |
Неверные значения исходных параметров |
2 |
2 |
-1 2 |
Нет матрицы,удовлетворяющей данному условию |
2 |
2 |
1 3 |
2 3 |
2 |
3 |
|
|
3 |
3 |
0 -2 3 2 3 4 3 4 5 |
3 4 5 |
Описание данных:
переменная |
тип |
описание |
n |
int* |
количество строк исходного массива |
m |
int* |
количество столбцов исходного массива |
k |
int |
количество столбцов нового массива |
i |
int |
номер строки |
j |
int |
номер столбца |
a |
int |
исходный массив |
b |
int |
новый массив |
t |
int |
вспомогательная переменная |
s |
char |
символ управления циклом |
Текст программы:
#include<conio.h>
#include<stdio.h>
#include<alloc.h>
void main (void)
{
clrscr();
int**a,**b;
int i,j,n,m,k,c,t;
char s;
printf("\n\n\n\n\n Программа предназначенная для создания матрицы, ");
printf(" а также для формирования новой матрицы, ");
printf(" удовлетворяющей заданному условию ");
printf(" (значения в столбцах больше сумм их индексов) ");
getch();
clrscr();
//Ввод размеров массива
do
{
do
{
clrscr();
printf("\n\n\n\n\n Введите размер матрицы.\n ");
printf(" (n-количество строк,m-количество столбцов)");
printf("\nn= ");
scanf("%d",&n);
printf("m= ");
scanf("%d",&m);
if (n<=0||m<=0)
{
printf("\n Внимание!Неверные значения исходных параметров.");
printf("\n (Нажмите любую клавишу для продолжения) ");
getch();
clrscr();
}
printf("\n \n");
printf(" Изменить размеры матрицы? (y/n)");
s=getche();
}
while(s=='y'||s=='Y');
//Ввод массива
do
{
clrscr();
printf("\nВведите значения массива:\n");
a=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
{
*(a+i)=(int*)malloc(m*sizeof(int));
for(j=0;j<m;j++)
{
scanf("%d",*(a+i)+j);
}
}
//Вывод массива
printf("\n Контрольный вывод матрицы\n\n\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("a[%d][%d]=%d ",i,j,*(*(a+i)+j));
}
printf("\n\n");
}
printf(" \n Изменить введённую матрицу? (y/n) ");
s=getch();
}
while(s=='y'||s=='Y');
//Формирование нового массива
k=0;
b=(int**)malloc(m*sizeof(int*));
for(j=0;j<m;j++)
{
for(i=0,t=0;i<n&&!t;i++)
{
if (*(a[i]+j)<=(i+j)) t++; //условие отбора
}
if (!t)
{
*(b+k)=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
*(*(b+k)+i)=*(*(a+i)+j); //запись в новый массив
}
k++;
}
}
//Вывод нового массива
clrscr();
printf("\n\n\n Вывод исходной матрицы\n\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf(" a[%d][%d]=%d ",i,j,*(*(a+i)+j));
}
printf("\n");
}
printf("\n\n\n Вывод конечной матрицы\n\n");
if(k>0)
{
for(i=0;i<n;i++)
{
for(j=0;j<k;j++)
{
printf(" b[%d][%d]=%d ",i,j,*(b[j]+i));
}
printf("\n");
}
}
else
{
printf(" Нет матрицы,удовлетворяющей данному условию");
}
printf("\n\n Продолжить работу? (y/n) ");
s=getch();
printf("\n \n");
clrscr();
}
while(s=='y'||s=='Y');
}
Блок схема:
нет
да
нет
да
да
нет
да
нет
да
нет
да
нет
да
нет
нет
да
да
нет
нет
да
нет
да
нет
Пояснения:
Сообщение
1:
Программа
предназначенная
для создания матрицы,
а
также для формирования
новой матрицы,
удовлетворяющей
заданному условию
(значения
в столбцах больше сумм их индексов)
Сообщение
2:
Внимание!Неверные
значения
исходных параметров.
(Нажмите
любую клавишу для продолжения)
Сообщение
3:
Нет матрицы,удовлетворяющей данному
условию
Условие
1: Изменить
размеры матрицы? (y/n)
Условие
2:
Изменить введённую матрицу? (y/n)
Условие
3: if
(*(*(a+i)+j)<=(j+i))
Условие
4:
Продолжить работу? (y/n)
да
нет
да
нет
да
нет
да
нет
Результаты решения задачи:
Все полученные ответы совпадают с контрольными примерами.
Выводы:
Данная лабораторная работа позволяет программисту освоить указатели.