Реферат Курсовая Конспект
В первом семестре рассматриваются основные конструкции языка Си и базовая технология программирования структурное программирование - раздел Программирование, Введение В Первом Семестре...
|
Введение
В первом семестре рассматриваются основные конструкции языка Си и базовая технология программирования (структурное программирование).
Структурное программирование – это технология создания программ, позволяющая путем соблюдения определенных правил уменьшить время разработки и количество ошибок, а также облегчить возможность модификации программы.
Тип wchar_t
Предназначен для работы с набором символов, для кодировки которых недостаточно 1 байта, например Unicode. Размер этого типа, как правило, соответствует типу short. Строковые константы такого типа записываются с префиксом L: L“String #1”.
Тип bool
Тип bool называется логическим. Его величины могут принимать значения true и false. Внутренняя форма представления false – 0, любое другое значение интерпретируется как true.
Тип void
К основным типам также относится тип void Множество значений этого типа – пусто.
Составные операторы
К составным операторам относят собственно составные операторы и блоки. В обоих случаях это последовательность операторов, заключенная в фигурные скобки. Блок отличается от составного оператора наличием определений в теле блока. Например:
{
n++; это составной оператор
summa+=n;
}
{
int n=0;
n++; это блок
summa+=n;
}
Операторы выбора
Операторы выбора - это условный оператор и переключатель.
1. Условный оператор имеет полную и сокращенную форму.
if (выражение-условие ) оператор; //сокращенная форма
В качестве выражения-условия могут использоваться арифметическое выражение, отношение и логическое выражение. Если значение выражения-условия отлично от нуля (т. е. истинно), то выполняется оператор. Например:
if (x<y&&x<z)min=x;
if ( выражение-условие ) оператор1; //полная форма
else оператор2;
Если значение выражения-условия отлично от нуля, то выполняется оператор1, при нулевом значении выражения-условия выполняется оператор2.Например:
if (d>=0)
{
x1=(-b-sqrt(d))/(2*a);
x2=(-b+sqrt(d))/(2*a);
cout<< “ x1=”<<x1<<“x2=”<<x2;
}
else cout<<“ Решения нет”;
2.Переключатель определяет множественный выбор.
switch (выражение)
{
case константа1 : оператор1 ;
case константа2 : оператор2 ;
. . . . . . . . . . .
[default: операторы;]
}
При выполнении оператора switch, вычисляется выражение, записанное после switch, оно должно быть целочисленным. Полученное значение последовательно сравнивается с константами, которые записаны следом за case. При первом же совпадении выполняются операторы помеченные данной меткой. Если выполненные операторы не содержат оператора перехода, то далее выполняются операторы всех следующих вариантов, пока не появится оператор перехода или не закончится переключатель. Если значение выражения, записанного после switch не совпало ни с одной константой, то выполняются операторы, которые следуют за меткой default. Метка default может отсутствовать.
Пример:
#include <iostream.h>
void main()
{
int i;
cout<<" Enter the number";
cin>>i;
switch(i)
{
case 1:cout<<" the number is one";
case 2:cout<<" 2*2="<<i*i;
case 3: cout<<" 3*3="<<i*i;break;
case 4: cout<<" "<<i<<" is very beautiful!";
default:cout<<" The end of work";
}
}
Результаты работы программы:
1. При вводе 1 будет выведено:
The number is one
2*2=1
3*3=1
2. При вводе 2 будет выведено:
2*2=4
3*3=4
3. При вводе 3 будет выведено:
3*3=9
4. При вводе 4 будет выведено:
4 is very beautiful!
5. При вводе всех остальных чисел будет выведено:
The end of work
Операторы циклов
Различают:
1) итерационные циклы;
2) арифметические циклы.
Группа действий, повторяющихся в цикле, называется его телом. Однократное выполнение цикла называется его шагом.
В итерационных циклах известно условие выполнения цикла.
1 Цикл с предусловием:
while (выражение-условие)
оператор;
В качестве <выражения-условия> чаще всего используется отношение или логическое выражение. Если оно истинно, т. е. не равно 0, то тело цикла выполняется до тех пор, пока выражение-условие не станет ложным.
Пример
while (a!=0)
{
cin>>a;
s+=a;
}
2 Цикл с постусловием:
do
оператор
while (выражение-условие);
Тело цикла выполняется до тех пор, пока выражение-условие истинно.
Пример:
do
{
cin>>a;
s+=a;
}
while(a!=0);
3 Цикл с параметром:
for ( выражение_1;выражение-условие;выражение_3)
оператор;
выражение_1 и выражение_3 могут состоять из нескольких выражений, разделенных запятыми. Выражение_1 - задает начальные условия для цикла (инициализация). Выражение-условие> определяет условие выполнения цикла, если оно не равно 0, цикл выполняется, а затем вычисляется значение выражения_3. Выражение_3 - задает изменение параметра цикла или других переменных (коррекция). Цикл продолжается до тех пор, пока выражение-условие не станет равно 0. Любое выражение может отсутствовать, но разделяющие их « ; » должны быть обязательно.
Примеры использования цикла с параметром.
1 Уменьшение параметра:
for ( n=10; n>0; n--)
{ оператор};
2 Изменение шага корректировки:
for ( n=2; n>60; n+=13)
{ оператор };
3 Возможность проверять условие отличное от условия, которое налагается на число итераций:
for ( num=1;num*num*num<216; num++)
{ оператор };
4 Коррекция может осуществляться не только с помощью сложения или вычитания:
for ( d=100.0; d<150.0;d*=1.1)
{ <тело цикла>};
for (x=1;y<=75;y=5*(x++)+10)
{ оператор };
5 Можно использовать несколько инициализирующих или корректирующих выражений:
for (x=1, y=0; x<10;x++;y+=x);
Операторы перехода
Операторы перехода выполняют безусловную передачу управления.
1 break - оператор прерывания цикла.
{
< операторы>
if (<выражение_условие>) break;
<операторы>
}
Т. е. оператор break целесообразно использовать, когда условие продолжения итераций надо проверять в середине цикла.
Пример:
// ищет сумму чисел вводимых с клавиатуры до тех пор, пока не будет введено 100 чисел или 0
for(s=0, i=1; i<100;i++)
{
cin>>x;
if( x==0) break; // если ввели 0, то суммирование заканчивается
s+=x;
}
2 continue - переход к следующей итерации цикла. Он используется, когда тело цикла содержит ветвления.
Пример:
//ищет количество и сумму положительных чисел
for( k=0,s=0,x=1;x!=0;)
{
cin>>x;
if (x<=0) continue;
k++;s+=x;
}
3 Оператор goto
Оператор goto имеет формат: goto метка;
В теле той же функции должна присутствовать конструкция: метка:оператор;
Метка – это обычный идентификатор, областью видимости которого является функция. Оператор goto передает управления оператору, стоящему после метки. Использование оператора goto оправдано, если необходимо выполнить переход из нескольких вложенных циклов или переключателей вниз по тексту программы или перейти в одно место функции после выполнения различных действий.
Применение goto нарушает принципы структурного и модульного программирования, по которым все блоки, из которых состоит программа, должны иметь только один вход и только один выход.
Нельзя передавать управление внутрь операторов if, switch и циклов. Нельзя переходить внутрь блоков, содержащих инициализацию, на операторы, которые стоят после инициализации. Пример:
int k;
goto m;
. . .
{
int a=3,b=4;
k=a+b;
m: int c=k+1;
. . .
}
В этом примере при переходе на метку m не будет выполняться инициализация переменных a , b и k.
3 Оператор return – оператор возврата из функции. Он всегда завершает выполнение функции и передает управление в точку ее вызова. Вид оператора:
return [выражение];
5. Примеры решения задач с использованием основных операторов Си++
«Начинающие программисты, особенно студенты, часто пишут программы так: получив задание, тут же садятся за компьютер и начинают кодировать те фрагменты алгоритма, которые им удается придумать сразу. Переменным дают первые попавшиеся имена типа х и у. Когда компьютер зависает, делается перерыв, после которого все написанное стирается, и все повторяется заново. Периодически высказываются сомнения в правильности работы компилятора, компьютера и операционной системы. Когда программа доходит до стадии выполнения, в нее вводятся произвольные значения, после чего экран становится объектом пристального удивленного изучения. «Работает» такая программа обычно только в бережных руках хозяина на одном наборе данных, а внесение в нее изменений может привести автора к потере веры в себя и ненависти к процессу программирования.
Ваша задача состоит в том, чтобы научиться подходить к программированию профессионально. В конце концов, профессионал отличается тем, что может достаточно точно оценить, сколько времени у него займет написание программы, которая будет работать в полном соответствии с поставленной задачей. Кроме «ума, вкуса и терпения», для этого требуется опыт, а также знание основных принципов, выработанных программистами в течение более, чем полувека развития этой дисциплины. Даже к написанию самых простых программ нужно подходить последовательно, соблюдая определенную дисциплину.» (Павловская Т. А., стр.109)
Решение задач по программированию предполагает ряд этапов:
1) Разработка математической модели. На этом этапе определяются исходные данные и результаты решения задачи, а также математические формулы, с помощью которых можно перейти от исходных данных к конечному результату.
2) Разработка алгоритма. Определяются действия, выполняя которые можно будет от исходных данных придти к требуемому результату.
3) Запись программы на некотором языке программирования. На этом этапе каждому шагу алгоритма ставится в соответствие конструкция выбранного алгоритмического языка.
4) Выполнение программы (исходный модуль ->компилятор ->объектный модуль -> компоновщик -> исполняемый модуль)
5) Тестирование и отладка программы. При выполнении программы могут возникнуть ошибки 3 типов:
a. синтаксические – исправляются на этапе компиляции;
b. ошибки исполнения программы (деление на 0, логарифм от отрицательного числа и т. п.) – исправляются при выполнении программы;
c. семантические (логические) ошибки – появляются из-за неправильно понятой задачи, неправильно составленного алгоритма.
Чтобы устранить эти ошибки программа должна быть выполнена на некотором наборе тестов. Цель процесса тестирования – определение наличия ошибки, нахождение места ошибки, ее причины и соответствующие изменения программы – исправление. Тест – это набор исходных данных, для которых заранее известен результат. Тест выявивший ошибку считается успешным. Отладка программы заканчивается, когда достаточное количество тестов выполнилось неуспешно, т. е. программа на них выдала правильные результаты.
Для определения достаточного количества тестов существует два подхода. При первом подходе программа рассматривается как «черный ящик», в который передают исходные данные и получают результаты. Устройство самого ящика неизвестно. При этом подходе, чтобы осуществить полное тестирование, надо проверить программу на всех входных данных, что практически невозможно. Поэтому вводят специальные критерии, которые должны показать, какое конечное множество тестов является достаточным для программы. При первом подходе чаще всего используются следующие критерии:
1) тестирование классов входных данных, т. е. набор тестов должен содержать по одному представителю каждого класса данных:
-1 | -1 | ||||||
Y | -1 | -1 |
2) тестирование классов выходных данных, набор тестов должен содержать данные достаточные для получения по одному представителю из каждого класса выходных данных.
При втором подходе программа рассматривается как «белый ящик», для которого полностью известно устройство. Полное тестирование при этом подходе заканчивается после проверки всех путей, ведущих от начала программы к ее концу. Однако и при таком подходе полное тестирование программы невозможно, т. к. путей в программе с циклами бесконечное множество. При таком подходе используются следующие критерии:
1) Тестирование команд. Набор тестов должен обеспечивать прохождение каждой команды не менее одного раза.
2) Тестирование ветвей. Набор тестов в совокупности должен обеспечивать прохождение каждой ветви не менее одного раза. Это самый распространенный критерий в практике программирования.
Классы задач по обработке массивов
1) К задачам 1 класса относятся задачи, в которых выполняется однотипная обработка всех или указанных элементов массива.
2) К задачам 2 класса относятся задачи, в которых изменяется порядок следования элементов массива.
3) К задачам 3 класса относятся задачи, в которых выполняется обработка нескольких массивов или подмассивов одного массива. Массивы могут обрабатываться по одной схеме – синхронная обработка или по разным схемам – асинхронная обработка массивов.
4) К задачам 4 класса относятся задачи, в которых требуется отыскать первый элемент массива, совпадающий с заданным значением – поисковые задачи в массиве.
Задачи 1-ого класса
Решение таких задач сводится к установлению того, как обрабатывается каждый элемент массива или указанные элементы, затем подбирается подходящая схема перебора, в которую вставляются операторы обработки элементов массива. Примером такой задачи является нахождение максимального элемента массива или среднего арифметического массива.
#include<iostream.h>
#include<stdlib.h>
void main()
{
int a[100];
int n;
cout<<” Enter the size of array:”;cin>>n;
for(int I=0;I<n;I++)
{a[I]=rand()%100-50;
cout<<a[I]<<” “;
}
int Sum=0;
for(I=0;I<n;I++)
Sum+=a[I];
Cout<<”Среднее арифметическое=”<<Sum/n”;
}
Задачи 2-ого класса
Обмен элементов внутри массива выполняется с использованием вспомогательной переменной:
int R=a[I];a[I]=a[J]; a[J]:=R; // обмен a[I] и a[J] элементов массива.
Пример1.
Перевернуть массив.
//формирование массива
for(int i=0,j=n-1;i<j;i++,j--)
{int r=a[i];
a[i]=a[j];
a[j]=r;}
//вывод массива
Пример 2.
Поменять местами пары элементов в массиве: 1и2, 3 и 4, 5 и 6 и т. д.
for(int i=0;i<n-1;i+=2)
{int r=a[i];
a[i]=a[i+1];
a[i+1]=r;}
Пример 3.
Циклически сдвинуть массив на к элементов влево (вправо).
int k,i,t,r;
cout<<" K=?";cin>>k;
for(t=0;t<k;t++)
{
r=a[0];
for(int i=0;i<n-1;i++)
a[i]=a[i+1];
a[n-1]=r;
}
Задачи 3-ого класса
При синхронной обработке массивов индексы при переборе массивов меняются одинаково.
Пример 1. Заданы два массива из n целых элементов. Получить массив c, где c[I]=a[I]+b[I].
For(int I=0;I<n;I++)c[I]=a[I]+b[I];
При асинхронной обработке массивов индекс каждого массива меняется по своей схеме.
Пример 2. В массиве целых чисел все отрицательные элементы перенести в начало массива.
int b[10];//вспомогательный массив
int i,j=0;
for(i=0;i<n;i++)
if(a[i]<0){b[j]=a[i];j++;}//переписываем из а в b все отрицательные элементы
for(i=0;i<n;i++)
if(a[i]>=0){b[j]=a[i];j++;}// переписываем из а в b все положительные элементы
for(i=0;i<n;i++) cout<<b[I]<<” “;
Пример3.
Удалить из массива все четные числа
int b[10];
int i,j=0;
for(i=0;i<n;i++)
if(a[i]%2!=0){b[j]=a[i];j++;}
for(i=0;i<j;i++) cout<<b[i]<<" ";
cout<<" ";
Задачи 4-ого класса
В поисковых задачах требуется найти элемент, удовлетворяющий заданному условию. Для этого требуется организовать перебор массива и проверку условия. Но при этом существует две возможности выхода из цикла:
- нужный элемент найден ;
- элемент не найден, но просмотр массива закончен.
Пример1. Найти первое вхождение элемента К в массив целых чисел.
int k;
cout<<" K=?";cin>>k;
int ok=0;//признак найден элемент или нет
int i,nom;
for(i=0;i<n;i++)
if(a[i]==k){ok=1;nom=i;break;}
if(ok==1)
cout<<" nom="<<nom;
else
cout<<" there is no such element!";
Указатели
Операции с указателями
С указателями можно выполнять следующие операции:
1) разыменование (*);
2) присваивание;
3) арифметические операции (сложение с константой, вычитание,
инкремент ++, декремент --);
4) сравнение;
5) приведение типов.
1) Операция разыменования предназначена для получения значения переменной или константы, адрес которой хранится в указателе. Если указатель указывает на переменную, то это значение можно изменять, также используя операцию разыменования.
Примеры:
int a; //переменная типа int
int*pa=new int; //указатель и выделение памяти под динамическую переменную
*pa=10;//присвоили значение динамической переменной, на которую указывает указатель
a=*pa;//присвоили значение переменной а
Присваивать значение указателям-константам запрещено.
2) Приведение типов
На одну и ту же область памяти могут ссылаться указатели разного типа. Если применить к ним операцию разыменования, то получатся разные результаты.
int a=123;
int*pi=&a;
char*pc=(char*)&a;
float *pf=(float*)&a;
printf(" %x %i",pi,*pi);
printf(" %x %c",pc,*pc);
printf(" %x %f",pf,*pf);
При выполнении этой программы получатся следующие результаты:
66fd9c 123
66fd9c {
66fd9c 0.000000
Т. е. адрес у трех указателей один и тот же, но при разыменовании получаются разные значения в зависимости от типа указателя.
В примере при инициализации указателя была использована операция приведения типов. При использовании в выражении указателей разных типов, явное преобразование требуется для всех типов, кроме void*. Указатель может неявно преобразовываться в значения типа bool, при этом ненулевой указатель преобразуется в true, а нулевой в false.
3) Арифметические операции применимы только к указателям одного типа.
- Инкремент увеличивает значение указателя на величину sizeof(тип).
Например:
char *pc;
int *pi;
float *pf;
. . . . .
pc++;//значение увеличится на 1
pi++;//значение увеличится на 4
pf++;//значение увеличится на 4
- Декремент уменьшает значение указателя на величину sizeof(тип).
- Разность двух указателей – это разность их значений, деленная на размер типа в байтах.
Например:
int a=123,b=456,c=789;
int*pi1=&a;
int *pi2=&b;
int*pi3=&c;
printf(" %x",pi1-pi2);
printf(" %x",pi1-pi3);
Результат
Суммирование двух указателей не допускается.
Можно суммировать указатель и константу:
pi3=pi3+2;
pi2=pi2+1;
printf(" %x %d",pi1,*pi1);
printf(" %x %d",pi2,*pi2);
printf(" %x %d",pi3,*pi3);
Результат выполнения программы:
66fd9c 123
66fd9c 123
66fd9c 123
При записи выражений с указателями требуется обращать внимание на приоритеты операций.
Ссылки
Понятие ссылки
Ссылка – это синоним имени объекта, указанного при инициализации ссылки.
Формат объявления ссылки
тип & имя =имя_объекта;
Примеры:
int x;// определение переменной
int& sx=x;// определение ссылки на переменную х
const char& CR=’ ’;//определение ссылки на константу
8.1. Правила работы со ссылками:
1) Переменная ссылка должна явно инициализироваться при ее описании, если она не является параметром функции, не описана как extern или не ссылается на поле класса.
2) После инициализации ссылке не может быть присвоено другое значение.
3) Не существует указателей на ссылки, массивов ссылок и ссылок на ссылки.
4) Операция над ссылкой приводит к изменению величины на которую она ссылается
Ссылка не занимает дополнительного пространства в памяти, она является просто другим именем объекта.
Пример1:
#include <iostream.h>
void main()
{
int I=123;
int &si=I;
cout<<” i=”<<I<<” si=”<<si;
I=456;
cout<<” i=”<<I<<” si=”<<si;
I=0; cout<<” i=”<<I<<” si=”<<si;
}
Выведется
I=123 si=123
I=456 si=456
I=0 si=0
Указатели и массивы
Функции и массивы
– Конец работы –
Используемые теги: первом, семестре, рассматриваются, основные, конструкции, языка, Базовая, Технология, программирования, Структурное, Программирование0.089
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: В первом семестре рассматриваются основные конструкции языка Си и базовая технология программирования структурное программирование
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов