Вопрос 21(8). Технология Real. Динамическая модель

5. Message sequence chart

 
 

Указываются: вид сообщения (с параметрами), интервалы между сообщениями, максимальное время ожидания и т.д.

Нужно рисовать все возможные сценарии, чтобы система не падала при любых внешних воздействиях. Надо рисовать как можно больше (и дольше). Надо понять, всё ли мы учли.

“What if” – анализ “что, если”.

Это – первооснова системы. Здесь ещё нет алгоритмов её работы. Но есть поведение системы в целом.

MSC даёт материал для написания тестов.

6. State transition diagram

Берём один объект из всех сценариев поведения. Пытаемся описать только его поведение. Делим его на устойчивые состояния, рисуем диаграмму переходов: откуда куда переходит объект, получив какое-то сообщение.

 
 

Реально переходы занимают какое-то время. Мы даём объекту закончить переход.

Переход 5 ® 6 тоже важен: можно сделать много состояний, можно мало; плохо, когда один переход занимает много операций, а остальные – мало (нужно вводить дополнительные состояния).

Главная работа проектировщика – переход от 5 к 6.

7. Specification and description language(SDL)

 
 

Состояния приёма, посылки сигнала Þ можно моделировать работу параллельных процессов.

На диаграмме должны быть видны пути передачи сигналов.

Если 6 выполнено хорошо, то переход 6 ® 7 не сложен.

В RTST было по сути только 4 и 7, т.н. semantic gap (семантический разрыв). В REAL есть ещё 5 и 6.

Конечная автоматная SDL-модель – удобное выразительное средство для рисования событийной логики системы.

8. Конвертер из SDL в объектный программный код

Почему сложно: посылка-приём сообщения ~ 300 команд.

Удалось найти сужение, основываясь на ограничениях (переходы короткие, есть только 20% критичных объектов, можно локализовать данные), т.е. учитываем специфику предметной области. Применяется не свёртка-развёртка. Есть только один объект – ФПО (функциональное ПО), остальные объекты – вызов процедуры (~ 30 команд).

Практические задания.

Задача 1. Дан массив чисел а0,...,аn-1. Выяснить, имеются ли в данном массиве два идущих подряд положительных элемента. Подсчитать количество таких пар.

<?php
$x=array();
for($i=0;$i<10;$i++)
$x[$i]=rand(-50,50);
$n=count($x);
echo "N=$n<br>";
$p=0;
for($i=0;$i<$n-1;$i++){
echo"$i|$x[$i]<br>";
if($x[$i]>0 and $x[$i+1]>0) $p++;
}
echo"$i|$x[$i]<br>";
echo "Количество пар - $p";
?>

Задача 2. Даны действительные числа а0,...,аn-1. Вычислить сумму положительных и произведение четных членов данного массива. Если таких членов нет, то выдать сообщение.

<?php
$n=10;
$x=array();
for($i=0;$i<$n;$i++)
$x[$i]=rand(-50,50);
$s=0;
$p=1;
for($i=0;$i<$n;$i++){
echo "$i|$x[$i]<br>";
if($x[$i]>0) $s+=$x[$i];
$r=2*(int)($x[$i]/2);
if($x[$i]==$r) $p*=$x[$i];
}
if($s==0)
echo "Нет положительных чисел<br>";
else
echo "Сумма положительных чисел: $s <br>";
if($p==1)
echo "Нет четных чисел<br>";
else
echo "Произведение четных чисел: $p";
?>

Задача 3. Если в данном массиве действительных чисел а0,...,аn-1 есть хотя бы один член, меньший чем -2, то все отрицательные члены заменить их квадратами.

<?php
$x=array();
for($i=0;$i<10;$i++)
$x[$i]=rand(-15,50);
$n=count($x);
for($i=0;$i<$n;$i++)
echo "$i|$x[$i]<br>";
$fl=0;
$i=0;
while($fl==0 && $i<$n){
if($x[$i]<-2) $fl=1;
$i++;
}
echo "<p>";
if($fl==1){
for($i=0;$i<$n;$i++)
if($x[$i]<0) $x[$i]*=$x[$i];
}
for($i=0;$i<$n;$i++)
echo "$i|$x[$i]<br>";
?>

Задача 4. Сформировать в программе массив из целых чисел от 2 до N. Подсчитать сумму квадpатов четных и сумму квадратов нечетных чисел.

<?php
$N=12;
$N-=1;
for($i=0;$i<$N;$i++)
$x[$i]=$i+2;
for($i=0;$i<$N;$i++)
echo "$i|$x[$i]<br>";
$sum_even=0;
$sum_odd=0;
for($i=0;$i<$N;$i+=2)
$sum_even+=$x[$i]*$x[$i];
for($i=1;$i<$N-1;$i+=2)
$sum_odd+=$x[$i]*$x[$i];
echo "Сумма квадратов четных чисел: $sum_even<br>";
echo "Сумма квадратов нечетных чисел: $sum_odd<br>";
?>

Задача 5. Массив а0,...,а23 содержит данные измерения температуры воздуха в течение дня. Найти максимальную, минимальную и среднюю температуру воздуха.

<?php
$N=24;
for($i=0;$i<$N;$i++)
$x[$i]=rand(22,38);
for($i=0;$i<$N;$i++)
echo "$i, $x[$i]<br>";
$max=$x[0];
$min=$x[0];
$s=$x[0];
for($i=1;$i<$N;$i++){
if($max<$x[$i]) $max=$x[$i];
if($min>$x[$i]) $min=$x[$i];
$s+=$x[$i];
}
$avg=$s/$N;
echo "Max = $max<br>";
echo "Min = $min<br>";
echo "Среднее арифметическое = $avg<br>";
?>

Задача 6. Дан массив целых чисел а0,...,аn-1. Выяснить имеется ли в данном массиве хотя бы одно нечетное отрицательное число и определить его местонахождение в массиве.

<?php
$N=10;
for($i=0;$i<$N;$i++)
$x[$i]=rand(-22,22);
for($i=0;$i<$N;$i++)
echo "$i, $x[$i]<br>";
$i=0;
$flag=true;
while($i<$N && $flag){
if($x[$i]<0){
$r=2*(int)($x[$i]/2);
if($x[$i]<>$r) $flag=false;
}
$i++;
}
if(!$flag) echo "INDEX: ",$i-1;
?>

Задача 7. Дан массив целых чисел а0,...,аn-1. Найти количество и сумму тех членов данного массива, которые делятся на 5 и не делятся на 7.

<?php
$n=10;
$x=array();
for($i=0;$i<$n;$i++)
$x[$i]=rand(1,40);
for($i=0;$i<$n;$i++)
echo"$i|$x[$i] <br>";
$i=0;
$p=0;
$s=0;
while($i<$n) {
$r=5*(int)($x[$i]/5);
if($x[$i]==$r)
if($r<>7*(int)($r/7)) {
$s+=$r;
$p++;
}
$i++;
}
echo "Количество: $s<br>";
echo "Сумма: $p<br>";
?>

Задача 8. Дан массив действительных чисел а0,...,аn-1. Получить количество отрицательных членов данного массива и пpоизведение элементов, принадлежащих отрезку [b,d].

<?php
$n=10;
for($i=0;$i<$n;$i++)
$x[$i]=rand(-10,20);
for($i=0;$i<$n;$i++)
echo "$i|$x[$i]<br>";
$b=1;
$d=10;
$k=0;
$p=1;
for($i=0;$i<$n;$i++){
$r=$x[$i];
if($r<0) $k++;
if($r>=$b && $r<=$d) $p*=$r;
}
echo "Количество отрицательных элементов: $k";
echo "Произведение элементов из [b,d]: $p<br>";
?>

Задача 9. Дан массив целых чисел а0,...,аn-1. Найти все пары (аii+1), такие что аi<=3 и аi+1<0. Распечатать их значения и номеpа. Если таких паp нет, то выдать сообщение.

<?php
$N=10;
for($i=0; $i<$N; $i++)
echo $i,": ",$x[$i]=rand(-20,20),"<br>";
$fl=0;
for($i=0; $i<$N-1; $i++) {
if($x[$i]<=3 && $x[$i+1]<0) {
$fl=1;
echo "x[",$i,"]=",$x[$i]," x[",$i+1,"]=",$x[$i+1],"<br>";
}
}
if(!$fl)
echo "Требуемых пар не существует<br>";
?>

Задача 10. Дан массив целых чисел а0,...,аn-1. Найти все пары (аii+1),такие,что аi=0 и аi+1 кратно 2.

<?php
$N=10;
for($i=0; $i<$N; $i++)
echo $i,": ",$x[$i]=rand(-8,8),"<br>";
for($i=0; $i<$N-1; $i++)
if($x[$i]==0 && $x[$i+1]==2*(int)($x[$i+1]/2))
echo "x[",$i,"]=",$x[$i]," x[",$i+1,"]=",$x[$i+1],"<br>";
?>

Задача 11. Даны действительные числа а0,...,а15. Получить мах(а015, а114,..., а78).

<?php
$N=16;
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i]=rand(0,99),"<br>";
$max=$x[0]+$x[15];
echo "x[0]=",$x[0],"; x[",$N-1,"]=",$x[$N-1],"<br>";
$n=$N/2;
for($i=1;$i<$n;$i++){
$r=$x[$i]+$x[$N-$i-1];
if($max<$r) $max=$r;
echo "x[",$i,"]=",$x[$i],"; x[",$N-$i-1,"]=",$x[$N-$i-1],"<br>";
}
echo "Max = $max<br>";
?>

Задача 12. Даны целые числа а0,...,аn-1. Все члены массива а0,...,аn-1, предшествующие наименьшему числу, умножить на это число.

<?php
$N=20;
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i]=rand(0,99),"<br>";
$min=$x[0];
$index=0;
for($i=1;$i<$N;$i++)
if($min>$x[$i]) {
$min=$x[$i];
$index=$i;
}
echo "Min = $min, Index = $index<br>";
for($i=0;$i<$index;$i++)
$x[$i]*=$min;
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i],"<br>";
?>

Задача 13. Дан массив символов s0,..sn-1. Подсчитать сколько раз встречается в массиве символ К.

<?php
$s="Книгу купил Каримов Комил.";
$n=strlen($s);
$p=0;
for($i=0;$i<$n;$i++)
if($s[$i]=='К') $p++;
echo "Количество К - $p";
?>

Задача 14. Дан массив символов s0,..sn-1. Напечатать true, если в заданном массиве буква а встречается чаще, чем буква b, и напечатать false в противоположном случае.

<?php
$s="aaaaaaaaaaabrtbbdsabfabbresbbgadbabbab";
$count_a=0;
$count_b=0;
$n=strlen($s);
for($i=0;$i<$n;$i++)
if($s[$i]=='a')
$count_a++;
else if($s[$i]=='b')
$count_b++;
echo ($count_a>$count_b)?"true":"false";
?>

Задача 15. Даны действительные числа а0,...,а15. Получить мin(а08, а19,..., а715).

<?php
$N=16;
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i]=rand(0,99),"<br>";
$n=$N/2;
$min=$x[0]*$x[$n];
echo "x[0]=",$x[0],"; x[",$n,"]=",$x[$n],"<br>";
for($i=1;$i<$n;$i++){
$r=$x[$i]*$x[$n+$i];
if($min>$r) $min=$r;
echo "x[",$i,"]=",$x[$i],"; x[",$n+$i,"]=",$x[$n+$i],"<br>";
}
echo "Min = $min<br>";
?>

Задача 16. Дан массив действительных чисел а0,...,аn-1. Выяснить, верно ли, что наибольший член данного массива по модулю больше единицы.

<?php
$N=16;
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i]=rand(-50,5)/50,"<br>";
$max=$x[0];
for($i=1;$i<$N;$i++)
if($max<$x[$i]) $max=$x[$i];
echo "Наибольший элемент массива по модулю ",abs($max),
(abs($max)>1)?" больше":" меньше"," единицы";
?>

Задача 17. Дан массив действительных чисел а0,...,аn-1. Найти минимальное значение элементов массива, принадлежащих интервалу (c1,c2) и заменить все элементы массива, находящиеся в интервале (c1,c2), на это число. Исходный и скорректированный массивы напечатать.

<?php
$N=20;
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i]=rand(-200,200)/100,"<br>";
$c1=-.2;
$c2=.2;
$fl=true;
$j=0;
for($i=0;$i<$N;$i++)
if($x[$i]>$c1 && $x[$i]<$c2) {
$k[$j++]=$i;
if($fl) {
$fl=false;
$min=$x[$i];
}
else if($min>$x[$i])
$min=$x[$i];
}
if($fl)
echo "Ни один элемент массива не принадлежит массиву ($c1,$c2).";
else {
$n=count($k);
for($i=0;$i<$n;$i++)
$x[$k[$i]]=$min;
echo "Наименьший элемент массива, принадлежащий интервалу ($c1,$c2): $min<br>";
echo "Новый массив:<br>";
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i],"<br>";
}
?>

Задача 18. Дан массив действительных чисел а0,...,аn-1. Определить месторасположение первого элемента данного массива, который больше 100. Этот и все последующие элементы разделить на 100. Исходный и скорректированный массивы напечатать.

<?php
$N=10;
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i]=rand(0,110),"<br>";
$i=0;
while($i<$N && $x[$i]<=100)
$i++;
if($i<$N) {
for($j=$i; $j<$N; $j++)
$x[$j]/=100;
echo "Новый массив:<br>";
for($i=0; $i<$N; $i++)
echo $i," | ",$x[$i],"<br>";
}
?>

Задача 19. Дан массив целых чисел а0,...,аn-1. Найти в данной последовательности все пары (аii+1), такие, что аii+1 кратно 10.

<?php
$N=10;
for($i=0; $i<$N; $i++)
echo $i,"| ",$x[$i]=rand(-50,50),"<br>";
for($i=0; $i<$N-1; $i++) {
$r=$x[$i]*$x[$i+1];
if($r==10*(int)($r/10))
echo "x[",$i,"]=",$x[$i]," x[",$i+1,"]=",$x[$i+1],"<br>";

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: