Как написать программу записная книжка

Время на прочтение
3 мин

Количество просмотров 21K

FAQ.Net — программа для заметок, написанная под Windows на языке C# (.NET Framework 2.0).
История началась с того, что нужна была портативная программа для хранения накопленных знаний (копий статей из интернета, ссылки на статьи, SQL-запросы, программный код, пароли и т.д.), с возможностью быстрого поиска и редактирования документов. За основу интерфейса FAQ.Net был взят интерфейс из CHM-формата (файл справки или руководство о программе).
Так как я специализируюсь на базах данных, то решил все документы хранить в БД, используя встроенную СУБД — SQLite. Создал таблицы и написал интерфейс для работы с БД.

Многие программисты до сих пор создают заметки в текстовых документах, сохраняя их на компьютере и со временем теряют их местонахождение. Теперь, с помощью FAQ.Net все накопившиеся документы, можно хранить в одном месте, не опасаясь за их утрату.
В приложении FAQ.Net имеется возможность резервного копирования БД.

Я уже много лет пользуюсь FAQ.Net и аналогов с таким удобным и быстрым поиском не находил.

Приложение работает под Windows XP (если установлен .NET Framework 2.0) и выше.

Интерфейс приложения FAQ.Net

Приложение FAQ.Net состоит из трех областей:

  1. панель поиска и навигации по документам
  2. название раздела или выбранного документа
  3. список документов или редактируемый документ

Вкладка «Разделы»

На вкладке «Разделы» создается иерархический список разделов, которые можно перемещать, изменять или удалять (в двух вариантах: удаление вместе с содержимым и с переносом содержимого в другой раздел).

Поиск

Поиск работает сразу по всем документам, операцией LIKE встроенной СУБД SQLite. При поиске документа можно учитывать несколько условий поиска, добавив специальные символы (|| — операция ИЛИ, && — операция И). Символ «%» означает искать любые символы.

Я думал, что такой способ поиска будет медленным, но протестировав LIKE на базе размером более 2Гб удивился его быстроте.

Хранение и редактирование документов

Все документы хранятся в RTF-формате в БД, в одном единственном файле с именем «FAQ.sqlite», который находится рядом с exe-файлом приложения (FAQ_Net.exe).
Документы можно распечатать, имеется предварительный просмотр.
Можете вставлять изображения в документы.

Вкладка «Избранное»

На вкладке «Избранное» отображаются документы, которые пользователь помечает в области документа, нажав на пиктограмму с изображением звезды (Добавить в избранное).

При нажатии на «Добавить в избранное» документ появляется наверху в панели «Избранное». При отжатии кнопки «Добавить в избранное» документ удаляется из списка в панели «Избранное».

Вкладка «Журнал»

На вкладке «Журнал» отображаются 50 последних документов, отсортированных по дате создания в порядке убывания (самые свежие вверху списка).

Поиск и замена слов внутри документа

Для поиска внутри документа, необходимо нажать Ctrl+F (для замены слов нажмите Ctrl+H). После этого, внизу появится панель поиска и замены текста.

Что дальше?

  1. В дальнейшем список форматов буду расширять. Планирую добавить возможность хранения, поиска и редактирования HTML-формата, а также XLSX-формат.
  2. Для программистов будет удобным добавление функции подсветки синтаксиса для выделенного текста.
  3. Добавлю функцию автоматического обновления приложения.
  4. Улучшить дизайн компонентов.
  5. На вкладке «Разделы» отделить панель списка документов от панели содержимого документа, чтобы список документов не скрывался при открытии документа.
  6. Внести возможность создавать ссылки на другие документы внутри приложения.
  7. Написать API чтобы хранить и обрабатывать HTML-документы при парсинге сайтов.
  8. Сделать приложение FAQ.Net кроссплатформенным.
  9. Список пожеланий можете дополнять сами в комментариях или в группе ВКонтакте (см.ниже).

Кому будет полезна программа заметок FAQ.Net?

Приложение FAQ.Net можно применять людям различных профессий и статусов. Рекомендую использовать приложение для заметок FAQ.Net: программистам, студентам и преподавателям.

Был рад поделиться своей разработкой. Надеюсь Вам была интересна статья и программой для заметок FAQ.Net будут пользоваться.

Скачать Windows приложение FAQ.Net (бесплатно):

(x64) yadi.sk/d/sq3g4NOD3Zt7ZY
(x86) yadi.sk/d/NKXeyUWH3Zt8PQ

Группа ВКонтакте

Alonetop

1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

1

01.02.2011, 20:47. Показов 9190. Ответов 19

Метки нет (Все метки)


Необходимо осуществить следующее:
Написать записную книжку которая будет хранить данные о сотрудниках:
ФИО,
ПОЛ,
Телефон,
Домашний адрес,
дату рождения,
необходимо обеспечить ввод и отображение данных по отдельности, отображение полного списка сотрудников родившихся в текущем месяце,данные должны хранится в файле на диске.

Добавлено через 3 минуты
На этом я застрял!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace WriteBook
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ЗАПИСНАЯ КНИЖКА ВЕРСИЯ 1.0, Курин Стас Все права защищены!");
            //Создадим массивы для хранения данных о сотрудниках
            string[] fio;
            fio = new string[100];
            string[] pol;
            pol = new string[100];
            string[] phone;
            phone = new string[100];
            string[] home;
            home = new string[100];
            string[] data;
            data = new string[100];
            int i=1;
            Console.WriteLine("[1]Ввести данные");
            Console.WriteLine("[2]Отобразить данные конкретной записи");
            Console.WriteLine("[3]Отобразить весь список записей");
            Console.WriteLine("[4]ВЫХОД");
            int k = Int32.Parse(Console.ReadLine());
            string p;
            Console.WriteLine(k.ToString());
            switch (k)
            {
                case 1:
                    Console.WriteLine("---МЕНЮ ВВОДА ДАННЫХ---");
                    for (i=1; i <= 100; i++)
                    {
                        Console.WriteLine("Введите ФИО:");
                        fio[i] = Console.ReadLine();
                        Console.WriteLine("Введите пол:");
                        pol[i] = Console.ReadLine();
                        Console.WriteLine("Введите номер телефона:");
                        phone[i] = Console.ReadLine();
                        Console.WriteLine("Введите домашний адрес:");
                        home[i] = Console.ReadLine();
                        Console.WriteLine("Введите дату рождения:");
                        data[i] = Console.ReadLine();
                        Console.WriteLine("Вернутся в меню?([да]-Вернутся;[нет]-Продолжить ввод данных)");
                        p = Console.ReadLine();
                    } break;
                    
                case 2:
                    Console.WriteLine("---МЕНЮ ВЫВОДА ДАННЫХ О ЗАПИСИ---");
                    break;
                case 3:
                    Console.WriteLine("---МЕНЮ ОТОБРАЖЕНИЯ СПИСКА ВСЕХ ЗАПИСЕЙ---");
                    break;
                case 4:
                    Console.WriteLine("Выход из программы");
                    break;
                   
            }
 
 
 
 
        }
    }
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



6258 / 3559 / 898

Регистрация: 28.10.2010

Сообщений: 5,926

01.02.2011, 20:51

2

Цитата
Сообщение от Alonetop
Посмотреть сообщение

данные должны хранится в файле на диске.

А в файле БД можно сделать?



0



132 / 132 / 29

Регистрация: 17.09.2010

Сообщений: 288

01.02.2011, 20:56

3

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



0



179 / 175 / 14

Регистрация: 17.01.2011

Сообщений: 349

01.02.2011, 20:56

4

Alonetop, используйте XML. Сделать легко, обрабатывать легко. Статей в интернете — вагон и маленькая тележка.



0



1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

01.02.2011, 21:10

 [ТС]

5

Вот в том то и дело что задача в именно в консольке!
Нигде больше!
Я думаю так: надо после занесения данных сделать так чтоб можно было возвратится в меню выбора действий тоесть к свитчу и после того как данные будут занесены они должны автоматом в файлик на диске записатся!А после этого надо сделать так чтоб выводились данные которые быле занесены в текущем месяце



0



132 / 132 / 29

Регистрация: 17.09.2010

Сообщений: 288

01.02.2011, 21:13

6

Alonetop, тогда может попробовать написать класс, определить в нем массив и серелизировать его при входе/выходе.



0



1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

01.02.2011, 21:32

 [ТС]

7

Я не совсем профи в C# все что осталось в моей голове я уже показал жду от вас помощи уважаемые учил С++ 5 лет назад в технаре!



0



XpressMusicMan Музыка24/7

46 / 35 / 3

Регистрация: 27.08.2010

Сообщений: 346

01.02.2011, 22:00

8

Цитата
Сообщение от Slap
Посмотреть сообщение

Alonetop, используйте XML. Сделать легко, обрабатывать легко. Статей в интернете — вагон и маленькая тележка.

А я чего то до ХМЛ не как не доберусь… Не посоветуешь ли чего нибудь толкового?

По теме:
Зачем усложнять аж до такого уровня? Можно хранить в текст файле все! Конечно же попариться придется с написанием кода который будет читать всю инфу, но в этом если надо — могу помочь



0



1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

01.02.2011, 22:06

 [ТС]

9

Цитата
Сообщение от QwertyX
Посмотреть сообщение

А я чего то до ХМЛ не как не доберусь… Не посоветуешь ли чего нибудь толкового?

По теме:
Зачем усложнять аж до такого уровня? Можно хранить в текст файле все! Конечно же попариться придется с написанием кода который будет читать всю инфу, но в этом если надо — могу помочь

Помоги плиз!



0



XpressMusicMan Музыка24/7

46 / 35 / 3

Регистрация: 27.08.2010

Сообщений: 346

01.02.2011, 22:23

10

Создавать классы умеешь?



0



eji

132 / 132 / 29

Регистрация: 17.09.2010

Сообщений: 288

01.02.2011, 22:28

11

Alonetop, честно скажу, не совсем в консоли получается, но вообщем если можно хранить каждого человека в отдельности, то можно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace HandBook
{
    [Serializable]
    public class Book
    {
        public string LastName { get; set; } // Свойства книги, будем хранить фамилию, имя и адрес.
        public string Name { get; set; }
        public string Address { get; set; }
 
        public void Save(Book book, string lastName, string name, string address)
        {
            try
            {
                book.LastName = lastName;
                book.Name = name;
                book.Address = address;
 
                FileStream fs = new FileStream(book.LastName + ".dat", FileMode.Create);
 
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fs, book);
 
                fs.Close();
            }
            catch { return; }
        }
 
        public void Load(Book book, string findLastName)
        {
            try
            {
                FileStream fs = new FileStream(findLastName + ".dat", FileMode.Open);
 
                BinaryFormatter formatter = new BinaryFormatter();
 
                book = (Book)formatter.Deserialize(fs);
                Console.WriteLine(book.LastName);
                Console.WriteLine(book.Name);
                Console.WriteLine(book.Address);
 
                fs.Close();
            }
            catch { return; }
        }
    }
}

И уже вызываем:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
 
namespace HandBook
{
    public class HandBook
    {
        static void Main(string[] args)
        {
            Book book = new Book();
 
            book.Load(book, "Иванов");
            
            string lastName = Console.ReadLine();
            string name = Console.ReadLine();
            string address = Console.ReadLine();
 
            book.Save(book, lastName, name, address);
 
            Console.ReadKey();
        }
    }
}

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



1



1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

01.02.2011, 22:28

 [ТС]

12

Как вызываем мне не совсем понятно поясни пожалуйста!



0



XpressMusicMan Музыка24/7

46 / 35 / 3

Регистрация: 27.08.2010

Сообщений: 346

01.02.2011, 22:32

13

Не, скайпом не пользуюсь…
В общем eji, все правильно подсказал, создай класс, потом в программе сделай массив из объектов созданных по классу, и в каждый объект пихай его данные… С этим разберешься, потом останется только сохранение и чтение из файла…



1



eji

132 / 132 / 29

Регистрация: 17.09.2010

Сообщений: 288

01.02.2011, 22:39

14

Alonetop, после того как добавите класс Book в проект, пишите:

C#
1
2
3
4
static void Main(string[] args) // В методе Мэин.
        {
            Book book = new Book();
            ...



0



BrumbleHorse

122 / 122 / 16

Регистрация: 18.09.2010

Сообщений: 212

01.02.2011, 22:57

15

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System;
using System.IO;
using System.Text;
 
namespace SimpleNotebook
{
    class Program
    {
        static void Main(string[] args)
        {
            string file_name = "SimpleNotebook.txt";
            string state = null;
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.BackgroundColor = ConsoleColor.Gray;
            Console.Clear();
            Console.WriteLine("Запускаем простую записную книжку . .");
            if(System.IO.File.Exists(Convert.ToString(Path.GetFullPath(file_name)))==false)
                Console.WriteLine("Не найден файл SimpleNotebook.txt. . он будет создан автоматически . .");
            Console.WriteLine("Готово . .");
            while(state!="3")
            {
                try
                {
                Console.WriteLine(" 1 - добавить новую запись  2 - найти запись  3 - выход");   
                state = Console.ReadLine();
                switch (state)
                {
                    case "1":
                        Employee temp = new Employee();
                        Console.WriteLine("Введите имя: ");
                        temp.Name = Console.ReadLine();
                        Console.WriteLine("Введите пол: ");
                        temp.Gender = Console.ReadLine();
                        Console.WriteLine("Введите номер телефона: ");
                        temp.Phone = Console.ReadLine();
                        Console.WriteLine("Введите адрес: ");
                        temp.Adress = Console.ReadLine();
                        Console.WriteLine("Введите дату рождения: ");
                        temp.BirthDate = Console.ReadLine();
                        temp.WriteEmployee();
                        break;
                    case "2":
                        string n=null;
                        Console.WriteLine("Введите имя сотрудника,которого ищем: ");
                        n = Console.ReadLine();
                        Employee.DisplayEmployee(n);
                        break;
                    default:
                        break;
                }
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
            Console.WriteLine("Работа завершена . . Нажмите клавишу для выхода . .");
            Console.ReadLine();
                }
   
 
        }
  
       public class Employee
        {
            public string Name  {get;set;}
            public string Gender {get;set;}
            public string Phone {get;set;}
            public string Adress {get;set;}
            public string BirthDate {get;set;}
            public Employee() { }
            public void WriteEmployee()
            {
                using (StreamWriter sw = File.AppendText("SimpleNotebook.txt"))
                {
                    sw.WriteLine(this.Name);
                    sw.WriteLine(this.Gender);
                    sw.WriteLine(this.Phone);
                    sw.WriteLine(this.Adress);
                    sw.WriteLine(this.BirthDate);
                }
            }
            public static void DisplayEmployee(string name)
            {
                using (StreamReader sr = File.OpenText("SimpleNotebook.txt"))
                {
                    string temp = null;
                    while ((temp = sr.ReadLine()) != name && temp != null) ;
                    if (temp == name)
                    {
                        Console.WriteLine("Полное имя: " + temp);
                        Console.WriteLine(String.Format("Пол: " + sr.ReadLine()));
                        Console.WriteLine(String.Format("Телефон: " + sr.ReadLine()));
                        Console.WriteLine(String.Format("Адрес: " + sr.ReadLine()));
                        Console.WriteLine(String.Format("Дата Рождения: " + sr.ReadLine()));
                    }
                    else
                        Console.WriteLine("Такой сотрудник не найден . .");
                }
            }
               
        }
   }



2



1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

01.02.2011, 23:03

 [ТС]

16

Респект вам парни и уважуха!Спасибо за помощь!



1



1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

02.06.2011, 17:22

 [ТС]

17

Нужна помощь необходимо в этой же книжке вывести список людей родившихся в введенным пользователем месяце!



0



1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

04.06.2011, 18:13

 [ТС]

18

походу надо описать массив считывать туда данные, сравнивать день рождения



0



167 / 96 / 23

Регистрация: 13.03.2011

Сообщений: 402

04.06.2011, 19:58

19

ФИО,
ПОЛ,
Телефон,
Домашний адрес,
дату рождения,
необходимо обеспечить ввод и отображение данных по отдельности, отображение полного списка сотрудников родившихся в текущем месяце,данные должны хранится в файле на диске.
***
Класс создайте и от него породите нужные об’екты



0



Alonetop

1 / 1 / 0

Регистрация: 01.02.2011

Сообщений: 13

05.06.2011, 10:41

 [ТС]

20

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System;
using System.IO;
using System.Text;
 
namespace SimpleNotebook
{
    class Program
    {
        static void Main(string[] args)
        {
            string file_name = "SimpleNotebook.txt";
            string state = null;
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.BackgroundColor = ConsoleColor.Gray;
            Console.Clear();
            Console.WriteLine("Запускаем простую записную книжку . .");
            if(System.IO.File.Exists(Convert.ToString(Path.GetFullPath(file_name)))==false)
                Console.WriteLine("Не найден файл SimpleNotebook.txt. . он будет создан автоматически . .");
            Console.WriteLine("Готово . .");
            while(state!="3")
            {
                try
                {
                Console.WriteLine(" 1 - добавить новую запись  2 - найти запись  3 - выход");   
                state = Console.ReadLine();
                switch (state)
                {
                    case "1":
                        Employee temp = new Employee();
                        Console.WriteLine("Введите имя: ");
                        temp.Name = Console.ReadLine();
                        Console.WriteLine("Введите пол: ");
                        temp.Gender = Console.ReadLine();
                        Console.WriteLine("Введите номер телефона: ");
                        temp.Phone = Console.ReadLine();
                        Console.WriteLine("Введите адрес: ");
                        temp.Adress = Console.ReadLine();
                        Console.WriteLine("Введите дату рождения: ");
                        temp.BirthDate = Console.ReadLine();
                        temp.WriteEmployee();
                        break;
                    case "2":
                        string n=null;
                        Console.WriteLine("Введите имя сотрудника,которого ищем: ");
                        n = Console.ReadLine();
                        Employee.DisplayEmployee(n);
                        break;
                    default:
                        break;
                }
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
            Console.WriteLine("Работа завершена . . Нажмите клавишу для выхода . .");
            Console.ReadLine();
                }
   
 
        }
  
       public class Employee
        {
            public string Name  {get;set;}
            public string Gender {get;set;}
            public string Phone {get;set;}
            public string Adress {get;set;}
            public string BirthDate {get;set;}
            public Employee() { }
            public void WriteEmployee()
            {
                using (StreamWriter sw = File.AppendText("SimpleNotebook.txt"))
                {
                    sw.WriteLine(this.Name);
                    sw.WriteLine(this.Gender);
                    sw.WriteLine(this.Phone);
                    sw.WriteLine(this.Adress);
                    sw.WriteLine(this.BirthDate);
                }
            }
            public static void DisplayEmployee(string name)
            {
                using (StreamReader sr = File.OpenText("SimpleNotebook.txt"))
                {
                    string temp = null;
                    while ((temp = sr.ReadLine()) != name && temp != null) ;
                    if (temp == name)
                    {
                        Console.WriteLine("Полное имя: " + temp);
                        Console.WriteLine(String.Format("Пол: " + sr.ReadLine()));
                        Console.WriteLine(String.Format("Телефон: " + sr.ReadLine()));
                        Console.WriteLine(String.Format("Адрес: " + sr.ReadLine()));
                        Console.WriteLine(String.Format("Дата Рождения: " + sr.ReadLine()));
                    }
                    else
                        Console.WriteLine("Такой сотрудник не найден . .");
                }
            }
               
        }
   }

За основу взято это



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

05.06.2011, 10:41

Помогаю со студенческими работами здесь

Создать в Excel приложение — записную книжку
Создать в Excel приложение — записную книжка. С помощью формы в нее можно вносить, просматривать и…

Создать динамическую записную книжку, используя структуру
Создать динамическую записную книжку, используя структуру

struct book{
char name;
char…

Как сделать записную книжку по приведённому шаблону?
Попробуем написать
простенькую записную книжку. Сразу же оговорюсь, этот способ описание книги -…

Опишите, используя структуру данных запись, записную книжку
Опишите, используя структуру данных запись, записную книжку (фамилия и инициалы, год рождения, дата…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

20

Разработка приложения ‘Записная книжка’

Содержание

Введение

. Выбор инструментальных средств и постановка задачи

.1 Выбор инструментальных средств

.2 Этапы подготовки и написания программы

.3 Анализ технического задания и постановка задачи

. Описание структуры программы

.1 Интерфейс программы

.2 Алгоритм программы

.3 Входные данные

.4 Выходные данные

. Руководство оператора

.1 Назначение программы

.2 Условия выполнения программы

.3 Выполнение программы

.4 Сообщения оператору

Заключение

Глоссарий

Список использованных источников

Введение

Программы, работающие на компьютере, можно разделить на три категории:

  1. Прикладные программы, непосредственно обеспечивающие выполнение необходимых пользователям работ: редактирование текстов, рисование, обработку информационных массивов и т.д.
  2. Системные программы, выполняющие различные вспомогательные функции, например диагностика компьютера или резервное копирование информации.
  3. Инструментальные системы (системы программирования), обеспечивающие создание новых программ.

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

Из всего разнообразия прикладного ПО выделяют группу наиболее распространенных программ (типовые пакеты и программы), которые можно использовать во многих областях человеческой деятельности.

К типовому прикладному ПО относят следующие программы:

текстовые процессоры;

табличные процессоры;

системы иллюстративной и деловой графики (графические процессоры);

системы управления базами данных;

экспертные системы;

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

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

Основной задачей курсового проекта было создание программного продукта для хранения информации о персональных данных. Разрабатываемый программный продукт Записная книжка позволяет пользователю записывать, сохранять, читать и удалять информацию о людях, а именно: фамилию, имя и отчество; номер телефона, год рождения, домашний адрес и адрес электронной почты.

В ходе выполнения курсового проекта необходимо выполнить следующие этапы:

анализ технического задания и постановка задачи проектирования;

выделение функций, которые будет выполнять разрабатываемая программа;

разработка алгоритма программы, предназначенной для выполнения функций, сформированных на предыдущем этапе;

составление программы согласно разработанным алгоритмам на языке Delphi;

отладка программы;

составление и оформление пояснительной записки.

Программный продукт разрабатываемый в соответствии с заданием; предназначен для пользователей, имеющих небольшой опыт работы в сфере компьютерных технологий. Программа будет реализована на компьютере стандартной конфигурации с операционной системой Windows XP на языке Delphi (Object Pascal) в среде программирования Delphi7.0. Среди множества языков Delphi является наиболее универсальным и легко изучаемым языком. На сегодня Delphi поддерживает все современные возможности объектно-ориентированного программирования в такой мощной системе проектирования как Delphi 7. Продукт будет загружается стандартным методом для приложений Windows, например, двойным щелчком по файлу ZapisnayaKnigka.exe и не потребует установки дополнительного программного обеспечения.

программный персональный алгоритм сохранение

1. Выбор инструментальных средств и постановка задачи

.1 Выбор инструментальных средств

Система программирования — это система для разработки новых программ на конкретном языке программирования.

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

компилятор или интерпретатор;

интегрированная среда разработки;

средства создания и редактирования текстов программ;

обширные библиотеки стандартных программ и функций;

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

«дружественная» к пользователю диалоговая среда;

многооконный режим работы;

мощные графические библиотеки; утилиты для работы с библиотеками

встроенный ассемблер;

встроенная справочная служба;

другие специфические особенности.

ЭВМ непосредственно выполняет программы на машинном языке программирования данной ЭВМ. При этом программа представляет собой набор отдельных команд компьютера. Эти команды являются достаточно «простыми», например, сложение, умножение, сравнение или пересылка отдельных данных. Каждая команда содержит в себе сведения о том, какая операция должна быть выполнена (код операции), с какими операндами (адреса данных или непосредственно сами данные) выполняются вычисления и куда (адрес) должен быть помещен результат.

Машинные языки были первыми языками программирования. Программирование на них затруднительно ввиду того, что, во-первых, эти языки различны для каждого типа ЭВМ, во-вторых, являются трудоемкими для большинства пользователей по причине необходимости знания особенностей конкретной ЭВМ и большого количества реализуемых ею операций (команд). Данные языки обычно используются для разработки системных программ, при этом чаще всего применяются специальные символические языки — Ассемблеры, близкие к соответствующим машинным языкам.

Человеку свойственно формулировать и решать задачи в выражениях более общего характера, чем команды ЭВМ. Поэтому с развитием программирования появились языки, ориентированные на более высокий уровень абстракции при описании решаемой на ЭВМ задачи. Эти языки получили название языков высокого уровня. Их теоретическую основу составляют алгоритмические языки, например, Паскаль, Си, Бейсик, Фортран, PL/1.

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

Интерпретатор — это программа, которая получает исходную программу и по мере распознавания конструкций входного языка реализует действия, описываемые этими конструкциями.

Транслятор — это программа, которая принимает исходную программу и порождает на своем выходе программу, записываемую на объектном языке программирования (объектную программу). В частном случае объектным может служит машинный язык, и в этом случае полученную на выходе транслятора программу можно сразу же выполнить на ЭВМ. В общем случае объектный язык необязательно должен быть машинным или близким к нему (автокодом). В качестве объектного языка может служить и некоторый промежуточный язык.

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

Широкое распространение получили системы программирования, ориентированные на создание Windows-приложений, одним из которых является пакет Borland Delphi (Дельфи) — блестящий наследник семейства компиляторов Borland Pascal, предоставляющий качественные и очень удобные средства визуальной разработки. Его исключительно быстрый компилятор позволяет эффективно и быстро решать практически любые задачи прикладного программирования.

1.2 Этапы подготовки и написания программы

На ЭВМ могут решаться задачи различного характера, например: научно-инженерные; разработки системного программного обеспечения; обучения; управления производственными процессами и т. д. В процессе подготовки и решения на ЭВМ научно-инженерных задач можно выделить следующие этапы:

постановка задачи;

математическое описание задачи;

выбор и обоснование метода решения;

алгоритмизация вычислительного процесса;

отладка программы;

решение задачи и анализ результатов.

В задачах другого класса некоторые этапы могут отсутствовать, например, в задачах разработки системного программного обеспечения отсутствует математическое описание.

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

. Постановка задачи

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

. Математическое описание задачи

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

Математическая модель должна удовлетворять по крайней мере двум требованиям: реалистичности и реализуемости.

Под реалистичностью понимается правильное отражение моделью наиболее существенных черт исследуемого явления.

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

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

. Выбор и обоснование метода

Модель решения задачи с учетом ее особенностей должна быть доведена до решения при помощи конкретных методов решения. Само по себе математическое описание задачи в большинстве случаев трудно перевести на язык машины. Выбор и использование метода решения задачи позволяет привести решение задачи к конкретным машинным операциям. При обосновании выбора метода необходимо учитывать различные факторы и условия, в том числе точность вычислений, время решения задачи на ЭВМ, требуемый объем памяти и другие.

Одну и ту же задачу можно решить различными методами, при этом в рамках каждого метода можно составить различные алгоритмы.

. Алгоритмизация вычислительного процесса

На данном этапе составляется алгоритм решения задачи согласно действиям, задаваемым выбранным методом решения. Процесс обработки данных разбивается на отдельные относительно самостоятельные блоки, и устанавливается последовательность выполнения блоков. Разрабатывается блок-схема алгоритма.

. Составление программы

При составлении программы алгоритм решения задачи переводится на конкретный язык программирования. Для программирования обычно используются языки высокого уровня, поэтому составленная программа требует перевода ее на машинный язык ЭВМ. После такого перевода выполняется уже соответствующая машинная программа.

. Отладка программы

Отладка заключается в поиске и устранении синтаксических и логических ошибок в программе.

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

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

. Решение задачи и анализ результатов

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

Разработанная программа длительного использования устанавливается на ПК, как правило, в виде готовой к выполнению машинной программы. К программе прилагается документация, включая инструкцию для пользователя. Чаще всего при установке программы на диск для ее последующего использования помимо файлов с исполняемым кодом устанавливаются различные вспомогательные программы (утилиты, справочники, настройщики и т. д.), а также необходимые для работы программ разного рода файлы с текстовой, графической, звуковой и другой информацией.

1.3 Анализ технического задания и постановка задачи

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

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

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

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

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

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

В свою очередь исполнителю проще понять суть поставленной задачи, досконально спланировать последовательность написания программы и не тратить время на лишнюю (не требуемую) работу.

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

Согласно заданию необходимо составить программу «Записная книжка» для работы с персональными данными людей. В программе будут следующие пункты: номер записи по порядку, фамилия, имя, отчество, год рождения, адрес электронной почты, телефон и домашний адрес. Так же будут предусмотрены ввод, редактирование и удаление данных.

Как видим, задание сводится к созданию базы данных для работы с данными людей, в качестве чего послужит файл book.dat. А также, согласно заданию, вывод на экран данных и их программное редактирование.

В программе следует проанализировать полученную из файла информацию и вывести на экран в виде полей с данными по определённой записи.

Подытожив все вышесказанное можно сформулировать требования к разрабатываемому программному обеспечению и выполнить постановку задания на проектирование. Так, согласно заданию, программа должна быть реализована в среде Delphi и должна выполнять следующие функции:

чтение из файла данных и вывод их на экран;

ввод, редактирование, удаление данных.

сохранение изменений в файл.

Последующие разделы будут посвящены решению поставленных задач и разработке приложения с вышеперечисленными функциями.

2. Описание структуры программы

2.1 Интерфейс программы

Перед тем, как написать программу, мы поместили на форму все необходимые компоненты: 9 этикеток (Label), 7 текстовых полей (Edit) и две кнопки (Button).

Далее потребовалось изменить некоторые свойства формы Form1, а именно:

свойство Borderlcons biMaximize = False, т.е. запретили сворачивание окна и разворачивание его на весь экран;

свойство BorderStyle = bsSingle, т.е. запретили пользователю менять размеры формы;

свойство Caption = Записная книжка — это название, заголовок формы;

свойство Position = poScreenCenter — чтобы форма появлялась в центре экрана;

свойство Color = clBackground — выбрали цвет формы (голубой);

свойство Height = 320 — высота формы;

свойство Width = 464 — ширина формы.

Остальные свойства оставляем по умолчанию. В свойствах Caption компонентов Label1:Label8 указываем «Фамилия», «Имя», «Отчество», «Год рождения», «E-mail», «Телефон», «Адрес» и «Номер записи:» соответственно, а в Label9 делаем его пустым. Также назначаем всем используемым компонентам такие свойства как: left (положение по горизонтали), Top (положение по вертикали), Height (высота) и Width (ширина). Кроме того пустым делаем свойство Text для компонентов Edit1:Edit7 и меняем значение свойства Caption кнопки Button1 на «Вверх», а Button2 на «Вниз».

2.2 Алгоритм программы

Открываем редактирование процедуры FormActivate (активация формы) формы Form1. Для этого щёлкаем на форме мышью, а затем в Object Inspector на вкладке Events дважды щёлкаем в пустом поле рядом со строкой события OnActivate. (Далее будем аналогично открывать редактирование процедуры FormClose, за исключением того, что щёлкать надо будет рядом со строкой события OnClose). В редакторе текста программы открывается пустая процедура TForml.FormActivate, которая будет выполняться при запуске программы, поэтому в начале работы приложения будет проверяться, существует ли файл book.dat с данными. В том случае, если такого файла нет, создаём этот файл и записываем в него первую запись, делая её пустой, иначе открываем файл для чтения информации, производим чтение информации из файла построчно и записываем данные из файла в программу и закрываем файл.

Для определения существования файла, используем функцию FileExists, которой передаётся один параметр — имя файла, возвращающую true в том случае, если файл с таким именем существует, и False, если его нет.

Для вывода на экран года рождения (p.year), используем функцию IntToStr для преобразования числа в текст, т.к. год хранится в переменной year типа integer.

Если запись является первой (то есть номер её равен «0»), то кнопку «Вверх» делаем неактивной, присвоив свойству Enabled кнопки Button1 значение False, иначе активной, т.е. значение True.

В объект Label8 выводим порядковый номер записи в книге, с использованием функции IntToStr.

В ходе выполнения работы использовались следующие процедуры для работы с файлом:(<Имя файловой переменной>,<Имя файла>);

Процедура AssignFile назначает значение FileName значению FileHandle при подготовке к чтению или записи этого файла. Имя файла задается либо строковой константой, либо через переменную типа String. Имя файла должно соответствовать правилам работающей в данный момент операционной системы. В программе процедура будет выглядеть так: AssignFile(F,C:\book.dat).(<Имя файловой переменной>);

Открывается файл для чтения из него информации, ему присваивается имя, заданное процедурой Assign, в данном случае Reset(F).

После работы с файлом он, как правило, должен быть закрыт процедурой CloseFile (<Имя файловой переменной>). Чтение информации производит оператор Read(F, p). После его выполнения строка из файла F заносится в переменную p.

Процедура Rewrite(F) открывает файл для записи.

Процедура seek(F, rec) перемещает указатель в файле в новую позицию.

Процедура Write(F, p) записывает данные в файл. Для увеличения порядковой переменной используется процедура inc(rec), а для уменьшения — dec(rec).

После выполнения процедуры Form1.FormActivate выполняются процедуры Form1.Button1Click и Form1.Button2Click.

Для того, чтобы открыть редактирование процедур Button1Click или Button2Click (нажатие кнопки) формы Form1, следует щёлкнуть по кнопке мышью, а затем в Object Inspector на вкладке Events дважды щёлкнуть в пустое поле рядом со строкой события OnClick.

Если запись не является первой, то делаем кнопку «Вверх» активной.

При нажатии на кнопку «Вверх» выполняется процедура Form1.Button1Click. В данной процедуре записываем текущую запись в файл, переходим к следующей записи, уменьшив её номер на единицу, читаем запись и выводим данные на экран, включая номер текущей записи, после чего осуществляем проверку её на номер и, при необходимости, отключаем верхнюю кнопку.

При закрытии формы выполняется последняя процедура Form1.FormClose, записывающая последнюю (текущую) запись в файл.

2.3 Входные данные

Исходными данными для выполнения является файл, который должен содержать, или в который нужно внести, персональные данные людей.

2.4 Выходные данные

Выходными данными являются:

изменение файла, содержащего персональную информацию;

заполненная записная книжка, которая содержит следующие пункты: номер по порядку, фамилия, имя, отчество человека, год его рождения, адрес электронной почты, номер телефона, адрес.

3. Руководство оператора

3.1 Назначение программы

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

3.2 Условия выполнения программы

Программа Записная книжка выполняется на компьютере стандартной конфигурации с операционной системой Windows 95 — Windows XP; создаётся на языке Delphi (Object Pascal) в системе Delphi 7.0; загружается стандартным методом для приложений Windows.

3.3 Выполнение программы

Разработанная программа представляет собой исполняемый файл ZapisnayaKnigka.exe, размером 383 Кбайта, который находится в приложении И. Программа «Записная книжка» не требует инсталляции. Загрузка программы Записная книжка осуществляется стандартным методом для приложений Windows, например, двойным щелчком по файлу ZapisnayaKnigka.exe. После этого откроется окно приложения, в том случае, если никто ещё не пользовался программой на вашем персональном компьютере, поля записной книжки: «Фамилия», «Имя», «Отчество», «E-mail», «Телефон» и «Адрес» будут пустыми, а в поле «Год рождения» будет стоять значение «0»; номер записи будет равен 0 и прокрутка вверх будет недоступна.

Для того чтобы создать первую запись, введите данные в поля: «Фамилия», «Имя», «Отчество», «Год рождения», «E-mail», «Телефон», «Адрес» и нажмите кнопку «Вниз». Введённая запись автоматически сохранится, программа перейдёт на следующую запись и кнопка «Вверх» станет активной.

Важно помнить, что в поле «Год рождения» можно вводить только числовые данные, в противном случае при переходе на следующую запись, программа выдаст ошибку. Вся оставшаяся информация может вводиться независимо от того, к какому типу данных она принадлежит.

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

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

3.4 Сообщения оператору

Программой «Записная книжка» предусмотрены стандартные функции окна «Закрыть» и «Свернуть», но стоит запрет на команду «Развернуть», а также на изменение размеров окна программы, в связи с тем, что при разворачивании окна и изменении его размеров интерфейс приложения станет выглядеть нецелесообразно.

При каждом запуске, программа открывается с первой записи (т.е. с записи под номером «0»).

При работе с программой, создаётся файл book.dat на системном диске C в корневом каталоге, при удалении этого файла, все данные будут утеряны. Также пользователю запрещается открытие файла book.dat, по причине возможного повреждения хранящихся в нём данных, а также нарушения работы системы.

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

Заключение

Данная курсовая работа была выполнена в соответствии с поставленным заданием и отлажена в среде Delphi 7.0. В ходе выполнения курсовой работы была разработана программа для работы с персональными данными людей: фамилия, имя, отчество, год рождения, адрес электронной почты, телефон, домашний адрес, предусмотрены ввод, редактирование и удаление данных.

Во время проектирования программы были выполнены все стандартные этапы разработки, такие как: постановка и описание задачи, выбор метода решения этой задачи, составление алгоритма программы, её написание и отладка, а также анализ полученных результатов.

Были проведены — анализ технического задания и постановка задачи.

Были выделены функции, которыми должна обладать разрабатываемая программа.

Была разработана программа, описана её логическая структура, в том числе алгоритм программы, используемые методы разработки программы.

Согласно разработанному алгоритму была составлена и отлажена программа на алгоритмическом языке программирования Delphi (Object Pascal). Во время разработки программы проводилось ее тестирование.

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

Результаты работы оформлены в виде пояснительной записки.

В ходе выполнения курсового проекта мы убедились в широких возможностях языка программирования Delphi (Object Pascal), повысили уровень практических навыков программирования в интегрированной среде программирования Borland Delphi 7, получили навыки оформления программной документации.

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

Во время написания также были изучены теоретические основы программирования, правила написания и оформления программ,

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

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

Программа «Записная книжка» соответствует общим требованиям к программным системам, таким как:

общение на языке, близком к естественному;

наглядное представление данных, возможность редактирования;

быстрота ознакомления с работой, легкость осваивания;

отсутствие жестких ограничений на структуру и объем исходных данных;

доступность общения;

возможность адаптации к требованиям пользователя;

полнота и доступность программной документации.

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

Глоссарий

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

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

. Среда программирования Delphi — среда программирования, в которой используется язык программирования Object Pascal

Постановка задачи — точная формулировка условий задачи с описанием входной и выходной информации.

Интерфейс программы — набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах. Используется программистами для написания всевозможных приложений.

Структура программы — это общая схема построения программы, рассматривающая ее составные компоненты (программные блоки) и взаимосвязи между ними.

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

Процедура — это любая подпрограмма, которая не является функцией.

Входные данные — величины, которые задаются до начала работы алгоритма или определяются динамически во время его работы.

Выходные данные — результат решения задачи.

Список использованных источников

1 Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi. — М.: ООО «Бином-Пресс», 2006. — 1152 с.: ил.

2 Архангельский А.Я. Программирование в Delphi. — М.: ООО «Бином-Пресс», 2004. — 1152 с.: ил.

Гофман В.Э., Хомоненко А.Д. Delphi. Быстрый старт. — СПб: БХВ-Петербург, 2003. — 288 с.: ил.

Зуев Е.А. Программирование на языке Delphi 6.0,7.0. — М.: Радио и связь, Веста, 1993.

Хомоненко А. Delphi 7. — СПб.: БХВ-Петербург, 2007. — 1200 с.

Амелина Н. Задачи по программированию. — М .: Вузовская книга, 2000. — 104 с.

Бобровский С. Delphi 7: Учебный курс. — СПб.: Питер, 2006. — 735 с.

Кэнту М. Delphi 7: Для профессионалов. — СПб.: Питер, 2004. — 1101 с.: ил.

Культин Н. Delphi 5. Программирование на Object Pascal -СПб.: БХВ- Санкт-Петербург, 1999.- 480 с., ил.

Тейксейра С., Пачеко К. Delphi 5, Руководство разработчика. в 2 т. — СПб.: Питер, 2005.

MainActivity

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.SearchView;

import com.example.sqlitejava.adapter.ListItem;
import com.example.sqlitejava.adapter.MainAdapter;
import com.example.sqlitejava.db.AppExecuter;
import com.example.sqlitejava.db.MyDbManager;
import com.example.sqlitejava.db.OnDataReceived;

import java.util.List;

public class MainActivity extends AppCompatActivity implements OnDataReceived {
private MyDbManager myDbManager;
private EditText edTitle, edDisc;
private RecyclerView rcView;
private MainAdapter mainAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem item= menu.findItem(R.id.id_search);
SearchView sv = (SearchView)item.getActionView();
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}

@Override
public boolean onQueryTextChange(final String newText) {

readFromDb(newText);

return false;
}
});
return super.onCreateOptionsMenu(menu);
}

private void init() {

myDbManager = new MyDbManager(this);
edTitle = findViewById(R.id.edTitle);
edDisc = findViewById(R.id.edDesc);
rcView = findViewById(R.id.rcView);
mainAdapter = new MainAdapter(this);
rcView.setLayoutManager(new LinearLayoutManager(this));
getItemTouchHelper().attachToRecyclerView(rcView);
rcView.setAdapter(mainAdapter);
}

@Override
protected void onResume() {
super.onResume();

myDbManager.openDb();
readFromDb("");

}

public void onClickAdd(View view) {

Intent i = new Intent(MainActivity.this, EditActivity.class);
startActivity(i);
}

@Override
protected void onDestroy() {
super.onDestroy();
myDbManager.closeDb();
}

private ItemTouchHelper getItemTouchHelper(){
return new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}

@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
mainAdapter.removeItem(viewHolder.getAdapterPosition(), myDbManager);
}
});
}

private void readFromDb(final String text){

AppExecuter.getInstance().getSubIO().execute(new Runnable() {
@Override
public void run() {
myDbManager.getFromDb(text, MainActivity.this);
}
});

}

@Override
public void onReceived(final List<ListItem> list) {

AppExecuter.getInstance().getMainIO().execute(new Runnable() {
@Override
public void run() {
mainAdapter.updateAdapter(list);
}
});
}
}

EditActivity

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;
import com.example.sqlitejava.adapter.ListItem;
import com.example.sqlitejava.db.AppExecuter;
import com.example.sqlitejava.db.MyConstants;
import com.example.sqlitejava.db.MyDbManager;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

public class EditActivity extends AppCompatActivity {

private final int PICK_IMAGE_CODE = 123;
private ImageView imNewImage;
private ConstraintLayout imageContainer;
private FloatingActionButton fbAddImage;
private ImageButton imEditImage, imDeleteImage;
private EditText edTitle, edDesc;
private MyDbManager myDbManager;
private String tempUri = "empty";
private boolean isEditState = true;
private ListItem item;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
init();
getMyIntents();
}
@Override
protected void onResume() {
super.onResume();

myDbManager.openDb();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(resultCode == RESULT_OK && requestCode == PICK_IMAGE_CODE && data != null){

tempUri = data.getData().toString();
imNewImage.setImageURI(data.getData());
getContentResolver().takePersistableUriPermission(data.getData(), Intent.FLAG_GRANT_READ_URI_PERMISSION);

}
}

private void init(){

edTitle = findViewById(R.id.edTitle);
edDesc = findViewById(R.id.edDesc);
imNewImage = findViewById(R.id.imNewImage);
fbAddImage = findViewById(R.id.fbAddImage);
imageContainer = findViewById(R.id.imageContainer);
imEditImage = findViewById(R.id.imEditImage);
imDeleteImage = findViewById(R.id.imDeleteImage);
myDbManager = new MyDbManager(this);
}

private void getMyIntents(){

Intent i = getIntent();
if(i != null){

item = (ListItem)i.getSerializableExtra(MyConstants.LIST_ITEM_INTENT);

isEditState = i.getBooleanExtra(MyConstants.EDIT_STATE, true);

if(!isEditState){

edTitle.setText(item.getTitle());
edDesc.setText(item.getDesc());
if(!item.getUri().equals("empty")){
tempUri = item.getUri();
imageContainer.setVisibility(View.VISIBLE);
imNewImage.setImageURI(Uri.parse(item.getUri()));
imDeleteImage.setVisibility(View.GONE);
imEditImage.setVisibility(View.GONE);

}

}

}

}

public void onClickSave(View view) {

final String title = edTitle.getText().toString();
final String desc = edDesc.getText().toString();

if (title.equals("") || desc.equals("")) {

Toast.makeText(this, R.string.text_empty, Toast.LENGTH_SHORT).show();

} else {

if(isEditState){

AppExecuter.getInstance().getSubIO().execute(new Runnable() {
@Override
public void run() {
myDbManager.insertToDb(title, desc, tempUri);
}
});
Toast.makeText(this, R.string.saved, Toast.LENGTH_SHORT).show();

} else {

myDbManager.updateItem(title, desc, tempUri,item.getId());
Toast.makeText(this, R.string.saved, Toast.LENGTH_SHORT).show();

}
myDbManager.closeDb();
finish();

}
}
public void onClickDeleteImage(View view){

imNewImage.setImageResource(R.drawable.ic_image_def);
tempUri = "empty";
imageContainer.setVisibility(View.GONE);
fbAddImage.setVisibility(View.VISIBLE);
}

public void onClickAddImage(View view){
imageContainer.setVisibility(View.VISIBLE);
view.setVisibility(View.GONE);
}

public void onClickChooseImage(View view){

Intent chooser = new Intent(Intent.ACTION_OPEN_DOCUMENT);
chooser.setType("image/*");
startActivityForResult(chooser, PICK_IMAGE_CODE);

}
}

ListItem

import java.io.Serializable;

public class ListItem implements Serializable {

private String title;
private String desc;
private String uri = "empty";
private int id = 0;

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

public String getUri() {
return uri;
}

public void setUri(String uri) {
this.uri = uri;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}
}

MainAdapter

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.sqlitejava.EditActivity;
import com.example.sqlitejava.R;
import com.example.sqlitejava.db.MyConstants;
import com.example.sqlitejava.db.MyDbManager;
import java.util.ArrayList;
import java.util.List;

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MyViewHolder> {
private Context context;
private List<ListItem> mainArray;


public MainAdapter(Context context) {
this.context = context;
mainArray = new ArrayList<>();
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_list_layout, parent, false);
return new MyViewHolder(view, context, mainArray);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.setData(mainArray.get(position).getTitle());
}

@Override
public int getItemCount() {
return mainArray.size();
}

static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView tvTitle;
private Context context;
private List<ListItem> mainArray;

public MyViewHolder(@NonNull View itemView, Context context, List<ListItem> mainArray) {
super(itemView);
this.context = context;
this.mainArray = mainArray;
tvTitle = itemView.findViewById(R.id.tvTitle);
itemView.setOnClickListener(this);

}
public void setData(String title){
tvTitle.setText(title);
}

@Override
public void onClick(View v) {

Intent i = new Intent(context, EditActivity.class);
i.putExtra(MyConstants.LIST_ITEM_INTENT, mainArray.get(getAdapterPosition()));
i.putExtra(MyConstants.EDIT_STATE, false);
context.startActivity(i);


}
}
public void updateAdapter(List<ListItem> newList){

mainArray.clear();
mainArray.addAll(newList);
notifyDataSetChanged();
}

public void removeItem(int pos, MyDbManager dbManager){
dbManager.delete(mainArray.get(pos).getId());
mainArray.remove(pos);
notifyItemRangeChanged(0, mainArray.size());
notifyItemRemoved(pos);


}

}

OnDataReceived

import com.example.sqlitejava.adapter.ListItem;
import java.util.List;

public interface OnDataReceived {
void onReceived(List<ListItem> list);
}

MyDbManager

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.sqlitejava.adapter.ListItem;
import java.util.ArrayList;
import java.util.List;

public class MyDbManager {
private Context context;
private MyDbHelper myDbHelper;
private SQLiteDatabase db;

public MyDbManager(Context context) {
this.context = context;
myDbHelper = new MyDbHelper(context);
}
public void openDb(){
db = myDbHelper.getWritableDatabase();
}

public void insertToDb(String title, String disc, String uri){

ContentValues cv = new ContentValues();
cv.put(MyConstants.TITLE, title);
cv.put(MyConstants.DISC, disc);
cv.put(MyConstants.URI, uri);
db.insert(MyConstants.TABLE_NAME, null, cv);

}
public void updateItem(String title, String disc, String uri,int id){
String selection = MyConstants._ID + "=" + id;
ContentValues cv = new ContentValues();
cv.put(MyConstants.TITLE, title);
cv.put(MyConstants.DISC, disc);
cv.put(MyConstants.URI, uri);
db.update(MyConstants.TABLE_NAME,cv,selection, null);
}
public void delete(int id){
String selection = MyConstants._ID + "=" + id;
db.delete(MyConstants.TABLE_NAME,selection, null);
}

public void getFromDb(String searchText, OnDataReceived onDataReceived) {
final List<ListItem> tempList = new ArrayList<>();
String selection = MyConstants.TITLE + " like ?";
final Cursor cursor = db.query(MyConstants.TABLE_NAME, null, selection,
new String[]{"%" + searchText + "%"}, null, null, null);


while (cursor.moveToNext()) {
ListItem item = new ListItem();
String title = cursor.getString(cursor.getColumnIndex(MyConstants.TITLE));
String desc = cursor.getString(cursor.getColumnIndex(MyConstants.DISC));
String uri = cursor.getString(cursor.getColumnIndex(MyConstants.URI));
int _id = cursor.getInt(cursor.getColumnIndex(MyConstants._ID));
item.setTitle(title);
item.setDesc(desc);
item.setUri(uri);
item.setId(_id);
tempList.add(item);

}
cursor.close();
onDataReceived.onReceived(tempList);
}
public void closeDb(){
myDbHelper.close();
}

}

MyDbHelper

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;

public class MyDbHelper extends SQLiteOpenHelper {

public MyDbHelper(@Nullable Context context) {
super(context, MyConstants.DB_NAME, null, MyConstants.DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

db.execSQL(MyConstants.TABLE_STRUCTURE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL(MyConstants.DROP_TABLE);
onCreate(db);

}
}

MyConstants

public class MyConstants {
public static final String EDIT_STATE = "edit_state";
public static final String LIST_ITEM_INTENT = "list_item_intent";
public static final String TABLE_NAME = "my_table";
public static final String _ID = "_id";
public static final String TITLE = "title";
public static final String DISC = "disc";
public static final String URI = "uri";
public static final String DB_NAME = "my_db.db";
public static final int DB_VERSION = 2;
public static final String TABLE_STRUCTURE = "CREATE TABLE IF NOT EXISTS " +
TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY," + TITLE + " TEXT," + DISC + " TEXT," +
URI + " TEXT)";

public static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
}

AppExecuter

import android.os.Handler;
import android.os.Looper;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class AppExecuter {
private static AppExecuter instance;
private final Executor mainIO;
private final Executor subIO;

public AppExecuter(Executor mainIO, Executor subIO) {
this.mainIO = mainIO;
this.subIO = subIO;
}

public static AppExecuter getInstance(){

if(instance == null) instance = new AppExecuter( new MainThreadHandler(), Executors.newSingleThreadExecutor());
return instance;
}

public static class MainThreadHandler implements Executor{
private Handler mainHandler = new Handler(Looper.getMainLooper());

@Override
public void execute(Runnable command) {
mainHandler.post(command);
}
}

public Executor getMainIO() {
return mainIO;
}

public Executor getSubIO() {
return subIO;
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/blue_dark"
tools:context=".MainActivity">


<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rcView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:clickable="true"
android:onClick="onClickAdd"
app:backgroundTint="@color/colorPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/ic_add" />
</androidx.constraintlayout.widget.ConstraintLayout>

activity_edit.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/blue_dark"
tools:context=".EditActivity">

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/imageContainer"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="4dp"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/guideline"
app:layout_constraintEnd_toEndOf="@+id/edTitle"
app:layout_constraintStart_toStartOf="@+id/edTitle"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0">

<ImageView
android:id="@+id/imNewImage"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@android:drawable/editbox_background"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_add_image" />

<ImageButton
android:id="@+id/imEditImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:onClick="onClickChooseImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@android:drawable/ic_menu_edit" />

<ImageButton
android:id="@+id/imDeleteImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:onClick="onClickDeleteImage"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@android:drawable/ic_menu_delete" />
</androidx.constraintlayout.widget.ConstraintLayout>

<EditText
android:id="@+id/edTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="8dp"
android:background="@android:drawable/editbox_background"
android:ems="10"
android:hint="Title"
android:inputType="textPersonName"
android:padding="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageContainer" />

<EditText
android:id="@+id/edDesc"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:background="@android:drawable/editbox_background"
android:ems="10"
android:gravity="top"
android:hint="Discription"
android:inputType="textMultiLine|textPersonName"
android:padding="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/edTitle"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/edTitle"
app:layout_constraintTop_toBottomOf="@+id/edTitle" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:alpha="0.6"
android:clickable="true"
android:onClick="onClickSave"
android:tint="#FFFFFF"
app:backgroundTint="@color/blue_dark"
app:layout_constraintBottom_toBottomOf="@+id/edDesc"
app:layout_constraintEnd_toEndOf="@+id/edDesc"
app:srcCompat="@drawable/ic_action_name" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fbAddImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:alpha="0.6"
android:clickable="true"
android:onClick="onClickAddImage"
app:layout_constraintBottom_toTopOf="@+id/floatingActionButton"
app:layout_constraintEnd_toEndOf="@+id/floatingActionButton"
app:srcCompat="@drawable/ic_add_image" />

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintGuide_percent="0.33105335"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

item_list_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@color/colorPrimary">

<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="TextView"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="SearchView"
android:id="@+id/id_search"
android:icon="@drawable/ic_search"
app:showAsAction="ifRoom"
app:actionViewClass="android.widget.SearchView"
/>
</menu>

styles.xml

<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowFullscreen">true</item>
</style>
<style name="AppTheme.EditThem" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowFullscreen">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

</resources>

strings.xml

<resources>
<string name="app_name">SQLIteJava</string>
<string name="text_empty">Заголовок или содержание не заполнено!!</string>
<string name="saved">Сохранено!</string>
</resources>

Приложение «Записная книжка»

В этом приложении мы используем с вами новое понятия: глобальная переменная и массивы данных.

Глобальная переменная в программировании — переменная, областью видимости которой является вся программа.

Она нужна для выведения данных. Данные хранятся в массивах (списках). Списки могут быть связанными, то есть каждому элементу из одного списка соответствует определённый элемент из другого списка.

Приложение «Записная книжка»— это приложение, в котором при вводе имени друга выводится его телефон (или любимый фильм, или день рождения, или то, что вы захотите).


Компоненты приложения:

  • Надпись

  • Изображение

  • Текст

  • Кнопка

Блоки


Видео к уроку: 

Понравилась статья? Поделить с друзьями:
  • Как написать программу диалог
  • Как написать программу джарвиса
  • Как написать программу генератор случайных чисел
  • Как написать программу вычисляющую значение функции
  • Как написать программу вычисления площади круга