ОБСУЖДЕНИЕ

Решение лабораторных, контрольных и т.д. на С++

535 ответов 219,5 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
message was deleted
 
Народ.
Помогите реализовать сортировку естественным двунаправленным слиянием.
Ну очень надо. Ни хрена у меня не получется(.
 
Код:
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;




template <class Q>
void merge_sort(Q a[], int lb, int ub){
poisk(a,lb,ub);


}


template <class Q>
void slian(Q a[], int lb, int l, int ub, int r, int w) {
Q *t = new Q[ub-lb+1];
if(w%2==0){
for (int lt=0, i=lb, j=ub; i<=l || j>=r;lt++){
if(i<=l && j>=r){
if(a[i]<a[j]){
t[lt]=a[i];
i++;
}
else{ 
t[lt]=a[j];
j++;
} 
}


if(i<=l && j<r){
t[lt]=a[i];
i++;
}

if(j>=r && i>l){
t[lt]=a[j];
j++;
}
}
}
}

template <class Q>
void poisk(Q a[], int lb, int ub){
int w=0;
int l=lb;
int r=ub;
for (int c=0;(l+1)!=r;){

for (int i=l; i<r; i++){
if(a[i]<a[i+1]){

l=i;
} 
else
break;
}

for (int j=r; l<j; --j){
if(a[j]<a[j-1]){

r=j;
} 
else
break;
}
slian (a, lb, l, ub, r, w);
w+=1;
lb=l+1;
ub=r-1;
}

}

int _tmain(int argc, _TCHAR* argv[])
{

int c[16]={503, 87, 512, 61, 908, 170, 897, 275, 653, 426, 154, 509, 612, 677, 765, 703};

for (int i=0; i<16; i++)
cout<<c[i]<<",";
cout<<endl;

merge_sort (c, 0, 15);

for (int i=0; i<16; i++)
cout<<c[i]<<",";
cout<<endl;



return 0;
}
Вот код который у меня получился. Он у меня ищет упорядоченные куски и сливает их, и все дальше у меня стопор(
 
Помогите народ ,не могу придумать идею. Дан текстовый файл. Составить наибольшую по длине цепочку из слов. последущее в цепочке слово начинается с той же буквы, на которую оканчивалось предыдущее. Все это решить через динамические списки. В принципе понятно что необходимо завести массив из структур, хранящую первую букву, последнюю и длину слов. Но как организовать поиск наибольшой по длине цепочки да еще через динамические списки кто нить может помочь?
 
каждое слово сравниваешь с каждым иным по заданному условию, в цикле заполняешь счетчик.
 
тебе уже ответили в твоей теме
 
Задание:
Исходные данные вводяться из файла
Результаты выводяться на экран и в файлы:
а)упорядоченные в алфавитном порядке
б)упорядоченные по числовому порядку

Строка таблицы данных содержит след. информацию о владельцах авто:
фио владельца, марка авто, год выпуска, страна-производитель.
Требуется найти:
перечень марок авто, встречающихся максимальное число раз.

Вот заготовка:
Код:
#include<iostream.h>
#include<math.h>
#include<fstream.h>
#include<conio.h>
#include<iomanip.h>
#include<string.h>
const int L=51;
struct fio
{char fam[L],im[L],ot[L];
};
struct avto
{fio f;
char mar[L];
char str[L];
char gv[L];
};
struct otvet
{fio f;
char mar[L];
char str[L];
char gv[L];
int ng;
};
void inputfile(avto x[], int &n);
void outputs(otvet x[], int n);
void outputitog(otvet x, int n);
void outputfile(otvet x[], int n);

void inputfile(avto x[], int &n)
{ifstream fin;
char file[L];
cout<<"Imya vhodnogo faila:";
cin>>file;
fin.open(file);
if(fin.fail()){cout<<file<<" ne otkrivaetsya!";
getch(); exit(1);}
n=0;
do {fin>>x[n].f.fam>>x[n].f.im>>x[n].f.ot>>x[n].mar>>x[n].gv>>x[n].str;
n++;}
while (fin.good()); n--; fin.close();}

void outputfile(otvet x[], int n)
{ofstream fout;
char file[L]; int i;
cout<<"imya vihodnogo fayla:";
cin>>file;
fout.open(file);
if (!fout){cout<<file<<" ne sozdan"; getch(); exit(1); }
for(i=0;i<n;i++)
fout<<i+1<<setw(5)<<x[i].f.fam<<setw(5)<<x[i].f.im<<setw(5)<<x[i].f.ot<<setw(5)<<x[i].mar<<endl;
fout.close();
}

void outputs(otvet x[],int n)
{int i;
for(i=0;i<n;i++)
cout<<endl<<i+1<<setw(5)<<x[i].f.fam<<setw(5)<<x[i].f.im<<
setw(5)<<x[i].f.ot<<setw(5)<<x[i].mar<<setw(5)<<x[i].gv<<setw(5)<<x[i].str<<endl;
}

void main()
{const int N=100;
avto a[N];
otvet b[N];
int m,k,i,j,fl;
char max[N];
cout<<endl<<endl;
inputfile(a,m);
k=0;
for(i=0;i<m;i++)
{fl=0;
for(j=0;j<k;j++)
if(strcmp(a[i].mar,b[j].mar)==0)
{fl=1;b[j].ng++;break;}
if(fl==0){strcpy(b[k].f.fam,a[i].f.fam); strcpy(b[k].f.im,a[i].f.im);
strcpy(b[k].f.ot,a[i].f.ot);  strcpy(b[k].mar,a[i].mar);b[k].ng=1;
k++;}
}
outputfile(b,k);
cout<<endl<<endl<<"Perechen`:\n";
outputs(b,k);
getch();
}
 
С++
подскажите,пожалуйста.....нужно написать БЫСТРУЮ(quick, qs) сортировку....сумм эзначений элементов массива по возрастанию в столбце .[codebox] /*дана матрица ar [row,col]. Упорядочить каждый столбец матрицы по возрастанию суммы значений элементов матрицы.
5 разных способов. способы сортировок: пузырьковой, отбора, вставки, Шелла, быстрой сортировки.
Вывести на экран неупорядоченную и упорядоченную матрицы
Вывести на экран число сравнений и перестановок переменных в каждом методе сортировки*/
#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
HANDLE hStdout;
//---------------------------------------------------------------------------------
void bubble(int **summ,int **ar,const int row,const int col);
void select(int **summ,int **ar,const int row,const int col);
void insert(int **summ,int **ar,const int row,const int col);
void shall(int **summ,int **ar,const int row,const int col);
void quick(int **summ,int **ar,const int row,const int col);
void qs(int **summ,int **ar, int first, int last, const int row,const int col);
int ** newarr(int row, int col);
int ** aclone(int **ar,const int row,const int col);
void printAr(int ** ar, int row, int col);
//----------------------------------------------------------------------------------
int main (void)
{
int row, col, t, b, c, i, j;
int **summ, **summ1, **ar,**ar1, **ts, **ta;

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hStdout, BACKGROUND_INTENSITY);
SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN);
srand(time(0));
SetConsoleTextAttribute(hStdout, 10);
cout<<"Vveddite kolichestvo strok > 0\n";
cin>>row;

cout<<"Vvedite kolichestvo ctolbtsov> 0\n";
cin>>col;

SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
printf("\n");
SetConsoleTextAttribute(hStdout, 11);
cout<<"Isxodnaya matritsa:\n";
printf("\n");
ar=new int* [row];
for (i=0; i<row; i++)
ar=new int[col];

ar1=new int* [row];
for (i=0; i<row; i++)
ar1=new int[col];

for(i = 0;i < row;++i)
{
ar = new int[col];
for(j = 0;j < col;++j)
ar[j] = rand() % 999;
}
for (i=0; i<row; i++)
{
for (j=0; j<col; j++)
{
printf ("%-4d",ar[j]);
printf(" ");
}
printf("\n");
}
printf("\n");
//--------------------------------------------------------------------------------
summ=new int* [row];
for (i=0; i<row; i++)
summ=new int[col];

summ1=new int* [row];
for (i=0; i<row; i++)
summ1=new int[col];

for (j=0; j<col; j++)
{

for (i=0; i<row; i++)
{
t=ar[j]/100;
b=(ar[j]-t*100)/10;
c=(ar[j]-t*100-b*10);
summ[j]=t+b+c;

}

}
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
SetConsoleTextAttribute(hStdout, 12);

printf("\n");
printf("Summi elementov:\n");
printf("\n");
printAr(summ,row,col);
//-------------------------------------------------------------------------------------------
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
SetConsoleTextAttribute(hStdout, 2);
printf("Sortirovka puzirkom:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
bubble(ts, ta, row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
printf("\n");
SetConsoleTextAttribute(hStdout, 9);
printf("\n");
printf("Sortirovka vstavkami:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
insert(ts, ta,row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
printf("\n");
SetConsoleTextAttribute(hStdout, 14);
printf("\n");
printf("Sortirovka otborom:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
select(ts, ta,row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);



cout<<"--------------------------------------------------------------------------------";
printf("\n");
SetConsoleTextAttribute(hStdout, 7);
printf("\n");
printf("Sortirovka metodom Shella:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
shall(ts, ta,row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);

cout<<"--------------------------------------------------------------------------------";
printf("\n");
SetConsoleTextAttribute(hStdout, 13);
printf("\n");
printf("Bistraya sortirovka:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
quick(ts, ta,row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
cin >> i;
cout<<"Press any key";
getch();
}

//--------------------------------------------------------------------------------
void bubble(int **summ,int **ar,const int row,const int col)
{
int i,j,w,t,sravn,perest;
bool b;
sravn=0;
perest=0;
do
{

b=false;
for (j=0; j<col; j++)
for (i=0; i<row-1; i++)
if (summ[j]>summ[i+1][j])
{
w=ar[j];
ar[j]=ar[i+1][j];
ar[i+1][j]=w;
t=summ[j];
summ[j]=summ[i+1][j];
summ[i+1][j]=t;
b=true;
perest++;
sravn++;
}
else {sravn++;}
}
while (:(;
printAr(ar,row,col);
printf("\n");
printf("sravn %d; perest %d\n",sravn,perest);
}

void select(int **summ,int **ar,const int row,const int col)
{
int i,j,w,t,m,sravn,perest;
sravn=0;
perest=0;
for (j=0; j<col; j++)
for (m=0; m<row-1; m++)
for (i=m+1; i<row; i++)
{

if (summ[j]<summ[m][j])
{
w=ar[m][j];
ar[m][j]=ar[j];
ar[j]=w;
t=summ[m][j];
summ[m][j]=summ[j];
summ[j]=t;
perest++;
sravn++;
}
else
{sravn++;}
}

printAr(ar,row,col);
printf("\n");
printf("sravn %d; perest %d\n",sravn,perest);

}

void insert(int **summ,int **ar,const int row,const int col)//сортировка вставками
{
//вставка.........................................................................
........................

int i,j,e,d,k, sravn,perest;

sravn=0;
perest=0;
for (j=0; j<col;j++)
{
for (i=0; i<row; i++)
{
sravn++;
e=summ[j];
d=ar[j];
for (k = i-1; k >= 0 && e < summ[k][j]; k--)
{
sravn++;
ar[k+1][j]= ar[k][j];
summ[k+1][j] = summ[k][j];

}
summ [k+1][j]=e;
ar [k+1][j]=d;
perest++;
}
}


printAr(ar,row,col);
printf("\n");
printf("sravn %d; perest %d\n",sravn,perest);

}
void shall(int **summ,int **ar,const int row,const int col)
{
int i,j,w,t,p,m,perest;
long sravn;
sravn=0;
perest=0;
for (j=0; j<col; j++)
for (i=0; i<row-1; i++)
while(summ[j]>summ[i+1][j])
{
for (m=3; m>0; m--)
for (p=0; p<row-m; p++)
if (summ[p][j]>summ[m+p][j])
{
w=ar[p][j];
ar[p][j]=ar[p+m][j];
ar[p+m][j]=w;
t=summ[p][j];
summ[p][j]=summ[p+m][j];
summ[p+m][j]=t;
perest++;
sravn++;
}
else
{sravn++;}
}
printAr(ar,row,col);
printf("\n");
printf("sravn %d; perest %d\n",sravn,perest);
}






void qs(int **summ,int **ar, int l, int r, const int row,const int col)//быстрая сортировка
{
int j,val,h,sravn,perest;
sravn=0;perest=0;

for (j=0;j<col;j++)
{
if (l<r)
{ h=1;

if (l!=r)
{
if ((summ[l][j]>summ[r][j])&(true))
{
val=l;
l=r;
r=val;
val=summ[l][j];
summ[l][j]=summ[r][j];
summ[r][j]=val;
val=ar[l][j];
ar[l][j]=ar[r][j];
ar[r][j]=val;
false;
r=r-h;
perest++;
sravn++;
}
else
{
sravn++;
r=r+h;
}
}
else
{
qs(summ,ar,l,l-1,row,col);
qs(summ,ar,l+1,r,row,col);
}
}
}
}
void quick(int **summ, int **ar,const int row,const int col)//быстрая сортировка
{
int sravn,perest;
sravn=0;
perest=0;
qs(summ, ar, 0, row-1, row,col);

printAr(ar,row,col);
printf("\n");
printf("sravn %d; perest %d\n",sravn,perest);
}


//-----------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------


int ** newarr(int row, int col)
{
int ** ar, i;
ar = new int* [row];
for (i=0;i<row;i++)
{
ar = new int [col];
}
return ar;
}
int ** aclone(int **ar,const int row,const int col)
{
int i,j,**clone;
clone = newarr(row,col);
for (i=0;i<row;i++)
{
for (j=0;j<col;j++)
{
clone[j]=ar[j];
}
}
return clone;
}

void printAr(int ** ar, int row, int col)
{
int i,j;
for (i=0; i<row; i++)
{
for (j=0; j<col; j++)
{
printf ("%-4d",ar[j]);
}
printf("\n");
}
}[/codebox]
 
Здравствуйте!
В общем мне нужно программу для перевода чисел из десятичной в шестнадцатиричную систему счисления !
Вот тут друг решил потратить на меня время , и набросал тут чутка #include <iostream.h>
#include <conio.h>

char* trans(int, char []);

int main(void)
{int num;
char str[80];
clrscr();
cout<<"Vvedite chislo: ";
cin>>num;
cout<<"16-oe prestavlenie chisla: "<<trans(num, str)<<endl;

getch();
return 0;
}

char* trans(int n, char s[])
{char c;
int sgn, m, i, l, j;

if (n<0)
{sgn=-1;
n=n*sgn;
}
else
sgn=1;
i;
while (n>15)
{m=n % 16;
if (m<10)
s=m+48;
else
s='A'm-10);
n=n/16;
i++;
}
if (n<10)
s=n+48;
else
s='A'n-10);
i++;
if (sgn==-1)
{s='-';
i++;
}
s='\0';
l=i/2;
for(j; j<l; j+
{c=s[i-j-1];
s[i-j-1]=s[j];
s[j]=c;
}
return (&s[0]);
}
Но проблема в том , что я никак не могу понять алгоритма!!
Вот к вам просьба , напишите пожалуйста подробные комментарии к этой прграмме, или если можно, решить ее проще.. Вот как мне все объяснил друг :
Сначала знак запоминается,Если число отрицательное, то его знак меняется на положительный,Потом уже само 16-ое представление находится,Разряды 16-го числа записываются в строку s.,Если число было изначально отрицательным, то в конце строки записываем '-'.Потом нам надо перевернуть строку.Чтобы число было отображено правильно.И мы эту строку переворачиваем, меняя местами элементы строки.
Надеюсь на вас...
кстати , нужна прога под C++ Builder 3.11 for DOS
 
Есть такая задача: задан граф - не дерево. Проверить, можно ли превратить его в дерево удалением одной вершины вместе с ее ребрами. Помогите пожалуйста!!! Ну перво наперво: я просто условие не особо понимаю. О чем это вообще? Что должно быть на экране и т.п.??? И каким образом можно было бы это сделать??? Я на первом курсе и ничего не понимаю, совсем, а такую же задачу я видела для 4 курса.
 
Сегодня была первая лаба по Turbo C++...Я толком ни чего не сделал,и вот эти три задачки у меня в долгу теперь :rolleyes:
1)Определить сколько слов в тексте
2) Определить самое длинное слово в тексте
3)Определить сколько раз встречается символ в тексте
Если сможете пишите комментарии,а то не пойму
Пожалуйста
 
Доброго времени суток.
Помогите,кто сможет,решить одну лабораторную по С++.
Работаем мы по шаблону win32 console application в Visual Studio.
Задачка у нас на указатели:
Код:
Заменить все отрицательные елементы на значение минимального положительного елемента,что не равен нулю.
Размерность массива - 50
Диапазон значений: от -100 до 100

Заранее спасибо.
 
Для: YUE

Код:
int	array[50]; // предпологается что уже заполнен!! 
int	i, min = 100;
for ( i = 0; i < 50; i++ ) if ( array[i] > 0 && array[i] < min ) min = array[i];
for ( i = 0; i < 50; i++ ) if ( array[i] < 0 ) array[i] = min;
 
Для: DJFREEMAN
3-я. Все предельно упрощено

Код:
# include <stdio.h>
# include <stdlib.h>

void main(void)
{

char symbol='a'; // буква, которую ищем
char str[80]="the C is exellent language"; // Это твой текст в котором искать надо

int count=0;
int i=0;

while (str[i]!='\0')
{
if (str[i]==symbol) count++; // перебираем буквы на соотвествие искомому символу
i++; // Нарасчиваем индекс
}


printf("You have %d \"%c\" in your text\n", count, symbol); // Выводим результат (типа че получилось)

}
 
Приветствую всех.Не могли бы вы помочь с решением программы.
Это транспортная задача,решаемая методом столбца.На языке visual c++.
-----------------------------------------------------
Поставщик и |
их мощность | Потребители их спрос
____________ | B1 B2 B3 B4
----------------------| 45 55 51 49
-----------------------------------------------------
A1 20 ----------- |----- 10/20 1 2 8
A2 30 ----------- | -----8/25 3/5 1 8
A3 40------------ | ----- 6 5/40 6 4
A4 50 ----------- | ----- 4 7/10 9/40 6
A5 60 ---------- | ----- 3 4 2/11 8/49
_____________________________________________________
(Не обязательно по этой таблице,это просто как пример).

Заранее очень признательна. :huh:
 
Ой,извиняюсь.Немного некорректно выразилась)).
Составить опорный план.
Есть склады и предприятия.
На складах хранится определенное количество товаров,эти товары необходимо разместить по предприятиям.Ищем наименьшее значение в столбце,прибавляем к нему необходимое количество товаров со склада,если на данном складе нет необходимого количества,переходим к следующему.И так далее.После того как предприятие получит необходимое количество,повторяем процедуру с другим предприятием.Вообщем вот как-то так).
 
Дело в том что не совсем в программировании разбираюсь.
Вот сейчас заступорилась.Как мне сделать так,чтобы если на складе остается 0 товаров,чтобы переходило к следующему складу?
То есть пишу :
for(int i=100;i<1000;i++);
{
if(m_A1B1<i) i=m_A1B1;
if(m_A2B1<i) i=m_A2B1;
}
for(int a=i;a<1000;a++);
{
int x,y;
if(m_A1B1<=i) x=m_A1-m_B1,y=m_A1-x,m_A1=x,m_A1B11=y,m_B1=m_B1-m_A1B11;
if(m_A2B1<=i) x=m_A2-m_B1,y=m_A2-x,m_A2=x,m_A2B11=y,m_B1=m_B1-m_A2B11;
И не знаю что делать дальше
(кстати как можно формулу в более лицеприятный вид привести?Если пишу m_A1B1=x и затем x=x+x,то ничего не получается)) )
Надеюс понятно написала...
 
Анька
можно чуток упростить...:

m_B1=m_B1-m_A1B11;
можно заменить на:
m_B1 -= m_A1B11;

"(кстати как можно формулу в более лицеприятный вид привести?Если пишу m_A1B1=x и затем x=x+x,то ничего не получается)"
где это у тебя написано!!???
 
Статус
Закрыто для дальнейших ответов.