МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
||||||||||||
Лекція 8. вказівникиДержавний захист сім'ї та дитинства. Закон України "Про державну допомогу сім'ям з дітьми" Закон України "Про державну допомогу сім'ям з дітьми" від 21 листопада 1992 р. встановлює гарантований державою рівень матеріальної підтримки сімей з дітьми через надання державної допомоги з урахуванням складу сім'ї, її прибутків, віку, стану здоров'я дітей тощо. Передбачена цим законом державна допомога спрямовується на соціальний захист сімей з дітьми. Закон складається з 3 розділів, 10 глав (85 статей). Розділ 1. Загальні положення. — Сім'ї мають право на державну допомогу з вагітності й пологів, за народження дитини, з догляду за дитиною до досягнення нею трирічного віку, за хворою дитиною і за дитиною-інвалідом та в інших випадках і на умовах, передбачених цим законом та іншими нормативними актами (ст.1). Існують різні види державної допомоги. Порядок призначення та виплати її сім'ям визначається Кабінетом Міністрів України (ст. 2). Фінансування державної допомоги проводиться з Фонду соціального страхування України, Пенсійного фонду України, коштів державного й місцевих бюджетів та інших коштів (ст. 6). Державна допомога, що надається сім'ям з дітьми, не підлягає оподаткуванню (ст. 7). Розділ 2. Державна допомога сім'ям з дітьми. — У цьому розділі встановлюються категорії сімей, які мають право на державну допомогу, умови призначення та розмір допомоги різним категоріям сімей, строки виплати допомоги, органи, які призначають і здійснюють виплату різних видів допомог та ін. Існують такі види державної допомоги: 1) допомога з вагітності й пологів виплачується жінкам протягом 70 днів до пологів і 56 днів після них та становить для працюючих 100% їхнього заробітку, для зареєстрованих як безробітні протягом понад 10 місяців — одну мінімальну зарплату. Допомога сплачується за місцем роботи, а безробітним — органами соціального забезпечення за місцем проживання на підставі виданого в установленому порядку лікарняного листка (статті 10—21); 2) одноразова допомога за народження дитини призначається й сплачується впродовж шести місяців від дня народження дитини та становить чотири мінімальні зарплати на кожну народжену дитину (статті 16—21); 3) допомога з догляду за дитиною до досягнення нею трирічного віку виплачується щомісяця одному з батьків, що доглядає за дитиною, і становить одну мінімальну зарплату (статті 22—33); 4) допомога матерям, зайнятим доглядом трьох та більше дітей віком до 16 років, призначається, якщо середньомісячний сукупний дохід на кожного члена сім'ї не перевищує трьох мінімальних зарплат і становить одну—дві мінімальні зарплати залежно від кількості дітей (статті 34—51); 5) допомога з догляду за дитиною-інвалідом надається раз на місяць одному з непрацюючих працездатних батьків або особі, яка їх заміщує, на підставі виданого в установленому порядку медичного висновку (статті 40—44); 6) допомога з тимчасової непрацездатності у зв'язку з доглядом за хворою дитиною віком до 14 років надається працюючій особі на строк не більше 14 днів у розмірі від 60 до 100% доходу залежно від трудового стажу особи, яка здійснює догляд за дитиною (статті 45—51); 7) допомога на дітей віком до 16 років у розмірі 50% мінімальної зарплати на кожну дитину, якщо середньомісячний сукупний дохід на кожного члена сім'ї не перевищує трикратного розміру мінімальної зарплати (статті 52—57); 8) допомога на дітей одиноким матерям надається жінкам, якщо у свідоцтві про народження дитини відсутній запис батька, в розмірі однієї мінімальної зарплати, а також удовам із дітьми 50% мінімальної зарплати. Допомога виплачується до досягнення дитиною 16-річного віку на підставі виданих у встановленому порядку довідок (статті 58—63); 9) допомога на дітей, що перебувають під опікою чи піклуванням, становить 200% мінімальної зарплати на кожну дитину, якщо розмір одержуваних на цих Дітей аліментів, пенсій і допомоги на місяць не перевищує двократного розміру мінімальної зарплати (статті 70—74). Розділ 3. Відповідальність місцевої державної адміністрації, виконавчих комітетів, сільських, селищних і міських рад, підприємств, установ, організацій і громадян. — Стаття 82 встановлює відповідальність громадян за достовірність даних і документів, виданих для призначення державної допомоги. Одержувачі державної допомоги зобов'язані повідомляти органи, які призначають державну допомогу, про всі обставини, що впливають на виплату допомоги. У разі невиконання цього обов'язку та одержання зайвих сум державної допомоги громадяни повинні відшкодувати заподіяну шкоду (ст. 83). Суми державної допомоги, надміру виплачені внаслідок зловживань із боку громадян, стягуються на підставі рішень органів, які призначають державну допомогу (ст. 84). Скаргу на рішення органу, який призначає державну допомогу, може бути подано до районного (міського) народного суду.
Розуміння і правильне використання вказівників дуже важливо для створення гарних програм на мові С. Вказівники необхідні для успішнго використання функцій і динамічного розподілу пам'яті. Крім того, багато конструкцій мови C++ вимагають застосування вказівників. Однак із вказівниками варто працювати обережно. Використання в програмі неіціалізованого, або "дикого" (wild), вказівника може привести до "зависання" комп'ютера. При неакуратному використанні вказівників у програмі може виникнути помилка, яку дуже важко знайти. Але й обійтися без вказівників у програмах на мові С не можна.
Оголошення вказівників Вказівник - це змінна, що містить адресу деякого об'єкта. Тут мається на увазі адреса в пам'яті комп'ютера. Взагалі це просто ціле число. Але не можна трактувати покажчик як змінну або константу цілого типу. Якщо перемінна буде вказівнииком, то вона повинна б відповідним чином бути оголошена. Вказівник оголошується в такий спосіб: тип *<ім'я змінної>; У цьому оголошенні тип - деякий тип мови С, що визначає типоб'єкта, на який вказує вказівник (адресу якого містить); * - означає, що наступна за ном змінна є вказівником. Наприклад: char *ch; int *temp, i, *j; float *pf, f; Тут оголошені покажчики ch, temp, j, pf, змінна i типу int і змінна f типу float.
Операції над вказівниками З покажчиками зв'язані дві спеціальні операції: & і *. Обидві ці операції є унарними, тобто мають один операнд, перед якими вони ставляться. Операція & відповідає операції "взяти адресу". Операція * відповідає словам "значення, розташоване по зазначеній адресі". Особливість мови С перебуває в тому, що знак * відповідає двом операціям, що не мають одна до іншої ніякого відношення: арифметичної операції множення й операції взяти значення. У той же час сплутати їх у контексті програми не можна, тому що одна з операцій унарна (містить один операнд), інша - множення - бінарна (містить два операнда). Унарні операції & і * мають найвищий пріоритет. У оголошенні зміннної, що є вказівником, дуже важливий базовий тип. Звідкіля компілятор знає, скільки байтів пам'яті займає перемінна, на якій вказує даний покажчик? Відповідь проста: із базового типу вказівника. Якщо вказівник має базовий тип int, то змінна займає 2 байти, char - 1 байт і т.д. Найпростіші дії з покажчиками ілюструються наступною програмою: # include <stdio.h> /* Приклад 27. */ /* Робота з покажчиками */ main() { float x=10.1, у; float *pf; pf=&x; y=*pf; printf(“x=%f у=%f”, х, у); *pf++; printf(“x-%f у=%f”, х, у); y=l+*pf*y; printf(“x=%f у=%f”, х, у); return 0; } До вказівників можна застосувати операцію присвоювання. Вказівники того самого типу можуть використовуватися в операції присвоювання, як і будь-які інші змінні. Розглянемо приклад. # include <stdio.h> /* Приклад 28. */ main() { int x=10; int *p, *g; p=&x; g=p; printf("%p", p); /* друк вмісту р */ printf("%p", g); /* друк вмісту g */ printf("%d %d", х, *g); /* друк розміру х і розміри за адресою g*/ } У цьому прикладі приведена ще одна специфікація формату функції printf() %р.Цей формат використовується для друку адреси пам'яті в шістнадцятковій формі. Не можна створити змінну типу void, але можна створити вказівник на тип void. Вказівнику на void можна привласнити вказівник будь-якого іншого типу. Однак при зворотному присвоюванні необхідно використовувати явне перетворення вказівника на void; void *pv; float f, *pf; pf=&f; pv=pf; pf=(float*)pv; У мові С припустимо привласнюється вказівнику будь-якої адреси пам'яті. Однак, якщо оголошений покажчик на ціле int *pi; а за адресою, що привласнений даному вказівнику, знаходиться змінна х типу float, то при компіляції програми буде видане повідомлення про помилку в рядку р=&х; Цю помилку можна виправити перетворюючи вказівник на int до типу вказівника на float явним перетворенням типу: p=(inf*)&x; Але при цьому втрачається інформація про те, на який тип вказував вихідний покажчик: # include <stdio.h> /* Приклад 29. */ /* Неправильні дії з вказівниками */ main() { float х=10.1, у; int *p; р=&х; /* Потім замінимо на p=(int*)&x; */ y=*p; printf("x=%f y%f \n, x, у); } У результаті роботи цієї програми не буде отримана та відповідь, що очікувалася. Змінній у не буде привласнене значення змінній х, тому що будуть оброблятися не 4 байти, як покладено для змінної типу float, а тільки 2 байти, тому що базовий тип вказівника - int. Як і над іншими типами змінних, над вказівниками можна робити арифметичні операції: додавання і віднімання. (Операції ++ і -- є окремими випадками операцій додавання і віднімання.) Арифметичні дії над покажчиками мають свої особливості. Виконаємо найпростішу программу # include <stdio.h> /* Приклад 30. */ main() { int *p; int х; p=&x; рrintf("%р %р", p, ++р); } Після виконання цієї програми ми побачимо, що при операції ++р значення покажчика р збільшилося не на 1, а на 2. І це правильно, тому що нове значення вказівника повинно вказувати не на наступну адресу пам'яті, а на адресу наступного цілого. А ціле, як ми пам'ятаємо, займає 2 байти. Якби базовий тип вказівника був не int, a double, то були б надруковані адреси, що відрізняються на 8, саме стільки байт пам'яті займає змінна типу double, тобто при кожній операції ++р значення покажчика буде збільшуватись на кількість байтів, що займають змінну базового типу вказівника. Операції над вказівниками не обмежуються тільки операціями ++ і --. До вказівників можна додавати деяке ціле або віднімати ціле. Нехай вказівник р має значення 2000 і вказує на ціле. Тоді в результаті виконання оператора р=р+3; значення вказівника р буде 2006. Якщо ж вказівник р1=2000 був би вказівником на float, то після застосування оператора р1=р1+10; значення р1 було б 2040. Загальна формула для обчислення значення вказівника після виконання операції р=р+n; буде мати вигляд <р>=<р>+n*<кільк. байт пам'яті базового типу вказівника> Можна також віднімати один вказівник від іншого. Так, якщо р і p1 - вказівники та елементи того самого масиву, то операція р - р1 дає такий же результат, як і віднімання індексів відповідних елементів масиву. Інші арифметичні операції над вказівниками заборонені, наприклад не можна скласти два вказівники, помножити вказівник на число і т.д. Вказівники можна порівнювати. Застосовнао всі 6 операцій: <, >, <=, >=, = , == і !=. Порівняння р < g означає, що адреса, що знаходиться в р, менше адреси, що знаходиться в g. Якщо р и g вказують на елементи одного масиву, то індекс елемента, на який вказує р, менше індексу масиву, на який указує g.
Зв'язок вказівників і масивів У мові С існує важливий зв'язок між масивами і вказівниками. У мові С прийнято, щоб ім'я масиву - це адреса пам'яті, починаючи з якої розташований масив, тобто адреса першого елемента масиву. Таким чином, якщо був оголошений масив int plus[10]; то plus є вказівником на масив, точніше, на перший елемент масиву. Оператори p1=plus; і p1=&plus[0]; приведуть до тому самому результату. Для того щоб одержати значення 6-го елемента масиву plus, можна написати plus[5] або *(р1+5). Результат буде той самий. Перевага використання другого варіанта в тому, що арифметичні операції над вказівниками виконуються швидше, якщо ми працюємо з елементами масива, що йдуть підряд. Якщо ж вибір елементів масиву випадковий, то швидша і більш наочна робота з індексами. Дуже часто доводиться працювати над опрацюванням текстів, тобто з масивами рядків. Як ми пам'ятаємо, у мові С рядок - це масив символів, що закінчується нульовим байтом. Розглянемо дві програми, що реалізуют практично, ті самі дії. # include <stdio.h> # include <ctype.h> /* Приклад 31. */ main() { char str[]=”String From Letters in Different Registers"; /* Рядок, що складається з Літер Різних Регистрів"; */ int i; printf(" Рядок Буде Надрукований Заголовними Літерами"); while (str[i]) printf(“%c”, toupper(str [ i++])); } # include <stdio.h> # include <ctype.h> /* Приклад 32 б. */ main() { char str[]=" String From Letters in Different Register"; /* "Рядок, що складається з Літер у Різних Регистрах"/ рrintf("Рядок буде надрукований малими літера"); p=str; while(*p) printf(“%c”, tolower(*p++)); } Якщо в цих прикладах замінити рядок англійською мовою на набрану російськими літерами, то ніякого перетворення літер у рядкові або, навпаки, у прописні не відбудеться. Це зв'язано з тим, що стандартні функції toupper() і tolowеr() аналізують значення аргументу і повертають те ж саме значення, якщо він не є відповідно рядковою або прописною літерою латинського алфавіту. Якщо ж аргумент є мала літера латинського алфавіту, то значенням функції toupper() буде відповідна прописна літера (точніше, код цієї літери). Функція tolower() змінює код лише прописних літер латинського алфавіту. Прототипи цих функцій знаходяться в заголовному файлі ctype. h.
Масиви вказівників Вказівники, як і змінні будь-якого іншого типу, можуть об'єднуватися в масиви. Оголошення масиву вказівників на 10 цілих чисел має вид int *x[10]; Кожному з елементів, масивуможна привласнити адресу; наприклад, третьому елементу привласнимо адресу цілої змінної в: х[2]=&у; щоб знайти значення змінної у, можна написати *х[2]. Приведемо приклад використання масиву вказівників.Частіше усього це буває зручно при опрацюванні масиву рядків. #include <stdio.h> #include <string.h> #include <stlib.h> #include <conio.h> /* Приклад 33 */ main() { char ext[]={exe", "com", "dat", "c", "pas", "cpp") char ch, s1[80]; for(;;) { do { рrintf(“Файли з розширенням:\n"); printf(“l. exe\n"); printf("2. com\n"); printf("3. dat\n"); printf("4. c\n"); printf("5. pas\n"); printf("6. cpp\n"); printf("7. guit\n"); printf("Baш вибір: \n"); ch=getche(); printf(\n); { while ((ch<'l'||(ch>'7')); if (ch==’7') break; strcp(s1, "dir*."); strcat(s1, ext[ch-1]); system(s1); } } Тут функція system() - бібліотечна функція, що змушує операційну систему DOS виконати команду, що є аргументом цієї функції. Дуже часто масив вказівників використовується, якщо треба мати поcилання на стандартний набір рядків. Наприклад, якщо ми хочемо зберегти повідомлення про можливі помилки, це зручно зробити так: char *errors[]={"Cannot open file ", "Cannot close file" , "Allocation eiror ", "Syaem error " }; При такому оголошенні рядкові константи будуть занесені в розділ констант у пам'яті, масив вказівників буде перебувати з чотирьох елементів під який буде виділена пам'ять, і ці елементи будуть ініціалізовані адресами, що вказують на початок цих рядкових констант. Взагалі рядкова константа в мові С асоціюється з адресою початку рядка в пам'яті, тип рядка утворюється char* (вказівник на тип char). Тому можливо й активно використовується наступне присвоювання: сhar *pc: рс = "Hello, World ! "; У мові С можлива також ситуація, коли покажчик вказує на покажчик. У цьому випадку опис буде мати наступний вигляд: int **point; Вказівник Вказівник Змінна
point має тип вказівник на вказівник на int. Відповідно, щоб одержати цілочисельне значення змінної, на якій вказує point, треба у виразі використовувати **point. Приклад використання: #include <sidio.h> /* Приклад 32. */ main() { int i, pi, ppi; i=7; pi=&i; ppi=π printf(“i=%d pi=%р ppi=%р \n", i, pi, ppi); *pi++; printf(“i=%d pi=%p ppi=%p \n", i, pi, ppi); *ppi=12; printf("i=%d pi=%p ppi=%р \n", i, pi, ppi); return 0; }
Читайте також:
|
|||||||||||||
|