Часто встречающиеся ошибки программирования




1. Точка с запятой после скобок селектора:

switch (n);

{

case 0: оператор;

break;

..........

2. Отсутствие фигурных скобок после слова switch:

Switch (n)

case 0: оператор;

break;

..........

3. Перечисление меток вариантов без слов case:

Switch (n)

{

case 0, 1, 2: n++;

break;

.....

4. Перечисление меток вариантов через запятые:

Switch (n)

{

case 0, case 1, case 2: n++;

break;

.....

5. Отсутствие оператора break после ветвей переключателя:

Switch (n)

{

case 0: case 1: case 2: n++;

case 3: n--;

.....

Циклы

Одним из самых ценных свойств компьютеров является их способность многократно повторять последовательность одинаковых или похожих действий – циклов.

Являясь наиболее мощными структурами алгоритмических языков, циклы подразделяются на:

1) бесконечные циклы,

2) циклы с предусловием (циклы типа ПОКА),

3) циклы с постусловием (циклы типа ДО),

4) циклы с параметром (циклы типа ДЛЯ).

 

Бесконечные циклы

Бесконечный цикл может быть представлен следующей схемой:

 

i=0;

label: i++; //эти три оператора образуют бесконечный цикл

i--;

goto label;

Как правило, появление в программе бесконечных циклов вызвано логическими ошибками, допущенными программистом при разработке алгоритма и кодировании (написании операторов программы) с использованием оператора безусловного перехода goto. Поэтому в современных алгоритмических языках этот оператор практически не используется, а заменяется циклами. Бесконечные циклы не выявляются транслятором при синтаксическом контроле и проявляются только после запуска программы на выполнение следующим образом:

1) длительное время (десятки секунд) программа не выводит на устройство вывода никакой информации – программа зависает,

2) на устройство вывода постоянно выводится одна и та же информация.

Таким образом, бесконечные циклы – это логические ошибки программиста.
С ними сталкивается любой программист, и поэтому необходимо овладеть методами их поиска.

Циклы с предусловием

Как правило, некоторую цепочку операторов необходимо повторять не бесконечно, а до тех пор, пока выполняется некоторое условие:

ПОКА (условие) ВЫПОЛНЯТЬ

цепочка;

Такой цикл называется циклом с предусловием (циклом ПОКА) и изображается следующей схемой:

 

 

Условие – это логическое выражение, зависящее от переменных, входящих в цепочку. Цикл повторяется до тех пор, пока условие истинно. Значит, данное условие является условиемпродолжения цикла. Выполнение цикла заканчивается, если операторы цепочки изменяют значения переменных, входящих в условие, и оно становится ложным.

Цикл не выполняется ни разу, если условие было ложным с самого начала.

Цикл ПОКА превращается в бесконечный, если условие подобрано так, что оно всегда истинно.

В Си цикл с предусловием реализуется оператором цикла while:

While (условие)

оператор;

или

While (условие)

{

оператор;

оператор;

....

оператор;

}

Операторы, находящиеся между фигурными скобками, называются телом цикла.

Внимание!Условие всегда заключается в скобки, и после него точка с запятой не ставится!

Если поставить точку с запятой после условия, то этот цикл, как правило, превращается в бесконечный, потому что в этом случае условие изменяться не будет.

Фигурные скобки используются в том случае, если после условия должна следовать цепочка операторов.

Действия оператора while:

1) проверяется выполнение условия,

2) если оно истинно, то выполняется оператор (цепочка), стоящий после него,

3) после его выполнения снова проверяется условие, и если оно снова истинно, то цикл повторяется,

4) если условие становится ложным, то цикл заканчивает работу.

Примеры

1. Вычислить сумму ста первых натуральных чисел:

s = 1 + 2 + 3 + … + 98 + 99 + 100

Пусть s – искомая сумма,

i – очередное число (изменяется от 1 до 100).

Тогда алгоритм решения задачи можно описать следующим образом:

a) обнуляем сумму s = 0,

b) берем первое число: i = 1,

c) добавляем в сумму это число: s = s + i,

d) увеличиваем очередное число на единицу: i = i+ 1,

e) если оно не больше 100, то снова добавляем его в сумму и повторяем цикл.

Представим этот алгоритм так:

s = 0;

i = 1;

ПОКА (i ≤ 100)

НАЧАЛО

s = s + i;

i = i + 1;

КОНЕЦ;

Программа

#include <stdio.h>

#include <conio.h>

#include <math.h>

Int main()

{

int i=1, s=0;

while (i<=100)

{

s+=i;

i++;

}

printf(“\ns=%d i=%d”,s, i);

return 0;

}

Результат решения задачи:

s=5050 i=101

Таким образом, выходим из этого цикла со значением i не 100, а 101.

Вместо цепочки

s+=i;

i++;

можно использовать один оператор:

s+=i++;

Этот цикл можно превратить в бесконечный, если после условия поставить точку с запятой:

int i=1, s = 0;

while (i<=100);

{

s += i;

i++;

}

printf(“\ns=%d i=%d”,s, i);

Значение переменной i в этом случае меняться не будет – она останется равной единице.

2. Вычислить сумму s всех цифр заданного натурального числа n

Пусть s – искомая сумма,

i – очередная цифра числа.

Тогда алгоритм решения задачи можно описать следующим образом:

1) обнуляем сумму s = 0,

2) берем последнюю цифру числа, для чего определяем остаток от деления исходного числа на 10: i = n % 10,

3) добавляем в сумму найденную цифру: s = s + i,

4) уменьшаем число в 10 раз: n = n / 10,

5) повторяем цикл до тех пор, пока n > 0 – это и будет условием продолжения цикла.

Программа

#include <stdio.h>

#include <conio.h>

#include <math.h>

Int main()

{

int i, n, s = 0;

printf(“\nВведите целое положительное число:”);

scanf(“%d”, &n);

while (n>0)

{

i = n % 10;

s+=i;

n /= 10;

}

printf(“\ns=%d”,s);

return 0;

}

Схема алгоритма

 

 

3. Ввести с клавиатуры по одному последовательность целых чисел (конец последовательности – число 0). Определить их сумму, максимальное и минимальное число, количество введенных чисел и их среднее арифметическое.

Пусть s – искомая сумма,

min, max – минимальное и максимальное из введенных чисел,

count – количество введенных чисел,

sred – среднее арифметическое,

n – очередное число.

Тогда алгоритм решения задачи можно описать следующим образом:

1) обнуляем сумму s = 0,

2) вводим первое число n,

3) если оно не равно нулю, то

4) принимаем его значение за min и max,

5) количество введенных чисел count = 1,

6) увеличиваем сумму на введенное число s = s + n,

7) входим в цикл ввода:

8) вводим очередное число n,

9) если оно не равно нулю, то

10) количество введенных чисел увеличиваем на 1: count = count+1,

11) увеличиваем сумму на введенное число s = s + n,

12) если оно меньше min, то min = n,

13) если оно больше max, то max = n,

14) повторяем цикл до тех пор, пока n # 0 – это и будет условием продолжения цикла.

Создадим интерфейс этой задачи – взаимодействие программы с пользователем, то есть что должно выводиться на экран:

Первое число: 3

Очередное число: 8

Очередное число: 1

Очередное число: -2

Очередное число: 0

Сумма = 10

Количество чисел = 4

min = -2

max = 8

Среднее арифметическое = 2.50

Схема алгоритма

 

Программа

#include <stdio.h>

#include <conio.h>

#include <math.h>

Int main()

{

int min, max, n, count = 0;

float sred, s = 0.0;

printf(“\nВведите первое число:”);

scanf(“%d”, &n);

if (n==0)

return 0;

min = n; // за минимум и максимум принимаем

max = n; // первое введенное число

count = 1; // введено одно число

s += n;

while (n!=0)

{

printf(“\nВведите очередное число:”);

scanf(“%d”, &n);

if (n==0)

break;

count++;

s += n;

if (n > max)

max = n;

if (n < min)

min = n;

}

printf(“\nСумма = %4.2f”, s);

printf(“\nКоличество чисел = %d”, count);

printf(“\nmin = %d”, min);

printf(“\nmax = %d”, max);

sred = s / count;

printf(“\n Среднее арифметическое = %6.2f”,sred);

return 0;

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: