Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие2013_09_28.doc
Скачиваний:
24
Добавлен:
20.05.2015
Размер:
2.72 Mб
Скачать

Массивы строк

Для создания массива строк используется двумерный символьный массив, в котором размер левого индекса определяет количество строк, а размер правого - максимальную длину каждой строки. Например, при выполнении следующей инструкции объявляется массив, предназначенный для хранения 10 строк длиной 80 символов.

char str_mas[10][80];

Для доступа к отдельной строке достаточно указать только левый индекс. Например, следующая инструкция вызывает функцию gets() для записи третьей строки массива str_mas.

gets(str_mas[2]);

Для получения доступа к четвертому символу третьей строки достаточно написать

cout<<str_mas[2][5];

Задача 146.В следующей программе демонстрируется использование массива строк при реализации расчета зарплаты служащих с повременной оплатой и вывода ведомости на получение зарплаты с сортировкой их фамилий по алфавиту.

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include <dos.h>

#include <string.h>

const int m=5, int L=40;

void main()

{

clrscr();

int k, i, j;

char rab[L];

char fio[m][L]={"Иванов", "Андреев", "МакДональд", "Петров", "Ващенко"};

float tarif[m], salary[m];

int work[m];

// Сортировка списка фамилий по алфавиту.

for(i=0; i<m-1; i++)

for(j=i+1; j<m; j++)

if(strcmp(fio[i], fio[j])>0)

{

strcpy(rab, fio[i]);

strcpy(fio[i], fio[j]);

strcpy(fio[j], rab);

}

for(k=0; k<m; k++)

cout<<fio[k]<<"\n";

// Расчет зарплаты по тарифу и отработанным часам.

k=0;

puts(" Введи тариф и количество отработанных часов ");

while(k<m)

{

puts(fio[k]);

cout<<" Тариф: ";

cin>>tarif[k];

cout<<" Отработанно часов: ";

cin>>work[k];

salary[k]=tarif[k]*work[k];

k++;

}

puts("");

puts(" Ведомость на выдачу зарплаты ");

puts("");

for(k=0; k<m; k++)

printf(" %-25s %12.2f\n", fio[k], salary[k]);

getch();

}

Задача 147.Программа осуществляет статистическую обработку сведений о сдаче сессии студентами группы. Фамилии студентов хранятся в массиве строк fio[M][Lstr], а оценки каждого по N (N=4) предметам — в двумерном массиве session [M][N]. Программа, в частности, печатает фамилии тех, у кого есть двойки и их количество, а также предмет, по которому студенты имеют наибольшее количество двоек.

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include <iostream>

#include<string.h>

using namespace std;

const int M=5, N=4, LStr=20;

// сортировка строк использование strcpy(),strcmp()

void sor( char fio[][LStr] , int count)

{ char rab[LStr]; int i,k;

for (i=0; i<count-1; i++)

for (k=i+1; k<count; k++)

if (strcmp(fio[i],fio[k])>0)

{

strcpy(rab, fio[i]);

strcpy(fio[i], fio[k]);

strcpy(fio[k], rab) ;

}

}

int main()

{

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

char fio[M][LStr]={"IVANOV","PETROV","WASECHKIN","SIDOROV","AKSAKOV"};

float mark[M][N]; int i,k,test, max, p[N-1], predmet;

//********************

sor(fio,M);

//********************

for (i=0; i<M; i++)

{

wcout<<L"Введи оценки студента по фамилии "<<fio[i]<<"\n";

wcout<<L"математика: "; cin>>mark[i][0];

wcout<<L"информатика: "; cin>>mark[i][1];

wcout<<L"экономика: "; cin>>mark[i][2];

}

for (i=0; i<M; i++)

mark[i][N-1]=(mark[i][0]+mark[i][1]+mark[i][2])/(N-1);

wcout<<L"\n\n Результаты сдачи экзаменов" ;

wcout<<L"\n\nФамилия Матем Информ Эконом Ср.балл \n";

for (i=0; i<M; i++)

printf ("\n%-15s %-10.0f %-10.0f %-10.0f %-10.2f",fio[i],

mark[i][0],mark[i][1],mark[i][2],mark[i][3]);

wcout<<L"\n\nЭти cтуденты позорят наш ВУЗ:";

for (i=0; i<M; i++)

{

test=0;

for (k=0;k<N-1;k++)

if (mark[i][k]==2)

test++;

if (test!=0) wcout<<"\n\t"<<L"У "<<fio[i]<<L"а двоек - "<<test;

}

for (k=0; k<N-1; k++)

{

p[k]= 0; max = 0;

for (i=0;i<M;i++)

if (mark[i][k]==2) p[k]=p[k]+1;

if (p[k]>max)

{ max=p[k];

predmet=k;

}

}

wcout<<L"\n\nБольше всего двоек ";

switch (predmet)

{

case 0 :wcout<<L" по математике";

break;

case 1 :wcout<<L" по информатике";

break;

case 2: wcout<<L" по экономике" ;

break;

}

wcout<<L", а именно "<<max<<L" шт.\n";

getch();return 0;

}

Задачи для самостоятельного решения

  1. Ввести два слова. Напечатать их в алфавитном порядке.

  1. В заданной строке символов удалить разделители: пробелы, запятые, тире.

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

  1. Составить программу, которая в заданной строке символов подсчитывает количество вхождений:

а) каждой из букв латинского (русского) алфавита;

б) каждой из цифр.

5. Определить, сколько раз в заданном тексте встречается каждая из его литер.

  1. Удалить из заданного текста «лишние» пробелы, оставив между словами по одному пробелу.

  1. Удалить из заданной фразы текст, заключённый в круглые скобки (вместе со скобками). Результат выдать на экран.

  1. Ввести текст, в котором слова отделяются друг от друга пробелами. Вывести на экран последнее слово наоборот.

  1. Дан текст, содержащий только буквы. Определить, симметричен ли он, т.е. читается ли он одинаково слева направо и справа налево (например, текст «пилвино онивлип» симметричен).

  1. Составить программу, которая в заданной строке удваивает каждую его букву (например, из слова ‘база’ должно получиться ‘ббааззаа’).

  1. Ввести строку символов S1. Построить новую строку S2, полученную из S1 добавлением после каждого символа ‘*’ цепочки символов из k пробелов. Считается, что натуральное число k > 0 задано.

  1. Составить программу для игры в ‘поле чудес’ (угадывание слова путём постепенного добавления по одной букве).

Строки как параметры функций

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

  1. Составить функцию, которая по заданной строке S1 строит новую строку S2, полученную удвоением каждой буквы исходной строки.

  1. Составить функцию, которая позволяет из заданной строки S1 переслать в другую строку S2 символы введённой строки, кроме букв “а” и “A”. Строку S2 напечатать.

  1. Составить функцию, которая каждую встреченную в заданной строке символов букву “а” заменяет сочетанием букв “ку” ( так, например, из слова “абракадабра” должно получиться слово “кубркуккудкубрку”).

  1. Составить функцию, которая по заданной строке S1 строит новую строку S2 удалением из S1 символов: цифр, пробелов и запятых.

  1. Составить функцию, которая для заданной строки S1 печатает те её символы, которые входят в неё только один раз.

  1. Составить функцию, которая позволяет для заданной строки подсчитать и выдать на экран количество букв в первом слове (слова в строке отделяются пробелами).

  1. Составить функцию, которая позволяет для заданной строки подсчитать и выдать на экран количество букв в последнем слове (слова в строке отделяются пробелами).

  1. Составить функцию, которая позволяет из заданной строки S1 переслать в другую строку S2 символы введённой строки, исключив цифры. Результат выдать на экран.

  1. Составить функцию, которая определяет, какая из букв в заданном тексте втречается более двух раз.

  1. Составить функцию для решения следующей задачи. Считая, что слова в тексте отделяются несколькими пробелами, найти и напечатать слово, которое начинается и заканчивается одинаковой буквой.

  1. Составить функцию, которая позволяет определить, какая из букв в заданном тексте встречается наиболее часто ( например, в слове «абракадабра» это буква «а»).

  1. Составить функцию для решения следующей задачи. Считая, что слова в тексте отделяются несколькими пробелами, найти и напечатать все слова, которые заканчиваются заданной буквой.

  1. Составить функцию, которая позволяет на основе заданной строки S1, содержащей буквы и цифры, построить две новые строки: S2, содержащую все буквы и S2 – все цифры исходной строки.

  1. Составить функцию, которая преобразует заданный текст (шифрует), заменяя всякую букву латинского алфавита на симметричную ей относительно середины алфавита. (Латинский алфавит: ABCDEFGHIJKLMNOPQRSTUVWXYZ).