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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

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

Featured Replies

#include <stdio.h>

int main (int argc, const char * argv[])
{
    int i;
    int j;
    int k;
    
    for (i = 0; i< 10; i++) {
        for (j = 0; j< 10; j++) {
            for (k = 0; k< 10; k++) {
                if ((i*j*k) == (i + j + k)) {
                    printf("%i%i%i\n", i, j, k);
                }
            }
        }
    }
    return 0;
}

Значи #include <stdio.h> не сме учили не мога да го използвам от там и printf. (int argc, const char * argv[] Това също не знам какво е.

Ползваме #include<iostream> , using namespace std; int main() u cout. Ако може по такъв начин да я преработиш, аз пробвах, ама не стана, не ми извежда всички числа. Също ще съм благодарен да обясниш накратко за тези редове:

 
    for (i = 0; i< 10; i++) {
        for (j = 0; j< 10; j++) {
            for (k = 0; k< 10; k++) {
                

В смисъл откъде идва логиката и защо трябва да е така, ако може така да го кажа математическото решение как е ?

И много ти благодаря :yanim:

  • Отговори 941
  • Прегледи 234,6k
  • Създадено
  • Последен отговор

Да беше казал, че ти трябва Ц++ решение.

 
#include <iostream>

using namespace std;

int main()
{
    int i;
    int j;
    int k;
    
    for (i = 0; i< 10; i++) {
        for (j = 0; j< 10; j++) {
            for (k = 0; k< 10; k++) {
                if ((i*j*k) == (i + j + k)) {
                    cout << i << j << k << endl;
                }
            }
        }
    }
    return 0;
}

Логиката на програмата е да генерира всички трицифрени числа използвайки netsted loops. Всяко трицифрено число може да се представи като

x = i*100 + j*10 + k
. Понеже нас ни интересуват само цифрите, които съставят числата, ползваме 3-те loop-а. По-опростено решение би било използването на един loop и делене и модуло операции за да намерим i, j, k от горното уравнение :


#include <iostream>;

using namespace std;

int main()
{
    int i;
    int j;
    int k;
    int counter;
    
    for (counter = 0; counter < 1000; counter++)  {
        i = counter / 100;
        j = counter / 10;
        k = counter %10;
               
        if ((i*j*k) == (i + j + k)) {
            cout << i << j << k << endl;
        }
    }
    return 0;
}

Да беше казал, че ти трябва Ц++ решение.

 
#include <iostream>

using namespace std;

int main()
{
    int i;
    int j;
    int k;
    
    for (i = 0; i< 10; i++) {
        for (j = 0; j< 10; j++) {
            for (k = 0; k< 10; k++) {
                if ((i*j*k) == (i + j + k)) {
                    cout << i << j << k << endl;
                }
            }
        }
    }
    return 0;
}

Логиката на програмата е да генерира всички трицифрени числа използвайки netsted loops. Всяко трицифрено число може да се представи като

x = i*100 + j*10 + k
. Понеже нас ни интересуват само цифрите, които съставят числата, ползваме 3-те loop-а. По-опростено решение би било използването на един loop и делене и модуло операции за да намерим i, j, k от горното уравнение :


#include <iostream>;

using namespace std;

int main()
{
    int i;
    int j;
    int k;
    int counter;
    
    for (counter = 0; counter < 1000; counter++)  {
        i = counter / 100;
        j = counter / 10;
        k = counter %10;
               
        if ((i*j*k) == (i + j + k)) {
            cout << i << j << k << endl;
        }
    }
    return 0;
}

Изключително ти благодаря :whist: Втория начин дето си го направил нещо не ми се получава, но на мен ми трябва първия с вложен цикъл, много благодаря :)

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

Айде пак елементарна задачка, ако може бърз отговор. Решението да е на C++ и ако може коментар към някой от редовете :lol6: Съставете програма, коята намира решението на уравнението ах+бу=с, където а,б,c са цели числа, а неизвестните х и у - цели числа в интервала (-9;9). ПРЕДВАРИТЕЛНО БЛАГОДАРЯ :biggrin:

Редактирано от LaVendetta (преглед на промените)

Давай да видим как си започнал, пък ние ще удряме по едно рамо. Жокер, потърси алгоритъм за решаване на диофантово уравнение!

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

Едит:

Някой ще ми помогне ли или направо да се отказвам и да търся помощ другаде ?

Редактирано от LaVendetta (преглед на промените)

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

Защо все пак не опиташ да започнеш. Примерен вариант е ах+bу=с => x = (c - by)/a. Записваш функцията и тъй като x и y са дефинирани като целочислени. Завърташ един цикъл от -9 до 9 и изчисляваш. Поглеждаш дали текущия резултат удовлетворява интервала и ако го го удовлетворява значи двойката е корен. Хайде сега си ти наред.

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

Имам следната курсова задача по информатика на езикът С. "Да се състави програма за обработката на масива А[N,N], където данните са цели числа в интервала [-500;1000]. Програмата да извърши следните действия: 1. отпечатва условието на задачата 2. отпечатва имената на автора на задачата 3. въвежда входните данни 4. отпечатва входните данни 5.1. да се образува едномерен масив C[N], елементите на който са минималните елементи от всеки ред на масива А 5.2. полученият масив да се сортира по големина 6. отпечатване на получените резултати след обработка 5.1. и след обработка 5.2." Ще ви бъда много благодарен ако може някой да ми помогне с точки: 5.1 и 5.2 Благодаря ви предварително :tongue2:

За точка 5.1 мисля, че просто трябва да се дефинира масив, чийто размер е броя на редовете N. След това трябва да се напише вложен масив, който да обходи всички стойности на всеки ред и, когато стигне до последния елемент на съответния ред да запише най-малката стойност в съответния индекс не C[N].

Например нещо такова:

#define N 5

int c[N];

void findSmallestNumbersPerLine(int a[][N]) {
	int i, j, smallestNumber;
	smallestNumber = 0;

	for(i = 0; i < N; i++) {
		smallestNumber = a[i][0]; // Взимаме стойността на първия елемент в реда

		for(j = 0; j < N; j++) { // Обхождаме всички числа в реда
			if(a[i][j] < smallestNumber) {
			   smallestNumber = a[i][j];
			}
		 }

	 c[i] = smallestNumber;
	}
}

Не съм го тествал, така че си поиграй малко. Почти съм сигурен, че работи.

Редактирано от Bfaf (преглед на промените)

Ето и моето решение. Има за 5.1 и 5.2. Изглежда по-сложно от това на Bfaf. :)

#define N 5

typedef int Arr1D_T[N];        // Тип за Едномерен масив
typedef int Arr2D_T[N][N];    // Тип за Двумерен масив

//Функция която намира и връща минималната стойност на даден ред от 2-мерен масив
int minRowValue(Arr2D_T pArray2D, int row, int nArraySize)
{
    int i;
    int min = pArray2D[row][0];
    for(i = 1; i < nArraySize; i++) {
        if(min > pArray2D[row][i]) {    
            min = pArray2D[row][i];
        }
    }
    return(min);
};

// Функция която сортира едномерен масив.
void sortArray1D(Arr1D_T pArray1D, int nArraySize)
{
    int i, j;
    int temp;
    int flag;
    for(i = 1; i < nArraySize; i++) {
        temp = pArray1D[i];
        j = i - 1;
        flag = 1;
        do{
            if(temp < pArray1D[j]) {
                pArray1D[j + 1] = pArray1D[j];
                if(0 == j){
                    flag = 0;
                }
                j--;
            } else {
                flag = 0;
            }
        }while (flag);
        pArray1D[j + 1] = temp;
    }
};

// Функция която записва минималните стойности на всеки ред на едномерен в двумерен масив
void findMinRowValues(Arr2D_T pArray2D, Arr1D_T pArray1D, int nArrayRows, int nArrayCols)
{
    int i;
    for(i = 0; i < nArrayRows; i++) {
        pArray1D[i] = minRowValue(pArray2D, i, nArrayCols);
    }
};

int main(int argc, char* argv[])
{
    Arr2D_T A;    // Двумерен масив
    Arr1D_T C;  // Едномерен масив

    // TODO:  Тук си въвеждаш данните в А...

    // Намираме минималните стойности на редовете на А и ги пишем в С
    findMinRowValues(A, C, N, N);

    // TODO:  Тук извеждаш С като отговор на 5.1

    // Сортираме С
    sortArray1D(C, N);

    // TODO:  Отново извеждаш С като отговор на 5.2

    return 0;
}

ето до къде съм стигнал аз със задачата: и някак си не можах да приложа вариантите който предлагате за 5.1 и 5.2. Предполагам вината е моя тъй като не съм мнг навътре в нещата та ето до къде съм аз

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define N 10

int main()

{

int A[N][N] , C[N] ;

int m,i,j,min;

printf(" Avtor: Ilian Georgiev Georgiev \n");

printf(" EMF, 19gr, toplotehnika, fak.N 051208011 \n");

printf(" Uslovie: Da se systavi programa za obrabotka \n");

printf(" na masiva A[N,N], kudeto dannite sa celi chisla \n");

printf(" v intervala [-500;1000]. Programata da izvyrshi \n");

printf(" slednite deistviya: \n");

printf(" - otpechatva uslovieto na zadachata \n");

printf(" - otpechatva imenata na avtora na programata \n");

printf(" - vyvejdane na vhodnite danni \n");

printf(" - otpechatvane na vhodnite danni \n");

printf(" - 1) da se obrazuva ednomeren masiv C[N], elementite ,na koito \n");

printf("sa minimalnite elementi na vseki red na masiva A \n");

printf(" - 2) polucheniyat masiv da se sortira po golemina \n");

printf(" - otpechatvane na rezultatite sled obrabotka 1) i 2) \n");

printf("Vavejdane navhodni danni: \n");

printf("vavedete broi redove i stalbove: ");

scanf("%d",&m);

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

for(j=0;j<m;j++)

do

{

printf("vavedete A[%d][%d]= ",i,j);

scanf("%d", &A[j]);

}

while( (A[j]<-500) && (A[j]>1000) );

printf("izvejdane na vhodnite danni: \n");

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

{

for(j=0;j<m;j++)

printf(" %d ", A[j]);

printf(" \n ");

}

Ще отговоря с един много як цитат на Джак Клайн:

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

Значи аз не мисля точно така. Както видя, опитахме се да ти покажем, как става. Всичко което ти остава е да вмъкнеш моя код в твоя или обратното.

Редактирано от flare (преглед на промените)

Оценявам помощта , но по принцип този предмет няма общо с моята специалност. И за това не ми се задълбава да ги уча подробно тези неща тъй като НИКОГА повече те няма да ми потрябват за съжаление. Благодаря ви още веднъж за помощта и ще се гледам да ги натъманя работите :rolleyes:

такаа да се похваля направих я задачата

ето го и сорса:

#include <stdio.h>

#include <stdlib.h>

#define N 10

int main()

{

int A[N][N] , C[N] ;

int m,i,j,min,p;

printf(" Avtor: Ilian Georgiev Georgiev \n");

printf(" EMF, 19gr, toplotehnika, fak.N 051208011 \n");

printf(" Uslovie: Da se systavi programa za obrabotka \n");

printf(" na masiva A[N,N], kudeto dannite sa celi chisla \n");

printf(" v intervala [-500;1000]. Programata da izvyrshi \n");

printf(" slednite deistviya: \n");

printf(" - otpechatva uslovieto na zadachata \n");

printf(" - otpechatva imenata na avtora na programata \n");

printf(" - vyvejdane na vhodnite danni \n");

printf(" - otpechatvane na vhodnite danni \n");

printf(" - 1) da se obrazuva ednomeren masiv C[N], elementite ,na koito \n");

printf("sa minimalnite elementi na vseki red na masiva A \n");

printf(" - 2) polucheniyat masiv da se sortira po golemina \n");

printf(" - otpechatvane na rezultatite sled obrabotka 1) i 2) \n");

printf("Vavejdane navhodni danni: \n");

printf("vavedete broi redove i stalbove: ");

scanf("%d",&m);

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

for(j=0;j<m;j++)

do

{

printf("vavedete A[%d][%d]= ",i,j);

scanf("%d", &A[j]);

}

while( (A[j]<-500) && (A[j]>1000) );

printf("izvejdane na vhodnite danni: \n");

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

{

for(j=0;j<m;j++)

printf(" %d ", A[j]);

printf(" \n ");

}

printf("izvejdane na ednomeren masiv ot min elementi na vseki red \n ");

min=0;

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

{

min=A[0];

for(j=0;j<m;j++)

{

if(A[j]< min)

{

min=A[j];

}

}

C=min;

printf("C[%d]=%d\n",i,C);

}

printf("sortirane na ednomernia masiv po golemina \n");

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

{

for(j=i+1; j<m; j++)

{

if (C[j]< C)

{

p=C;

C=C[j];

C[j]=p;

}

}

}

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

printf("C[%d]=%d\n",i,C);

getchar();

system("pause");

}

Благодаря на тези, който ми помогнаха :)

имам още 1 малко питане , не мога да подкарам една доста елементарна задачка: Да се състави и изпълни програма, която да въвежда от клавиатурата едно цяло число и да проверява дали въведеното число се дели на 5. Ако числото не се дели на 5, да го допълва до първото по-голямо число, което се дели на 5. След проверката програмата да извежда на екрана съответните съобщения. Да се тестват всички разклонения на програмата!

#include <stdio.h>

#include <stdlib.h>

#define b 5

int a,chas,c;

int main()

{

printf("vavedete a: ");

scanf("%d", &a);

if (a%b==0);

{

printf("a=%d se deli na 5 i chastnoto e \n",a);

chas=a/b;

scanf("&d", &chas);

printf("%d \n", chas);

}

else

{

do

{

c=a++;

}

while (c%b==0);

scanf("%d", &c);

printf("a dopylneno do %d\n",c);

printf("se deli na 5 \n");

chas=c/b;

scanf("%d", &chas);

printf("i chastnoto e %d \n",chas);

}

system("pause");

return 0;

}

ето какво съм направил аз , но явно бъркам някъде , защото не тръгва и това си е :( Ще съм ви мнг благодарен за съвети

Редактирано от ILGeorgiev (преглед на промените)

Извинявай за въпроса ама имаш ли си идея какво прави scanf?

Това долу ще работи. разгледай коментарите.

#include <stdio.h>
#include <stdlib.h>
int main()
{
#define b 5
int a,chas,c;

printf("vavedete a: ");
scanf("%d", &a);

// Тука if не трябва да има ;
if (a%b==0)
{
    printf("a=%d se deli na 5 i chastnoto e \n",a);
    chas=a/b;

    // Ето тук трябва да отпечаташ резултат, който се намира в променливата chas.
    //scanf не само е излишен, но и ще ти изтрие резултата.
    // scanf("&d", &chas);
    printf("%d \n", chas);
}
else
{
    do
    {
	    c=a++;

    // Условието е точно обратното от твоето. трябва да увеличава докато има остатък а не докато няма.
    // Отделно да използваш цикъл при положение че можеш да го получиш директно
    // c = a + b - a%b си е живо разточителство
    }while ((c%b)!=0);

    //Излишен и грешен scanf
    //scanf("%d", &c);
    printf("a dopylneno do %d\n",c);
    printf("se deli na 5 \n");
    chas=c/b;

    //Излишен и грешен scanf
    //scanf("%d", &chas);
    printf("i chastnoto e %d \n",chas);
}
system("pause");
return 0;
}

Редактирано от flare (преглед на промените)

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

Здравейте!

Имам проблем с една програма. Идеята е да се въведе стринг от типа " 'число' 'оператор' 'число' 'оператор' ... " докато не стигне до '?', след което програмата приключва изпълнението си и извежда резултата от събирането/изваждането на числата в стринга :speak:

Проблем срещам, когато събирам/изваждам числа по-големи или равни на 10, при което програмата просто събира/изважда всички цифри поотделно и извежда резултат, вместо да събере цифрите по десетици и единици. Пример: 20 - 3 ? Извежда резултат -1 :P

Благодарности на FLARE за насоките :D

#include <iostream>
using namespace std;
int main () {
char a;
int result=0;
int control=0;
bool isPositive = true;
do {
cin >> a;
control = atoi(&a);
if(a =='+') isPositive = true;
else if(a =='-') isPositive = false;
else if(a =='?') break;
if(isPositive) {
  result += control;
  control = 0;
} else if(isPositive == false) {
   result -= control;
   control = 0;
  }
} while(a!='?');
cout << result;
}

Благодарности на FLARE за насоките :)

Е доста по-добре е от това което ми прати отначало.

Ето ти корекциите:

#include <iostream>
using namespace std;
int main () {
	char a;
	int result=0;
	int control=0;
	bool isPositive = true;
	do {
		cin >> a;
		// Това е грешно. atoi очаква нулево завършващ стринг,
		// а му подаваш единичен символ - няма как да знаеш след символа какво има
		//control = atoi(&a);
		if(a =='+') {
			isPositive = true;
			result += control;
			// Временния резултат трябва да се нулира и добавя на знак
			// - нали те са разделителите на числата
			control = 0;
		} else if(a =='-'){
			isPositive = false;
			result += control;
			control = 0;
		// добре, но трябва да добавиш изобщо проверка за различно от цифра или знак
		} else if(a =='?') {
			break;
		} else if(true == isPositive) {
			// На всяка нова цифра умножаваш временното * 10 и тогава я добавяш.
			control = control*10 + (a - '0');
		} else if(false == isPositive) {
			// За отрицателно е наобратно.
			control = control*10 - (a - '0');
		}
	} while(a!='?');
	// Това е доста важно. След въвеждане на въпросителна последното число
	// не е добавено затова го добавяме сега.
	result += control;

	cout << result;
}
п.п. Променливата isPositive и проверките и всъщност могат да се избегнат, но няма сега да издребняваме.

Редактирано от flare (преглед на промените)

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

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

#include <iostream.h>
void main(){

int number;
	do
	{
   	 cout<<"Enter Number : ";
   	 cin >>number;

	}while(!cin);
}

Редактирано от samon (преглед на промените)

ползвай

std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
след всеки невалиден вход. Проверявай не std::cin, а по-добре самата операция за вход.

нещо такова:

#include<iostream>
#include <limits>
int getSafe()
{
    int  res;
    while ((std::cout << "<Твоето съобщение>")
            && !(std::cin >> res)) {
        std::cout << "<Грешка>n";
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
    }
    return(res);
}

Редактирано от flare (преглед на промените)

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

Дадени са N точки в равнината (пространството).

а)Да се определят двете най-близо (най-отдалечени) разположени точки.

б)Всеки три последователни точки образуват триъгълник. Да се определят номерата и координатите на точките, които образуват най-големия (най-малкия) триъгълник.

#include <iostream.h>

#include<math.h>

double X[100], Y[100];

int N,i,L,k;

void main(){

do{

cout<<"broi tochki N="; cin>>N; }

while(N<3||N>100);

for (i=0; i<N; i++) {

cout<<"X["<<i<<"]=";

cin>>X;

cout<<"Y["<<i<<"]=";

cin>>Y; }

for(i=0;i<N-1;i++)

for(j=i+1; j<N; j++) {

L [k]=dist(X,Y,X[j],Y[j]);

k++;}

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

Първо имаш няколко грешки - L е променлива, а не масив. То за най-дългата или най-късата отсечка, не ти и трябва масив. Просто преди цикъла направи L да е равно на дължината на първата отсечка, и след това за всяка следваща проверяваш дали е по-голяма (по-малка) и е така заменяш стойността на L. Освен това L трябва да е double.

Така. останалото от тази задача е математика, а не програмиране.

Ползваш функция dist, но не е дефинирана. От Питаговата теорема:

double dist (double X1, double Y1, double X2, double Y2)
{
    return(sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2)*(Y1 - Y2)));
}
Израза "най-голям" от условието, предполагам, се отнася за площ. Най-удобно ще е с формулата на Херон:

double surface (double side1, double side2, double side3)
{
    double sp = (side1 + side2 + side3)/2
    return(sqrt(sp * (sp - side1) * (sp - side2) * (sp - side3)));
}
Правиш цикъл в който извикваш тази функция с параметри дължините на три поредни отсечки които намираш с по-горната функция. Намираш най-голямото лице точно, както и най-голямата отсечка по-горе.

П.П. Ако ще пишеш на C++, поне се опитай да ползваш класове за точка и триъгълник.

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

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

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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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