Премини към съдържанието
  • Добре дошли!

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

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

     

Помощ за задачи на C/C++ (merged)


Препоръчан отговор

Здравейте.

 

Имам проблем с търсенето на цикли в граф. По условие на задачата имам да намеря най-късия цикъл в ориентиран граф, тоест ако графа ми е: (A,B,C,D), връзките между елементите на графа са: (A->B), (A->A), (B->C), (B->A),  (C->D), (C->A), (D->A) и така циклите са ми: А->B->C->D->A; A->B->C->A; A->B->A; A->A, програмата трябва да изведе най-късия, в случая A->A. За да я реша предполага, че първо трябва да открия всички цикли, след това да ги сложа всеки в отделен списък и накрая да изведа най-малкия списък, в който ще е най-късия цикъл (A->A), но не знам как да го реализирам. В момента съм направил връзките (арките) между отделните елементи:

#include <iostream>

using namespace std;

const int N = 10;

struct elem
{
	char key;
	elem *next;	
} *g1[N];

void init(elem *g[N])
{
	for (int i = 0; i < N; i++)
		g[i] = NULL;
}

int search_node(char c, elem *g[N])
{
	for (int i = 0; i < N; i++)
		if (g[i])
			if (g[i]->key == c)
			{
				return 1;
			}

	return 0;
}

int search_arc(char from, char to, elem *g[N])
{
	if (search_node(from, g) && search_node(to, g))
	{
		int i = 0;

		while (g[i]->key != from) i++;

		elem *p = g[i]->next;

		while (true)
		{
			if (p == NULL)
			{
				break;
			}

			if (p->key == to)
			{
				return 1;
			}

			p = p->next;
		}
	}

	return 0;
}

void add_node(char c, elem *g[N])
{
	if (search_node(c, g))
		cout << "Node already exists.\n";

	int i = 0;
	while (g[i] && (i < N)) i++;

	if (g[i] == NULL)
	{
		g[i] = new elem;
		g[i]->key = c;
		g[i]->next = NULL;
	}
	else
	{
		cout << "Maximum nodes reached.\n";
	}
}

void add_arc(char from, char to, elem *g[N])
{
	if (search_arc(from, to, g))
		cout << "Arc already exists.\n";
	else
	{
		if (!search_node(from, g))
			add_node(from, g);

		if (!search_node(to, g))
			add_node(to, g);

		int i = 0;
		while (g[i]->key != from) i++;

		elem *p = new elem;
		p->key = to;
		p->next = g[i]->next;

		g[i]->next = p;
	}
}

void print(elem *g[N])
{
	for (int i = 0; i < N; i++)
	{
		if (g[i] != NULL)
		{
			elem *p = g[i];

			while (p)
			{
				cout << p->key << "\t";
				p = p->next;
			}

			cout << endl;
		}
	}
}

void iscycle(elem *g[N])
{

}

int main()
{
    system ("cls");

	cout << "init: " << endl;
	init(g1);

	cout << "graph 1: " << endl;
	add_arc('a', 'b', g1);
	add_arc('a', 'a', g1);
	add_arc('b', 'c', g1);
	add_arc('b', 'a', g1);
	add_arc('c', 'a', g1);
	add_arc('c', 'd', g1);
	add_arc('d', 'a', g1);

	print(g1);

	cout << "cycles: ";
	iscycle(g1);
               
    system("pause");
	return 0;

}
Линк към коментара
Сподели в други сайтове

Здравейте колеги.

 

Имам проблем с една програма. Стигнал съм до едно положение и се чудя как да опиша следните функции : 

 

1.Четене на точка по подаден индекс от вектор
2.Инициализация на съдържанието на вектора с точки със случайни стойности по Z по зададена размерност за X(N)
3. Добавяне на елемент във вектора, параметър CBar3D
4.Четене на точка по зададен индекс на вектора
5. Създава и връща вектор от CBar3D, изчислени като разлика спрямо подадена като параметър(средна)стойност(int) по координата Z
6. Изчислява средна стойност на графиката по координата Z
 
Пращам ви това, което съм направил до момента.

#include<iostream>
#include<fstream>
#include<string>
#include<math.h>
#include<cstdlib>
#include<vector>
#include<iterator>
#include<list>
#include<algorithm>
#include<functional>
using namespace std;
	class CBar3D
{
	private:
		double x, y, z;
		static int pnum;
		static int a;

	public:
		CBar3D()
		{
			x = y = z = 0;
			pnum++;
	
		}

		CBar3D(double a, double b, double c)
		{
			x=a; y=b; z=c; pnum++; 
		}	
	double get_x() const
	{
		return x;
	}	
	void set_x(double a)
	{
		x=a;
	}
	double get_y() const
	{
		return y;
	}
	void set_y(double b)
	{
		y=b;
	}
	double get_z() const
	{
		return z;
	}
	void set_z(double c)
	{
		z=c;
	}
	bool operator<(CBar3D x)
	{
		if ( this->get_x() == x.get_x())
			return this->get_y() < x.get_y();
		else
		{
		return false;
		}
	}
	void print()
	{
		cout << "\n a=" << x << "\n b=" << y <<"\n c=" << z <<endl;
	}
	static void PrintPNum()
	{
		cout<<"randum sotinost= "<<pnum;
	}
		friend ostream& operator>>(ostream&str,  CBar3D &A);
		friend istream& operator<<(istream&str,  CBar3D &A);
	};
	 ostream& operator<<(ostream& str, const  CBar3D&A)
{
	str << A.get_x() << " " << A.get_y() <<" "<< A.get_z << endl;
	return str;
}
istream& operator>>(istream& str, CBar3D&A)
{double a,b,c;
	str >> a;
	str >> b;
	str >> c;
	A.set_x(a);

	return str;
}
static void Printa()
	{
		int a, chislo;
		do
		{
			cout << "vyvedete chislo a="; 
			cin >> a;
			chislo = rand() % 100 + 1;
			if (a==chislo)
			{
				cout << "Tova e chisloto \n\n\n\n";
				
			}
			else 
			{
				cout << "Tova ne e chisloto \n\n\n\n";
				
			};
		}
		while (a!=chislo);
	}
	class CGraphic
{
private:
	string imegraf;
	int razmer;
	vector<CBar3D> vv;
	double d;
	list <CGraphic> st;

public:		
	CGraphic(string imegr, string FileName)
	{
		ifstream file ( FileName.c_str());
 if(!file)
			throw "Can't open file";
		while(!file.eof())
		{
			CGraphic s ;
			file>>s;

			st.push_back(s);
	}
		file.close();
	}
	void Output(ostream&  konzola)
	{
		copy(st.begin(),st.end(),ostream_iterator<CGraphic>(konzola, " "));
	}

  CGraphic(string imegr, int N) 
  { 
	  imegraf=imegr;
	  razmer=N;
  
  for (int i=1;i<=N;i++)
	  vv.push_back(CBar3D(i,5,rand()%30));
  }
   string getimegr() const
   {
	   return imegraf;
   }
   void setimegr( const string imegr )
   {
	   imegraf=imegr;
   }
   int getN() const
   {
	   return razmer;
   }
   void setN(const int N)
   {
	   razmer=N;
   }
   CGraphic()
   {    d = 0.0; }

  CGraphic(double x)
  {  d = x; }

  CGraphic &operator=(double x)  
  {
	  d=x;
  return *this;
  }

  double getd() const
  {
	  return d; 
  }
   void setd(double x)
	{
		x=d;
	}
  
		friend ostream& operator>>(ostream&str,  CGraphic &B);
		friend istream& operator<<(istream&str,  CGraphic &B);
	};
		ostream& operator<<(ostream& str, const  CGraphic&B)
{
	str << B.getd() << " " << B.getimegr() <<" "<< B.getN << endl;
	return str;
}
istream& operator>>(istream& str, CGraphic&B)
{double d,int N, double x;
	str >> d;
	str >> N;
	str >> x;
	B.setd(x);

	return str;
}
		vector<CBar3D> newvector(int sr)
		{
			vector<CBar3D> temp;

		}
	void setvector(CBar3D vv)
	{
	
	}
		int srednoZ()
	{
        
	}
	void main(int argc, char** argv)
	{
		{
			{	
			vector<int> vv;// дефиниране на празен вектор
			for (int i=0; i<10; i++) vv.push_back(i);// добавяне на още 10 елемента. Чрез vv.push_back(i) добавяме елемент
		cout << "Sled dobavqne na oshte 10 elementa: " << vv.size() << endl;
		cout << "Съдържанието на масива от вектори е:";
		}
    vector<int> vectorOne(10);
    
	cout << "Размер на вектора е: " << vectorOne.size() << " elements." << endl;
    cout << "Капацитет на вектора е: " << vectorOne.capacity() << " elements." << endl;
    
	for (long index=0; index<(long)vectorOne.size(); ++index) vectorOne.at(index)=rand();
    
	cout << "Вектора съдържа следните елементи:" << endl;
    for (long index=0; index<(long)vectorOne.size(); ++index) 
	{
        cout << vectorOne.at(index) << " ";
    }
		cout << endl << endl;
		
		system("pause");	
	}
}

Линк към коментара
Сподели в други сайтове

  • 2 месеца по-късно...

Извинявам се, писал съм по старо питане.

Редактирано от Реджеп Иведик (преглед на промените)
Линк към коментара
Сподели в други сайтове

  • 2 седмици по-късно...

Здравейте, искам да напиша програма, която да въвежда 10 букви от клавиатурата, след което да извежда най-малката от тях. Имам два проблема: единия е, че цикър for се върти само до петия елемент, а след това изпечатва последния въведен. Ако махна цикъла, за една буква сравнението е акуратно, но ако искам да въведа повече букви, нещо ми убягва. Ще се радвам да ми помогнете. :)

#include <stdio.h>

int main()
{
    char ch1,ch2;
    int    i;
    ch2 = 'z';
    printf("\n Enter characters: ");
    for(i=0; i<=9; i++)
    {
            ch1 = getchar();
            if (ch1 <= ch2)
            ch2 = ch1;
     }
    printf("\n The lowest letter is: %c\n",ch2);
	system("pause");
	return 0;
}

Редактирано от Statickoob (преглед на промените)
Линк към коментара
Сподели в други сайтове

За скобите ли става въпрос? Сложих скобите, след цикъл for, но пак резултата е същия.

Редактирано от Statickoob (преглед на промените)
Линк към коментара
Сподели в други сайтове

Цикъла ти се изпълнява 11 пъти и ако вкараш 10 букви и ентер 11-та ще е той и ще е най-малката (ASCII кода за стрелка надолу е 10)

Линк към коментара
Сподели в други сайтове

Ок, ограничих брояча до 9 (нали от 0 до 9 са 10 символа), но резултата е същия. Явно нещо ми убягви при ASCII кодовете. Би ли обяснил?

Линк към коментара
Сподели в други сайтове

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

Линк към коментара
Сподели в други сайтове

  • 3 месеца по-късно...

Моля помогнете ми с 1ва задача.

С втората се справих.

 

 

20151226_131911.jpg

Линк към коментара
Сподели в други сайтове

  • 11 месеца по-късно...

Здравейте! :)

Пиша в темата защото имам проблем и се надявам някой да успее да ми помогне.Студент първокурсник съм и ми се налага да направя курсова по Програмиране (уж я направих),но трябва да направя и блок схема ...... а нямам никаква идея как... Задачата ми е :  "Да се състави алгоритъм и програма използващи функция, чрез която да се въвеждат в едномерни масиви две числови редици, всяка с по N на брой реални числа (N<10). Да се прехвърлят и съхранят в нови редици само тези стойности, които в двете редици с входни данни съвпадат по индекс и стойност. "
 Писана е на Microsoft Visual C++ 6.0 ,Някой може ли да помогне с блок-схема?

#include <stdio.h>

#define M 9

          // Прототипи:

void vhod (float a[], int br);

void printmas (float a[], int br);

void main ()

{ 

float  x[M], y[M], eq[M];

int i, j, n;

do

       { printf ("Broi na chislata : N>0;N<10 =");

          scanf ("%d", &n);

        }

  while (n<1||n>M);

  printf ("Vuvedi chisla za X:\n");  // извиква се функция vhod за масив x

          vhod (x,n);

  printf ("Vuvedi chisla za Y:\n");  // извиква се функция vhod за масив y

          vhod (y,n);

  printf ("\nVuvedeni chisla za X:\n");

          printmas (x,n);               //извиква се функция printmas за x

   printf ("\nVuvedeni chisla za Y:\n");

          printmas (y,n);               // извиква се функция printmas за y

 

                   for (i=0,j=0;i<n;i++)

                             if (x[i]==y[i])

                             z[j++]=x[i];

  printf ("\nSuvpadashti chisla:\n");

          printmas (z , j);     // извиква се функция printmas за z

 

}

/*       Функция vhod от тип void.

          Резултатите са в масива         */

 

  void vhod (float a[],int br)

  {

          int i;

          for (i=0;i<br; i++)

          {       

                    printf("element %d=",i+1);

                   scanf ("%f, ",&a[i]);

          }

  }

           /* Функция printmas от тип void.

                Резултатите са на екрана */

void printmas (float a[], int br)

  {

          int i;

          for (i=0; i<br; i++)

          printf ("%f, ",a[i]);

          printf ("\n");

   }

 

 

Редактирано от Penev90 (преглед на промените)
Линк към коментара
Сподели в други сайтове

  • 11 месеца по-късно...
на 29.04.2006 г. в 0:42, TyRsEn написа:

Курсовата задача е следната:

Поразгледах в интернет и открих програма, която е писана за същото задание като моето. Ето я и нея:

 

 

При пускането и обаче (Borland C++ 3.1, курсовата задача трябва да е правена на него) се оказа, че има 3 грешки и като цяло не е точно това, което правим в университета.

 

Ето една задачка правена в час:

 

 

Моля хората, които разбират от програмиране да помогнат за евентуалното написаване на програмата или ако може горната с 3-те грешки да се оправи, но да има вид като тази в час (накрая да е с "return 0;", а не с "getch();", да е с по-простички функции (не с min=99999999999 и разни въвеждания на масиви).

 

БЛАГОДАРЯ НА ВСИЧКИ ОТГОВОРИЛИ!!!

Моля за помощ за курсова работа .

 

16.1. Програмистът Гошо Тарикатски съхранява сорсовете на своите програми в специален сейф. За да го обезопаси срещу крадци решил да създаде сложна система за отключване. Тя се задействала от два различни пулта, от които се въвеждале две трицифрени числа. След като се въведат числата се стартира програма, която генерира кода за сейфа по следния начин:

·         Събира първата цифра на първото число с последната цифра на второто число. Ако резултатът е двуцифрено число, цифрите му се събират. Получената цифра се записва като първа за кода.

·         Втората цифра се получава като по същият начин се обработят вторите цифри на двете числа.

·         След сумирането на последната цифра на първото число и първата цифра на второто по посочената схема, се получава третата цифра на кода.

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

 

16.2. Дадено е естественото число n. Съставете алгоритъм и напишете програма, която проверява дали n съдържа три еднакви цифри.

 

16.3. За група от М студента са зададени оценките по 5 дисциплини (Анализ, Геометрия, Програмиране, Чертане, Физика). Да се състави алгоритъм и напише програма за намиране на най-често срещаната оценка на всеки студент от групата.

 

16.4. Даден е двумерен масив Z с k реда и n стълба. Да се състави алгоритъм и напише програма, която създава нов масив M, като стойността на Mi е равна на най-малката положителна стойност в i-ия ред на Z.

Линк към коментара
Сподели в други сайтове

преди 15 минути, Лозева написа:

Моля за помощ за курсова работа .

 

16.1. Програмистът Гошо Тарикатски съхранява сорсовете на своите програми в специален сейф. За да го обезопаси срещу крадци решил да създаде сложна система за отключване. Тя се задействала от два различни пулта, от които се въвеждале две трицифрени числа. След като се въведат числата се стартира програма, която генерира кода за сейфа по следния начин:

 

·         Събира първата цифра на първото число с последната цифра на второто число. Ако резултатът е двуцифрено число, цифрите му се събират. Получената цифра се записва като първа за кода.

 

·         Втората цифра се получава като по същият начин се обработят вторите цифри на двете числа.

 

·         След сумирането на последната цифра на първото число и първата цифра на второто по посочената схема, се получава третата цифра на кода.

 

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

 

 

 

16.2. Дадено е естественото число n. Съставете алгоритъм и напишете програма, която проверява дали n съдържа три еднакви цифри.

 

 

 

16.3. За група от М студента са зададени оценките по 5 дисциплини (Анализ, Геометрия, Програмиране, Чертане, Физика). Да се състави алгоритъм и напише програма за намиране на най-често срещаната оценка на всеки студент от групата.

 

 

 

16.4. Даден е двумерен масив Z с k реда и n стълба. Да се състави алгоритъм и напише програма, която създава нов масив M, като стойността на Mi е равна на най-малката положителна стойност в i-ия ред на Z.

 

Разгледай какво прави оператора %, масиви/вектори и итерация върху тях. 

Линк към коментара
Сподели в други сайтове

Трябва  ми спешно помощ за 2-ра и 3-та точка ако някой има малко време да удари едно рамо ще съм безкрайно благодарен. 

Прогромо с функция main() и избор на функция за.
1.Въвъеждане от клавиатурата на размерност (с проверка за коректност) и елементи на масив цели числа K(M) (K<=30);
2.Изчисляване на средно аритметичното от четните положителни числа в масива;
3.Изчисляване на броя на нулевите числа в масива;
4.Извеждане на екран резултатите от съответното изчисляване, както и на въведените числа в масива (с походящи текстове) 

Линк към коментара
Сподели в други сайтове

  • 1 година по-късно...

Някой може ли да помогне? Значи имам 20 часа за които трябва да реша този проблем. 
Иамм следната задача : 

Програма с функция main() и избор чрез меню на функции за:

Въвеждане от клавиатура на размерност (с проверка за коректност) и елементи на масив от цели числа C(K) (K<=25);

Формиране на нов масив CN(K) само от нечетните по стойност елементи и определяне на средно-аритметичната им стойност;

Презаписване на масива C(K) в масив CS(K) и сортиране на този масив в низходящ ред;

Извеждане на екран информация за съответния масив с пояснителен текст.

Направил съм я задачата. Тръгна ми няколко пъти, но вече не ще :Д Някой по-голям разбирач нека да погледне. Ще черпя ! 

https://pastebin.com/U8FHWwDx

Линк към коментара
Сподели в други сайтове

  • 1 година по-късно...

Добавете отговор

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

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Добави ново...

Информация

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