1.78k likes | 2k Views
Программирование. Часть 4 Структуры данных. 4. Структурное программирование 4. 5 . Базовые структуры данных: структуры. Программа = Структуры данных + Алгоритмы. СТРУКТУРА ДАННЫХ – способ представления данных в программе для компьютера
E N D
Программирование Часть 4 Структуры данных
4. Структурное программирование 4.5. Базовые структуры данных: структуры Программа = Структуры данных + Алгоритмы • СТРУКТУРА ДАННЫХ – способ представления данных в программе для компьютера • ПРОГРАММА - описание структур данных и алгоритма решения задачи на языке программирования, автоматически переводимое на язык машинных команд конкретной ЭВМ помощи транслятора (интерпретатора). Задача: Спроектировать структуру данных для представления в памяти компьютера информации о членах университетского коллектива.
4. Структурное программирование 4.5. Базовые структуры данных: структуры • НАЧНЕМ С ДАННЫХ О члене университетского коллектива. ПОСТАВЛЕНА ЗАДАЧА ХРАНИТЬ И ОБРАБАТЫВАТЬ СЛЕДУЮЩУЮ ИНФОРМАЦИЮ О нем: • Идентификационный номер (студенческого билета или удостоверения) • Фамилия • Имя • Отчество • Дата рождения • Домашний адрес • Дата зачисления (на работу или учебу) • Должность • Является ли членом профсоюза
4. Структурное программирование 4.5. Базовые структуры данных: структуры • Выберем типы данных и имена переменных для хранения информации о каждом человеке: • Идентификационный номер – int id • Фамилия – char surname [80] • Имя – charfirstname[40] • Отчество –char patronymic [60] • Дата рождения – unsigned short birthyear, birthmonth, birthday • Адрес – char address [80] • Дата зачисления – unsigned short enteryear, entermonth, enterday • Должность – char position [30] • Является ли членом профсоюза – booltradeunion
4. Структурное программирование 4.5. Базовые структуры данных: структуры • Структура – упорядоченное множество данных различного типа, которые называются полями или членами структуры. • Доступ к полю структуры осуществляется по имени структуры и имени поля. • Поля структуры могут иметь любой тип (кроме void). • Структура может содержать только такие поля, длина которых известна компилятору в момент определения структуры. • Структурным типом данных или просто структурой называется тип, описывающий структуру. • Синтаксис объявления структурного типа: • structИмя_структуры • { • Тип_ поля_1 Имя_поля1; • Тип_ поля_2 Имя_поля2; • … • };
4. Структурное программирование 4.5. Базовые структуры данных: структуры Примеры объявления структурныхтипов : struct Date struct Name { { unsigned short year; char surname [80]; unsigned short month; char firstname [40]; unsigned short day; char patronymic [60]; }; }; struct Cmplx { double re; double im; }; Обратите внимание: описание структуры заканчивается точкой с запятой
4. Структурное программирование 4.5. Базовые структуры данных: структуры Размещение в памяти структурныхтипов : structDate { unsigned short year; unsigned short month; unsigned short day; }; structCmplx { double re; double im; }; Внимание! Компилятор не гарантирует размещение элементов структуры в смежных ячейках памяти!
4. Структурное программирование 4.5. Базовые структуры данных: структуры Объявление переменных структурного типа Имя_типаИмя_переменной; Имя_типаИмя_переменной={список значений}; Примеры объявления переменных структурныхтипов, Cmplx c1, c2, c3; Date birth, enter, expel, graduate, death ; struct// Совмещение объявлений типа и переменных {// в анонимной структуре double re; double im; } c1, c2, c3;
4. Структурное программирование 4.5. Базовые структуры данных: структуры Примеры объявления переменных структурныхтипов с инициализацией Cmplx c1 = {0, 0}; Date birth = {1991, 10, 7}, enter = {2009, 9 , 1}, graduate = {2014, 6, 30}; struct// Совмещение объявлений типа и переменных { double re; double im; } c1={0, 0}, c2={1, 0}, c3={1, 0};
4. Структурное программирование 4.5. Базовые структуры данных: структуры Доступ к элементам структуры: оператор . (точка) Имя_переменной.Имя_поля birth.year = 2002; birth.month=12; c1.re = 12.5; c1.im = -24; c2.re = c1.re*c1.re + c1.im*c1.im; Присваивание переменных – структур одного типа : c1=c2; expel.year=enter.year;
4. Структурное программирование 4.5. Базовые структуры данных: структуры • Структуры могут: • объединять данные (поля) различных типов; • быть вложенными друг в друга struct Date { unsigned short year; unsigned short month; unsigned short day; }; struct Member { int id; Name ownname; Date birth; char address [80]; Date enter; char position [30]; //"student", "teacher", "scientist" … bool tradeunion; }; struct Name { char surname [80]; char firstname [40]; char patronymic [60]; };
4. Структурное программирование 4.5. Базовые структуры данных: структуры Рассмотрим работу с вложенными структурами struct Member { int id; Name ownname; Date birth; char address [80]; Date enter; char position [30]; bool tradeunion; }; Member stud1 = {298678, “Сидорова”, “Анна”, “Ивановна”, 1991, 10, 7, “Минск, ул. Серова 23, кв. 1”, 2009, 9, 1,“student”, false}; Member prep4 = {129639, {“Попкец”, “Павел”, “Петрович”}, {1980, 6, 1}, “Минск, ул. Казинца 75, кв. 12”, {2003, 3, 18}, “teacher”, true}; Member temp = stud1; stud1.cardno = 123456789; stud1.ownname.surname = “Попкец”; stud1.ownname.surname = prep4.ownname.surname; prep4=temp;
4. Структурное программирование 4.5. Базовые структуры данных: структуры А как представить в памяти информацию обо всех членах коллектива, например, факультета? Student stud1, stud2, stud3, stud4, stud5, … stud788, stud789, stud790;
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки • Массив – нумерованная последовательность данных одного типа, которые хранятся в непрерывной области памяти друг за другом. Члены последовательности данных называются элементами массива. • Доступ к элементу массива производится путем указания имени массива и номера элемента. • Нумерация элементов может выполняться одной или несколькими последовательностями целых чисел – индексными последовательностями. • Если нумерация выполняется одной последовательностью говорят, что массив является одномерным, в противном случае – многомерным. • Нумерация элементов массива всегда начинается с 0, а номер каждого следующего члена больше номера предыдущего на 1.
4. Структурное программирование 4.5. Базовые структуры данных: структуры Размещение в памяти массивов: int b [10] short x [2][4] Внимание! Компилятор гарантирует размещение элементов массива в смежных ячейках памяти!
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки • Массив определяется: • именем (идентификатором); • количеством размерностей - числом номеров, необходимых для указания местонахождения элемента массива; • размером (диапазоном изменения индексов) по каждой размерности. • Конфигурация массива фиксирована. • Все элементы массива принадлежат к одному и тому же типу данных. • Элементами массива могут быть как простые переменные любых типов, так и переменные составных типов (массивов, структур, строк и т.д.). • В качестве индексов в С++ могут использоваться константы и переменные любых целых типов.
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Синтаксис описания одномерного массива Имя_типа_элемента Имя_массива[Размер]; Имя_типа_элемента Имя_массива[Размер] = {список значений}; Примеры описаний массивов float b[20] ; const int n=4; int a[n] = {5, 6,7,8}; 4 байта
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Примеры описаний массивов float x[20] = {0} ; Если список инициализации содержит меньше элементов, чем массив, оставшиеся элементы инициализируются значением 0. Если список содержит больше элементов, чем массив, компилятор генерирует сообщение об ошибке. double y [ ] = {5.5, 6.8, 8.8, 9.5, 10.3} Если значения элементов перечисляются явно, размер массива можно не указывать (компилятор определит его по количеству элементов) 8 байтов
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Операция индексирования Имя_массива[Индекс]; Индекс – целочисленное выражение, значение которого изменяется между 0 и (Размер-1). Для переменной – индекса лучше выбирать тип целый со знаком, так как контроль выхода значений индекса за допустимый диапазон не ведется. const int n=4; int a[n] = {5, 6,7,8}; int i = 3; a[1] = a[2]+a[i]-6;
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Задача. Написать программу, осуществляющую ввод, сложение, вычитание, скалярное умножение двух n-мерных векторов и вывод результатов. Структура данных для представления n-мерного вектора: одномерный массив размера n типа double. Расчетные формулы:
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Если список инициализации содержит меньше значений, чем число элементов массива, оставшиеся элементы будут инициализированы 0 Решение задачи: int main() { const int n=4; double a[n]={0}, b[n]={0}, res[n]={0}; cout << "Enter..." << endl; for (int i=1; i<=n; i++) { cout << endl << "a" << i << ": "; cin >> a[i-1]; cout << "b" << i << ": "; cin >> b[i-1]; }
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Решение задачи: for (int i=1; i<=n; i++) res[i-1]=a[i-1]+b[i-1]; //Sum cout << endl << "a + b = ( "; for (inti=1; i<=n; i++) cout << res[i-1] << " "; cout << ")"; for (inti=1; i<=n; i++) res[i-1]=a[i-1]-b[i-1]; //Difference cout << endl << "a - b = ( "; for (inti=1; i<=n; i++) cout << res[i-1] << " "; cout << ")"; double r=0; for (inti=1; i<=n; i++) r+=a[i-1]*b[i-1]; //Product cout << endl << "a * b = " << r; _getch(); return 0; };
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Задача (Решето Эратосфена). Найти простые числа, меньшие наперед заданного n. Идея алгоритма Эратосфена: из списка всех чисел от 2 до n последовательно вычеркивать числа, кратные уже известным простым числам. Основная структура данных программы: одномерный массив размера 2..n типа boolean. Индексы массива соответствуют анализируемым числам. Элемент массива имеет значение true, если индекс этого элемента - простое число.
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Алгоритм на псевдокоде • Данные. • Максимальное анализируемое число n • Массив, хранящий информацию, простым ли является значение индекса каждого элемента: boolerato [n] • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до n • 3.1. Если erato [ i ] == true , • 3.1.1. Заменить на false значения элементов массива erato • с индексами от iдо n, кратными i • 4. Вывести значения индексов элементов массива erato, • принимающих значение true
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Оптимизируем и уточняем алгоритм на псевдокоде • Данные. • Максимальное анализируемое число n • Массив, хранящий информацию, простым ли является значение индекса каждого элемента: boolerato [n] • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true , • 3.1.1. Заменить на false значения элементов массива erato • с индексами от iдо n, равными i * j, где j изменяется • от i до n • 4. Вывести значения индексов элементов массива erato, • принимающих значение true
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Уточняем алгоритм на псевдокоде • Данные. • Максимальное анализируемое число n • Массив, хранящий информацию, простым ли является значение индекса каждого элемента: boolerato [n+1] • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] = true i = 2 j =
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] = true i = 2 erato[4] = false j = 2
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] = true i = 2 erato[6] = false j = 3
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] = true i = 2 erato[8] = false j = 4
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 2 erato[10] = false j = 5
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 2 erato[12] = false j = 6
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 2 erato[14] = false j = 7
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 2 erato[16] = false j = 8
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 2 i * j > n j = 9
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 3 erato[9] = false j = 3
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 3 erato[12] = false Повторное присваивание выгоднее проверки! j = 4
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 3 erato[15] = false j = 5
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == true i = 3 i * j > n j = 6
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true erato[i] == false i = 4 j =
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную • Алгоритм. • Инициализировать константу n • Объявить массив eratoи инициализировать его значениями true • Для всех iот 2 до целой части sqrt (n) • 3.1. Если erato [ i ] == true, для всех j от iдо n выполнять • 3.1.1. Если i*j > n выйти из цикла • 3.1.2. erato [i*j] = false • 4. Вывести значения индексов элементов массива erato, • принимающих значение true i = j =
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Программа на С++ int main()// sieve of Eratosthenes { const unsigned int n = 1000; const unsigned int size = n+1; bool erato [size]={0}; for (int i = 2; i <= n; i++) erato [i] = 1; for (int i = 2; i <= static_cast <int> (sqrt(static_cast <float> (n))); i++) { if (erato[i]) for (int j = i; j <= n; j++) { if (i*j > n)break; erato [i*j]=false; } } for(int i=2; i <= n; i++) if (erato[i]) cout << i << endl; _getch(); return 0; }
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки • Строки символов в С++ • В С++ есть несколько способов представления строк символов: • в виде одномерного массива символов (строки, завершающиеся нулевым байтом); • в виде объекта класса string; • другие способы в зависимости от реализации. • Строки, завершающиеся нулевым байтом • Описываются как одномерный массив, каждый элемент которого имеет тип char. • Символы строки последовательно располагаются в элементах массива, начиная с нулевого. • В элемент массива, следующий за последним символом автоматически записывается элемент с ASCII кодом 0: ‘\0’
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки • Описание строк, завершающихся нулевым байтом • Строка описывается как обычный массив символов char • Размер массива должен быть на 1 больше длины самой длинной строки, которую предполагается в этом массиве хранить • char s[10] = “Hello”; • Основные отличия строк от массивов: • В процессе выполнения программы отслеживается текущая длина строки • Строка в целом может быть проинициализирована значением строкового литерала (а не только поэлементно символьными значениями) • При помещении идентификатора символьного массива в поток cout выводится не адрес массива, а его содержимое от 0-го элемента до последнего перед завершающим символом \0
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Самые распространенные функции из <string.h>
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки Примеры char st [20] = “ Good Morning”; cout << st; // Good Morning strcpy(st, “Hello”); cout << st; // Hello strcpy(st,“”); Мусор
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки • Основные ограничения на действия со строками, завершающимися нулевым байтом • Строки, как и обычные массивы, нельзя присваивать друг другу, используя оператор присваивания(включая присвоение строке строкового литерала где-либо, кроме начальной инициализации). • К строкам, как к обычным массивам, нельзя применять операции сравнения • Для строк нет перегруженных операций (например, + для операции конкатенации) • Для выполнения операций копирования, конкатенации, сравнения строк и ряда других операций приходится использовать встроенные функции, описанные в заголовке <string.h>
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки int main() // Basic operations with strings { char st [20] = "*******************"; // 19 '*‘ char st1 [20]; for (int i=0; i <=19; i++) cout << st[i]; // ******************* cout << endl<< st << " " << strlen (st) << endl; //******************** 19 strcpy(st,"Good Morning"); for (int i=0; i <=19; i++) cout << st[i]; // Good Morning ****** cout << endl<< st << " " << strlen (st) << endl; // Good Morning 12 strcpy(st,"Hello"); for (int i=0; i <=19; i++) cout << st[i]; // Hello orning ****** cout << endl<< st << " " << strlen (st) << endl; // Hello 5 cout << endl; strcpy(st1, strchr(st, 'e')); cout << st1 << endl; // ello bool i = strchr(st, 'e'); cout << i << endl; // 1 if (strchr(st, 'e')) cout << "char e found"; // char e found _getch(); return 0; }
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки • Ввод строк • При вводе строки с клавиатуры (помещение в поток cin) следует контролировать длину вводимой строки (чтобы она не превышала длину массива, где будет храниться строка • char str [MAX]; • cin >> setw (MAX) >> str; // Ввод до MAX-1 символов • При помещении строки в поток cinпробелы и символы новой строки конвертируются в завершающий нулевой байт • cin >> setw (MAX) >> str; // Введем строку “Good Morning” • cout << str; // Получим Good • Чтобы ввести строку, содержащую пробелы, необходимо вызвать встроенную функцию getlineдля потока cin: • cin.getline(st, MAX); или • char SEP=‘$’; • cin.getline (st, MAX, SEP); // Задаем свой разделитель строк
4. Структурное программирование 4.6. Базовые структуры данных: массивы и строки int main()// Counting number of characters into string { const int MAX = 80; // Maximum array dimension char buffer[MAX]=""; // Input buffer int count = 0; // Character counter while (true) { cout << "Enter a string of less than 80 characters:\n"; cin.getline(buffer, MAX); if (! strcmp(buffer,"")) break; for(count=0; buffer[count] != '\0'; count++);// The same: count=strlen(buffer) cout << endl << "The string \"" << buffer << "\" has " << count << " characters." << endl; } return 0; }