Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_dlya_ekzamena_po_informatike.docx
Скачиваний:
12
Добавлен:
15.05.2015
Размер:
183.75 Кб
Скачать

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; }

  1. Свойства матриц

Свойства матриц

Рассмотрим некоторые свойства матриц:

  • если номер строки элемента совпадает с номером столбца (i = j), это означает что элемент лежит на главной диагонали матрицы;

  • если номер строки  превышает номер столбца (i > j), то элемент находится ниже главной диагонали;

  • если номер столбца больше номера строки (i < j), то элемент находится выше главной диагонали.

  • элемент лежит на побочной диагонали, если его индексы удовлетворяют равенству i + j+1 = n;

  • неравенство i + j +1< n характерно для элемента находящегося выше побочной диагонали;

  • соответственно, элементу лежащему ниже побочной диагонали соответствует выражение i + j + 1 > n.

  1. Найти сумму элементов матрицы, лежащих выше главной диагонали

#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. Поиск максимального элемента и его индексов

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 [];

  1. Вычислить количество положительных элементов квадратной матрицы, расположенных по ее периметру и на диагоналях. #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;

}

  1. Сформировать вектор 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; }

  1. Найти сумму и количество целых чисел, записанных в бинарный файл

#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;

}

  1. Заполнить файл значениями функции 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

  1. Указатели, динамические массивы

В Си++ существуют динамические массивы – массивы переменной длины, они определяются с помощью указателей.

Указатель – переменная, значением которой является адрес памяти, по которому хранится объект определенного типа. При объявлении указателей всегда указывается тип объекта, который будет храниться по данному адресу.

type * name;

Здесь name – переменная, объявляемая, как указатель. По этому адресу (указателю) храниться значение типа type.

Например:

int *i;

Объявляем указатель (адрес) i. По этому адресу будет храниться переменная типа int. Переменная i указывает на тип данных int.

float *x,*z;

Объявляем указатели с именами x и z, которые указывают на переменные типа float.

  1. Арифметические операции над адресами

Над адресами в языке Си определены следующие операции:

  • суммирование, можно добавлять к указателю целое значение;

  • вычитание, можно вычитать указатели или вычитать из указателя целое число.

Однако при выполнении арифметических операций есть некоторые особенности.

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 – адрес начала

  1. Динамические массивы. Основные понятия

  1. Динамические массивы. Порядок основных действий

  2. Строки

Строка – последовательность символов. Если в выражении встречается одиночный символ, он должен быть заключен в одинарные кавычки. При использовании в выражениях строка заключается в двойные кавычки. Признаком конца строки является нулевой символ ‘\0’. В С\С++ в отличии от других языков программирования отсутствует тип данных строка,   строки в Си можно описать с помощью массива символов (массив элементов типа char), в   массиве следует предусмотреть место для хранения признака конца строки ('\0').

Например, описание строки из 25 символов должно выглядеть так: char s[26];

Здесь элемент s[25] предназначен для хранения символа конца строки.

char s[7]="Привет";

Можно описать и массив строк

char m[3][25]={"Пример ", "использования", " строк"}

Определен массив из 3 строк по 25 байт в каждой.

Для работы можно использовать указатели (char *). Адрес первого символа и будет начальным значением указателя.

  1. Структуры

Структура является собранием одного или более объектов(переменных, массивов, указателей, других объектов), которые для удобства работы с ними объединены под одним именем.

Определение структуры состоит из двух шагов:

  • объявление структуры (задание нового типа данных определенного пользователем),

  • объявление полей.

  1. Файлы

Файлом называют способ хранения информации на физическом устройстве. Файл — это понятие, которое применимо ко всему — от файла на диске до терминала.

В C++ отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку. Они позволяют работать с различными устройствами, такими, как диски, принтер, коммуникационные каналы и т.д. Эти устройства сильно отличаются друг от друга. Однако файловая система преобразует их в единое абстрактное логическое устройство, называемое потоком.

  1. Организация работы с файлами

Текстовый поток — это последовательность символов. При передаче символов из потока на экран, часть из них не выводится (например, символ возврата каретки, перевода строки).

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

Объявление файла

FILE *идентификатор;

Пример

FILE *f;

  1. Неформатированные файловый ввод-вывод

Функция возвращает указатель на файловую переменную или 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);

  1. Форматированный файловый ввод-вывод

  • fgetc() и fputc() позволяют соответственно осуществить ввод-вывод символа.

  • fgets() и fputs() позволяют соответственно осуществить ввод-вывод строки.

  • fscanf() и fprintf() позволяют соответственно осуществить форматированный ввод-вывод и аналогичный соответствующим функциям форматированного ввода-вывода, только делают это применительно к файлу.

  • remove(const char *filename);

Удаляет с диска файл, указатель на который хранится в файловой переменной filename. Функция возвращает ненулевое значение, если файл не удалось удалить.

  • rename(const char *oldfilename, const char *newfilename);

Функция переименовывает файл; первый параметр – старое имя файла, второй – новое. Возвращает 0 при неудачном завершении программы.

  1. Файловый ввод-вывод с использованием потоков средствами C++

Библиотека потокового ввода-вывода

fstream

Связь файла с потоком вывода

ofstream имя логического файла;

Связь файла с потоком ввода

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]