Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Массивы С

0

В предыдущей главе мы работали со строками С. Как вы узнали, строка С представляет собой последовательность символов, расположенных рядом друг с другом в памяти. также представляют собой последовательности других типов данных, расположенных рядом друг с другом в памяти. Как и в случае со строками, операции со списком базируются на адресе первого элемента.

Допустим, вам потребовалось написать программу для вычисления среднего арифметического трех оценок. Создайте про грамму командной строки С с именем gradeInTheShade.

Отредактируйте файл main.c:

#include <stdio.h>

#include <stdlib.h> // malloc(), free()

float averageFloats(float *data, int dataCount)

{

float sum = 0.0;

for (int i = 0; i < dataCount; i++) { sum = sum + data[i];

}

return sum / dataCount;

}

int main (int argc, const char * argv[])

{

//создание массива значений floats

float *gradeBook = malloc(3 * sizeof(float)); gradeBook[0] = 60.2;

gradeBook[1] = 94.5;

gradeBook[2] = 81.1;

// вычесление среднего

float average = averageFloats(gradeBook, 3);

// освобождение массива free(gradeBook); gradeBook = NULL;

printf("Average = %.2f\n", average);

return 0; }

Постройте и запустите программу

Рис. 35.1. Указатели на буфер значений fioat

Функция malloc() выделяет буфер в куче, поэтому вы должны проследить за тем, чтобы он был освобожден после завершения работы. А разве не удобнее было бы объявить буфер как часть кадра (в стеке), чтобы он автоматически освобождался после завершения выполнения функции? Да, это возможно.

Внесите изменения в main.c:

import <stdio.h>

float averageFloats(float *data, int dataCount)

{

float sum = 0.0;

for (int i = 0; i < dataCount; i++) { sum = sum + data[i];

}

return sum / dataCount;

}

int main (int argc, const char * argv[])

{

// объявление массива как части кадра float gradeBook[3];

gradeBook[0] = 60.2;

gradeBook[1] = 94.5;

gradeBook[2] = 81.1;

// вычисление среднего

float average = averageFloats(gradeBook, 3);

// освобождать массив не нужно

// уничтожение производится автоматически при возвращении управления функцией

printf("Average = %.2f\n", average); return 0; }

Постройте и запустите программу.

Строковый литерал упрощает заполнение массива символами. Также существуют специальные литералы массивов. Пример использования такого литерала для инициализации gradeBook:

int main (int argc, const char *argv[])

{

float gradeBook[] = {60.2, 94.5, 81.1};

float average = averageFloats(gradeBook, 3);

printf("Average = %.2f", average); return 0; }

Постройте и запустите программу.

Обратите внимание: указывать, что длина gradeBook равна 3, не обязательно; компилятор сам вычисляет ее по литералу массива. Этот тип может использоваться во многих местах, в которых обычно используется *. Например, измените объявление averageFloats() следующим образом:

float averageFloats(float data[], int dataCount) { float sum = 0.0;

for (int i = 0; i < dataCount; i++) { sum = sum + data[i];

}

return sum / dataCount;

}

Постройте и запустите программу.

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии