Int main()
{ int i,n;
float *a,s;
cout<<"n=“; cin>>n;
a=(float *) malloc(n*sizeof(float));
cout << "Vvedite massiv A";
for(i=0;i<n;i++) // cin>>a[i];
cin>>*(a+i);
for(s=0,i=0;i<n;i++) //s+=a[i];
s+=*(a+i);
cout << "S="<<s;
free(a);
return 0; }
Свойства матриц
Свойства матриц
Рассмотрим некоторые свойства матриц:
если номер строки элемента совпадает с номером столбца (i = j), это означает что элемент лежит на главной диагонали матрицы;
если номер строки превышает номер столбца (i > j), то элемент находится ниже главной диагонали;
если номер столбца больше номера строки (i < j), то элемент находится выше главной диагонали.
элемент лежит на побочной диагонали, если его индексы удовлетворяют равенству i + j+1 = n;
неравенство i + j +1< n характерно для элемента находящегося выше побочной диагонали;
соответственно, элементу лежащему ниже побочной диагонали соответствует выражение i + j + 1 > n.
Найти сумму элементов матрицы, лежащих выше главной диагонали

#include "stdafx.h"
#include <stdio.h>
void main(int argc, char* argv[])
{
float b,a[20][20],s;
int i,j,n,m;
printf("n=");scanf("%d",&n);
printf("m=");scanf("%d",&m);
printf("\n Vvedite A \n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%g",&b);
a[i][j]=b;
}
printf("\n Matrica A\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%g\t",a[i][j]);
printf("\n");
}
for(s=0, i=0;i<n;i++)
for(j=0;j<m;j++)
if (i<j) s+=a[i][j];
printf("\nS=%g\n",s);
}
Поиск максимального элемента и его индексов

1-й способ работы с динамическими матрицами.
При работе с динамическими матрицами следует помнить, что выделенный участок памяти под матрицу A(N,M) представляет собой участок памяти размером NxM элементов.
A=(тип *) calloc(n*m, sizeof(тип))
или
A=(тип *) malloc(n*m*sizeof(тип))
Поэтому для обращения к элементу Ai,j необходимо, по номеру строки i и номеру столбца j вычислить номер этого элемента k в динамическом массиве. Учитывая, то что в массиве элементы нумеруются с нуля k=i.*m+j.
a[i][j] *(a+i*m+j)
2-й способ работы с динамическими матрицами.
Основан на использовании двойного указателя, указателя на указатель. float **a;
Это указатель на float *, или указатель на массив.
Void main()
{int n,m; float **a; a=new float *[n];
Создали массив указателей в количестве n штук на float, каждый элемент массива, является адресом, в котором хранится указатель на float. Осталось определить значение этого указателя. Для этого организуем цикл от 0 до n-1, в котором каждый указатель будет адресовать участок памяти, в котором хранится m элементов.
for(i=0;i<n;i++) a[i]=new float(m);
ai,j – a[i][j]
По окончании работы необходимо освободить память
for(i=0;i<n;i++) delete a[i]; delete [];
Вычислить количество положительных элементов квадратной матрицы, расположенных по ее периметру и на диагоналях. #include "stdafx.h"
#include <iostream.h>
#include <malloc.h>
Int main(int argc, char* argv[])
{ float *a; int i,j,n,k=0;
cout<<"n="; cin>>n;
cout<<"Vvod matrici"<<endl;
a=(float *)calloc(n*n,sizeof(float));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>*(a+i*n+j);
cout<<"Matrica« <<endl;
for(i=0;i<n;i++)
{ for(j=0;j<n;j++) cout<<*(a+i*n+j)<<"\t“; cout<<endl; }
for(i=0;i<n;i++)
{ if (*(a+i*n+i)>0) k++;
if( *(a+i*n+n-i-1)>0) k++; }
cout<<"k="<<k<<endl;
for(i=1;i<n-1;i++)
{ if (*(a+0*n+i)>0 ) k++;
if (*(a+i*n+0)>0) k++;
if (*(a+(n-1)*n+i)>0) k++;
if (*(a+i*n+n-1)>0) k++; }
cout<<"k="<<k<<endl;
if (n%2!=0 && *(a+(n-1)/2*n+(n-
1)/2)>0) k--;
cout<<"k="<<k<<endl;
free(a); return 0;
}
Сформировать вектор P(m), в который записать номера строк максимальных элементов каждого столбца.
Задана матрица A(n,m). Сформировать вектор P(m), в который записать номера строк максимальных элементов каждого столбца. Алгоритм решения этой задачи следующий: для каждого столбца матрицы находим максимальный элемент и его номер, номер максимального элемента j-–го столбца матрицы записываем в j-–й элемент массива P.

#include "stdafx.h"
#include <iostream.h>
int main(int argc, char* argv[])
{ float max; int *p;
int i,j,n,m,nmax; cout<<"n=";
cin>>n; cout<<"m=“; cin>>m;
cout<<"Vvod matrici"<<endl;
float **a=new float *[n];
for(i=0;i<n;i++)
a[i]=new float(m);
p=new int[m];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];cout<<"Matrica"<<endl;
for(i=0;i<n;i++)
{ for(j=0;j<m;j++)
cout<<a[i][j]<<"\t“; cout<<endl; }
cout<<"Massiv P"<<endl;
for(j=0;j<m;j++)
{ max=a[0][j]; nmax=0;
for(i=1;i<n;i++)
if (a[i][j]>max)
{ max=a[i][j]; nmax=i; }
p[j]=nmax;
cout<<p[j]<<"\t“; }
cout<<endl;
delete [] a;
return 0; }
Найти сумму и количество целых чисел, записанных в бинарный файл
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{ FILE *f;
int dat, n=0, sum=0;
cout << "File name? ";
char s[20];
cin.getline(s, 20);
f=fopen(s, "rb");
while (fread(&dat, sizeof(int), 1, f))
{ n++;
cout << dat << " ";
sum+=dat;
}
cout << endl;
cout << "sum: " << sum << ";
number: " << n << endl;
fclose(f);
system("PAUSE");
return EXIT_SUCCESS;
}
Заполнить файл значениями функции y = x * cos x
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
double fun(double x);
int main()
{double a, b, h, x; char s[20];
cout << "Enter the beginning and end of the segment, step-tabulation: ";
cin >> a >> b >> h;
cout << "File name? "; cin >> s;
ofstream f;
f.open(s);
for (x=a; x<=b; x+=h)
{f.width(10); f << x;
f.width(15); f << fun(x) <<
endl; }
f.close();
system("PAUSE");
return EXIT_SUCCESS;
}
double fun(double x)
{ return x*cos(x
Указатели, динамические массивы
В Си++ существуют динамические массивы – массивы переменной длины, они определяются с помощью указателей.
Указатель – переменная, значением которой является адрес памяти, по которому хранится объект определенного типа. При объявлении указателей всегда указывается тип объекта, который будет храниться по данному адресу.
type * name;
Здесь name – переменная, объявляемая, как указатель. По этому адресу (указателю) храниться значение типа type.
Например:
int *i;
Объявляем указатель (адрес) i. По этому адресу будет храниться переменная типа int. Переменная i указывает на тип данных int.
float *x,*z;
Объявляем указатели с именами x и z, которые указывают на переменные типа float.
Арифметические операции над адресами
Над адресами в языке Си определены следующие операции:
суммирование, можно добавлять к указателю целое значение;
вычитание, можно вычитать указатели или вычитать из указателя целое число.
Однако при выполнении арифметических операций есть некоторые особенности.
double *p1;
float *p2;
int *i;
p1++
p2++;
i++;
Операция p1++ увеличивает значение адреса на 8, операция p2++ увеличивает значение адреса на 4, а операция i++ на 2. Операции адресной арифметики выполняются следующим образом:
операция увеличения приводит к тому, что указатель будет сcлаться на следующий объект базового типа (для p1 – это double, для p2 – float, для i – int);
операция уменьшения приводит к тому, что указатель, ссылается на предыдущий объект базового типа.
после операции p1=p1+n, указатель будет передвинут на n объектов базового типа; p1+n как бы адресует n-й элемент массива, если p1 – адрес начала
Динамические массивы. Основные понятия
Динамические массивы. Порядок основных действий
Строки
Строка – последовательность символов. Если в выражении встречается одиночный символ, он должен быть заключен в одинарные кавычки. При использовании в выражениях строка заключается в двойные кавычки. Признаком конца строки является нулевой символ ‘\0’. В С\С++ в отличии от других языков программирования отсутствует тип данных строка, строки в Си можно описать с помощью массива символов (массив элементов типа char), в массиве следует предусмотреть место для хранения признака конца строки ('\0').
Например, описание строки из 25 символов должно выглядеть так: char s[26];
Здесь элемент s[25] предназначен для хранения символа конца строки.
char s[7]="Привет";
Можно описать и массив строк
char m[3][25]={"Пример ", "использования", " строк"}
Определен массив из 3 строк по 25 байт в каждой.
Для работы можно использовать указатели (char *). Адрес первого символа и будет начальным значением указателя.
Структуры
Структура является собранием одного или более объектов(переменных, массивов, указателей, других объектов), которые для удобства работы с ними объединены под одним именем.
Определение структуры состоит из двух шагов:
объявление структуры (задание нового типа данных определенного пользователем),
объявление полей.
Файлы
Файлом называют способ хранения информации на физическом устройстве. Файл — это понятие, которое применимо ко всему — от файла на диске до терминала.
В C++ отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку. Они позволяют работать с различными устройствами, такими, как диски, принтер, коммуникационные каналы и т.д. Эти устройства сильно отличаются друг от друга. Однако файловая система преобразует их в единое абстрактное логическое устройство, называемое потоком.
Организация работы с файлами
Текстовый поток — это последовательность символов. При передаче символов из потока на экран, часть из них не выводится (например, символ возврата каретки, перевода строки).
Двоичный поток — это последовательность байтов, которые однозначно соответствуют тому, что находится на внешнем устройстве.
Объявление файла
FILE *идентификатор;
Пример
FILE *f;
Неформатированные файловый ввод-вывод
Функция возвращает указатель на файловую переменную или NULL при неудачном открытии файла.
Примеры.
f = fopen(s, "wb");
k = fopen("h:\ex.dat", "rb");
Запись в файл
fwrite(адрес записываемой величины, размер одного экземпляра, количество записываемых величин, имя логического файла);
fwrite(&dat, sizeof(int), 1, f);
Чтение из файла
fread(адрес величины, размер одного экземпляра, количество считываемых величин, имя логического файла);
fread(&dat, sizeof(int), 1, f);
Форматированный файловый ввод-вывод
fgetc() и fputc() позволяют соответственно осуществить ввод-вывод символа.
fgets() и fputs() позволяют соответственно осуществить ввод-вывод строки.
fscanf() и fprintf() позволяют соответственно осуществить форматированный ввод-вывод и аналогичный соответствующим функциям форматированного ввода-вывода, только делают это применительно к файлу.
remove(const char *filename);
Удаляет с диска файл, указатель на который хранится в файловой переменной filename. Функция возвращает ненулевое значение, если файл не удалось удалить.
rename(const char *oldfilename, const char *newfilename);
Функция переименовывает файл; первый параметр – старое имя файла, второй – новое. Возвращает 0 при неудачном завершении программы.
Файловый ввод-вывод с использованием потоков средствами C++
Библиотека потокового ввода-вывода
fstream
Связь файла с потоком вывода
ofstream имя логического файла;
Связь файла с потоком ввода
