Программирование в информационных технологиях
В.Г. Салимов
http:// vagif4.tripod.com
Сopyrigth©2017…V.H.Salimov.All rigths reserved
Программирование в информационных технологиях
Дисциплина ²Основы программирования² занимает важное место в процессе подготовки специалистов в области информационных технологий. В качестве базового языка выбран С++. Известно, что этот язык широко используется для разработки системных программ. Это обьясняется наличием в этом языке широкого спектра низкоуровневых операций.
Эффективное программирование содержит в себе два аспекта:
- эффективные структуры данных;
- эффективные алгоритмы обработки данных
В рамках данного курса студенты изучают методы разработки алгоритмов, выбора эффективных структур данных и создания на их основе компьютерных программ. В качестве базовой среды программирования выбран Borland C++ 3.1. Наряду с этим уделяется внимание также таким средам как Borland C++ Builder , Ms Visual studio . Наряду с основным консольным режимом рассматриваются также возможности визуального (GUİ) режима.
В течение курса студенты наряду с лекциями проходят практические занятия и выполняют лабораторные работы.
1 вопрос . * Основы алгоритмизации
По определению под алгоритмом понимают последовательность операций приводящих к решению определенной задачи.
Результативность(конечность) - при точном исполнении всех команд алгоритма процесс должен прекратиться за конечное число
шагов и привести к определенному результату;
Массовость - алгоритм обеспечивает решение не одной конк-
ретной задачи, а некоторого класса задач;
Дискретность - алгоритм всегда состоит из последовательности
дискретных шагов;
Детерминируемость - алгоритм должен состоять из команд, однознач-
но понимаемых исполнителем.
Понятность - для записи алгоритма используются команды,
которые входят в систему команд исполнителя;
Показано, что алгоритм любой сложности может быть построен на основе 3 базовых алгоритмов.
1. Линейный
2. Разветвляющийся
3. Циклический
Для представления алгоритмов используются 3 основных метода
1. вербальный.
2. на основе условного алгоритмического языка
3. на основе блок схем.
Наиболее часто используется метод блок-схем, т.е. условных графических символов. Основные символы языка блок-схем имеются в любой оффисной программе
Процесс | |
Начало/конец | |
Ввод /вывод | |
Условие | |
Цикл | |
Подпрограмма (функция) | |
Печать |
2 вопрос.* Базовые алгоритмы линейный, разветвляющийся
Строго доказано, что любой алгоритм может быть представлен в виде комбинации 3 базовых алгоритмов:
1. линейного
2. разветвляющегося
3. циклического
Разветвляющиеся алгоритмы в зависимости от числа веток могут быть с двумя , тремя ветками.
Циклические алгоритмы по организации могут быть
А) с предусловием
В) с постусловием
С) с параметром
начало |
Конец |
A1 |
A2 |
AN |
линейный
Начало |
Условиеие |
Конец |
A1 |
A2 |
Да |
Нет |
разветвляющийся
3 вопрос. * Базовые алгоритмы- циклы
Условие выполняется |
Процесс |
Конец |
Да |
Нет |
Цикл с предусловием
Процесс |
Условие выполняется |
Конец |
Да |
Нет |
Цикл с постусловием
I=1 to n step h |
Процесс |
Конец |
Цикл с параметром
4 вопрос .* Примеры алгоритмов ( линейный, разветвляющийся)
1. Линейный алгоритм.
Пример. Найти обьем равнобедренной треугольной пирамиды со сторонами основания a, b, с и боковой стороной L
Начало |
Конец |
a,b,c,L |
p=(a+b+c)/2 |
S=Площ. Герон düsturu |
H= √(L2-R2) |
R=a*b*c/(4*S) |
V=1/3*S*H |
V |
2.Разветвляющийся алгоритм
sin x, если x>=a;
y=
cos x, если x< a
Начало |
Конец |
a,x |
y |
x>=a |
Y=sin(x) |
Y=cos(x) |
Да |
Нет |
5 вопрос *. Примеры алгоритмов -циклы с известным числом повторений
3.Цикл с известным числом повторений . Вычислить y=sin x на отрезке [a,b] с шагом разбиения h
Начало |
конец |
a,b,h |
x,y |
x=a |
x=x+h |
y=sin(x) |
x<=b |
Да |
Нет |
Здесь N=](b-a)/h[+1 число повторений цикла
6 вопрос **. Примеры алгоритмов - итерационный цикл
4 Итерационный цикл: Вычисление квадратного корня итерационным методом Ньютона
x=√u x0=(u+1)/2
xi=1/2*( xi-1+u/ xi-1)
│xi2-u│≤ε
Начало |
Конец |
u,eps |
x=(u+1)/2 |
abs(x2-u)≤eps |
x |
X=1/2*(x+u/x) |
Нет |
Да |
7 вопрос .* Примеры алгоритмов -одномерный массив
5 Одномерные массивы. Найти сумму членов последовательности a1, a2 , a3 ......... a100 y=∑ ai
Начало |
Конец |
i=1 to 100 |
i=1 to 100 |
ai |
y=0 |
y=y+ ai |
y |
8 вопрос .* Примеры алгоритмов -сложный цикл
Сложный цикл. Найти произведение всех элементов матрицы A (n,m)
Начало |
Конец |
n, m |
i=1 to n |
j=1 to m |
i=1 to n |
J=1 to m |
ai,j |
y=1 |
y=y* ai,j |
y |
Команды препроцессора
void main ()
{
}
function vag1(.........)
{
......
}
function vag2(.........)
{
......
}
function vag3(.........)
{
......
}
Слово Void используется только в С++
Транслятор языка C двухэтапный на первом обрабатываются команды препроцессора, на втором транслируется сама программа
Препроцессор специальная программа позволяющая сделать процесс трансляции более гибким. Препроцессор имеет свой язык , в основном используются две команды include и define. Первая обеспечивает подключение к данной программе модулей из библиотек или других источников функций, вторая позволяет именовать некоторые значения.
#include <stdio.h>
#include <math.h>
#include <seva.c>
#define Gunel 606
#define poka while
#define pechat printf(“salam”);
Первая директива указание на подключение библиотеки ввода/вывода stdio.h, вторая директива подключение библиотеки математических функций math.h , третья директива подключает к данной программе функцию находящуюся в файле seva.c
Последние 2 директивы вводят сответствующие синонимы poka вместо while , pechat вместо printf(“salam”);
Самая простая С программа имеет следующий вид
#include <stdio.h>
#include <math.h>
main ()
{
}
{} называется блоком
Внутри блока могут располагаться другие блоки
main ()
{ главный блок
….
{
1 blok
…….
}
…..
{ 2 blok
}
}
16 вопрос .** Типы операций
В языке C имеется два типа операций
1. математические
2. логические
Таблица . Основные операции в С++
Знак | Операция | Тип Операндов | Тип результата |
+ | Сложение | Целый, действит. | Целый, действит. |
- | Вычитание | Целый, действит. | Целый, действит. |
* | Умножение | Целый, действит. | Целый, действит. |
/ | Деление | Действительный | Действительный |
/ | Целочисленное деление | Целый | Целый |
% | Остаток от делен. | Целый | Целый |
-- | Декремент - 1 | Целый | Целый |
++ | Инкримент +1 | Целый | Целый |
& | "and" | Целый | Целый |
| | "or" | Целый | Целый |
^ | Not "or" | Целый | Целый |
~ | Отрицание | Целый | Целый |
<< | Сдвиг влево | Целый | Целый |
>> | Сдвиг вправо | Целый | Целый |
Как видно наряду с традиционными операциями имеются дополнительные операции инкримент и дикремент а также битовые операции.
++p; заменяет p=p+1;.Аналогично p++; Разницу этих операций показывает следующий пример
x=12;
y=++x;
y получит значение 13
x=12;
y=x++;
y получит значение 12
Аналогично --p; и p--;
ОПЕРАЦИЯ ?
Для программирования разветвления можно использовать следующую структуру:
Условие ? Выражение 1: выражение 2;
Если условие верно вычисляется 1 выражение , в противном случае 2 выражение
Пример .
y=x<0 ? –x: x;
23 вопрос * Приоритеты операций и стандарт. математические функ.
Приоритеты операций
Имя функции | Математическое определение |
abs(x) | Абсолютная величина |
fabs(x) | Абсолютная величина для вещественного аргумента |
sin(x) | Sin |
cos(x) | Cos |
tan(x) | tg |
atan(x) | Arctg |
atan2(y,x) | Arctg в интервале |
sinh(x) | Гиперболический sin |
cosh(x) | Гиперболический cos |
tanh(x) | Гиперболический tg |
exp(x) | ex |
log(x) | ln(x), x>0 |
log10(x) | Десятичный log10(x), x>0 |
pow(x,y) | xy. Не допустимы если х=0, y≤0 или x<0 и y –не целые |
sqrt(x) | , x≥0 |
Вычисление степени Х имеет ряд проблем-функция pow(x,y) не позволяет возводить отрицательные числа в нецелую степень, в этом случае можно использовать следующее выражение , что в синтаксисе С/С++ запишется как exp(n*log(fabs(x))) или –pow(fabs(x),y).
24 вопрос * Оператор присваивания
Пример
scanf (“%f %f %f”,&a,&b,&c);// здесь вводятся 3 действительные перем.
26 вопрос ** Вывод данных в помощью функции printf
В языке С для вывода данных используется функция
printf(s1, s2);
Здесь s1 – список форматов, s2 – список переменных.
Общие правила использования аналогичны scanf
Форматные коды аналогичны но дополнительно указываются количество общее количество позиций и количество позиций после запятой.
Общая структура формата имеет следующий вид. %[флаг][En][.точность][модификатор]тип
Ниже приводятся форматы для вывода
Параметр | Назначение |
Флаг | |
- | Смещение влево , справа заполняется пробелами, по стандарту смещение вправо. |
+ | Вывод знака «+» или «-» |
Пробел | Перед положит. Числом пробел, перед отрицательным – «-» |
# | Код системы счисления : 0 – восьмерич , 0х (0Х) 16-ти ричная |
En | |
n | Длина поля вывода. Если недостаточно то автоматически увеличивается, пустые позиции заполняются пробелами. |
0n | Аналогично но пустые позиции заполняются 0. |
Точность | |
Стандартная точность | |
n | e, E, f количество знаков после запятой |
Moдификатор | |
h | Для d, i, o, u, x, X short int |
l | Для d, i, o, u, x, X long int |
Тип | |
с | char, при выводе один байт. |
d | Signed int |
i | В десятичной системе signed int |
o | В восьмеричной системе int unsigned |
u | В десятичной системе unsigned int |
x, X | В 16 системе int unsigned, если х тогда a-f istifadə, если Х тогда– A-F. |
f | Следующий формат [-]dddd.dddd |
e | Следующий формат [-]d.dddde[+|-]ddd |
E | Следующий формат [-]d.ddddE[+|-]ddd |
g | e или f в зависимости от значения и точности |
G | Е или F в зависимости от значения и точности |
s | Для строк |
В функции Printf используется ряд специальных символов.
Simvol | Funksiya |
\b | Смещение влево |
\n | Переход на новую строку |
\r | Переход к началу строки |
\t | Горизонтальная строка |
\’ | Aпостроф |
\’’ | Кавычки |
\? | Символ ? |
Код ТИП
%c Символ
%Md int
%Mld long int
%M.Ne float
%M.Nf float
%M.Nlf double
%M.Ng f,e общий
%Mo 8 –ная система
%s Строка
%Mu insigned int
%Mx 16 –ая система
Здесь М общая длина поля N количество знаков после запятой. Если м недостаточна то происходит округление, если N не указывается то 6 знаков.
Примеры вывода
Примеры
scanf("%f%f",&a,&b);
scanf("%f%d",&c,&d);
printf("a=");
scanf("%f",&a);
27 вопрос * Ввод с помощью CIN и вывод с помощью COUT
Функции Scanf () и printf() используются в C и C++ . Дополнительно в C++ введены классы cin (ввод) и cout (вывод)
Для их использования в директиве include необходимо добавить библиотеку <iostream.h>
Пример
cin>>x>>y>>a>>b;
Здесь вводятся 4 переменные ;
Cout<<a<<b<<c;
Здесь выводятся 3 переменные;
Пример
Вместо Scanf(“%f”,&n);
Можно использовать cin>>n;
Вместо Scanf(“%d%f%i”,&a,&b,&c);
Cin>>a>>b>>c;
Вместо Printf(“%d”,n); можно Cout<<n;
Вместо printf(“%d%f%c”,a,b,t); можно Cout<<a<<b<<t;
Cin и cout используют свободный формат и выбирают формат в соответствии типом переменных.
28 вопрос * Форматный вывод в Cout
Для вывода по формату в Cout можно использовать специальные функции setw(n), setprecision(m). Первая задает ширину поля вторая число знаков после запятой.В конце нужно указывать специальную функцию endl для перевода на новую строку. Для их использования должна быть подключена библиотека <iomanip.h>
Пример
Float f;
f=478.5765;
Cout<<setw(12)<<setprecision(4)<<f<<endl
#include <math.h>
#include <iostream.h>
#include <iomanip.h>
main ()
{
double auto jaf;
cout<<"vvedite chislo "<<endl<<"jaf=";
cin>>jaf;
cout<<setw(4)<<setprecision(3)<<jaf;
cin>>jaf;
}
#include <stdio.h>
#include <math.h>
#include <iostream.h>
Main ()
{
cout<<56.73<<"\n"<<78.2<<45<<" Jafar";
}
#include <stdio.h>
#include <math.h>
#include <iostream.h>
#include <iomanip.h>
main ()
{
double auto jaf;
register unsigned long int jafar12=45;
cout<<"vvedite chislo "<<endl<<"jaf=";
cin>>jaf;
cout<<setw(4)<<setprecision(3)<<jaf<<jafar12;
}
Пример линейной программы
#include <stdio.h>
#include <math.h>
main()
{
/*qrup 646.6*/
float x,t,z,y,w;
scanf("%f%f%f", &x, &t, &z);
y=(2*cos(x))/(1/2+pow(sin(t), 2));
w=y+(z*z)/(3+(z*z)/5);
printf("%8f %8f\n", y, w);
}
29 вопрос ** Оператор İf и goto
Оператор İf может быть использован для создания разветвляющихся и циклических программ. Существует несколько вариантов этого оператора.
a) Простой İf
if ( условие)
Выражение;
Если условие удоволетворяется то вычисляется выражение, в противном случае ничего не вычисляется.
Пример
#include <stdio.h>
#include <math.h>
main ()
{
int a,x,y;
scanf ("%d %d",&a,&x);
if (a>2)
{
y=x*x;
printf("%10d",y);
}
}
Если используется несколько выражений то необходимо использовать блок.
if (условие)
{
Выражение 1;
……
Выражение ;
}
b)Оператор if/else
if (условие)
Выражение 1;
else
Выражение 2;
Если условие верно то выполняется выражение 1 в противном случае выражение 2.
Если несколькр операторов (выражений) то необходтмо использовать блок {}
if (условие)
{
}
else
{
}
Внутри одного оператора İf могут размещаться другие операторы İf
#include <stdio.h>
#include <math.h>
main()
{
int a, x, y;
scanf ("%d %d",&a, &x);
if (a<3)
y=pow(x,2);
else
if (a>5)
{
y=pow(x,3);
}
else
y=pow(x,4);
printf("%d",y);
}
c) оператор if/else if
if (условие1)
выражение1;
else if (условие2)
выражение2;
else if (условие3)
выражение3;
Если истинно условие1, то выполняется выражение1, если выполняется условие2 то выражени2, если условие 3 то выражение
Оператор безусловного перехода goto m; Здесь m метка на которую выполняется переход.
Пример помеченного оператора
farida: y=5; // здесь farida метка оператора
Метка может быть присвоена только испонимым операторам.
Организация цикла с помощью goto (фрагмент программы)
farida: scanf(“%d”,x);
if (x==7777) goto nazir1;
y=x*x;
printf("%18ld\n",y);
goto farida;
nazir1:printf("конец программы");
}
30 вопрос ** Оператор Switch/case
Switch (n)
{
Case 1 константа1 :
выражение1;
break;
Case 2 константа2 :
выражение2;
break;
Case N константаN :
выражениеN;
break;
[ default: стандартное выражение ]
}
Здесь n называется селектором, переменная целого типа, значение которой определяет номер ветки на которую выполняется переход
Последний случай описывает ситуацию исключения..
Пример. Калькулятор
#include <stdio.h>
main ()
{
float a,b;
char c;
scanf("%f%c%f",&a,&c,&b);
printf("%12.2f%c%12.2f=",a,c,b);
switch (c)
{
case '+' :
printf("%12.2f",a+b);
break;
case '-' :
printf("%12.2f",a-b);
break;
case '*' :
printf("%12.2f",a*b);
break;
case '/' :
printf("%f12.2",a/b);
break;
default :printf("такой операции нет");
}
}
While (условие)
Do while Полностью аналогичен while (условие) но здесь проверка продолжения выполняется в конце цикла, такой цикл называется циклом с постусловием. Такой цикл всегда выполняется xотя бы один раз.
Пример
#include <stdio.h>
main ()
{
// сумма 1 -5
int isum=0:
x=0;
do
{
isum+=x;
x++;
}
while(x<=5);
printf(“%5d \n”,isum);
}
Внутри циклов могут использовать специальные операторы break и continue
Оператор break вместе с IF используется для преждевременного прекращения работы цикла.
Оператор continue напротив обеспечивает переход к следующей итерации.
Пример 2. Вычислить функцию на отрезке
#include <stdio.h>
#include <math.h>
main ()
{
float a,b,h,x,y;
scanf("%f%f%f",&a,&b,&h);
x=a;
while (x<=b)
{
y=pow(x,2);
printf("%8.2f %8.2f \n",x,y);
x+=h;
}
}
34 вопрос ** Массивы . Общие сведения
Массив относится к сложным типам данных и наиболее часто используемому типу. Массив –это обьедененные под одним именем множество однотипных данных, где обращение к отдельным элементам осуществляется с помощью индексов.
По числу индексов массивы бывают одномерные (вектора), двумерные ( матрицы) и большей размерности. Массивы как и другие переменные должны быть обьявлены.
Обьявление массивов:
tip имя [ max1];
tip имя [max1] [max2];
ПРИМЕР
int x [20];
float g[10] [20];
Здесь обьявлены одномерный массив х типа int состоящий из 20 элементов и двумерный массив g целого типа состоящий из 10 строк и 20
При обьявлении массивы можно инициалировать , т.е. задать начальные значения.
int a[5]={3,6,12,34,-78};
В языке C ++ индексирование начинается с 0 , т.е. первый элемент имеет индекс не 1 а 0, последний не 20 а 19. !!!!!!
Для обращения к отдельным элементам используются индексы
Например x[5]=89;
6-ому элементу массива X присваивается значение 89 !!!!
i=7;
j=8;
f[i][j]=0; f[7][8]=0;
Элементу матрицы f находящемся на пересечении 8 строки и 9 столбца присваивается 0
Над индексами м ожно выполнять операции
x[2*i-1]=66;
В памяти матрицы располагаются по строкам..
35 вопрос *** Ввод , вывод и обработка массивов
Обычно ввод/вывод осуществляется с помощью оператора for
a) Ввод одномерного массива
float a[10];
int b[3][4];
int i,j ;
for (i=0;i<10 ; i++) scanf(“%f”, &a[i]);
b) Построчный ввод матрицы
for (i=0;i<3;i++)
for (j=0;j<4;j++)
scanf (“%f”, &b[i][j]);
c) Вывод одномерного массива
d) for (i=0;i<10;i++) printf(“%8.2 f ”, a[i]);
b. Построчный вывод матрицы
for (i=0;i<3;i++)
{
for (j=0;j<4;j++) scanf (“%10d”, b[i][j]);
printf(“\n”);
}
Пример 1. Найти скалярное произведение двух векторов
#include <iostream.h>
void main (void)
{
int a[3]={2,7,12},s,i;
int b[3];
s=0;
for(i=0;i<3;i++)
{
cin>>b[i];
}
for(i=0;i<3;i++) s=s+a[i]*b[i];
cout<<s;
}
Примеры
Пример 1
#include <stdio.h>
#include <math.h>
void main ()
{
int y=0,a[5]={2,4,3,7,1};
int k;
for (k=0;k<5;k++)
y=y+a[k];
printf(“%d”, y);
}
Пример 2
#include <stdio.h>
#include <math.h>
void main ()
{
int y=0,a[5]={10,-5,3,12,-8};
int k;
for (k=0;k<5;k++)
if( a[k]%2==0) y+=a[k]+2;
printf(“%d”, y);
}
Пример 3
#include <stdio.h>
#include <math.h>
void main ()
{
int y=0, a[ 3 ][ 3 ]={10,0,3,2,-8,-1,0,2,3};
int i,j;
for (i=0;i< 3;i++)
for(j=0;j<3;j++)
y+=a [ i ] [ j ];
printf("%d", y);
}
Пример 4
#include <stdio.h>
#include <math.h>
void main ()
{
int y=20, a[ 3 ][ 3 ]={10,0,3,2,-8,-1,0,2,3};
int i,j;;
for (i=0;i< 3;i++)
for(j=0;j<3;j++)
if (a[ i ] [j ] !=0) y+=a [ i ] [ j ];
printf("%d", y);
}
Пример
#include <stdio.h>
#include <math.h>
void main ()
{
int n=0,a[5]={10,-5,3,12,-8};
int k;
for (k=0;k<5;k++)
if( a[k]<0) n+=1;
printf("%d", n);
}
36 вопрос *** Указатели
Указатели это особой тип данных.Они служат для хранения не чисел или текста a для хранения адресов переменных где хранятся данные. C помощью указателей можно решить ряд проблeм программирования, в частности с помощью них можно организовывать связные структуры такие как стек, очередь, деревья и другие.
Указатели как и другие типы данных должны быть обьявлены.
Пример
int *a;
float *x;
Здесь аэто не целая переменная а переменная для хранения адреса какой либо целочисленной переменной. !!!!!!
При работе с указателями в основном используются две основные операции
&- получить адрес *- получить значение переменной посредством указателя
& -можно применять как к отдельным переменным так и к элементам массивов.
Операцию получения адреса & нельзя применять к константам и математическим выражениям.
Например &15 и &(a*x+b) недопуситимыми !!!!»!»!.
Пример
#include <stdio.h>
main ()
{
int a,x;
int *pt; // это указатель !!!
a=5;
pt=&a;
x=*pt;
printf(“%d %d”,a,x);
}
Эта програма фактически реализует простое присвоение x=a;
Указатели можно использовать как альтернативный индексам метод обращения к элементам массивов.
Для этого указателю необходимо присвоить адрес первого элемента массива , для обращения к последующим элементам можно использовать инкрементирование указателя
Пример1
#include <stdio.h>
#include <math.h>
main ()
{
int a[3][3]={8,4,2,1,10,4,2,5,2},c;
int *pt,*pt1;
int i;
pt=&a[0][0];
pt1=&a[2][2];
c=0;
c=*pt+*pt1;
printf("%d",c);
}
Пример2
#include <math.h>
#include <stdio.h>
main ()
{
int a[4]={8,4,2,1},b[4]={2,7,6,8},c,*pt,*pt1;
int i;
pt=&a[3];
pt1=&b[3];
c=*(pt-2)+*(pt1-2);
printf("%d",c, pt-2);
}
Пример3
#include <stdio.h>
#include <math.h>
main ()
{
int a[4]={8,4,2,1},b[3]={2,7,6},c,*pt,*pt1;
int i;
pt=&a[0];
c=0;
for (i=0;i<4;i++)
c=c+*(pt+i);
pt1=&b[2];
c=c+*pt1;
printf("%d",c);
}
Указатели можно распечатывать как целую переменную, но нельзя вводить !!!
37 вопрос ** Строки
В C++ нет специального типа для хранения строк и для этого используются массивы типа char . При этом последним символом должен быть ‘\0’ !!!!!.
char s[20]; // строка из 20 символов;
Строки можно обьявлять и без указания длины массива .
char d [ ] ; // строка без указания длины
Строкам можно придавать значения 3 путями:
1) инициализация// во время обьявления
2) присвоение// во время исполнения
3) при вводе // при этом использование символа & не обязательно !!!
В 1 и 3 методе символ ’\0’добавляется автоматически, во втором случае об этлм должен позаботится сам программист. Символ ’\0’ записывается в одиночных кавычках !!!!!!
Пример
#include <stdio.h>
main ()
{
char a[20]= “Narmin”;
char b[]=“Nigar”;
char x1[4], x2[8], static char x3[6]=”salam” ;
x1[0]=’g’; x1[1]=’r’; x1[2]=’u’; x1[3]=’p’; x1[4]=’\0’;
char m[3][25]={“Пример”,”Джафар”,”606”};
printf (“\n\n\t vvediten slovo komputer”);
scanf (“%s”,x2) // & не обязательно
}
Можно работать со массивами строк обьявляя его как 2 мерный массив
При вводе в составе строк не должно быть пробела !!!!!!!
Присваивать строки не разрешается
A=”Aytan” // Нельзя !!!!!!
Это надо делать по элементно !!!!
char d[6] // один символ дополнительно !!!!
d[0]=’A’;
d[1]=’y’;
d[2]=’t’;
d[3]=’a’;
d[4]=’n’;
d[5]=’\0’;
Строки можно выводить с помощью printf и формата s
Строки можно вводить с помощью специальной функции gets(a) а выводить с помощью puts(a) здесь a имя строки
Строки обрабатываются как символьные массивы с помошью циклов. При использовании оператора for необходимо предварительно найти реальную длину строки. Для этого используется функция strlen(), которая как и другие строковые функции расположены в библиотеке string.h
Эта библиотека должна быть подключена с помощью include
38 вопрос . *** Функции для работы со строками
strlen (a) - определяет длину строки. Заменяет sizeof ().
strcpy(a1,a2) -копирует a2 в a1
strncpy(a1,a2,n) -копирует n символов из a2 в a1
strcat(a1,a2) -обьеденяет a1 и a2 (a2 после a1 )
strcmp(a1,a2) сравнивает a1 и a2 с учетом регистра, если строки одинаковы то возвращает 0, если r s1>s2 то 1, если s1<s2 то -1
stricmp(s1,s2) – аналогично strcmp но без учета регистра.
strncat(s1,s2,n) – n символов из s2 добавляет в конец s1
strstr(s1,s2) – находит подстроку s2 в составе s1 , начиная с этой позици и выделяет оставшиеся символы..
sprintf(s,........)- печать не на экран а в строку s s аналогично printf sscanf(s,......) - считывает данные не с клавиатуры а со строки
Пример Ввести строку и определить число появлений символа А
#include <stdio.h>
#include <string.h>
main ()
{
char a[20];
int i, n,s;
scanf("%s",&a); // vvod
printf("%s",a); // vivod
n=strlen(a);// dlina
s=0;
for (i=0 ;i< n;i++)
if (a[i]=='A')
s= s+1;
printf(" s=%d",s);
}
Пример 2 Определить число появлений символа A (другое решение)
#include <stdio.h>
#include <string.h>
main ()
{
char a[20]="A455AABB5saA";
int i, n,s;
i=0;
s=0;
while (a[i]!='\0')
{
if (a[i]=='A')
s= s+1;
i=i+1;
}
printf(" s=%d",s);
}
Пример 3
#include <stdio.h>
#include <string.h>
main ()
{
char a[20]="Program";
char b[20]="Pascal";
int i, n,s=0;
if (strcmp("Grup","grup")==0)
printf("s=%d",strlen(a));
else printf("s=%d",strlen(b));
}
Пример 4
#include <stdio.h>
#include <string.h>
main ()
{
char a[20]="Program";
char b[20]="Pascal";
int i, n,s=0;
if (strcmp("Ritchi","ritchi")==0)
printf("s=%d",strlen(strncat(a,b,1)));
else printf("s=%d",strlen(strncat(a,b,6)));
}
Пример 5
#include <stdio.h>
#include <string.h>
main ()
{
char a[20]="Programc++";
char b[20]="ram";
char c[20];
int i, n,s=0;
strcpy(c,strstr(a,b));
printf(“%s \n”, c);
if (strlen(c)>0)
printf("s=%d",strlen(strncat(a,b,1)));
else printf("s=%d",strlen(c));
}
39 вопрос ** Перечислительный тип
Это тип данных обьявляется с помощью ключевого слова enum и задается списком своих возможных значений.Т.е вначале должен быть определен сам тип !!!
Например
enum mesac {yanvar, fevral, mart,aprel};// тип месяц
enum predmet {matematika,fizika, ximiya};// тип предмет
enum cvet {krasniy, jeltiy, zeleniy}; // тип цвет
enum figura={treugolnik, kvadrat, pramougolnik}; // тип фигура
После формирования типа можно обьявить переменные
predmet jafar,gunel;// 2 peremeniye tipa predmet
В действительности перечислительный тип реализован как целочисленный unsighed int со значениями 0, 1,2 …, т.е. yanvar=0, fevral=1, fizika=2 .
С этим типом данных можно выполнять ограниченное число операций-присвоение из своего списка, сравнение, в составе оператора цикла
Пример jafar=ximiya;
Пример
#include <stdio.h>
main ()
{
enum cvet {jeltiy,beliy,krasniy};
cvet b1,t; int d=0;
b1=beliy;
printf("%d\n",b1);
for(t=jeltiy;t<=krasniy;t++)
d=d+t*t;
printf("%d",d);
}
Программа выдаст
Этот экзотический тип в основном используется для придания больщей наглядности.
40 вопрос *** Файлы
Для работы с файлами они должны быть обьявлены. Для этого используются указатели.
FILE *имя,*имя1;
Пример
FILE *fin, *fout;
Слово FILEдолжно быть обязательно записано в верхнем регистре !!!!!!!!
Перед чтением или записью файл дожен быть открыт с помощью специальной функции fopen в соответствующем режиме.
Коды режимов приводяться ниже :
‘r’ только чтение, еслит файл не сущ. то не открывается
‘w’ только запись, если файл суш. то он стирается
‘a’ добавление, если не сущ. то он создается
‘r+’ ввод и вывод, если не сущест. то не открывается
‘w+’ открывает пустой файл для записи и чтения, если сущ.
то он стирается
‘a+’ как режим ‘a’ но допускает чтение
Файлы открываются следующим образом
fin=fopen(“vag.txt”,”r”);// только для чтения
fin=fopen(“vag1.txt”,”w”);// для записи
Для чтения из файла используется fscanf вместо scanf а для вывода fprintf вместо printf .
fscanf(s0,s1, s2);
Здесь s0-имя файла, s1 – список форматов; s2 – список переменных с символом &на первой позиции.
fprintf(s0,s1, s2);
Здесь s0-имя файла, s1 – список форматов, s2 – список переменных.
Для возврата файла вначало используется функция REWIND (file )
Для определения конца файла используется цикл while совместно с функцией EOF (имя файла)
Для закрытия файла используется функция fclose (имя файла)
Файл vag.txt должен предварительно создан и размещен в соответствующем каталоге !!!!! !!!!!
При указании пути используется не традиционная запись С:\ vag.txt а
С:\\ vag.txt ( т.е. 2 символа слэш) !!!!!
Пример 1.
В файле leyla.txt расположены числа 2 3 6 7 -2
#include <stdio.h>
#include <math.h>
void main (void)
{
FILE *min;
int i;int x,y,z,w;
min=fopen("c:\\leyla.txt","r");
for (i=1;i<4; i++)
fscanf(min,"%d\n",&x);
fscanf(min,"%d",&y);
fscanf(min,"%d\n",&w);
z=x+y+w;
printf("%d",z);
fclose (min);
}
Пример 2
В файле vag.txt размещены числа 2 3 6 7 -2 .
#include <stdio.h>
#include <math.h>
void main (void)
{
FILE *min;
int i;int x,y,z,w;
min=fopen("d:\\leyla.txt","r");
fscanf(min,"%d\n",&x);
fscanf(min,"%d",&y);
rewind(min);
fscanf(min,"%d\n",&w);
z=x+y+w;
printf("%d",z);
fclose (min);
}
Пример 3
В файле vag.txt размещены числа 5 7 2 7 -2
#include <stdio.h>
#include <math.h>
void main (void)
{
FILE *min;
int i;int x,y,z,w;
min=fopen("c:\\leyla.txt","r");
z=0;
while (fscanf(min,"%d\n",&x)!=EOF)
if(x>0) z=z-x+2;
printf("%d",z);
fclose (min);
}
Пример 4 Копирование файла
#include <stdio.h>
#include <math.h>
void main (void)
{
FILE *min,*f2;
int x;
min=fopen("c:\\leyla.txt","r");
f2=fopen("c:\\leyla1.txt","w");
while (fscanf(min,"%d\n",&x)!=EOF)
{fprintf(f2,"%d\n",x); }
fclose (min); fclose(f2);
}
В с++ имеются дополнительные средства для работы с файлами
Класс