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

  • Автор темы Автор темы European
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Народ.
Помогите реализовать сортировку естественным двунаправленным слиянием.
Ну очень надо. Ни хрена у меня не получется(.
 
link removed не создавай лишних тем.
а еще
 
Код:
#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,то ничего не получается)"
где это у тебя написано!!???
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!