Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Определите “смысл” приведенных ниже фрагментов программ.
Сформулируйте его в виде одной фразы, например: “Программа находит максимальное значение из элементов массива A”.
//--------------------------------------------------------1 cin >> a >> b; c=a; a=b; b=c; //--------------------------------------------------------2 c= A[i]; A[i]=A[i+1]; A[i+1]=c; //--------------------------------------------------------3 cin >> a >> b; if (a < b) c = b; else c = a; //--------------------------------------------------------4 cin >> a >> b; c = a; if (a > b) c = b; //--------------------------------------------------------5 if (a < 0) a = -a; //--------------------------------------------------------6 if (a > 0 ) a = a + 1; else a = a - 1; //--------------------------------------------------------7 for (i=1; i<10; i++) ...
// Переменная - минимум/максимум //---------------------------------------------------------8 for (i=0,s=0; i<10; i++) if (A[i]>s) s=A[i]; //---------------------------------------------------------9 for (i=1,k=0; i<10; i++) if (A[i]>A[k]) k=i; //---------------------------------------------------------10 for (i=0,k=-1; i<10; i++) { if (A[i]<0) continue; if (k==-1) k=i; else if (A[i]<A[k]) k=i; } //---------------------------------------------------------11 for (i=0,k=-1; i<10; i++) { if (A[i]<0) continue; if (k==-1 || A[i]<A[k]) k=i; }
// Переменная - счетчик //---------------------------------------------------------12 for (i=0,s=0; i<10; i++) if (A[i]>0) s++; //---------------------------------------------------------13 for (i=1,s=0; i<10; i++) if (A[i]>0 && A[i-1]<0) s++; //---------------------------------------------------------14 for (i=1,s=0,k=0; i<10; i++) { if (A[i-1]<A[i]) k++; else { if (k>s) s=k; k=0; } // Переменная -признак //---------------------------------------------------------15 for (i=0,s=0,k=0; i<10; i++) if (A[i]<0) k=1; else { if (k==1) s++;k=0; } // Переменная - накопитель //--------------------------------------------------------16 for (s=1, i=1; i<10; i++) s = s * i; //--------------------------------------------------------17 for (s=1, i=0; i<10; i++) s = s * 2; //--------------------------------------------------------18 for (s=0, i=0; i<10; i++) s = s + A[i]; //--------------------------------------------------------19 for (s=1, i=0; i < 10; i++) s = s * A[i]; //--------------------------------------------------------20 for (i=0, s=1; s < n; i++) s = s * 2;cout << i;
// Последовательности //---------------------------------------------------------21 for (i=0; A[i]!=0; i++) {...} //---------------------------------------------------------22 cin >> b; for (i=0; A[i]!=0; i++); A[i]=b; A[i+1]=0;
// Работа с цифрами числа //---------------------------------------------------------23 for (a=10; a<30000; a++) { for (n=a, s=0; n!=0; n=n/10) { k=n%10; s=s+k;} if (a==s*s*s) cout << a << "\n"; } //---------------------------------------------------------24 for (i=0, n=a; n!=0; i++, n=n/10); for (A[i--]=0, n=a; n!=0; i--, n=n/10) A[i]=n % 10;
// Признаки делимости //--------------------------------------------------------25 for (i=2; n % i !=0; i++); cout << i; //--------------------------------------------------------26 for (i=n1-1; !(n1 % i ==0 && n2 % i ==0); i--); cout << i; //--------------------------------------------------------27 i = n1; if (i < n2) i=n2; for (; !(i % n1 ==0 && i % n2 ==0); i++); cout << i; //--------------------------------------------------------28 for (i=0,a=2; a<10000; a++) { for (n=2; n<a; n++) { if (a%n==0) break; } if (n==a) A[i++]=a; } A[i]=0; //--------------------------------------------------------29 for (i=0,a=2; a<10000; a++) { for (j=0; j<i; j++) { if (a%A[j]==0) break; } if (j==i) A[i++]=a; } A[i]=0;
// Завершениецикла //--------------------------------------------------------30 for (s=0, i=0; i < 10 && A[i] >0; i++) s = s + A[i]; //--------------------------------------------------------31 for (s=0, i=0, k=0; i < 10 && k ==0; i++) { s = s + A[i]; if (A[i]<=0) k=1; }
// Свойства - "для всех" и "существует" //--------------------------------------------------------32 for (i=0; i<10; i++) if (A[i]<0) break; if (i==10) cout << "Хорошо!!!\n"; //--------------------------------------------------------33 for (i=2; i<a; i++) if (a%i==0) break; if (i==a) cout << "Хорошо!!!\n"; //--------------------------------------------------------34 for (n=a; n!=0; n/=10) { k=n%10; for (i=2; i<k; i++) if (k%i==0) break; if (k!=i) break; } if (n==0) cout << "Хорошо!!!\n"; //--------------------------------------------------------35 for (i=0; i<10; i++) { for (j=2; j<A[i]; j++) if (A[i]%j==0) break; if (j==A[i]) break; } if (i!=10) cout << "Хорошо!!!\n";
// Прочее //--------------------------------------------------------36 for (s=A[0], i=1; i < 10; i++) A[i-1] = A[i]; A[9] = s; //--------------------------------------------------------37 for (i=0; i<5; i++) { c=A[i]; A[i]=A[9-i]; A[9-i]=c; } //--------------------------------------------------------38 for (i=0, j=9; i < j; i++, j--) { c=A[i]; A[i]=A[j]; A[j]=c; } Примеры разработки и составления программ. Особые числа Число 1997 имеет особые свойства. Будучи простым, оно при разделении его цифр на две любые части также дает простые числа (199 и 7, 19 и 97, 1 и 997). Найти другие подобные числа в диапазоне от 1000 до 2000. Идея: Поскольку проверка на то, является ли число простым, производится в нескольких случаях, то ее необходимо оформить в виде функции. Сущность алгоритма состоит в последовательной проверке всех значений от 1000 до 2000 на предмет соблюдения указанного свойства (полный перебор). Разделить число на две части можно, используя частное и остаток от его деления на степени 10, то есть 10,100,1000. Факты: 1. Алгоритм проверки - является ли число простым, приведен в тестовых вопросах предыдущего параграфа. Число aпростое, если оно не делится ни на одно из чисел в диапазоне от 2 до a-1. Это свойство всеобщности проверяется циклом с break.
for (i=2; i<a; i++) if (a%i==0) break; if (a==i)... // выход по a==i без break - не было ни одного деления 2. Этот фрагмент оформляется в виде функции, возвращающей логическое значение 0/1.
int PR(int a) { int i; for (i=2; i<a; i++) if (a%i==0) break; if (a==i) return 1; else return 0; } 3. Усовершенствование: завершить функцию с результатом 0 можно сразу же по обнаружении факта деления нацело. Кроме того, функция не проверяет значение 1, которое также является простым числом. int PR(int a) { int i; if (a==1) return 1; for (i=2; i<a; i++) if (a%i==0) return 0; return 1; } 4. Сам процесс поиска состоит в полном переборе значений в заданном диапазоне.
void main() { for (int n=1000; n<2000; n++) { ... Удовлетворяет ли n - условиям if (удовлетворяет)cout<<n<<endl; } } 5. Разделить число nна две части и проверить, являются ли они простыми, можно, используя частное и остаток от его деления на степень 10, например
intv=100; n / v - число без двух младших цифр n % v - число из двух младших цифр 6. Получить подряд степени числа 10 можно следующим циклом:
for (int v=10; v<n; v*=10) { ...n/v...n%v...} 7. Проверить, являются ли простыми все части, на которые делится число n,можно с помощью цикла проверки свойства ВСЕОБЩНОСТИ
for (int v=10; v<=n; v*=10) { if (!PR(n/v)) break; if (!PR(n%v)) break; } if (v>n) ... // Не было выхода по break (свойство: число простое)
8. Оператор continueдосрочно завершает шаг цикла и переходит к следующему, его можно использовать, если в результате проверки оказывается, что число nне удовлетворяет одному из условий. Тогда последовательность конструкций if(условие не соблюдается) continue;позволяет организовать “сито” проверок
{ if (!PR(n)) continue; // пропустить - число не простое for (int v=10; v<=n; v*=10) { if (!PR(n/v)) break; if (!PR(n%v)) break; } if (v<=n) continue; // пропустить - был выход по break cout<<n<<endl; // прошли сквозь сито - найдено число } Практически программа уже написана, остается составить ее из частей. Простые множители Сформировать массив простых множителей заданного числа. Простые множители числа -простые числа, произведение которых дает заданное число, например: 72 = 2*2*2*3*3. Шаг 1: Исходные данные и результат -формальные параметры функции. void calc(int val, int A[], int n){ ... } val -Заданное число A - Масссив простых множителей n - Размерность массива
Шаг 2: Форма представления результата. Последовательность простых множителей в массиве А ограничена значением 0. Основной цикл получения множителей состоит в выделении очередного множителя из val и запоминания его.
void calc(int val, int A[], int n) { int i; // Количество множителей int m; // Значение множителя for (i=0; не кончился массив и есть множители; i++) { // Получить значение множителя m A[i] = m; } A[i]=0; }
Шаг 3. Получение очередного простого множителя. Простой множитель -минимальное простое число, на которое исходное делится без остатка. Если оно найдено, то в следующем шаге нужно использовать частное от деления исходного числа на множитель, чтобы искать следующий, то есть val = val / m; Последний множитель даст переменной val значение 1.
void calc(int val, int A[], int n) { int m,i; for (i=0; i<n-1 && val !=1; i++) { // Получить минимальное простое число m,нацело делящее val val /= m; A[i] = m; } A[i] = 0; }
Шаг 4: Для поиска минимального m, нацело делящего val, в цикле подряд проверяются все m, начиная с 2, до тех пор, пока остаток от деления не станет равным 0. Окончательный вариант:
//------Простые множители числа void calc(int val, int A[], int n) { int m,i; for (i=0; i<n-1 && val !=1; i++) { for (m=2; val % m !=0; m++); val /= m; A[i] = m; } A[i] = 0; } Простые числа Сформировать массив простых чисел, не превышающих заданное. Простое число -число, которое делится нацело только на 1 и на само себя. Шаг 1: Исходные данные и результат -формальные параметры функции -аналогично предыдущему примеру.
void calc(int val, int A[], int n) {...}
Шаг 2: Сущность алгоритма состоит в проверке всех чисел от 2 до val и сохранении их в массиве, если они простые.
void calc(int val, int A[], int n) { int i; // Номер очередного простого часла int m; // Очередное проверяемое число for (i=0, m=2; i < n-1 && m < val; m++) { if (m - простое число) A[i++] = m; } A[i] = 0; }
Шаг 3: Конкретизируем утверждение, что m -простое число. Во-первых, оно не делится ни на одно число в диапазоне от 2 до m/2 включительно. Во-вторых, что то же самое, оно не делится ни на одно простое число от 2 до m-1. Тогда можно воспользоваться накопленными простыми числами в массиве A от A[0] до А[i-1]. Фрагмент программы, где определяется "простота" числа будет иметь вид:
int n; for (n=0; n < i; n++) if (m % A[n]==0) break; // Разделилосьнацело if (i==n) { ...m - простое число... }
Окончательный вариант:
//-------Простые числа void calc(int val, int A[], int n) { int i,m,k; for (i=0, m=2; i < n-1 && m < val; m++) { for (k=0; k < i; k++) if (m % A[k]==0) break; if (i==k) A[i++] = m; } A[i] = 0; } Счастливыебилеты “Счастливым” называется билет, в котором в шестизначном номере сумма первых трех цифр равна сумме последних трех.
Шаг 1: Исходные данные и результат. Функция возвращает целое -количество “счастливых” билетов. Формальных параметров нет.
Шаг 2: Если известно, каким образом преобразовать шестизначное число в массив из 6 значений его цифр, то алгоритм будет состоять в последовательном разложении всех шестизначных чисел на цифры и проверки результата на “счастье”.
int calc() { int n; // Количество "счастливых" билетов long v; // Проверяемое шестизначное число int B[6]; // Массив значений цифр for (n=0,v=0; v < 1000000; v++) { // Разложить val в массив значений цифр числа - B if (B[0]+B[1]+B[2]==B[3]+B[4]+B[5]) n++; } return n; }
Шаг 3: Остаток от деления целого числа на 10 дает значение младшей цифры, например 1996 % 10 = 6. Частное от деления целого числа на 10 дает то же самое число без последней цифры: 1996 / 10 = 199. Тогда остатки от последовательного деления на 10 исходного числа дадут искомые значения цифр (при условии, что частное от деления на следующем шаге становится делимым).
int m; // Номер шага (цифры) long vv; // Исходное число for (vv = v, m=0; m<6; m++) { B[m] = vv % 10; // Остаток - очередная цифра vv = vv / 10; // Частное становится делимым }
Окончательный вариант:
//------Счастливые билеты int calc() { int n, B[6]; long v; for (n=0,v=0; v < 1000000; v++) { int m; long vv; for (vv = v, m=0; m<6; m++, vv /=10) B[m] = vv % 10; if (B[0]+B[1]+B[2]==B[3]+B[4]+B[5]) n++; } return n; }
На первый взгляд такое количество шагов в последовательной детализации программы может показаться излишним. На самом деле программист должен делать их не на бумаге и не на экране монитора, а у себя в голове, превращая словесную формулировку некоторой части алгоритма в формальную запись на языке программирования, в которой тем не менее остаются неформализованные куски. Типы данных |
||
Последнее изменение этой страницы: 2018-05-10; просмотров: 191. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |