C++ разяснение на функции

perer

Registered
Здравейте!
Имам изпит по С++ и съм седнал да го уча :) Основните неща ги схванах, но това, като че ли, е единственото, което ме затрудни, за сега.
Става въпрос за функцията "void". Как се използва, какво прави и т.н. Така и не ни обясниха. Имам някакъв учебник, но там не е обяснено както трябва.

Та, може ли някой да ми го обясни. Ето кода:
Код:
#include "iomanip"
#include "iostream"
#include "conio.h"
#include "math.h"
#include "string"
using namespace std;
void RandArr(int arr[],int n, int left, int right){
	for(int i=0;i<n;i++)
		arr[i]=rand()%(right+1-left)+left;

}
void Output(int arr[],int n){
	for(int i=0;i<n;i++)
		cout<<setw(4)<<arr[i];
	cout<<endl;

}
void BubbleSort(int arr[], int n){
	for(int i=0;i<n;i++)
		for (int j=n-1;j>=i;j--)
			if(arr[j]<arr[j-1])
				swap(arr[j],arr[j-1]);
}
void Selection(int arr[],int n){
	for(int i=0;i<n-1;i++){
		int key=arr[i];
	int k=i;
	for (int j=i+1;j<n;j++){
		if(key>arr[j]){
			k=j;key=arr[j];
		}
}
	swap(arr[i],arr[k]);
	}
}
int main(){
	
	int Fi[25];
	int n=15;
	RandArr(Fi,n,-20,150);
	Output(Fi,n);

	BubbleSort(Fi,n);
	Output(Fi,n);

	cout<<"Selection sort\n";
	RandArr(Fi,n,-20,150);
	Output(Fi,n);
	Selection(Fi,n);
	Output(Fi,n);
	cout<<"\n";
	
	
	char bukvi[28];
	cout<<"A-"<<(int) 'A'<<endl;
	cout<<"Z-"<<(int) 'Z'<<endl;
	for(int i=0; i<123; i++)
		bukvi[i]=rand()%(90+1-65)+65;
	for (int i=0; i<123;i++)
		cout<<bukvi[i];
	cout<<endl;
	
	int brojA=0,brojK=0,brojZ=0;
	for (int i=0;i<123;i++){
		if(bukvi[i]=='A') brojA++;
		if(bukvi[i]=='K') brojK++;
		if(bukvi[i]=='Z') brojZ++;
	}
	cout<<"A-"<<brojA<<endl;
	cout<<"K-"<<brojK<<endl;
	cout<<"Z-"<<brojZ<<endl;
cout<<"\n";

int mat[10][10];
for (int i=0;i<10;i++)
	for (int j=0;j<10;j++)
		mat[i][j]=rand()%(1000+1-(-200))+(-200);
for(int i=0;i<10;i++){
	for(int j=0;j<10;j++)
		cout<<setw(5)<<mat[i][j];
	cout<<endl;
}
cout<<"\n";
for (int i=0;i<10;i++){
	int min=mat[i][0];
	for (int j=0;j<10;j++)
		if (min>mat[i][j]) min=mat[i][j];
	cout<<i<<"row:"<<min<<endl;
}

cout<<"Press any key to countinue ...";
_getch();
return 0;
}

Благодаря!
 
Void не връща стойност, за друго по-особено не се сещам :?:
ЕДИТ:
Ето ти един учебник, където е обяснено много подробно
http://www.cdunchev.hit.bg/C++.zip
 
Както каза потребителят преди мен, void е функция, която не връща резултат(нямаш return, а може и да проработи само с return;).
 
void не е функция. Това е тип. Нулевия (празния) тип, който заема 0 байта и няма стойност.

При дефиниция на функция пишеш <тип> <име>(<параметри>). Като напишеш типа да е void казваш реално, че няма да връщаш нищо
 
Ок, това го разбрах.
Защо се изплозва, тогава?
В моя случай, това е файл, който сме правили на упражнение, защо сме го ползвали?
 
perer каза:
Ок, това го разбрах.
Защо се изплозва, тогава?
В моя случай, това е файл, който сме правили на упражнение, защо сме го ползвали?

Защото не можеш да не му кажеш тип на нещото, което ще върне функцията
 
В твоя пример функциите, които са void са сортиращи функции. Тяхната единствена работа е да подредят елементите на подадения им масив. Не е необходимо да връщат резултат. Просто си вършат работата и толкова.
Докато, ако направиш функция, която да ти връща сумата на всички числа в масива, например, тя ще трябва да връща резултат - въпросната сума. Тогава няма да е void, а int, да речем, ако числата са цели.
 
misho каза:
В твоя пример функциите, които са void са сортиращи функции. Тяхната единствена работа е да подредят елементите на подадения им масив. Не е необходимо да връщат резултат. Просто си вършат работата и толкова.
Докато, ако направиш функция, която да ти връща сумата на всички числа в масива, например, тя ще трябва да връща резултат - въпросната сума. Тогава няма да е void, а int, да речем, ако числата са цели.

На мен това ми стана интересно, че сортиращите функции не взимат референцията на масива, за да го сортират. В такъв случай при PHP ще трябва да се върне резултат, но явно при C++ нещата стоят по по-различен начин.
 
Масивите в C++ всъщност са указатели. Не се копират като ги даваш чрез параметър. За това можеш да ги пипаш както искаш от функцията
 
Благодаря! Това го разбрах :)

Сега още нещо :p
Код:
bukvi[i]=rand()%(90+1-65)+65;
Този rand как работи? Смисъл, четох в нета какво значат цифрите, но не разбрах :roll: Та, някой може ли да ми обясни. Как да му кажа от къде до къде да генерира случайни букви, в случая.
 
Това след % е range-a:

Код:
rand() % 10 + 1 //случайни числа от 1 до 10


10 е колко числа да са в range-a, а 1 е от кое да започне.
 
Много благодаря на всички! :)
Ако има нещо друго пак ще ви пиша :p

А след като мине изпита ще напиша резултата ;)
 
StormBreaker каза:
void не е функция. Това е тип. Нулевия (празния) тип, който заема 0 байта и няма стойност.

При дефиниция на функция пишеш <тип> <име>(<параметри>). Като напишеш типа да е void казваш реално, че няма да връщаш нищо
Чак 0 байта не заема. void e "incomplete type" и size-a му не е ясен (според стандарта :))
 
B13_Savage каза:
StormBreaker каза:
void не е функция. Това е тип. Нулевия (празния) тип, който заема 0 байта и няма стойност.

При дефиниция на функция пишеш <тип> <име>(<параметри>). Като напишеш типа да е void казваш реално, че няма да връщаш нищо
Чак 0 байта не заема. void e "incomplete type" и size-a му не е ясен (според стандарта :))

В смисъл? Идеята ми беше, че ако ползваш void* имаш само начален адрес и това не ти дава информация колко байта трябва да четеш от този начален адрес.
 
Аз вчера в университета имах изпит върху C++ и беше откачено труден , но го взех . Не е за вярване какви алгоритми мисли човек когато решаването на 3-те задачи зависи дали ще запишеш 2-ри семестър :D
 
StormBreaker каза:
B13_Savage каза:
StormBreaker каза:
void не е функция. Това е тип. Нулевия (празния) тип, който заема 0 байта и няма стойност.

При дефиниция на функция пишеш <тип> <име>(<параметри>). Като напишеш типа да е void казваш реално, че няма да връщаш нищо
Чак 0 байта не заема. void e "incomplete type" и size-a му не е ясен (според стандарта :))

В смисъл? Идеята ми беше, че ако ползваш void* имаш само начален адрес и това не ти дава информация колко байта трябва да четеш от този начален адрес.
Toва което казвам е формалност разбира се.
sizeof(char) = 1; sizeof(void) = undefined;
 
B13_Savage каза:
StormBreaker каза:
B13_Savage каза:
Чак 0 байта не заема. void e "incomplete type" и size-a му не е ясен (според стандарта :))

В смисъл? Идеята ми беше, че ако ползваш void* имаш само начален адрес и това не ти дава информация колко байта трябва да четеш от този начален адрес.
Toва което казвам е формалност разбира се.
sizeof(char) = 1; sizeof(void) = undefined;

Да, разбрах какво имаш в предвид. Прав си, трябва да е undefined, не 0
 
Здравейте!
Моля помогнете с една задача. Не мога да я измисля :p

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

Проверката дали е положително числото я направих. Дали е нечетно също, но как да изброя колко са нечетните му цифри?
Също така, мога ли да го направя така че да не може да се въведат повече или по-малко от 5 цифри? Ако това стане да излезе грешка или просто да завърти отново цикъла и да иска въвеждане.

Благодаря!


Edit// Изкарах бройката на нечетните.
Значи само това. Мога ли да го направя да не може да се въвеждат повече от 5 цифри?
 

Горе