close

Вход

Забыли?

вход по аккаунту

?

Описание МРЗ вариант 13

код для вставкиСкачать
Вариант 13.
Задача №1. Дана действительная квадратная матрица порядка n, все элементы различны. Заполнить матрицу методом случайных чисел. Найти наибольший элемент среди стоящих на главной и побочной диагоналях и поменять его местами с элементом, стоящим на пересечении этих диагоналей.
Описание метода решения задачи
1. Выявляем исходные данные, результаты, назначаем им имена.
Исходные данные: квадратная матрица int mas [10][10] размерность матрицы: int n; Результаты: новая матрица, где наибольший элемент среди стоящих на главной и побочной диагоналях поменян с элементом, стоящим на пересечении этих диагоналей
2. Выбираем метод решения задачи, разбиваем на этапы (с учетом возможностей ЭВМ)
Первоначально составим укрупненную схему, а затем подробную для блоков IV, V
Укрупненная схема
I. Подключение всех необходимых заголовочных файлов
II. Глобальные описания переменных int mas[10][10],max; int n,p=0,r=0,q=0,w=0,per=0;
III. Определение размерности 2-го мерного массива IV. Элементы матрицы принимаются как случайные числа, вывод матрицы на экран в виде таблицы
V. Получение необходимого результата и вывод его на экран
IV. Вывод матрицы на экран в виде таблицы
for (int i=0; i<n; i++)
{ for (int j=0; j< n; j++)
{ mass[i][j]=random(50);
cout<<setw(5)<<mas [i][j];
}
cout<<endl;
}
V. 1. Так как алгоритм циклический, то выводим три набора формул и условие окончания (повторения) цикла. - рабочие формулы - нет, ничего не вычисляем
- закон изменения аргументов (переменных): i=i+1, j=j+1
- формулы для вычисления начальных значения аргументов (переменных): i:=0; j=0; max =-999; p=0, r=0, q=0, w=0, per=0;
- условие повторения цикла: i<n, j< m
2. МРЗ:
* поиск максимального значения среди элементов матрицы, стоящих на главной и побочной диагоналях и элемента, стоящего на пересечении диагоналей: используем алгоритм расчета всей матрицы - два цикла подряд, операторные скобки между ними не требуются
[блок присваивания переменным начальных значений]
цикл строк
цикл столбцов
- проверяем, элемент массива находится на главной диагонали? (i==j) ИЛИ на побочной диагонали? (i==n-j-1) И больше максимального значения? if (mas[i][j]>max) - это составное условие в программе запишется следующим образом:
if (((i==j) || (i==n-j-1)) && (mas[i][j]>max)), если Да, то в переменную max записываем это значение - max=mas[i][j]; и сохраняем в переменных p и r индексы - p=i; r=j; для последующей перестановки
- проверяем условие пересечения диагоналей - (i==j) && (i==n-j-1) и сохраняем в переменных q и w индексы - q=i; w=j; для проверки правильности поставленного условия сохраним в переменной per значение элемента массива per=mas[i][j];
* для проверки правильности решения задачи выводим на экран:
* максимальное значение, его индексы; * элемент массива, стоящий на пересечении диагоналей, его индексы
* производим перестановку: там, где стоял максимальный элемент, вставим элемент, стоящий на пересечении и наоборот на пересечение диагоналей вставим максимальный элемент. В программе это запишется следующим образом: mas[q][w]=max; mas[p][r]=per;
* выводим на экран измененный массив
Программа, реализующая данный алгоритм
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<iostream.h>
#include<iomanip.h>
int main()
{
clrscr();
randomize();
int mas[10][10],max; int n,p=0,r=0,q=0,w=0,per=0;
cout<<"Размерность массива n="; cin>>n;
printf("Исходная матрица:\n");
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
mas[i][j]=random(50);
cout<<setw(5)<<mas[i][j];
}
cout<<endl;
}
max=-999;
for (i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if (((i==j) || (i==n-j-1)) && (mas[i][j])>max)
{max=mas[i][j]; p=i; r=j;}
if ((i==j) && (i==n-j-1))
{q=i; w=j; per=mas[i][j];}
}
cout<<setw(9)<<" max главной и побочной="<<max;
cout<<" его индексы: i="<<p+1<<" j="<<r+1<<endl;
cout<<"пересечение: i="<<q+1<<" j="<<w+1<<" per="<<per<<endl;
mas[q][w]=max; //перестановка
mas[p][r]=per;
printf("результат:\n");
for (i=0; i<n; i++)
{
for (int j=0; j<n; j++)
cout<<setw(6)<<mas[i][j];
cout<<endl;
}
getch();
}
Задача №2. В строке, состоящей из слов "да" и "нет", заменить все "да" на "нет" Подсчитать, на сколько удлинилась строка.
Описание метода решения задачи
1. Выявляем исходные данные, результаты, назначаем им имена.
Исходные данные: исходная строка *str1- объявляется как указатель; переменная-указатель-*tmp, в неё будем записывать начальный адрес новой строки
len1- длина исходной строки
len2- длина полученной строки
k - определяет разность исходной и полученной строк
Результаты: новая строка str2
2. Выбираем метод решения задачи, разбиваем на этапы (с учетом возможностей ЭВМ)
Первоначально составим укрупненную схему, а затем подробную для блока III.
Укрупненная схема
I. Подключение всех необходимых заголовочных файлов
II. Глобальные описания переменных char *str1,*tmp,*str2; int k=0,len1=0,len2=0;
III. Получение необходимого результата и вывод его на экран
III. 1. МРЗ:
* вводим строку (gets(str1); функция считывает строку из stdin и записывает адрес str1, добавляя символ '\0')
* в переменной tmp сохраняем начальный адрес новой строки tmp= str2;
* в переменную len1 записываем длину исходной строки - len1=strlen(str1);
* в цикле "перебора элементов строки" - while(*str1 != '\0'):
- проверяем два символа *str1,*(str1+1), в программе это составное условие запишется следующим образом: if(*str1 == 'д' && *(str1+1)=='а')
и, если совпадение есть, то: в новую строку *str2 записываем символ "н" - *str2='н'. Увеличиваем адрес переменной str2 на одну ячейку str2++ и в строку *str2 записываем символ "е" *str2='е', вновь увеличиваем адрес переменной str2 на одну ячейку str2++ и снова записываем символ "т" по этому адресу *str2='т', таким образом, в новую строку *str2 будет посимвольно записано слово "нет"; после последнего записанного символа увеличиваем адрес переменной str2 на одну ячейку str2++ и исходную строку увеличиваем на один символ - str1+=1, так как строка удлинилась на один символ; иначе в новую строку переписываем символ из исходной строки - *str2=*str1; и увеличиваем адрес переменной str2 на одну ячейку str2++
- увеличиваем адрес переменной str1 на одну ячейку (str1++), иначе из цикла не выйдем * после окончания цикла "перебора элементов строки str1" в новую строку записываем символ конца строки (*str2='\0';)
* в переменную len2 записываем длину новой строки - len2=strlen(str2);
* вычисляем насколько удлинилась новая строка - k=len2-len1;
* вывод результата: - предварительно нужно перейти на начало новой строки - str2=tmp;
- выводим на экран новую строку str2 и сообщение "строка удлинилась на k символов";
Программа, реализующая данный алгоритм
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
void main()
{
char *str1,*tmp,*str2,*tmp2; int k=0,len1=0,len2=0;
clrscr();
printf("Введи строку ....\n");
gets(str1);
len1=strlen(str1);
tmp=str2;
while(*str1 !='\0')
{
if(*str1 == 'д' && *(str1+1)=='а')
{ *str2='н';str2++;*str2='е';str2++; *str2='т';str2++; str1+=1;}
else {*str2=*str1; str2++;}
str1++;
}
*str2='\0';
str2=tmp;
len2=strlen(str2);
k=len2-len1;
printf("\n%s",str2);
printf("\nСтрока удлинилась на =%d",k); printf(" символа(ов)");
getch();
}
Задача №3. Багаж пассажира характеризуется количеством вещей и общим весом вещей. Создать список, содержащий информацию о багаже нескольких пассажиров. Вывести этот список в виде таблицы. Выяснить, имеется ли пассажир, багаж которого превышает багаж каждого из остальных пассажиров и по числу вещей, и по весу. Если таких нет, то вывести сообщение об этом.
Документ
Категория
Рефераты
Просмотров
15
Размер файла
58 Кб
Теги
описание, вариант, мрз
1/--страниц
Пожаловаться на содержимое документа