Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

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

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

 

Помощ със задача на C++

Featured Replies

Добър вечер скъпи съфорумници :D. Бих желал да ми помогнете с една задачка на C++.

Тя е следната:

Да се създаде списък, съдържащ информация (име, пол, възраст, родители) за хората от един род. Да се напишат програмни функции за:
а) намиране на средната възраст на мъжете в рода;
б) извеждане името на най-малкото дете за зададен член на семейството.
 

#include <iostream>
#include <string>
using namespace std;

struct Rod{
	char ime[31];
	char pol[5];
	int god;
	char rodj[31];
	char rodm[31];
	Rod* next;
};

typedef Rod* Point;
Point* Head;

void CreateR(Point &Head){
	Point	Last, P; Last = NULL;
	char	ch;

	cout << "Въвеждане на данни за човек от рода: (Y/N) ?:";
	cin >> ch;
	while (ch == 'Y' || ch == 'y') {
		P = new Rod;
		cout << "Име: ";
		cin >> P->ime;
		cout << "Пол: (мъж/жена):  ";
		cin >> P->pol;
		cout << "Възраст: ";
		cin >> P->god;
		cout << "Майка: ";
		cin >> P->rodj;
		cout << "Баща: ";
		cin >> P->rodm;
		P->next = NULL;
		if (Head == NULL) 	Head = P;
		else	Last->next = P;
		Last = P;
		cout << "Продължаване на въвеждането? (Y/N) ?:";
		cin >> ch;
	}
}

void Tarsene(Point P){
	int G = 0, br = 0, S = 0;
	while (P != NULL) {
		if (strcmp("мъж", P->pol) == 0){
			br++;
			G += P->god;
		}
		P = P->next;
	}
	S = G / br;
	cout << "Средната възраст на мъжете в рода е: " << S;
}

void TarseneD(Point P, char *x){
	int min = P->god; char* c = P->ime;
	while (P != NULL) {
		if ((strcmp(x, P->rodj) == 0) || (strcmp(x, P->rodm) == 0))
		if (P->god < min){
			min = P->god; c = P->ime;
		}
		P = P->next;
	}
	if (c != 0) cout << "Най-малкото дете на посочения родител е: " << c << "\n";
	else cout << "Грешка! Неправилно въведен или несъществуващ родител.\n";
}

void main(){

	system("chcp 1251");

	char dv[100]; char ime[31];
	Point Head;
	Head = NULL;
	CreateR(Head);
	cout << "\n";
	Tarsene(Head);
	cout << "\n";
	cout << "\nЗадайте името на родителя: ";
	cin >> dv;
	TarseneD(Head, dv);
}

Горе е кодът на програмата. Написана е изцяло докрай. Въпросът ми е, ако можете да прочетете условието на задачата и да си дадете мнението/забележките дали е направена както трябва и всичко е спазено или ако не е, съответно защо. Имам чувството, че не съм разбрал условието както трябва и нещата не трябва да са точно такива. Това е единственото, което ме мъчи. Благодаря предварително!  :D

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

Хайде пробвай да я стартираш тук примерно:

http://cpp.sh/

In function 'void Tarsene(Point)': 47:30: error: 'strcmp' was not declared in this scope
In function 'void TarseneD(Point, char*)': 60:25: error: 'strcmp' was not declared in this scope
At global scope: 70:11: error: '::main' must return 'int'
In function 'int main()': 74:21: warning: unused variable 'ime' [-Wunused-variable]

и виж колко работи. Къде ти е функцията "strcmp"? Същото е и с други онлайн компилатори. И недей да си "латинизираш" българските думи - превеждай и пиши  всичко на английски, този код ако го погледне някой чужденец, ще се чуди кое какво е. Примерно: какво значи "Tarsene"? Дори и Google не знае:

https://translate.google.bg/#view=home&amp;op=translate&amp;sl=auto&amp;tl=bg&amp;text=Tarsene

Напиши го "searching" примерно и така нататък с останалите функции/променливи. Прочети книгата на Наков "Въведение в програмирането" като за начало, има доста полезни неща.

  • Автор

@Raze,

- strcmp е вградена функция за сравняване на стрингове (низове). Как къде е функцията strcmp ? В библиотеката string e :D, не сте добавили едно ".h" накрая (<string.h>). 

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

- Използвам MS Visual Studio и void main e възможно да не връща стойност, затова няма връщане на int. 

- Неизползваната променлива я игнорирайте, с или без нея си върви. В началото бях изпробвал нещо и бях забравил да я махна.

Конкретният код си върви, а въпроса ми е дали според вас кода отговаря на условието на задачата защото имам някакви съмнения.

Eто кодчето, което ще върви на онлайн компилатора:

 

#include <iostream>
#include <string.h>
using namespace std;

struct Rod{
	char ime[31];
	char pol[5];
	int god;
	char rodj[31];
	char rodm[31];
	Rod* next;
};

typedef Rod* Point;
Point* Head;

void CreateR(Point &Head){
	Point	Last, P; Last = NULL;
	char	ch;

	cout << "Въвеждане на данни за човек от рода: (Y/N) ?:";
	cin >> ch;
	while (ch == 'Y' || ch == 'y') {
		P = new Rod;
		cout << "Име: ";
		cin >> P->ime;
		cout << "Пол: (мъж/жена):  ";
		cin >> P->pol;
		cout << "Възраст: ";
		cin >> P->god;
		cout << "Майка: ";
		cin >> P->rodj;
		cout << "Баща: ";
		cin >> P->rodm;
		P->next = NULL;
		if (Head == NULL) 	Head = P;
		else	Last->next = P;
		Last = P;
		cout << "Продължаване на въвеждането? (Y/N) ?:";
		cin >> ch;
	}
}

void Tarsene(Point P){
	int G = 0, br = 0, S = 0;
	while (P != NULL) {
		if (strcmp("мъж", P->pol) == 0){
			br++;
			G += P->god;
		}
		P = P->next;
	}
	S = G / br;
	cout << "Средната възраст на мъжете в рода е: " << S;
}

void TarseneD(Point P, char *x){
	int min = P->god; char* c = P->ime;
	while (P != NULL) {
		if ((strcmp(x, P->rodj) == 0) || (strcmp(x, P->rodm) == 0))
		if (P->god < min){
			min = P->god; c = P->ime;
		}
		P = P->next;
	}
	if (c != 0) cout << "Най-малкото дете на посочения родител е: " << c << "\n";
	else cout << "Грешка! Неправилно въведен или несъществуващ родител.\n";
}

int main(){

	system("chcp 1251");

	char dv[100];
	Point Head;
	Head = NULL;
	CreateR(Head);
	cout << "\n";
	Tarsene(Head);
	cout << "\n";
	cout << "\nЗадайте името на родителя: ";
	cin >> dv;
	TarseneD(Head, dv);
	
}

 

Може :)

Аз принципно програмирам на java и правя приложения за android, но реших и това да го тествам. На компилатора, който съм дал по-горе, втория код нещо не тръгна както трябва. На друг компилатор излезе следното:

https://www.onlinegdb.com/online_c++_compiler

След въвеждане на данни и накрая отговор "N", дава грешка "floating point exception" - имаш някакъв проблем с обработката на данните, но не ми дава къде точно дава това изключение. А на преподавателя си му кажи, че това е много неправилно да ви учи така да въвеждате данните на български с латински букви и да вземе да прочете как се прави и да спре да ви учи неправилно.

Полето ти за джендър ти е много късо, те сега нали са нароиха един куп полове - направи поне 20 клетки

  • Автор

@Raze,

За след първия надпис при въвеждане на "N" да си представим, че изписва "Няма въведени данни" и прекъсва програмата. 

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

 

Вече може ли отговор на конкретния въпрос, моля.

@ined

И на мен първото, което ми мина през ума беше това. :biggrin:

Иначе според вашите разбирания спазено ли е условието. (Вече сериозно, ако може :D)

След като не мога да тествам програмата, няма как да ти дам отговор. На реална машина може и да върви като трябва, но на тези онлайн компилатори дава грешка. А не ми се инсталират IDE-та заради едно тестване. За мен кода не работи и няма как да ти дам отговор на въпроса. Иначе според условието и данните, които събира, би трябвало да е правилно. Може да направиш проверка дали данните са валидни - примерно ако възрастта не е реална да дава грешка или да иска отново въвеждането и, като изкарва съобщение за невалиден вход, пола да е избор от М и Ж или M/F и така нататък. За средна възраст на мъже би трябвало да иска и възраст на бащата, освен на детето, аз поне така го разбирам условието. Принципно трябва да иска и възраст на майката, а при въвеждане на деца примерно да пита колко са на брой и след въвеждане на бройка да иска въвеждане на имена, пол и години за всяко дете и в зависимост от информацията да обработи данните, примерно ако децата са момчета да ги добавя към мъжете.

Поиграх си с тази програмка.

1. Пуснах я с малки промени на
https://www.onlinegdb.com/online_c++_compiler

2. Увеличих pol[5] да стане pol[6], защото иначе не възприемаше правилно даже "мъж" и "жена"
и не намираше погрешка никое strcmp("мъж", P->pol) == 0 например
 
struct Rod{
    char ime[31];
    char pol[6];
    int god;
    char rodj[31];
    char rodm[31];
    Rod* next;
};

3. Във функцията Tarsene направих средната възраст да е тип (float)S.
иначе в G / br се объркваше с типовете
И ако погрешка стане br == 0  , тогава G/br ще прекъсне с деление на нула.

void Tarsene(Point P){
    int G = 0, br = 0;
    float S = 0.0;
    while (P != NULL) {
        cout << P->pol;
        if (strcmp("мъж", P->pol) == 0){
            cout << P->god;
            br++;
            G += P->god;
        }
        P = P->next;
    }
    S = (float)G / (float)br;
    cout << "Средната възраст на мъжете в рода е: " << S;
}

 

Променливата за пол може и да ти е String, просто проверяваш за валиден вход, няма нужда да е масив.

преди 2 часа, Реджеп Иведик написа:

С++ е стар език. На времето нямаше джендъри

switch (gender)
 {
  case MAN       : ...;
  case WOMAN     : ...;
  case PEDERAST  : ...;
  case LESBIAN   : ...;
  case TRAVESTIT : ...;
  case TRANS_MAN : ...;
  case TRANS_WOMAN: ...;
  case HERMAPHRODIT: ...;
}

На C++, че дори и на C всичко може да се опише :)

  • Автор

Благодаря Ви за помощта и шегите - всичко е 6 точки вече.

Да се извиня, ако не съм уважил пола на някого, другия път обещавам, че ще ги изброя всичките, както направи немският социалист преди 2-3 години. :)

https://www.youtube.com/watch?v=NN0ANxAhkxk 

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

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

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.