Подпрограми в С++

25 отговора 1099 прегледа
#1

Подпрограми в С++

Някой знае ли какво занчи подпрограма в C++. Ако да, може ли да ми обясни.
Благодаря

Отговор
в отговор на Sneji #2

Re: Подпрограми в С++

представи си, че аз съм програма. ти заставаш под мене, и следователно си подпрограма.
после ме хващаш за .... програматора, и правиме програма и половина...

Отговор
в отговор на Sneji #3

Re: Подпрограми в С++

Здравей, ще се опитам да те осветля малко.
Принципно какво представлява С++?
То представлява С в което имаме възможност за обектно ориентирано програмиране. Имаме класове, методи и свойства. Имаме възможност за наследяване на класовете и полиморфизъм. Наследяването е нещо разбираемо - един написан клас може да бъде наследен многократно от други класове и могат да се правят директни копия на него и да ползват пълните му възможности. Полиморфизмът се изразява във възможността да наследиш даден клас и да промениш някои от методите му. По този начин получаваш нов клас наследил предходният, но с променени методи и свойства.

Самият език С++ сам по себе си се състои от определен краен брой ключови думи и оператори. Методите на класовете са реално функциите от С.

Изпълнението на програмата започва от конкретна централна(главна) функция, която в зависимост от настройките на компилатора е main(),
WinMain() и т.н. Това може би от гледна точка на твоят преподавател по информатика е главната програма. От тук на сетне може да се счита, че всяка функция, метод на клас извикана от главната програма се нарича под програма, въпреки че аз не съм съгласен с това определение. От тази гледна точка, излиза че системните фукции като scanf, printf, cout, cin и т.н., своего
рода предствляват подпрограми, които се извикват от библиотечните модули заредени от компилатора.

Пример за истинска подпрограма е програма, която се активира в резултат на изпълнението на извикана инструкция на микропроцесора на компютъра.

За да не те объркам, под програма е всяка функция или метод извикан от основната програма, на който се подават данни и връща някакъв резултат - това могат да бъдат и функции или методи от библиотечни модули.

Отговор
в отговор на WinSocket #4

Е как можа

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


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на WinSocket #5

Re: Подпрограми в С++

Иииииии как успя да ги изръсиш тия неща...

Самият език С++ сам по себе си се състои от определен краен брой ключови думи и оператори. Методите на класовете са реално функциите от С.

баси якото звучи хехе

Отговор
в отговор на Sneji #6

Re: Подпрограми в С++

Виж това:


static void sortRange( int array[], int from, int to )
{
....
}

void sort( int array[], int len )
{
sortRange( array, 0, len - 1 );
}


Подпрограма в случая се явява sortRange. sortRange e подпрограма на sort. Именно и затова съм я писал "static" - т.е. да е видна само в текущия файл, достатъчно за sort. Т.е. идеята ми е потребителя да не извиква sortRange, а sort.

Т.е. подпрограмата е програма скрита от главната, нещо като бобината на електрическия двигател. Този който ползва двигателя няма нужда да се занимава с нея. Ако ме разбираш...

Отговор
в отговор на Sneji #7

Re: Подпрограми в С++

Да, прав е malkia, ако буквално интерпретира представката "под-" като програмка дето се вика от друга по-главна. Но не е съвсем прав, понеже в миналото думата под-програма се е използвалая взаимозаменяемо за която и да е процедура, даже функция.

Тази дума "под-програма" е влязла в българския език още кoгато е използван FORTRAN който има ключова дума SUBROUTINE за деклариране на процедура (в смисъла на pascal, или void функция в C). Даже сега във Visual Basic се използва SUB защата цел.

И защо някои хора се заяждат с WinSocket? Какво ви пречи, че някой си е изказал мнението и добронамерено е изкал да помогне?

Отговор
в отговор на b33 #8

Re: Подпрограми в С++

Ако някой разбира: Дадена е матрица А[m*n].Да се състави матрица В, чиито елементи B[i,j] са скаларните произведения на i-тия j-тия ред ...Въвеждането на матрицата А да стане от текстов фаил. Съставянето на матрицата Б да стане в подпрограма.

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

Отговор
в отговор на Cнeви #9

Re: Подпрограми в С++

Ех, МЕИ (поправи ме ако греша) !

Както и да е - идеята тук е, че трябва да направиш функция, която да ти смята работите и да връща някакъв резултат.

Т.е. - class Мatrix...

променливи - редове и стълбове на матрицата ти...

методи (или функции, за по-простичко) на класа: какво ти трябва, за да си сметнеш нещата (hint: връщат резултат - от тип Matrix)

Оттук нататък ти препоръчвам най-горещо да попрочетеш някоя книжка за С/C++! За начало стават и ръководствата, писани от преподавателите. После - ако ти стане интересно - литература из интернет - колкото щеш.

[линк]

За начало - бива.

Все пак е най-добре програмата да си я напишеш сама, ако имаш доброто желание да завършиш университета

ПС: МЕИ-то не е лош университет

Отговор
в отговор на Mylord #10

Re: Подпрограми в С++

ne e zadyljitelno da mojesh da programirash i da razbirash ot programirane za da zavyrshish MEI naprimer :)))) Taka, che Mylord - vashiat syvet e nepraktichen. Individyt Sneji prosto iska da zavyrshi za da si zakove diplomata na stenata. A pa i to v taia dyrjava za kakvo i e taia diploma da ia pitash????? :) Mislia, che pyrvia posting v sluchaia e nai praktichnoto obiasnenie za pod programa :))

Отговор
в отговор на Colombino #11

Re: Е как можа

На вместо да ругаеш, можеш да го коригираш или да дадеш по-точно обяснение.

За тези които не са съгласни - "Програмиране на С++", Георги Симов, Издателство "СИМ" 1994
1. "Обзор на езика С++" - Въведение
2. "Синтаксис на езика С++" - това е което съм искал да кажа.
3. "Структура на поргамите"

Редактирано от WinSocket на

Отговор
в отговор на WinSocket #12

Re: Е как можа

Виж сега, като не знаеш е по-добре да си замълчиш отколкото да дрънкаш врели-некипели. Не знам защо си мислиш, че като говориш сложно говориш умно. А аз ще се изкажа като шопа: "Я не знам ка требе да е, ама и така не е." Не знам, затова си трая. Мога само да дам мнение:
Според мен 'подпрограма' е нищо повече от синоним на процедура/функция. Просто става въпрос за по-стара терминология. Но пак повтарям това е мнение.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на virtual void #13

Re: Подпрограми в С++

Учих малко в МЕИ-то, но се изнесох на запад, вследствие на осцилоскопите от 60-те и 70-те години...

Доколкото си спомням имаше хора, които бяха много кадърни (2-3 на 100) и такива, които искат просто да завършат университет, както казваш, и да си закачат дипломата на стената, което е изключително глупаво.

Тук, DE, хората не правят така. Или учат, или работят, или и двете. Но ако учат - наистина учат. Но темите за манталитета и образованието са малко необятни, така че ще се озаптя дотук

When things are nice I never prefer one to the other.
Отговор
в отговор на Colombino #14

Re: Е как можа

Еми тогава за какво спорим.

Отговор
в отговор на Mylord #15

Re: Подпрограми в С++

Не се караите.
Първо: не уча в МЕИ , а в УАСГ и ще ставам строителен инженер.
Второ: никога не съм искала да ми пишат програмата просто материала за подпрограма ще го вземем след ваканцията и исках да го науча сама.

Отговор
в отговор на Cнeжи #16

Re: Подпрограми в С++

Този дъртофелен преподавател, дето ви е включил в учебния план израза "Подпрограми в C++", трябва да го обесите за топките със собствените му черва, на площада пред Александър Невски. Преди това може да му отрежете десния показалец и да го накарате да напише с кръвта си сто пъти следното изречение: "В C++ няма подпрограми, има функции".

Отговор
в отговор на Cнeжи #17

Re: Подпрограми в С++

Снежи, не се сърди! УАСГ (аз го знам като ВИAС) също е добър университет и е едно от хубавите места, където да учиш за строителен инженер.

Не се обиждай от участниците във форума - тук си е традиция да се гъбаркаме така, sorry. И давай, учи се, компютрите са важни за инженерите.

Отговор
в отговор на Colombino #18

Ми може да си бъде точно подпрограма

екзекютив, който се вика от основната програма за конкретна цел .

Отговор
в отговор на bira_more #19

Re: Ми може да си бъде точно подпрограма

Абе отделният процес си е цяла програма отвсякъде, не можеш да му викаш "подпрограма".

Отговор
в отговор на Cнeви #20

za Sneji: Reshenie na zadachata

Давам ти възможно най-простото решение на задачата. Не виждам защо трабва да ползвам класове и т.н., така че решението а на чисто C, което си е подмножество на C++, така, че спокойно можеш да твърдиш че програмата е писана на C++.

Баз да се задълбочаваме в заначението на думата "под-програме", ясно е че вашия преподавател е искал да използватe помощни процедури/функции при решение на задачаата. Аз съм ти решил задачата с 4 функции (демек под-програми).

Първо да изясним какво е скаларно произведение. Дефинира се за два вектора. Ако запишем двата вектора чрез X = (x1, x2, ... xn) и Y = (y1, y2, ..., yn) тяхното скаларно произведение е равно на
<X,Y> = x1*y1 + x2*y2 + ... + xn*yn
На нас ни е дадена една матрица A с m реда и n колони. Всеки ред от нея е n-мерен вектор, така че скаларното произведение между i-тия и j-тия вектор-red е определено по горната формула. Ще си напишем помощна функция (демек подпрограма) с името InternalProduct(int i, int j) която ще пресмята скаларното произведение на i-тия и j-тия ред. Ще я използваме за да пресметнем и запълним резултата - матрицата B (която очевидно трябва да има размвер m x m.

По нататък следва програмата. Смятам, че ще ти е ясна защото съм дал достатъчно коментар, но иначе питай и ще ти дам допълнително обяснение.


//////////////////////////////////////////////////////////////////
// file: zadacha.cpp
//////////////////////////////////////////////////////////////////

#include <stdio>
#include <stdlib.h>

#define M 3 // брой редове на матрицата A
#define N 4 // брой колони на матрицата A

// дефинираме матрицата A, т.е. входните данни
double A[M][N];

// дефинираме матрицата B, т.е. резултата
double B[M][M];

// Следва помощната функция (демек под-програма) която ще ни пресмята
// скаларното произведение между i-тия и j-тия ред от матрицата A
double InternalProduct(int i, int j) {
double product = 0.0;
int k;
for (k = 0; k < N; k++)
product += A[i][k] * A[j][k];
return (product);
}

// Следва функция (демек под-програма) която съставя (пресмята)
// матрицата B
void Calculate() {
int i, j;
for (i = 0; i < M; i++) {
for (j = 0; j < M; j++) {
B[i][j] = InternalProduct(i, j);
}
}
}

// Следва помощна функция (подпрограма) дето ще използваме за въвеждане
// на данни в матрицата A
void Input(FILE* fp) {
int i, j;
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
fscanf(fp, " %lf", &A[i][j]);
}
}
}

// Следва помощна функция (подпрограма) за разпечатване на резултата,
// т.е. матрицата B
void Output() {
int i, j;
printf("Резултат:\n");
for (i = 0; i < M; i++) {
for (j = 0; j < M; j++) {
printf(" %10.4f", B[i][j]);
}
printf("\n");
}
}

////////////////////////////////////////////////////////////////
// Следва главната програма
////////////////////////////////////////////////////////////////
int main(int argc, char* argv[]) {
FILE* fp = NULL;
// 1. Отваряме файла с входните данни
if (argc > 1) {
// Зададен е като аргумент име на файл.
// Отваряме го.
fp = fopen(argv[1], "rt");
if (fp == NULL) {
// грешка при отварянето
fprintf(stderr, "Грешка при отваряне на файла %s\n", argv[1]);
exit(1); // край на програмата
}
}
else {
// Няма зададено име на файл.
// Ще използваме стандартния вход.
fp = stdin;
}
// 2. Прочитаме входните данни от файла в матрицата A
Input(fp);
// 3. Затваряме файла, понеже не ни трябва повече
fclose(fp);
// 4. Првсмятаме скаларните произведения
Calculate();
// 5. Разпечатваме резултата
Output();
// КРАЙ
printf("Press ENTER ...");
getchar();
return (0);
}

.

Инструкции за ползване:
Запиши горния текст във файл, примерно zadacha.cpp, и после го компилирай както си знаеш, за да получиш изпълнимата програма zadacha.exe. После с помоща на Notepad.exe въведи следните данни във файла data.txt


1 2 3 4
5 6 7 8
9 10 11 12

Горе бяха данните за матрицата A. Сега използвай програмата за да сметнеш резултата. Може с drag-and-drop да преместиш и пуснеш файла data.txt върху иконата на zadacha.exe. Или от DOS Command Prompr да напишеш

C:> zadacha data.txt

или пък

C:> zadacha <data.txt

или бeз файла data.txt въведи директно данните:

C:> zadacha
1 2 3 4
5 6 7 8
9 10 11 12
^Z

/^Z се въвежда чрез едновременно натискане на клвишите Ctrl и Z/

Трябва да получиш следния отговор:

Рвзултат:
30.0000 70.0000 110.0000
70.0000 174.0000 278.0000
110.0000 278.0000 446.0000
Press ENTER ...

.

Това е,
Поздрави!

Отговор