forum.vnstele.com http://forum.vnstele.com/ |
|
Програмування на С, С# та С++ http://forum.vnstele.com/viewtopic.php?f=17&t=21 |
Сторінка 1 з 1 |
Автор: | echern [ 10 березня 2011, 12:08 ] |
Тема повідомлення: | Програмування на С, С# та С++ |
Розгляд основних аспектів розробки програмного забезпечення, вирішення типових завдань і пояснення прикладів. |
Автор: | Mykola Sheremeta [ 08 серпня 2012, 13:54 ] |
Тема повідомлення: | Re: Програмування на С, С# та С++ |
Доброго дня! У мене в лабораторній роботі №2 була задача, яку пропунувалось вирішити за допомогою однієї з мов програмування. Я тоді намагався її написати в матлабі, сидів тоді довгенько, але мені так і не вдалося її реалізувати. Умову тієї задачі і проблеми які в мене виникли при її реалізації можна подивитись тут, в мому повідомленні за 15 лютого 2012, 02:43. Багато води витекло з того часу, а я так і не забув, що мав незавершену справу (мабуть я стану привидом ). Сьогодні мав вільний день+бажання доробити ту задачу. Алгоритм розвязку доступно описаний в наступному за моїм повідомленням за 15 лютого 2012, 02:43. Тому, тут я наведу тільки код програми, прикріплю саму програму, і опишу деякі незначні проблеми які в мене виникли при реалізації здається такого простого алгоритму. Цього разу я писав програму на С++ в середовищі MS Visual C++ 2005 Exppress Edition (абсолютно безкоштовний софт, який можна скачати на сайті Майкрософту). От власне і сам код: Код: #include <iostream> #include <fstream> #include <map> using namespace std; int main(void) { map<int,float> load,tmp; map<int,float>::iterator it; fstream file("input.txt"); bool watcher=true; int n=0,tst,too,tmpi=0; float tmpf=0,tmpf1,ans=0; char tmpch; printf("Please enter value of total simulation time(Tm):\n"); cin>>tst;//total simulation time printf("Please enter value of time of observation(t):\n"); cin>>too;//time of observation if (!file.good()){ printf("You have some problem with input file(input.txt).\nPerhaps, this file is not exist.\n"); cin.sync(); cin.get(); return 0; } do { file.get(tmpch); if (tmpch=='\n'){ watcher=true; load[n]=tmpf; n++; tmpf=0; tmpi=0; } if (tmpch==',') watcher=false; if (watcher&&(tmpch!='\n')&&(tmpch!=',')) tmpf=tmpf*10+(tmpch-48); if (!watcher&&(tmpch!='\n')&&(tmpch!=',')){ tmpf1=tmpch-48; tmpi++; for (int k=1;k<=tmpi;k++){ tmpf1/=10.0; } tmpf+=tmpf1; } } while (!file.eof()); n-=1; load.erase(load.find(n)); if(n>((((tst*3600)/too))+2)||((tst*3600)/too)>n){ printf("You have some problem with input data.\nPerhaps, input data is not from program Ok_lab1.\n"); printf("Correct input data and try again.\n"); cin.sync(); cin.get(); return 0; } tmpi=3600/too; for(int i=0,k=0; i<tmpi;i++){ tmp[k]+=load[i]; } for(int i=1;i<n;i++){ tmp[i]=tmp[i-1]-load[i-1]+load[tmpi+i-1]; tmpf1=i; } for(int i=0; i<n; i++){ if (tmp[i]==ans) watcher=true; if (tmp[i]>ans){ ans=tmp[i]; tmpi=i; watcher=false; } } if(watcher){ printf("There are more then one hour of the largest load:\n"); it=tmp.find(tmpi); for(int i=0; i<n; i++){ if(it->second==tmp[i]){ printf("%d:%d:%d-%d:%d:%d;\n",i*too/3600,((i*too)%3600)/60,(i*too)%60,i*too/3600+1,((i*too)%3600)/60,(i*too)%60); } } } else{ int i=tmpi; printf("There is one hour of the largest load:\n"); printf("%d:%d:%d-%d:%d:%d;\n",i*too/3600,((i*too)%3600)/60,(i*too)%60,i*too/3600+1,((i*too)%3600)/60,(i*too)%60); } printf("Thank you!\nPress any key to exit.\n"); cin.sync(); cin.get(); return 0; } Як користуватись прогамою: В цій програмі масив послідовностей інтенсивності навантаження на проміжках t слід вводити окремим текстовим файлом з назвою "input.txt" без лапок, тобто створюєте текстовий документ з назвою "input.txt" без лапок, копіюєтете туди масив з пункту чотири програми Ok_lab1 "Дослідження телефонного навантаження", зберігаєте і закриваєте цей текстовий файл. Значення сумарного часу моделювання Tm(год) та значення часу інтервалу спостереження t(c) слід вводити з клавіатури після запуску програми. Файл "input.txt" повинен знаходитись в тій же теці, що і сама програма. Проблемка яка виникла при реалізації програми і її вирішення: Проблема ця полгає в тому, що масив який ви копіюєєте з програми Ok_lab1 скалдається з десяткових чисел формату "a,b", а не "a.b", тому одразу їх зчитувати як змінні з плаваючою комою не можна, оскільки "a,b" сприймається С++ як символьне значення, а не як числове значення формату "a.b". Звичайно, в текстовому документі всі коми можна замінити на крапки, і не морочити собі голову, але мені здалось, що таке вирішення даної проблеми є дещо не актуальним. Тому я запропунував вирішення даної проблеми іншим чином: 1) Зчитуємо символ цифри, перетворюємо його в цифру за допомогою ASCII зміщення. Тобто, наприклад символ "1" представляється ASCII як десяткове число 49 (шістнадцяткове 31, двійкове 110001), а число 1 представляється як десяткове 1 (шістнадцяткове 1, двійкове 1). Тобто для того щоб претворити символ "1" в десяткове число 1, від символьного представлення слід відняти десяткове число 48, і в результаті ми отримаємо десяткове число 1. Таким чином можна перетворити символ будь-якої десяткової цифри в десяткову цифру. 2) Зчитуємо наступний символ, і якщо це не "," то ми перетворюємо його в десяткову цифру. Далі число яке ми отримали в попередньому пункті домножуємо на 10, та додаємо до отриманого результату(операцією алгебраїчного додавання) цю отриману цифру. Отримане значення зберігаємо. Зчитуємо настпуний символ, і якщо це не "," то ми перетворюємо його в десяткову цифру, збережений попередньо результат домножуємо на 10 і додаємо до нього цю цифру, зберігаємо отриманий резльтат, і так доти доки не отримаємо символ "," або символ кінця рядка "\n". 3) Якщо ми зчитали символ кінця рядка, то збережене значення і є потрбним нам числом. Якщо ми зчитали символ ",", то нам слід зчитати наступний символ, перетворити його в десяткову цифру, отриману десяткову цифру поділити на 10, та отриманий реузультат додати до попредньо збереженого результату і зберегти тепер уже отриманий результат. Далі зчитуємо наступний символ, і якщо це не символ кінця рядка "\n" то перетворюємо його на цифру, ділимо її тепер уже на 100, додаємо отриманий результат до попередньо збереженого, і збергіаємо новий отриманий результат. Коли отримуємо третій символ після коми то його слід ділити уже на 1000, коли четвертий то слід ділити уже на 10000 і так далі, доти доки не зчитаємо символ кінця рядка "\n". І коли ми врешті зчитали символ кінця рядка, то збережене значення і є потрбним нам числом. Хух, нарешті описав даний алгоритм. Не знаю наскільки він получився зрозумілий, але я старався. Тепер лишилось тільки прикріпити саму програму. Зараз прикріплю). Приєднання файлів: Доречі, в цій програмі передбачений вивід всіх годин найбільшого навантаження, якщо є декілька годин з однаковим найбільшим навантаженням. P.S. Програма буде працювати на Windows XP, на Windows 7 не гарантою, тому, що там символ кінця рядка може бути відмінним від "\n". А на операційних системах сімейства linux вона працювати не буде, хоча спробуйте, раптом вам пощаситить. P.P.S. Якщо у когось є подібні задачі, що стосуються телекомунікацій пропонуйте їх мені тут, або в мій Skype: angelokk11. |
Автор: | echern [ 15 серпня 2012, 16:47 ] |
Тема повідомлення: | Re: Програмування на С, С# та С++ |
Перевірив, програма працює, хоча досить складно все зроблено . Було б добре, якщо б програма виводила ще значення навантаження в ГНН, а також був створений графічний інтерфейс, щоб зручніше було нею користуватися. ПС. Думаю, на рахунок привида Ви пожартували |
Автор: | Багрій Володимир [ 18 грудня 2012, 00:55 ] |
Тема повідомлення: | Re: Програмування на С, С# та С++ |
Програма отримання значень "чистої випадковості": Код: #include<stdio.h> #include<time.h> void main() { int i=0,x[100],y[100]; srand((unsigned)time(NULL)); do { x[i]=rand()%100; y[i]=x[i]*x[i]; if(y[i]>0&&y[i]<100) { printf("x=%d y=%d\n",x[i],y[i]); i++; } while(i<100); } ...можливі помилки, бо я вже спати хочу +пізніше викладу і побудову графіка до програмки |
Автор: | Багрій Володимир [ 22 січня 2013, 21:47 ] |
Тема повідомлення: | Re: Програмування на С, С# та С++ |
#include<dos.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> #include<math.h> #include<graphics.h> #define PATHTODRIVER "D:\\Borlandc\\Bgi" void Grafik(int x[],int y[]); void main() { int gd=DETECT, gm; int errorcode; int i=0,x[100],y[100]; srand((unsigned)time(NULL)); do { x[i]=rand()%100; y[i]=x[i]*x[i]; if(y[i]>0&&y[i]<100) { printf("%d %d\n",x[i],y[i]); delay(60); i++; } } while(i<100); initgraph(&gd,&gm,PATHTODRIVER); errorcode=graphresult(); if (errorcode!=grOk) { printf("Pomulka: %d\n",grapherrormsg(errorcode)); puts("Dlya zaverwennya progu nazhmit' <ENTER>"); getch(); return; } Grafik(x,y); getch(); closegraph(); } void Grafik(int x[],int y[]) { int i; for(i=0;i<100;i++) { y[i]=480-y[i]; putpixel (x[i], y[i], 20); } setlinestyle(SOLID_LINE,0,0.0000001); setcolor(WHITE); line (1,479,1+639,479); line (1,479,1,1); outtextxy(5,5,"Y"); outtextxy(630,470,"X"); } ось це повна програма...але правильно у мене графік чомусь не будує, а я не знаю де у прозі помилка якщо вам не важко, підскажіть мені, що ж треба змінити у ній |
Автор: | echern [ 23 січня 2013, 11:35 ] |
Тема повідомлення: | Re: Програмування на С, С# та С++ |
Поверхнево проаналізувавши код програми, можу порекомендувати наступні кроки: 1. Визначити діапазон зміни значень аргумента і функції (максимальне і мінімальне значення для масивів x[100], y[100]), а далі визначити масштабуючий коефіцієнт, щоб майбутнє зображення займало розмір робочого вікна, і цей коефіцієнт множити на кожен елемент масиву (буде два коефіцієнти, звичайно). 2. Перевірити, чи, раптом, колір точок, якими ви виводите графік (у Вас номер 20, а їх є, якщо не помиляюся - 16), не співпадає з кольором фону. Тому задайте, наприклад, для фону колір setbkcolor(1); а в функції putpixel(x,y, 9); 3. Адаптувати код програми, все ж таки під ОС Віндовс, тому що досівський драйвер графічного режиму може некоректно працювати, особливо під Він 7. |
Автор: | Багрій Володимир [ 23 січня 2013, 16:21 ] |
Тема повідомлення: | Re: Програмування на С, С# та С++ |
дякую буду кодити... |
Сторінка 1 з 1 | Часовий пояс UTC + 2 годин [ DST ] |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |