Программирование на языке Ассемблера для микроконтроллеров семейства i8051. Каспер Э.

Автор: Каспер Эрни
Язык: Русский
Издательство: Горячая Линия — Телеком
Год: 2004
ISBN: 5-93517-104-X
Страниц: 191

Изложены основы программирования на языке Ассемблера для популярного семейства микроконтроллеров i8051. Описаны особенности архитектуры микроконтроллеров семейства i8051. Приведены сведения о технологии разработки программ, системе и форматах команд. Книга содержит информацию о программировании некоторых типов задач, в том числе задач цифровой фильтрации сигналов, а также несколько рекомендаций о стиле программирования для начинающих программистов.

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

Написать программу, которая хранит значения двух дробей в виде числителя и знаменателя

Задача: Напишите программу, которая хранит значения двух дробей в виде числителя и знаменателя, а затем складывает эти дроби согласно арифметическому правилу. Значения дробей сохранить в структуре drob, состоящей из двух полей типа int, предназначенной для хранения числителя и знаменателя.

Листинг(исходник) программы:


#include <iostream>
#include <locale>
using namespace std;

void main()
{
setlocale(LC_ALL,"Russian");
struct DROB
{
int Chislitel;
int Znamenatel;
};
DROB *A = new DROB;
DROB *B = new DROB;
DROB *C = new DROB;
cout<<"Введите первую дробь в виде числителя и знаменателя через пробел: ";
cin>>A->Chislitel>>A->Znamenatel;
cout<<"\\nВведите вторую дробь в виде числителя и знаменателя через пробел: ";
cin>>B->Chislitel>>B->Znamenatel;

if(B->Znamenatel != A->Znamenatel)
{
C->Znamenatel = B->Znamenatel + A->Znamenatel;
int tempChisA = A->Chislitel * B->Znamenatel;
int tempChisB = B->Chislitel * A->Znamenatel;
C->Chislitel = tempChisA + tempChisB;
}
else if(B->Znamenatel == A->Znamenatel)
{
C->Chislitel = A->Chislitel + B->Chislitel;
C->Znamenatel = A->Znamenatel;
}
if( (C->Chislitel % C->Znamenatel) == 0)
{
C->Chislitel = C->Chislitel / C->Znamenatel;
C->Znamenatel /= C->Znamenatel;
}

cout<<"\\nОтвет: "<< C->Chislitel<<\'/\'<< C->Znamenatel<<endl; // Ответ

delete A;
delete B;
delete C;
system("pause");
}

Автор: Павел Кадыров

Архитектура компьютера / Structured Computer Organization

Автор: Э. Таненбаум
Язык: Русский
Издательство: Питер
Год: 2012
Переводчики: Юрий Гороховский, Д. Шинтяков
Серия: Классика Computer Science
ISBN: 5-469-01274-3, 0-13-148521-0
Страниц: 848

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

Книга рассчитана на широкий круг читателей: как на студентов, изучающих компьютерные технологии, так и на тех, кто самостоятельно знакомится с архитектурой компьютера.

Ассемблер и дизассемблирование

Автор: Владислав Пирогов
Язык: Русский
Издательство: БХВ-Петербург
Год: 2006
Серия: Профессиональное программирование
ISBN: 5-94157-677-3
Страниц: 464

Рассмотрены вопросы исследования кода Windows-приложений. Подробно описаны формат исполняемых модулей и структура инструкций микропроцессора Intel. Дан полный обзор инструментария по исследованию исполняемого кода: отладчики, дизассемблеры, редакторы ресурсов, НЕХ-редакторы и др. Большое внимание уделено работе с популярными программами по дизассемблированию и отладке SoftlCE и IDA Pro. Приведены примеры исследования исполняемого кода и описаны основные принципы подобного исследования: идентификация программных структур, поиск данных и др. Прилагаемый компакт-диск содержит тексты всех листингов, описанных в книге, а также учебные программы.

Ассемблер на примерах / Ucime se Programovat v Iazyce Assembler pro PC

Автор: Рудольф Марек
Язык: Русский
Издательство: Наука и техника
Год: 2005
Серия: Просто о сложном
ISBN: 5-94387-232-9
Страниц: 240

Эта книга представляет собой великолепное практическое руководство по основам программирования на языке ассемблера. Изложение сопровождается большим количеством подробно от комментированных примеров, что способствует наилучшему пониманию и усвоению материала. Доходчиво объясняются все основные вопросы программирования на этом языке.
Вы узнаете, как писать ассемблерные программы под разные операционные системы (Windows, DOS, Linux), как создавать резидентные программы, как писать ассемблерные вставки в программы на языках высокого уровня и многое другое. Попутно вам будут разъяснены основные моменты работы процессора, операционных систем, управления памятью и взаимодействия программ с аппаратными устройствами ПК — то есть все то, без знания чего нельзя обойтись при программировании на языке низкого уровня, которым и является ассемблер.
Книга написана доступным языком. Лучший выбор для начинающих.

Задача на динамические структуры данных, вариант 8 — про гаражную стоянку

О задаче:

По книге:C/C++ Программирование на языке высокого уровня: Учебник для вузов
Автор книги: Павловская Татьяна Александровна
Задача на тему: Динамические структуры данных — (на странице 165)
Вариант задачи: 8 — (на странице 168)’ style=’default’ collapse_link=’true’]

Условия задачи:
[свернуть]

Гаражная стоянка имеет одну стояночную полосу, причем въезд и выезд находятся в одном конце полосы. Если владелец автомашины приходит забрать свой автомобиль, который не является ближайшим к выходу, то все автомашины, загораживающие проезд, удаляются, машина данного владельца выводится со стоянки, а другие машины возвращаются на стоянку в исходном порядке . Написать программу, которая моделирует процесс прибытия и отъезда машин. Прибытие или отъезд автомашины задается командной строкой, которая содержит признак прибытия или отъезда и номер машины. Программа должна выводить сообщение при прибытии или выезде любой машины. При выезде автомашины со стоянки сообщение должно содержать число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей .
‘ style=’default’ collapse_link=’true’]

Примечание к исходнику программы
[свернуть]

Измените набор символов используемый для компилятора с набора символов Юникод(если она у вас стояла) на многобайтовую кодировку. Иначе у вас программа от компилируется и в консоли вы не увидите букв.
‘ style=’default’ collapse_link=’true’]

Листинг(исходник) программы:
[свернуть]

main.cpp
[свернуть]

	#include <iostream>
	#include <windows.h>
	#include <string.h>
	using namespace std;
	HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
	struct Avto
	{
	char marka[10];
	};
	struct Stek
	{
	Avto a;
	Stek *next;
	};
	char bufer [255];
	char*rus (char*s)
	{
	CharToOem (s,bufer);
	return bufer;
	}
	void vvod(Avto &x)
	{
	cin>>x.marka;
	}
	void Print(Stek *u)
	{
	int k=0;
	Stek *p = u;
	if(p==0)
	{
	cout<<rus("\\nВ Гараже НЕТ машин!!!")<<endl;
	return;
	}
	while(p)
	{
	p->a.marka;
	p = p->next;
	k++;
	}
	cout<<rus("\\n\\tВ гараже ");
	if(k<5) cout<<k<<rus(" машины")<<endl;
	else cout<<k<<rus(" машин")<<endl;
	p = u;
	SetConsoleTextAttribute(hConsole, 11);
	cout<<rus("\\n ГАРАЖ:")<<endl;
	while(p)
	{
	cout<<"\\t* ";
	cout << p->a.marka<<endl;
	p = p->next;
	}
	
	cout<<"\\t********"<<endl;
	SetConsoleTextAttribute(hConsole, 7);
	}
	
	void dobavlenie(Stek **u, Avto &x)
	{
	Stek *t=new Stek;
	strcpy(t->a.marka,x.marka);
	t->next=*u;
	*u=t;
	}
	
	bool Zabiraem(Stek**u, Avto &x)
	{
	if(*u==NULL)
	{
	return false;
	}
	Stek*t=*u;
	strcpy(x.marka, t->a.marka);
	*u=t->next;
	delete t;
	return true;
	}
	
	void vyezjaet_iz_garaja(Stek**u)
	{
	Stek *v=NULL;
	Avto x;
	char n[7];
	cout<< rus("\\n\\t Введите машину, которая выезжает:");
	cin>>n;
	while(*u)
	{
	if(Zabiraem(u,x))
	{
	if(strcmp(n, x.marka)==0)
	{
	cout<< rus(" машина ") << n; cout<<rus(" уехала!!!");
	while(Zabiraem(&v, x)) /// возвращаем элементы из стека V в стек U
	dobavlenie(u, x);
	return;
	}
	else
	{
	dobavlenie(&v, x);
	}
	}
	else break;
	}
	SetConsoleTextAttribute(hConsole, 12);
	cout <<rus(" В гараже НЕТ машины ")<<n<<endl;
	SetConsoleTextAttribute(hConsole, 7);
	while(Zabiraem(&v,x))
	dobavlenie (u,x);
	}
	void Clear(Stek **u)
	{
	if(*u == 0) return;
	Stek *p = *u;
	Stek *t;
	while(p)
	{
	t = p;
	p = p->next;
	delete t;
	}
	*u = 0;
	}
	
	int main()
	{
	SetConsoleTextAttribute(hConsole, 7);
	cout << "\\n" << endl;
	Stek *u=NULL;
	int n;
	Avto x; //переменная x типа avto
	do{
	SetConsoleTextAttribute(hConsole, 14);
	
	cout<<rus(" ***********************\\n * \\tМеню:")<<endl;
	
	cout<<rus(" * 1. Приехала новая машина")<<endl;
	
	cout<<rus(" * 2. Печатать гараж")<<endl;
	
	cout<<rus(" * 3. Машина выезжает")<<endl;
	
	cout<<rus(" * 0. Выход")<<endl;
	
	cout<<rus(" ***********************")<<endl;
	
	cout<<rus("\\n\\tЗадайте действие: ");
	
	cin>>n;
	
	SetConsoleTextAttribute(hConsole, 7);
	
	switch (n)
	{
	case 1: cout<<rus("Введите новое авто: ");vvod(x);
	dobavlenie(&u, x); cout<<rus("\\nАвто Добавлено!\\a\\n"); break;
	case 2: Print(u); break;
	case 3: Print(u); vyezjaet_iz_garaja(&u); break;
	case 0: Clear(&u); break;
	default: SetConsoleTextAttribute(hConsole, 12);
	cout<<rus("Нет такого ЧИСЛА!!!")<<endl;
	SetConsoleTextAttribute(hConsole, 7);
	}
	cout<<endl;
	}while (n!=0);
	return 0;
	}
	

[свернуть]

Работа со строками вариант 8, расширение файла DAT, определяет количество символов в самом коротком слове содержащее минимальное количество символов.

О задаче:
[свернуть]

По книге:C/C++ Программирование на языке высокого уровня: Учебник для вузов
Автор книги: Павловская Татьяна Александровна
Задача на тему: Функции библиотеки для работы со строками и символами — (на странице 159)
Вариант задачи: 8 — (на странице 161)’ style=’default’ collapse_link=’true’]
Условия задачи:
[свернуть]

С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки текста не должна превышать 70 символов).
Имя файла должно иметь расширение DAT.
Написать программу, которая:
[свернуть]

  • выводит текст на экран дисплея ;
  • определяет количество символов в самом коротком слове;
  • по нажатию произвольной клавиши поочередно выделяет каждое слово текста, содержащее минимальное количество символов.

‘ style=’default’ collapse_link=’true’]

Листинг(исходник) программы:
[свернуть]

Function.h
[свернуть]


void Find_words_to_text(char *Text,int &AllNumWords, int *Word, int *NumSymbols, int Num);
void Find_min_words(char *Text,int AllNumWords, int *NumSymbols, int Num,int *Word,int *Min_word,int &Num_symbols_word,int &Num_min_word);

‘ style=’default’ collapse_link=’true’]

Function.cpp
[свернуть]


#pragma once
#include <iostream>
#include <fstream>
#include <cctype>
using namespace std;
void Find_words_to_text(char *Text,int &AllNumWords, int *Word, int *NumSymbols, int Num)
{
for(int i(0),j(0); i<Num; i++)
{
if( Text[i] == \'\\0\' )	break;
else if( Text[i] == \' \' || Text[i] == \'\\n\') continue;
else if( ( !i || !isalpha(Text[i-1]) ) && isalpha(Text[i]) )
{
Word[j]=i;
NumSymbols[j]++;
if( !isalpha(Text[i+1]) )
{
AllNumWords++;
j++;
}
}
else if( isalpha(Text[i]) && isalpha(Text[i+1]) )
{
NumSymbols[j]++;
}
else if( isalpha(Text[i]) && !isalpha(Text[i+1]) )
{
AllNumWords++;
NumSymbols[j]++;
j++;
}
}
}
void Find_min_words(char *Text,int AllNumWords, int *NumSymbols, int Num,int *Word, int *Min_word,int &Num_symbols_word,int &Num_min_word)
{
for(int i(0); i < AllNumWords; i++)
{
if( !i ) Num_symbols_word = NumSymbols[i];
else if( Num_symbols_word > NumSymbols[i] ) Num_symbols_word = NumSymbols[i];
else if ( Num_symbols_word == 1 ) break;
}

for(int i(0),j(0); i < AllNumWords; i++)
{
if(Num_symbols_word == NumSymbols[i])
{
Min_word[j] = Word[i];
Num_min_word++;
j++;
}
}
}

‘ style=’default’ collapse_link=’true’]

main.cpp
[свернуть]


#include <iostream>
#include <fstream>
#include <cctype>
#include <locale>
#include <conio.h>
#include "Function.h"
#define Num 1001
using namespace std;
void main()
{
setlocale(LC_ALL,"Russian");

// для программу в общем
char Text[Num];

//для 1-ой функции
int AllNumWords=0; // Количество слов в тексте
int Word[Num/2]={0}; // Позиция начала слов относительно начала текста
int NumSymbols[Num/2]={0}; // Количество символов в словах

//для 2-ой функции
int Min_word[Num/2]={0}; // Слова в тексте с минимальным количеством символов
int Num_symbols_word=0; //Количество символов в минимальном слове
int Num_min_word=0; //Сколько всего слов с минимальным количеством букв

ifstream fin("TextFile.dat"); 

if(fin)
{
fin.getline(Text,1000,\'\\0\'); fin.close();
Find_words_to_text(Text,AllNumWords, Word, NumSymbols, Num);
Find_min_words(Text, AllNumWords, NumSymbols, Num, Word, Min_word, Num_symbols_word, Num_min_word);


//////////////////////////////////////////////////////////////////////////////////////////////////////////
cout<<"Количество символов в самом коротком слове равно "<<Num_symbols_word<<endl;
cout<<"Нажимайте любую клавишу чтобы выделить самые короткие слова в тексте.\\n\\n"<<Text<<endl;
char Select;
for(int j=0; j<Num_min_word; j++)
{
cout<<endl;
system("pause");
cout<<endl;
Select = _getch();
system("cls");
cout<<"Количество символов в самом коротком слове равно "<<Num_symbols_word<<endl;
cout<<"Нажимайте любую клавишу чтобы выделить самые короткие слова в тексте.\\n\\n";
for(int i = 0; i<Num; i++)
{
if( Text[i] == \'\\0\')
{
break;
}
else if( Min_word[j] == i )
{
cout<<"<<";
cout.put(Text[i]);
}
else if( Min_word[j]+Num_symbols_word == i )
{
cout<<">>";
cout.put(Text[i]);
}
else cout.put(Text[i]);
}
cout<<endl;
}
cout<<endl;
system("pause");
}
else
{
cout<<"Файл для чтения \\"TextFile.dat\\" не был найден!!!"<<endl<<endl;
system("pause");
}
}

‘ style=’default’ collapse_link=’true’]

Текстовый файл: [attachment=48:TextFile.dat]

Автор: Павел Кадыров

Вариант 9, работа со строками, расширение файла должно быть DAT, в выделенном предложении – поочередно выделяет все символы, отличные от букв и пробела.

О задаче:
[свернуть]

По книге:C/C++ Программирование на языке высокого уровня: Учебник для вузов
Автор книги: Павловская Татьяна Александровна
Задача на тему: Функции библиотеки для работы со строками и символами — (на странице 159)
Вариант задачи: 9 — (на странице 161)’ style=’default’ collapse_link=’true’]
Условия задачи:
[свернуть]

С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки текста не должна превышать 70 символов).
Имя файла должно иметь расширение DAT.
Написать программу, которая:
[свернуть]

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

‘ style=’default’ collapse_link=’true’]

Листинг(исходник) программы:
[свернуть]

Function.h
[свернуть]

 
void Find_end_sentence(char *Text,int *end_sentence, int &Num_sentence, int Num); 
void Find_end_sentence(char *Text,int *begin_sentence,int *end_sentence,int *Num_sentence, int Num); 
void Find_symbols(char *Text,int *begin_sentence,int *symbols,int *end_sentence,int *Num_sentence, int Num,int *NumSymbols, int &AllNumSymbols); 

‘ style=’default’ collapse_link=’true’]

Function.cpp
[свернуть]

 
#pragma once 
#include <iostream> 
#include <fstream> 
#include <cctype> 
using namespace std; 
void Find_end_sentence(char *Text,int *end_sentence, int &Num_sentence, int Num) 
{ 
for(int i(0),j(0); i<Num; i++) 
{ 
if( Text[i] == \'?\' || Text[i] == \'.\' || Text[i] == \'!\' ) 
{ 
end_sentence[j] = i; 
Num_sentence++; 
j++; 
} 
else if( Text[i] == \'\\0\' ) 
{ 
break; 
} 
} 
} 
void Find_end_sentence(char *Text,int *begin_sentence,int *end_sentence,int *Num_sentence, int Num) 
{ 
for(int i(0),j=0; i<Num && j<*Num_sentence; i++) 
{ 
if(Text[i] == \'\\0\') break; 
else if( (isupper(Text[i]) && !i) || (isupper(Text[i]) && i ) ) 
{ 
begin_sentence[j] = i; 
i = end_sentence[j]; 
j++; 
} 
} 
} 
void Find_symbols(char *Text,int *begin_sentence,int *symbols,int *end_sentence,int *Num_sentence, int Num,int *NumSymbols, int &AllNumSymbols) 
{ 
for(int i(0),j(0),k(0); i<Num; i++) 
{ 
if( Text[i] == \'\\0\') break; 
else if( !isalpha(Text[i]) && Text[i] != \' \' && Text[i] != \'\\n\' ) 
{ 
symbols[j] = i; 
AllNumSymbols++; 
if( begin_sentence[k] < i && i <= end_sentence[k]) 
{ 
NumSymbols[k]++; 
} 
else 
{ 
k++; 
NumSymbols[k]++; 
} 
j++; 
} 
} 
} 

‘ style=’default’ collapse_link=’true’]

main.cpp
[свернуть]

 
#include <iostream> 
#include <fstream> 
#include <cctype> 
#include <locale> 
#include "Function.h" 
#define Num 1001 
using namespace std; 
void main() 
{ 
setlocale(LC_ALL,"Russian"); 

char Text[Num]; 
int Symbols[Num/2]={0}; 
int NumSymbols[Num/2]={0}; 
int AllNumSymbols=0; 

int Begin_sentence[Num/2]={0}; 
int End_sentence[Num/2]={0}; 
int Num_sentence=0; 

ifstream fin("C:\\\\VC 2012\\\\Function C String library\\\\Variant 9\\\\TextFile.dat"); 

if(fin) 
{ 
fin.getline(Text,1000,\'\\0\'); fin.close(); 

Find_end_sentence( Text, End_sentence, Num_sentence, Num); // Поиск конца предложений 
Find_end_sentence( Text, Begin_sentence,End_sentence,&Num_sentence, Num); // Поиск начала предложений 
Find_symbols(Text, Begin_sentence, Symbols, End_sentence, &Num_sentence, Num, NumSymbols, AllNumSymbols); 

for(int j(0); j<Num_sentence; j++) 
{ 
for(int k(0); k<AllNumSymbols; k++) 
{ 
for(int i(0); i<Num; i++) 
{ 
if(Text[i] == \'\\0\') 
{ 
cout<<"\\n\\nВ "<<j+1<<" предложении найдено "<<NumSymbols[j]<<" символов отличных от букв и пробела.\\n\\n"; 
system("pause"); 
system("cls"); 
break; 
} 
else if( Text[i] == \'\\n\') continue; 


else if( Begin_sentence[j] == i && Begin_sentence[j] < Symbols[k] && Symbols[k] <= End_sentence[j]) 
{ 
cout<<" ["; 
cout.put(Text[i]); 
} 
else if( i == Symbols[k] && End_sentence[j] >= i) 
{ 
if(End_sentence[j] == i) 
{ 
cout<<" < "; 
cout.put(Text[i]); 
cout<<" >]"; 
} 
else 
{ 
cout<<" < "; 
cout.put(Text[i]); 
cout<<" > "; 
} 
} 
else if( End_sentence[j] < i && Symbols[k] > i) 
{ 
j++; 
} 
else if( End_sentence[j] == i && Begin_sentence[j] < Symbols[k] && Symbols[k] <= End_sentence[j]) 
{ 
cout.put(Text[i]); 
cout<<" ]"; 
} 
else cout.put(Text[i]); 
} 
} 
} 
} 
else 
{ 
cout<<"Файл для чтения \\"TextFile.dat\\" не был найден!!!"<<endl<<endl; 
system("pause"); 
} 
} 

‘ style=’default’ collapse_link=’true’]

Автор: Павел Кадыров

Вариант 7, задача работы со строками, с помощью текстового редактора создать файл имя файла должно иметь расширение DAT

О задаче:
[свернуть]

По книге:C/C++ Программирование на языке высокого уровня: Учебник для вузов
Автор книги: Павловская Татьяна Александровна
Задача на тему: Функции библиотеки для работы со строками и символами — (на странице 159)
Вариант задачи: 7 — (на странице 161)’ style=’default’ collapse_link=’true’]
Условия задачи:
[свернуть]

С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки текста не должна превышать 70 символов).
Имя файла должно иметь расширение DAT.
Написать программу, которая:
[свернуть]

  • выводит текст на экран дисплея ;
  • определяет количество символов в самом длинном слове;
  • по нажатию произвольной клавиши поочередно выделяет каждое слово текста, содержащее максимальное количество символов.

‘ style=’default’ collapse_link=’true’]

Листинг(исходник) программы:
[свернуть]

main.cpp
[свернуть]


#include <iostream>
#include <fstream>
#include <cctype>
#include <locale>
#include <conio.h>
using namespace std;
void main()
{
setlocale(LC_ALL,"Russian");

char Text[1001];
char *pBeginWords[500] = {0};
ifstream fin("TextFile.dat"); 
if(fin)
{
fin.getline(Text,1000,\'\\0\'); fin.close();
int lengthAllWords[500] = {0},
NumbAllWords=0;
for( int i=0, j=0; i<=1001; i++)
{
if (Text[i] == \'\\0\' && i ) break;
else if (Text[i] == \' \' && !i ) continue;
else if( isalpha(Text[i]) && !lengthAllWords[j])
{
pBeginWords[j] = &Text[i];
lengthAllWords[j]++;
}
else if(isalpha(Text[i]))
{
lengthAllWords[j]++;
}
else if(isalpha(Text[i-1]) && !isalpha(Text[i]))
{
j++;
}
NumbAllWords = j;
}
int MaxLengthWord(0), indexMaxLengthWord(0);
for( int j=0; j<NumbAllWords; j++)
{
if(lengthAllWords[j] > MaxLengthWord) MaxLengthWord = lengthAllWords[j], indexMaxLengthWord = j;
}
int NumWordMaxLength(0), *MaxWordPosix = new int[NumbAllWords];
*MaxWordPosix = NULL;
for( int j=0, i=0; j<NumbAllWords; j++)
{
if(lengthAllWords[indexMaxLengthWord] == lengthAllWords[j])
{
MaxWordPosix[i] = j; i++; NumWordMaxLength = i;
}
} 
//////////////////////////////////////////////////////////////////////////////////////////////////////////
cout<<"Количество символов в самом длинном слове равно "<<MaxLengthWord<<endl;
cout<<"Нажимайте любую клавишу чтобы выделить самые длинные слова в тексте.\\n\\n"<<Text<<endl;
char *pText = Text;
char Select;
char buff;
for(int j=0; j<NumWordMaxLength; j++)	//Цикл выделения всех длинных слов в тексте
{
cout<<endl;
system("pause");
cout<<endl;
Select = _getch();
system("cls");
cout<<"Количество символов в самом длинном слове равно "<<MaxLengthWord<<endl;
cout<<"Нажимайте любую клавишу чтобы выделить самые длинные слова в тексте.\\n\\n";
for(int i= 0; i<1001; i++)	 //Цикл прохода по всем символам в тексте
{
if( &pText[i] < pBeginWords[MaxWordPosix[j]] )
{
buff = pText[i];
cout.put(buff);
}

else if( ( &pText[i] == pBeginWords[MaxWordPosix[j]] ) )
{
cout<<" <<";
buff = pText[i];
cout.put(buff);
}
else if( ( &pText[i] == (pBeginWords[MaxWordPosix[j]]+MaxLengthWord ) ) )
{
cout<<">> ";
buff = pText[i];
cout.put(buff);
}
else if( (&pText[i] > pBeginWords[MaxWordPosix[j]]) && ( &pText[i] < pBeginWords[MaxWordPosix[j]+NumWordMaxLength]) )
{
buff = pText[i];
cout.put(buff);
}
else if( buff == \'\\0\'){ cout<<endl; break;}
else if( &pText[i] > (pBeginWords[MaxWordPosix[j]+NumWordMaxLength] ) )
{
buff = pText[i];
cout.put(buff);
}
}
cout<<endl;
}
delete [] MaxWordPosix; // Освобождение памяти от массива указателей
MaxWordPosix=NULL;

for(int i=0; i<500; i++) // Обнуление адресов массива указателей
pBeginWords[i]=NULL;
delete [] *pBeginWords; // Освобождение памяти от массива указателей
}
else cout<<"Файл для чтения \\"TextFile.dat\\" не был найден!!!"<<endl;
system("pause");
}

‘ style=’default’ collapse_link=’true’]

Автор: Павел Кадыров

Задача с книги Павловской, на тему Функции и Файлы (вариант 9)

О задаче:

По книге:C/C++ Программирование на языке высокого уровня: Учебник для вузов 
Автор книги: Павловская Татьяна Александровна
Задача на тему: Функции и Файлы — (на странице 151)
Вариант задачи: 9 — (на странице 154)’ style=’default’ collapse_link=’true’]

Условия задачи:
[свернуть]

Для хранения данных о планшетных сканерах описать структуру вида: 


struct scan_info {
char model[25]: // наименование подели
int price; // цена
double x_size; // горизонтальный размер области сканирования
double y_size; // вертикальный размер области сканирования
int optr; // оптическое разрешение
int grey: // число градаций серого
};

Написать функцию, которая запрашивает количество сканеров, информация о которых будет вводиться , динамически выделяет память под массив структур соответствующего размера и заполняет его данными в режиме диалога ( с клавиатуры ). При этом имя сканера может содержать пробелы. Написать функцию, которая записывает данный массив в создаваемый бинарный файл. Если цена сканера меньше 200, то данные об этом сканере в файл не записываются. Информация об остальных сканерах помещается в бинарный файл, причем сначала пишутся данные обо всех сканерах, имя которых начинается с заглавной буквы, а затем – с прописной. Структура файла: в первых четырех байтах размещается значение типа long, определяющее количество сделанных в файл записей; далее без пропусков размещаются записи о сканерах. Привести пример программы, создающей файл с данными о сканерах и осуществляющий вывод на дисплей данных о требуемой записи (либо всех, либо по номеру). Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается . 
‘ style=’default’ collapse_link=’true’]

Листинг(исходник) программы:
[свернуть]

Function.h
[свернуть]
scan_info *How_struct_add(int *Num);
void Write_in_bin_file(scan_info *SCANERS, const int Num);
void Output_on_display(scan_info *SCANERS, const int Num);

‘ style=’default’ collapse_link=’true’]

Struct.cpp
[свернуть]
#pragma once
struct scan_info
{
char model[25];
int price;
double x_size;
double y_size;
int optr;
int grey;
};

‘ style=’default’ collapse_link=’true’]

main.cpp
[свернуть]
#include <iostream>
#include <locale>
#include "Struct.cpp"
#include "Function.h"
using namespace std;
int main()
{
setlocale(LC_ALL,"Rus");
int Num; 
scan_info *pSCANERS = How_struct_add(&Num);
Write_in_bin_file( pSCANERS, Num );
Output_on_display( pSCANERS, Num);
delete [] pSCANERS;
system("pause");
return 0;
}

‘ style=’default’ collapse_link=’true’]

Func_Files.cpp
[свернуть]
#pragma once
#include <fstream>
#include <iostream>
#include <locale>
#include "Struct.cpp"
using namespace std;
scan_info *How_struct_add(int *Num)
{
///////////////////Запрос на число добавления скольки структур необходимо сделать/////////////////////////
int bufNum;
do
{ 
system("cls"); cout << "Введите кол-во структур для добавления. P.S. Вводить только положительное число отличное от нуля! : ";
cin>>bufNum; 
}
while(Num <= 0);
scan_info *SCANERS = new scan_info [bufNum]; // Создание динамического массива структур количества Num
*Num = bufNum; // Присваивание значение через указатель
for( int i = 0; i < bufNum; i++ ) 
{ 
cout<<" Введите наименование модели: "; cin.get(); cin.getline(SCANERS[i].model,25,\'\\n\');
cout<<"\\n Введите цену: "; cin>>SCANERS[i].price;
cout<<"\\n Введите горизонтальный размер области сканирования: "; cin>>SCANERS[i].x_size;
cout<<"\\n Введите вертикальный размер области сканирования: "; cin>>SCANERS[i].y_size;
cout<<"\\n Введите оптическое разрешение: "; cin>>SCANERS[i].optr;
cout<<"\\n Введите число градаций серого: "; cin>>SCANERS[i].grey;
system("cls");
}
return SCANERS;
}
void Write_in_bin_file(scan_info *SCANERS, const int Num)
{
ofstream fout("OutFile.bin", ios_base::binary); // Связываем поток ввода с файлом
for( int i=0, k=0; i < 2; i++)
{
if(!i)
{
for(int j=0; j < Num; j++)
{
if (SCANERS[j].model[0] > 64 && SCANERS[j].model[0] < 91 && SCANERS[j].price > 200)
{
k++; 
fout.seekp(0,ios_base::beg);
fout.write((char *)&k,sizeof(j));
fout.seekp(0,ios::end);
fout.write((char *)&SCANERS[j],sizeof(scan_info));
}
}
}
else
{
for(int j=0; j < Num; j++)
{
if (SCANERS[j].model[0] > 96 && SCANERS[j].model[0] < 123 && SCANERS[j].price > 200)
{
k++; 
fout.seekp(0,ios_base::beg);
fout.write((char *)&k,sizeof(j));
fout.seekp(0,ios::end);
fout.write((char *)&SCANERS[j],sizeof(scan_info));
}
}
}
}
fout.close();
}

void Output_on_display(scan_info *SCANERS, const int Num)
{
int selectNum, NumScan;
cout<<"Введите 1 для вывода всех записей или 2 для вывода записи по её номеру: "; cin>>selectNum; system("cls");
switch(selectNum)
{
case 1:
for(int i=0; i< Num; i++)
cout<<"Наименование модели: "<< SCANERS[i].model 
<<"\\n Цена: "<< SCANERS[i].price 
<<"\\n Горизонтальный размер области сканирования: "<< SCANERS[i].x_size
<<"\\n Вертикальный размер области сканирования: "<< SCANERS[i].y_size
<<"\\n Оптическое разрешение: "<< SCANERS[i].optr
<<"\\n Число градаций серого: "<< SCANERS[i].grey<<endl<<endl;
break;
case 2: 
cout<<"Введите номер записи сканера, от 1 до "<<Num<<": "; cin>>NumScan;
if(NumScan-1 < Num && NumScan-1 > -1)
{
NumScan -= 1;
cout<<"\\n Наименование модели: "<< SCANERS[NumScan].model 
<<"\\n Цена: "<< SCANERS[NumScan].price 
<<"\\n Горизонтальный размер области сканирования: "<< SCANERS[NumScan].x_size
<<"\\n Вертикальный размер области сканирования: "<< SCANERS[NumScan].y_size
<<"\\n Оптическое разрешение: "<< SCANERS[NumScan].optr
<<"\\n Число градаций серого: "<< SCANERS[NumScan].grey<<endl<<endl;
}
break;
default:
cout<<"Вы ввели не верное значение!!!\\n";
}
}

[свернуть]

Автор: Павел Кадыров