Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Спросили у пользователя n и разместили в динамической памяти массив из n элементов типа float.



Читайте также:
  1. I. Гашение дуги с помощью полупроводниковых элементов
  2. I. Этап «Военно-интеллектуальный - 1914». Посвящен памяти русских солдат участников Первой мировой войны 1914-1918 годов.
  3. II этап Развитие грудобрюшного типа дыхания с включением элементов дыхательной гимнастики А.Н. Стрельниковой
  4. II. Обращение к памяти программ.
  5. II.3.2. Эффекты взаимного влияния элементов
  6. int n; //р-ть массив
  7. RAID-массив в персональном компьютере

 

После окончания работы с массивом память необходимо освободить:

free(a);

 

Возможен вариант в стиле C++:

 

int n;

float *a;

 

cout<<“n=”; cin>>n;

a=new int[n]; // Выделяем память.

… // Поработали с массивом

delete [] a; // Освобождаем память

 

С элементами массива можно работать как с обычными переменными, т. е. присваивать им значения (a[3] = 5.0;), спрашивать их значения у пользователя (scanf(“%f”, &a[2]); или cin >> a[2];), печатать (printf(“%6.2f ”,a[2]); или cout << a[2]);) и т.п.

 

Но общее имя дает некоторые преимущества.

Пусть, например, нам нужно хранить 100 чисел. Если мы их храним в не связанных между собой переменных a0, a1, …, a99, то для того, чтобы спросить значения наших переменных у пользователя, придется писать программу из 100 строк:

 

cout << “a0=”; cin >> a0;

cout << “a1=”; cin >> a1;

cout << “a99=”; cin >> a99;

 

 

Если мы их храним в массиве a, программа будет значительно короче:

 

float a[100]; // Объявили массив из 100 элементов

for(int i=0;i<100;i++){ // Для i от 0 до 99 с шагом 1

cout << “a” << i << “=”; // Печатаем подсказку, чтобы видеть,

// какой элемент вводим. Например, при

// i=3 будет напечатано a3=

cin >>a[i]; // Спрашиваем a[i] у пользователя.

}

 

Возможен вариант в стиле С:

 

for(int i=0; i<100; i ++){

printf(“a%d=”,i);

scanf(“%d”, &a[i]);

}

 

Массивы и указатели.

 

Адрес переменной – это номер ячейки памяти, в которой она расположена.

 

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

 

Объявление указателя:

int *p; // Объявили указатель p на переменную целого типа.

// Теперь в p можно хранить адрес переменной типа int.

 

Для работы с указателями есть 2 операции:

& - взятие адреса

* - снятие адреса (разадресация).

 

Если x – переменная, то &x – ее адрес.

Если p – указатель на переменную, то *p - значение этой переменной.

 

Имя массива – это адрес его нулевого элемента.

Пусть объявлен массив: int a[5]={7,3,5,4,2};

 

Тогда a – это то же самое, что и &a[0].

*a – это то же самое, что и a[0]. В нашем случае *a = 7.

 

К указателю можно прибавить число.

Если a – это адрес элемента a[0], то a+3 – это адрес элемента a[3].

Операция сложения с константой учитывает размер адресуемых элементов.

Другими словами, если a – указатель на переменную типа int (т.е. номер ячейки, в которой содержится переменная типа int), то прибавление тройки увеличивает этот номер на 3*sizeof(int).

Таким образом,

a+3 – это то же самое, что и &a[3].

*(a+3) – это то же самое, что и a[3].

 

На самом деле, увидев обращение a[3], машина перепишет его в виде индексного выражения *(a+3).

 

Пример.

 

int a[5]={3,2,7,6,5};

printf(“%d”, 3[a]);

 

Вопрос: что будет напечатано?

 

Ответ: выражение 3[a] будет переписано в виде *(3+a), это равно *(a+3), то есть a[3].

Будет напечатано число 6.

 

Указатели можно вычитать.

 

Пример.

 

int a[5]={3,2,7,6,5};

int *p1, *p2;

int m;

p1=&a[1];

p2=&a[4];

m=p2-p1;

 

В результате m=3.

 

 

Рассмотрим несколько простых алгоритмов работы с массивами.

 

Задача 1. Дан массив a. Найти сумму его элементов.

 

Решение.

Пусть массив содержит n элементов a[0], a[1], … a[n-1].

В переменной S будет накапливаться сумма. Сначала сделаем S=0.

Будем по одному добавлять к S наши слагаемые:

S=0;

S=S+a[0];

S=S+a[1];

S=S+a[n-1];

 

Эту программу легко переписать в виде цикла:

 

S=0;

Для i от 0 до n-1 с шагом 1 делать

S=S+a[i];

 

А также перевести на язык C++:

 

S=0;

for (int i=0; i<n; i++)

S+=a[i];

cout << “Сумма равна” << S; // или printf(“S=%7.2f”, S);

 

Задача 2. Дан массив a. Найти в нем наименьший элемент и его индекс.

 

Решение. Будем просматривать по порядку элементы нашего массива. В переменной nom будем хранить индекс наименьшего из просмотренных элементов. Сначала сделаем nom=0. Если очередной просматриваемый элемент меньше, чем a[nom], то кладем в nom его индекс. После просмотра всего массива печатаем ответ (наименьший элемент - a[nom], его индекс - nom).

 

Последовательность наших действий:

 

nom=0;

Если a[1] < a[nom], то nom=1;

Если a[2] < a[nom], то nom=2;

Если a[n-1] < a[nom], то nom=n-1;

Печатать a[nom] и nom.

 

Эту последовательность легко переписать в виде цикла:

 

nom=0;

Для i от 1 до n-1 с шагом 1

Если a[i] < a[nom],

то nom=i;

Печатать a[nom] и nom

 

Реализуем задачу на языке C. Поиск минимального элемента оформим в виде функции, которая будет зависеть от массива a и числа элементов в нем n и возвращать индекс наименьшего элемента.

 

 

#include<iostream.h>

 

int minimum(float a[], int n); // Объявление функции.

// Возможны варианты

// int minimum(float a[100], int n); или

// int minimum(float *a, int n);

 

int main(){

float b[5]={3,2,0,4,7};

int no;

no=minim(b,5);

cout << “Наименьший элемент b[” << no << “]=” << b[no];

//

// В стиле языка C предыдущая строка запишется так:

// printf(“Наименьший элемент b%d=%d”, no, b[no]);

//

return(0);

}

 

 

int minim(int a[],int n){

int nom=0;

for(int i=1;i<n;i++)

if(a[i]<a[nom])

nom=i;

return(nom);

}

 

Задача 3.

Написать программу, которая для целочисленного массива a из n элементов определяет, сколько простых чисел располагается между его максимальным и минимальным элементами.

 

Решение.

Запишем алгоритм решения задачи:

 

  1. Найдем номера nmi и nma максимального и минимального элемента массива (см. задачу 2).
  2. Определим кусок массива, который мы должны просмотреть. Левую границу просмотра положим равной min(nma,nmi), правую max(nma,nmi).
  3. Просматриваем полученный кусок массива. Как только встретим простое число, счетчик простых чисел count увеличиваем на 1. Выяснять, будет ли данное число простым, будет отдельная функция prostoe().

 

Реализуем:

 

#include<iostream.h>

 

int a[100]; // Выделили память под 100 элементов массива.

int n; // Реально будем использовать n элементов.

 

void sprositMassiv(void); // Функция спрашивает у пользователя

// элементы массива a.

int prostoe(int n); // Функция возвращает 1, если x – простое

// и 0 в противном случае.

 

int main(){

int nmi, nma, lev, prav, count, i;

 

sprositMassiv();

nmi=0; nma=0;

for(i=1; i<n; i++) {

if(a[i]<a[nmi]) nmi=i;

if(a[i]>a[nma]) nma=i;

}

 

if (nmi > nma) { lev=nma; prav=nmi; }

else {lev = nmi; prav=nma; }

 

count = 0;

for (i=lev+1; i < prav; i++)

if (prostoe (a[i])) // т.е. if (prostoe(a[i])==1)

count++;

cout << “Количество простых равно ” << count;

return(0);

}

 

Осталось реализовать функции prostoe() и sprositMassiv().

 

int prostoe (int x) {

if (x==1) return(0); // 1- не простое число.

for(int i=2; i<x; i++){

if(x%i == 0) // Если x делится на i,

return(0); // то оно не простое.

}

return(1); // Если мы добрались до этой строчки,

// то x делится только на 1 и на себя.

// Тогда x – простое.

}

 

void sprositMassiv (void) { // Упражнение.

cout << “n=”; cin >> n; // Написать вариант данной

for (int i=0; i<n; i++) { // функции

cout << “a[” << i << “]=”; // в стиле языка С.

cin >> a[i]; //

}

}

 


Дата добавления: 2015-07-11; просмотров: 48 | Нарушение авторских прав






mybiblioteka.su - 2015-2024 год. (0.021 сек.)