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

  • Автор темы Автор темы European
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Помогите пожалуйста.

Тема:::::::ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ


Задание:::::

Составить программу, моделирующую заполнение гибкого магнитного диска.
Общий объем памяти на диске 360 Кб. Файлы имеют произвольную длину от 18 байт до 32 Кб. В процессе работы файлы либо записываются на диск, либо удаляются с него. В начале работы файлы записываются подряд , друг за другом. После удаления файла, на диске образовывается свободный участок памяти, и вновь записываемый файл записывается на этот участок, либо , если файл не вмещается на свободном участке, размещается после последнего записанного файла.
В случае, когда файл превосходит длину самого большого свободного участка выдается аварийное предупреждение.
Требование на запись или удаление файла происходит с командной строки, которая содержит имя файла , его длину в байтах, признак записи или удаления. Программа должна выдавать по запросу сведения о свободных и занятых участках памяти на диске.
Указание : следует создать список занятых и список свободных участков памяти на диске.



ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ


Составить программу, моделирующую заполнение гибкого магнитного диска.
Общий объем памяти на диске 360 Кб. Файлы имеют произвольную длину от 18 байт до 32 Кб. В процессе работы файлы либо записываются на диск, либо удаляются с него. В начале работы файлы записываются подряд , друг за другом. После удаления файла, на диске образовывается свободный участок памяти, и вновь записываемый файл записывается на этот участок, либо , если файл не вмещается на свободном участке, размещается после последнего записанного файла.
В случае, когда файл превосходит длину самого большого свободного участка выдается аварийное предупреждение.
Требование на запись или удаление файла происходит с командной строки, которая содержит имя файла , его длину в байтах, признак записи или удаления. Программа должна выдавать по запросу сведения о свободных и занятых участках памяти на диске.
Указание : следует создать список занятых и список свободных участков памяти на диске.



ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ




Составить программу, моделирующую заполнение гибкого магнитного диска.
Общий объем памяти на диске 360 Кб. Файлы имеют произвольную длину от 18 байт до 32 Кб. В процессе работы файлы либо записываются на диск, либо удаляются с него. В начале работы файлы записываются подряд , друг за другом. После удаления файла, на диске образовывается свободный участок памяти, и вновь записываемый файл записывается на этот участок, либо , если файл не вмещается на свободном участке, размещается после последнего записанного файла.
В случае, когда файл превосходит длину самого большого свободного участка выдается аварийное предупреждение.
Требование на запись или удаление файла происходит с командной строки, которая содержит имя файла , его длину в байтах, признак записи или удаления. Программа должна выдавать по запросу сведения о свободных и занятых участках памяти на диске.
Указание : следует создать список занятых и список свободных участков памяти на диске.
 
YUE

Заменить все отрицательные елементы на значение минимального положительного елемента,что не равен нулю.
Размерность массива - 50
Диапазон значений: от -100 до 100

ты прав. указателей нет, и я не вижу у тебя в задании ни слова... где должны быть указатели, с чем их надо связывать хз....
 
привет. скомпилируйте пожалуйста программу на Borland C++ 3.1, у меня почему-то не получается [codebox]#include <stdio.h> //Подключение стандартных #include <alloc.h> // Библиотек #include <conio.h> #include <process.h> #include <stdlib.h> #define MIN -32768
int *po = NULL; //Указатель на массив пунктов отправления
int *pn = NULL; //Указатель на массив пунктов назначения
int *st = NULL; //Указатель на матрицу стоимостей
int *matr=NULL; //Указатель на матрицу базисных переменных
int *matr2 = NULL; //Указатель на рабочую матрицу
int n ,m; //Размерность задачи
int *pu,*pv; //Указатели на массивы потенциалов
int *zj,*zi; // Указатель на массивы индексов
int ch=0,ch2=0; //Счетчики
FILE *fpdat; //Указатель на вводной файл
int iter=0; //Счетчик итерации
FILE *fil; //Указатель на выводной файл
int zen = -1; //Переменная для сохранения стоимости п-на
int z = 1; //Флаг для выхода при оптимальном плане
int basper;



// void exit(int status);


void data(void)
{
int i,j,t;
printf("Введите количество складов: ");
scanf("%d",&m);
printf("Kolichestvo skladov-----> %d",m);
printf("\n Введите количество магазинов:\n");
scanf("%d",&n);
printf("\n Kolichestvo magazinov --->%d",n);
//*********** Выделение памяти ******************
if((po=(int*)calloc(m,sizeof(int)))==NULL) abort();
if((pn=(int*)calloc(n,sizeof(int)))==NULL) abort();
if((st=(int*)calloc(n*m,sizeof(int)))==NULL) abort();

printf("Введите элементы матрицы стоимостей: \n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("Введите [%d][%d]\n ",i,j);
scanf("%d",&t);
*(st+i*n+j)=t;

}
}
printf("\n");
fprintf(fil,"\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%5d",*(st+i*n+j));
fprintf(fil,"%5d",*(st+i*n+j));
}
printf("\n");
fprintf(fil,"\n");
}
printf("Введите количество запасов на каждом складе:\n");
for(i=0;i<m;i++)
{
printf("\n");
scanf("%d",po+i);
printf("%5d",*(po+i));
}
printf("\n");
printf("Введите потребности:\n");
for(j=0;j<n;j++)
{
printf("\n");
scanf("%d",pn+j);
printf("%5d",*(pn+j));
}
return;
}//**** data



//************* SOZDANIE OPORNOGO PLANA ********************
//************* METHOD NORD-WEST YGLA **********************
void opplan(void)
{
int i,j,ch1 = 0;
//*************** ВЫДЕЛЕНИЕ ПАМЯТИ *************************
if((matr=(int*)calloc(m*n,sizeof(int))) == NULL) abort();

// ЦИКЛ ПРОСТОГО РАСПРЕДЕЛЕНИЯ ПОТРЕБНОСТЕЙ по ячейкам рабочей матрицы
for(i=0;i<m;i++)
{
for(j=ch1;j<n;j++)
{
if(*(po+i)<*(pn+j))
{
*(matr+i*n+j)=*(po+i);
*(pn+j)-=*(po+i);
*(po+i)=0;
break;
}
*(matr+i*n+j)=*(pn+j);
*(po+i) -= *(pn+j);
*(pn+j)=0;
ch1++;
}
}
//********* ПРОВЕРКА И ВЫвод получившейся матрицы ***********************
printf("PROVERKA\n");
fprintf(fil,"PROVERKA MATRIX - Северо заподный УГОЛ,\n просмотр получившегося распределения в матрице \n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%5d",*(matr+i*n+j));
fprintf(fil,"%d",*(matr+i*n+j));
}
printf("\n");
fprintf(fil,"\n");
}
fprintf(fil,"********************\n");
return;
} // opplan


void kost(void)
{
int i,j, *matr1,rez=0;
//выделение памяти
if((matr1=(int*)calloc(n*m,sizeof(int))) == NULL) abort();
//присвоение новой матрице значения базисной(старой) матрицы
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
*(matr1+i*n+j) = *(matr+i*n+j);
}
}

// Подсчет стоимости базисной матрицы (созданного массива)
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(*(matr1+i*n+j)>0)
rez += (*(matr1+i*n+j)) *(*(st+i*n+j));
}
}
printf("\n Rezultat : %d",rez);
printf("\n");
fprintf(fil,"%s %5d"," Rezultat : ",rez);
fprintf(fil,"\n");
getch();
free(matr1);
if(zen == rez)
{
z=0;
}
zen = rez;
return;
}
//************* KOST()



//************* PODSCHET POTENCIALOV ********************

void potenzial(void)
{
struct poten
{
int v;
int u;
int zn;
struct poten *next;
int b;
} *topnast = NULL,
*top = NULL,
*top1 = NULL;

int i,j;
int fl;

//********** ВЫДЕЛЕНИЕ ПАМЯТИ *******************8
if((pu=(int*)calloc(m,sizeof(int)))==NULL) abort();
if((pv=(int*)calloc(n,sizeof(int)))==NULL) abort();
// ПРИСВОЕНИЕ ВСЕМ ПОТЕНЦИАЛАМ ЗНАЧЕНИЯ MIN
for(i=0;i<m;i++)
*(pu+i) = MIN;

for(j=0;j<n;j++)
*(pv+j) = MIN;
// Выделение памяти под структуру и заполнение её значениями
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if((*(matr+i*n+j) > 0) || (*(matr+i*n+j)==-2))
{
if((top=(struct poten*)malloc(sizeof(struct poten)))==NULL)
abort();
fprintf(fil,"top = %d",top);
if(!topnast){
topnast = top;
fprintf(fil,"topnast = top = %d",top);
}
else top1 -> next=top;
top1=top;
top -> next=NULL;
top -> b = *(st+i*n+j); //Стоимости
top -> v = j;
top -> u = i;
top -> zn = -1;
}
}
}
*pu = 0;
i=0; j = -1;
for(top = topnast;top!=NULL;top = top -> next)
{
if((top -> u) == i && (top -> v)!=j)
{
*(pv+(top -> v)) = (top -> :lol: - *(pu+i);
j = (top->v);
top -> zn = 0;
}
else{
for(top1 = topnast;top1 != NULL;top1 = top1->next)
{
if((top1->v) == j && (top1->u)!=i)
{
*(pu+(top1->u))=(top1->B) - *(pv+j);
i = (top1->u);
top1 ->zn = 0;
break;
}
}
}
}
// ********** Продолжение функции подсчета потенциалов *****************

for(;;){
fl = 0;
for(top = topnast;top!=NULL;top =top -> next)
{
if((top -> zn) == -1)
{
if(*(pu+(top ->u)) !=MIN)
{
*(pv+(top->v))=(top->B) - *(pu+(top ->u));
fl = 1;
top -> zn = 0;
}
if(*(pv+(top->v)) !=MIN)
{
*(pu+(top->u))=(top->B) - *(pv+(top->v));
fl=1;
top->zn = 0;
}
}
}
if(!fl) break;
}
printf("\n ПОТЕНЦИАЛЫ ПО v:");
fprintf(fil,"\n **** ПОТЕНЦИАЛЫ ПО v:");
for(i = 0;i<n;i++)
{
printf("%d",*(pv+i));
fprintf(fil,"%5d",*(pv+i));
}
getch();
printf("\n ПОТЕНЦИАЛЫ ПО u: ");
fprintf(fil,"\n **** ПОТЕНЦИАЛЫ ПО u: ");
for(i=0;i<m;i++)
{
printf("%d",*(pu+i));
fprintf(fil,"%5d",*(pu+i));
}
fprintf(fil,"\n");
for(top = topnast;top!=NULL;top = top->next)
free(top);
return;
} // potenzial


// ****** PROVERKA PLANA NA OPTIMALNOST' ************************
void abcikl(int ik,int jk);
int cikl(int ik,int jk);
void pr(char pr[],void *st); // Предварительно
int prpoisk(int i1,int j1); // Объявлены
int levpoisk(int i1,int j1); //ЭТИ
int verpoisk(int i1,int j1); //Функции
int nizpoisk(int i1,int j1);
int optim(void)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
// ИЩЕМ ОПТИМАЛЬНОЕ РЕШЕНИЕ В НАШЕЙ МАТРИЦЕ И ЕСЛИ ЕГО НЕ НАЙДЕМ
// ТО ПО СЛЕДУЮЩЕМУ УСЛОВИЮ ПРИСВОИМ ГРАФОКЛЕТКЕ С КООРДИНАТАМИ
// ik,jk ЗНАЧЕНИЕ -1
if(( *(pu+i)+ *(pv+j))>(*(st+i*n+j))&&((*(matr+i*n+j)) == 0))
{
abcikl(i,j);
fprintf(fil,"optim(): План не оптимален, функции main() возвращаем -1,\n а abcikl() параметры i,j ");
return(-1);
}
}
}
fprintf(fil,"Plan optimalen");
return(0);
} // ******* optim() ***************



// ************** UPGRADE PLAN **************************
void abcikl(int ik,int jk)
{
int i,j;
fprintf(fil,"Мы в abcikl()");
if((matr2=(int*)calloc(n*m,sizeof(int))) == NULL) abort();
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
*(matr2+i*n+j) = *(matr+i*n+j); // Создаем копию рабочей матрицы
}
}
*(matr2+ik*n+jk) = -1;
// значению матрицы с параметрами ik,jk присваеваем -1
printf("\n");
printf("Поиск Цепи: \n\n");
fprintf(fil,"Поиск Цепи: \n\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fprintf(fil,"%5d",*(matr2+i*n+j));
printf("%5d",*(matr2+i*n+j));
}
fprintf(fil,"\n");
printf("\n");
}
fprintf(fil,"\n\n Переходим в Сраную, Мать её, Функцию cikl(ik,jk) \n");
getch();
cikl(ik,jk);

return;
} // abcikl



// ********* FUNKCION POISKA CIKLA **************************
int cikl(int ik,int jk)
{
int nst,nstr,i,j,
perlev = 0,
perpr = 0;
int perver = 0,
perniz = 0,
fl = 0,
fl3 = 1;
int napr;

struct cik { int prnapr;
int ick;
int jck;
struct cik *next;
} *topnast1 = NULL,
*top2 = NULL,
*top3 = NULL;
ch = 0;
if((top2 = (struct cik*)malloc(sizeof(struct cik))) == NULL)
abort();

if(!topnast1)
{
topnast1=top2;
top3=top2;
top3->ick=ik;
top3->jck=jk;
}
else
top3->next=top2;
top3=top2;
top2->next=NULL;
top2->ick = ik;
top2->jck = jk;
ch++;
fprintf(fil,"\n\nДо Условия while fl3 =%d \n",fl3);
pr("top2",top2);
fprintf(fil,"Весь цикл поиска сейчас начнется, надеюсь - \n что он будет не бесконечный или не бесполезный :( \n");
printf("Весь цикл поиска сейчас начнется, надеюсь - \n что он будет не бесконечный или не бесполезный :( \n");
printf("\n \t \t\tpress anykey to contunio\n");
getch();
while(fl3)
{
fl3=0;
fl = 0;
if((nst = prpoisk(ik,jk))>=0)
{
fprintf(fil,"\n\nВнимание!!!\n nst = %d \n",nst);
fprintf(fil,"Ща будет поик идти ему бы...:Point found!\n");
printf("И он пошел RIGHT:Point found !\n\r");
napr = 2;
jk = nst;
top2->prnapr = 1;
}
else if((nstr = nizpoisk(ik,jk))>=0)
{
fprintf(fil,"DOWN: Point found !\n");
printf("DOWN: Point found !\n\r");
napr = 3;
ik = nstr;
top2->prnapr = 2;
}

else if((nst=levpoisk(ik,jk))>=0)
{
fprintf(fil,"LEFT:Point found !\n");
printf("LEFT:Point found !\n\r");
napr = 4;
jk = nst;
top2->prnapr = 3;
}
// **************** Prodolzhenie 1 poiska ***********************
else if((nstr = verpoisk(ik,jk))>=0)
{
fprintf(fil,"UP:Point found !\n");
printf("UP:Point found !\n\r");
napr = 1;
ik = nstr;
top2->prnapr = 4;
}
else
return(-1);

while(!fl || *(matr2+ik*n+jk)!=-1)
{
fl=1;
switch(napr)
{
case 1:
printf("Search to the right --->");
fprintf(fil,"Search to the right --->");
if((nst = prpoisk(ik,jk))>=0)
{
printf("founded\n\r");
fprintf(fil,"founded\n");
if((top2=(struct cik*)malloc(sizeof(struct cik)))==NULL)
abort();
if(!topnast1) topnast1=top2;
else top3 -> next=top2;
top3 = top2;
top2 -> next = NULL;
top2->ick = ik;
top2->jck = jk;
ch++;
top2->prnapr = 1;
pr("top2",top2);
napr = 2;
jk = nst;
perpr = perlev = 0;
} // **** IF *******
else
{
fprintf(fil,"Point not found ! Change direction to LEFT\n");
napr = 3;
perpr = 1;
}
break;
//***************** PRODOLZHENIE 2 POISKA ******************************
case 2:
printf("Search to the down --->");
fprintf(fil,"Search to the down --->");
if((nstr=nizpoisk(ik,jk))>=0)
{
if((top2=(struct cik*)malloc(sizeof(struct cik))) == NULL)
abort();
printf("founded\n\r"); fprintf(fil,"founded\n");
if(!topnast1) topnast1=top2;
else top3->next=top2;
top3=top2;
top2->next=NULL;
top2->ick = ik;
top2->jck = jk;
ch++;
top2->prnapr = 2;
pr("top2",top2);
napr = 3;
ik = nstr;
perniz=perver=0;
} //**** IF ********
else
{
fprintf(fil,"Point not found ! Change direction to UP\n");
napr = 4;
perniz = 1;
}
break;

case 3:
printf("Search to the left -->");
fprintf(fil,"Search to the left -->");
if((nst=levpoisk(ik,jk))>=0)
{
if((top2=(struct cik*)malloc(sizeof(struct cik))) == NULL)
abort();
printf("founded\n\r"); fprintf(fil,"founded\n");
if(!topnast1)
topnast1=top2;
else
top3->next=top2;
top3=top2;
top2->next=NULL;
top2->ick = ik;
top2->jck = jk;
ch++;
//************ PRODOLZHENIE 3 POISKA *************
top2->prnapr = 3;
pr("top2",top2);
napr = 4; jk = nst;
perlev = perpr = 0;
} // ******* IF *****
else{
fprintf(fil,"Point not found ! Change direction to RIGHT\n");
napr = 1;
perlev = 1;
}
break;
case 4:
printf("Search to the up --->");
fprintf(fil,"Search to the up --->");
if((nstr=verpoisk(ik,jk))>=0)
{
if((top2=(struct cik*)malloc(sizeof(struct cik)))==NULL)
abort();
printf("founded\n\r"); fprintf(fil,"founded\n");
if(!topnast1) topnast1=top2;
else top3->next=top2;
top3=top2;
top2->next=NULL;
top2->ick=ik;
top2->jck=jk;
ch++;
top2->prnapr = 4;
pr("top2",top2);
napr = 1;
ik = nstr;
perver = perniz = 0;
} // *****If **************
else
{
fprintf(fil,"Point not found ! Change direction to DOWN\n");
napr = 2;
perver = 1;
}
break;
} // ************ SWITCH ********************
// ************** PRODOLZHENIE 4 POISKA ********************
if(perlev == 1 && perpr == 1)
{
*(matr2+ik*n+jk) = 0;
ik = top3 ->ick;
jk = top3 ->jck;
napr = top3->prnapr;
top3 = topnast1;
printf("Zerro 1\n\r");

for(top2=topnast1;top2->next !=NULL;top2=top2->next)
top3 = top2;
top3 -> next=NULL;
perlev = perpr = 0; // if(ch == 1)
if(top2==top3)
{
fl3=1;
break;
}
else
{
top3->next=NULL;
free(top2);
ch--;
printf("Viynimaem tochky: (%d,%d)=%d\n",ik,jk,*(matr2+ik*n+jk));
fprintf(fil,"Viynimaem tochky: (%d,%d)=%d\n",ik,jk,*(matr2+ik*n+jk));
pr("top2",top2);
}
perpr = 0;
perlev = 0;
} // IF

if(perver == 1 && perniz == 1)
{
*(matr2+ik*n+jk)=0;
printf("Zerro 2\n\r");
ik=top3->ick;
jk = top3->jck;
napr = top3->prnapr;
top3 = topnast1;

for(top2 = topnast1;top2->next !=NULL;top2=top2->next)
top3 = top2; perver = perniz = 0;
if(top2==top3)
{
fl3=1;
break;
}
else
{
top3->next = NULL;
free(top2);
ch--;
// ******* PRODOLZHENIE 5 POISKA *********************
printf("Viynimaem tochky: (%d,%d) = %d\n",ik,jk,*(matr2+ik*n+jk));
fprintf(fil,"Viynimaem tochky: (%d,%d) = %d\n",ik,jk,*(matr2+ik*n+jk));

pr("top2",top2);
}
perver = 0;
perniz = 0;
} // IF
if(ch==0)
{
fl3=1;
break;
}
} //while
} //while
i=0;
if((zi = (int*)calloc(ch,sizeof(int))) == NULL ) abort();
if((zj = (int*)calloc(ch,sizeof(int))) == NULL ) abort();
printf("\n\r");
ch2 = ch;
for(top2 = topnast1;top2 !=NULL;top2 = top2->next)
{
*(zi+i) = top2 ->ick;
*(zj+i) = top2 ->jck;
i++;
}

return(0);
} // *********** cikl ****************************



int prpoisk(int i1, int j1)
{
int j;

for(j=j1+1;j<n;j++)
{
if((*(matr2+i1*n+j))!=0)
return(j);
}
return(-1);
}
int levpoisk(int i1,int j1)
{
int j;

for(j = j1-1;j>=0;j--)
{
if((*(matr2+i1*n+j))!=0)
return(j);
}
return(-1);
}
int verpoisk(int i1,int j1)
{
int i;

for(i=i1-1;i>=0;i--)
{
if((*(matr2+i*n+j1))!=0)
return(i);
}
return(-1);
}

int nizpoisk(int i1, int j1)
{
int i;
for(i = i1+1;i<m;i++)
{
if((*(matr2+i*n+j1))!=0)
return(i);
}
return(-1);
}



// ************* FUNCTION SEARCH ********************
void pr(char pr[],void *st)
{
struct cik { int prnapr;
int ick;
int jck;
struct cik *next;
} *ptr;
int i,j;

ptr = (struct cik *)st;
fprintf(fil,"Koordinatiy ytoplennoy tochki : %d and %d",ptr->ick,ptr->jck);
printf("Koordinatiy ytoplennoy tochki : %d and %d\n\r",ptr->ick,ptr->jck);
fprintf(fil,"and napravlenie");
printf("Napravlenie");
switch(ptr->prnapr)
{
case 1:
fprintf(fil,"Vpravo\n");
printf("Vpravo\n\r");
break;
case 2:
fprintf(fil,"Vniz\n");
printf("Vniz\n\r");
break;
case 3:
fprintf(fil,"Vlevo\n");
printf("Vlevo\n\r");
break;
case 4:
fprintf(fil,"Vverh\n");
printf("Vverh\n\r");
break;
default:
fprintf(fil,"Start\n");
printf("Start\n\r");
break;
}
fprintf(fil,"WORK MATRIX\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fprintf(fil,"%5d",*(matr2+i*n+j));
}
fprintf(fil,"\n");
}
fprintf(fil,"************************************\n");
return;
}


// **************** UPGRADE PLAN *********************************//
void plmi(void)
{
int i,j,k,min,i1,j1,flagok;
ch = ch2;
flagok = 0;
i1=*zi;
j1 = *zj;
for(k=1;k<ch;k+=2){
i=*(zi+k);
j = *(zj+k);
if(*(matr+i*n+j) == -2){
*(matr+i1*n+j1) = *(matr+i*n+j);
*(matr+i*n+j) = 0;
flagok = 1;
break;
}
} // for
if(!flagok){
for(k=2;k<ch;k+=2){
i = *(zi+k);
j = *(zj+k);
if(*(matr+i*n+j) == -2)
*(matr+i*n+j) = 0;
} // for
i = *(zi+1);
j = *(zj+1);
min = *(matr+i*n+j);
for(k=3;k<ch;k+=2){
i=*(zi+k);
j=*(zj+k);
if(*(matr+i*n+j)<min)
min = *(matr+i*n+j);
}
if(min == -2) min = 0;
for(k=0;k<ch;k+=2){
i = *(zi+k);
j = *(zj+k);
*(matr+i*n+j) += min;
}
for(k=1;k<ch;k+=2){
i=*(zi+k);
j=*(zj+k);
*(matr+i*n+j)-=min;
}
} //if
// ***************** PROVERKA **************************//

printf("PROVERKA\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%5d",*(matr+i*n+j));
}
printf("\n");
}
free(matr2);free(zi);free(zj);free(pu);free(pv);
return;
}


void Bas(void)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(*(matr+i*n+j)!=0) basper++;
}
}
return;
}

void sohran(void)
{
// Sravnenie
int i,j,k;
for(k=0;k<ch;k++)
{
i=zi[k];
j=zj[k];
if((*(matr+i*n+j) == 0) && (basper < m+n-1))
{
*(matr+i*n+j) = -2;
basper++;
}//if
}
return;
}
// ************ SOZDANIE OPORNOGO PLANA **************************
// ************ METODOM SEVERNO-ZAPADNOGO YGLA *******************
void opplan1(void)
{
int i,j, ch1 = n-1;
//**************** Viydelenie pamyty *************************
if((matr=(int*)calloc(m*n,sizeof(int))) == NULL) abort();
for(i=0;i<m;i++)
{
for(j=ch1;j>=0;j--)
{
if(*(po+i)<*(pn+j))
{
*(matr+i*n+j)=*(po+i);
*(pn+j)-=*(po+i);
*(po+i)=0;
break;
}
*(matr+i*n+j)=*(pn+j);
*(po+i)-=*(pn+j);
*(pn+j)=0;
ch1--;
}
}
//*************** Proverka *************************
printf("Proverka\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%5d",*(matr+i*n+j));
}
printf("\n");
}
fprintf(fil,"matrix\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fprintf(fil,"%5d",*(matr+i*n+j));
}
fprintf(fil,"\n");
}
fprintf(fil,"*****************\n");
return;
}//******** opplan1


//************** SOZDANIE OPORNOGO PLANA ********************
//*************** METHOD NORD-WEST YGOL *********************

void opplan2(void)
{
int i,j,k_i,k_j=0, min = 32767, *kontr,fl;
if((matr=(int*)calloc(m*n,sizeof(int))) == NULL) abort();
if((kontr=(int*)calloc(m*n,sizeof(int))) == NULL) abort();
for(i=0;i<m;i++){
for(j=0;j<n;j++){
*(kontr+i*n+j) = 0;
}
}
for(i=0;i<m;i++){
fl = 0;
while(!fl){
for(j=0;j<n;j++){
if(*(st+i*n+j)<min){
if(*(kontr+i*n+j) == 0) {
min = *(st+i*n+j);
k_i = i; k_j = j;
}
}
}
*(kontr+k_i*n+k_j) = 1;
if(*(po+k_i)<*(pn+k_j)) {
min = 32767;
*(matr+k_i*n+k_j)=*(po+k_i);
*(pn+k_j)=*(po+k_i);
*(po+k_i)=0;
break;
}
else {
*(matr+k_i*n+k_j)=*(pn+k_j);
*(po+k_i)-=*(pn+k_j);
*(pn+k_j)=0;
min = 32767;
if(*(po+k_i) == 0) fl = 1;
}
}
}
printf("Proverka\n"); // proverka
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%5d",*(matr+i*n+j));
}
printf("\n");
}
fprintf(fil," matr\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
fprintf(fil,"%5d",*(matr+i*n+j));
}
fprintf(fil,"\n");
}
fprintf(fil,"*********************************\n");
return;
}// opplan2









void main()
{
int i,j,met;
int flagok;
fil = fopen("otchet.txt","w");
clrscr();
gotoxy(1,3);
printf("WARNING USERS ---->\n\n\n");
printf("Решение закрытой трансп.задачи\n\n");
printf("Базисные переменные,равные нулю, помечаются -2;\n");
printf("Графоклетка, относительно которой строится цепь\n");
printf("помечается -1\n");
gotoxy(1,22);
printf("press anykey to contunio...\n");
getch();
clrscr();
data();
printf("press anykey to contunio...\n");
getch();
clrscr();
gotoxy(1,3);
printf("\n YOU selest method building first plan:\n");
printf("1-method NORD-WEST ygol\n");
printf("2-method NORD-EST ygol\n");
printf("3-method minimum element to string\n");
scanf("%d",&met);
gotoxy(1,22);
printf("press anykey, to contunie...\n");
getch();
//void opplan(void);
//void opplan1(void);
//void opplan2(void);
clrscr();
switch(met)
{
case 1: opplan();
break;
case 2: opplan1();
break;
case 3: opplan2();
break;
default: printf("неверно выбран МЕТОД\n"); exit(-1);
}
basper = 0;
Bas();
flagok = 0;
if(basper<m+n-1)
{
//Если в первоначальном плане количество базисных
//переменных, отличных от нуля, меньше, чем M+N-1
while(!flagok)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(*(matr+i*n+j)==0)
{
*(matr+i*n+j) = -2;
flagok = 1;
basper++;
break;
} //if
}
if(flagok) break;
}
if(basper<m+n-1) flagok = 0;
}//while
}//if
for(;;)
{
fprintf(fil,"*********** Начало ДОЛБАНУТОЙ Итерации**********\n");
basper = 0;
Bas();
//void sohran(void);
if(iter>0)
{
//Количество базисных ненулевых переменных <m+n-1
if(basper <m+n-1) sohran();
}
kost(); //****** Вывод общей стоимости******
potenzial(); //*******Подсчет потенциалов********
ch2 = 0;
z = optim();
if(!z) break;
plmi();
iter++;
fprintf(fil,"%d ШАГ ДОСТАВШЕЙ ДО СЪЕХАВШЕЙ КРЫШИ ИТЕРАЦИИ",iter);
}
//************* ПРОВЕРКА************
printf("\n\nOPTIMAL PLAN :\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%5d",*(matr+i*n+j));
}
printf("\n");
}
fprintf(fil,"optimal PLAN :\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fprintf(fil,"%5d",*(matr+i*n+j));
}
fprintf(fil,"\n");
}
kost(); //************ВЫВОД общей стоимости***********
fclose(fil);
clrscr();
printf("Отчет о проделанной работе ПРОГРАММЫ в файле otchet.txt");
getch();
return;
} // main
[/codebox]
заранее спасибо
 
Привет всем!!!
я студентка 1-го курса!
помогите решить задачку!

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

вот сама задача

Дана матрица,элементами которой являются латинские буквы.Отсортировать в лексикографическом порядке элементы каждого столбца:
1) сортировкой вставками
2) сортировкой обменом

Заранее огромное спасибо!
 
Привет всем!
Я студент только 1-го курса и не справляюсь совсем,
помогите решить задачку

Мне нужно создать программу обработки файла, содержащий сведения о телефонах абонентов. Каждая запись с полями: Фамилия, год установки, номер телефона.
И вывод на печать инфу:
-по вводимой с клавиатуры фамилии абонента выдавать номер телефона;
-по вводимому году определить количество установленных телефонов с этого года.
если можете то вышлите на e-mail: St1ch@mail.ru
 
Не могу разобраться с делением матриц в С++.
Помогите пожалста.
 
нуу... сам алгоритм(метод гаусса) не очень понятен ... :)
 
Здравствуйте, буду благодарна за помощь, срочно нужно доделать курсовую)
Необходимо создать программу в MFC, которая рисует разные треугольники (по принципу как в Paint).
Осталось сделать только треугольник общего вида.
Вот на всякий случай реализация равнобедренного, равностороннего, прямоугольного треугольника (треугольник общего вида надо сделать по такому же принципу):
void CLine::Draw (CDC *PDC)
{
PDC->SetROP2(10) ;
if (tool==1) { PDC->MoveTo (m_X1,m_Y1); //линия
PDC->LineTo (m_X2,m_Y2);
}
if (tool==2) {
CPoint pts[3];
pts[0].x = m_X1;//равнобедренный
pts[0].y = m_Y1;
pts[1].x = m_X1+(m_X2-m_X1)/2;
pts[1].y = m_Y2;
pts[2].x = m_X2;
pts[2].y = m_Y1;
PDC->Polygon(pts, 3);
}
if (tool==3) {
CPoint pts[3];
pts[0].x = m_X1;//равносторонний
pts[0].y = m_Y1;
pts[1].x = m_Y1+(m_X2-m_X1)/2;
if(m_Y1<m_Y2)
pts[1].y = m_Y1+sqrt( pow(double(m_X2-m_X1) , 2) - pow(double(m_X2-m_X1)/2 , 2) );
else
pts[1].y = m_Y1-sqrt( pow(double(m_X2-m_X1) , 2) - pow(double(m_X2-m_X1)/2 , 2) );
pts[2].x = m_X2;
pts[2].y = m_Y1;
PDC->Polygon(pts, 3);

}
if (tool==4) {
CPoint pts[3];//прямоугольный
pts[0].x = m_X1;
pts[0].y = m_Y1;
pts[1].x = m_X1;
pts[1].y = m_Y2;
pts[2].x = m_X2;
pts[2].y = m_Y1;
PDC->Polygon(pts, 3);
}
 
Всем привет!
Очень срочно нужна помощь в решении одной интересной и сложноватой (для меня) в реализации программки...

Вот условие:
Дано наутральное число m. Вставить между некоторыми цифрами 1, 2, 3, 4, 5, 6, 7, 8, 9, записанными именно в таком порядке, знаки + и - так, чтобы значением получившегося выражения было число m. Например, если m=122, то подойдет следующая расстановка знаков: 12+34-5-6+78+9. Если требуемая расстановка знаков невозможна, то сообщить об этом.

Нужен алгоритм или код на С. Буду оч благодарен. Заранее спасибо.
 
Ну эт я понял... Вопрос, как его правильно организовать... У меня не получается менять длину чисел...
Не знаю, как это организовать...
 
Помогите плиззз.... в решении данного типа задания.

Создайте шаблон класса бинарное дерево, содержащее указатели на элементы данных. Используйте его при решении задачи.
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования. Для каждого поезда указывается:
номер поезда;
станция назначения;
время отправления.
Данные в информационной системе организованы в виде двоичного дерева. Составьте программу, которая:
обеспечивает первоначальный ввод данных в информационную систему и формирование двоичного дерева;
производит вывод всего дерева;
вводит номер поезда и выводит все данные об этом поезде;
вводит название станции назначения и выводит данные обо всех поездах, следующих до этой станции.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
 
сначала составляешь для одного знака: 1+23456789. Потом следующий случай: 12+3456789 и т.д. Аналогично с -
потом для двух знаков 1+2+3456789, 1+23+456789, ..., 1+2345678+9, 12+3+456789 и т.д. Аналогично если первый знак - или второй знак - или оба -
потом для 3-х и т.д.
 
Буду очень благодарна за помощь в решении курсовой работы. Сделала бы сама, но знаний не хватает ... поэтому прошу помощи.


Буду очень благодарна за помощь в решении курсовой работы. Сделала бы сама, но знаний не хватает ... поэтому прошу помощи.
 

Вложения

  • Car1.doc
    Car1.doc
    51 КБ · Просмотры: 199
  • Car1.doc
    Car1.doc
    51 КБ · Просмотры: 145
Задание:
Англо-русский словарь построен в виде вдоичного дерева.
Каждая компонента содержит английское слово, соответствующее ему русское слово и счетчик количества обращений к данной компоненте.
Первоначально дерево формируется в порядке английского алфавита. В процессе эксплуатации словаря при каждом обращении к компоненте к счетчику обращений прибавляется единица.
Написать программу, которая:
1) обеспечивает начальный ввод словаря с конкретными значениями счетчика обращений;
2) формирует новое представление словаря в виде двоичного дерева по следующему алгоритму:
а) в старом словаре ищется компонента с наибольшим значением счетчика обращений;
б) найденная компонента заносится в новый словарь и удаляется из старого;
в) переход к пункту а) до исчерпания исходного словаря.
3) Производит вывод исходного и нового словарей.
Программа должна обеспечивать диалог с помощью меню и кантроль ошибок при вводе.

Решение должно быть в виде динамических структур.

Где-то отрыл половину решения этого задания, но оно в виде приложения Windows, а нужно под Dos (т.е. Console Wizard).
Пытался переделать ее, отучить от кнопок и полей ввода, но ничего путного не вышло, лишь запутался (((

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

Программа из учебника Павловской
[codebox]#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
struct Node{
int d;
Node *left;
Node *right;
};
Node *first(int d);
Node *search_insert(Node *root, int d);
void print_tree(Node *root, int l);
//---------------------------------------------------------------------------
int main(){
int b[] = {10, 25, 20, 6, 21, 8, 1, 30};
Node *root = first(b[0]);
for (int i = 1; i<8; i++) search_insert(root, b);
print_tree(root, 0);
getch ();
return 0;
}
//---------------------------------------------------------------------------
// Формирование первого элемента дерева
Node * first (int d){
Node *pv = new Node;
pv->d = d;
pv->left = 0;
pv->right = 0;
return pv;
}
//---------------------------------------------------------------------------
// Поиск с включением
Node * search_insert (Node *root, int d) {
Node *pv = root, *prev;
bool found = false;
while (pv && !found){
prev = pv;
if (d == pv->d) found=true;
else if (d < pv->d) pv=pv->left;
else pv=pv->right;
}
if (found) return pv;
// Создание нового узла
Node *pnew = new Node;
pnew->d = d;
pnew->left = 0;
pnew->right = 0;
if (d < prev->d)
// Присоединение к левому поддереву предка
prev->left = pnew;
else
// Присоединение к правому поддереву предка
prev->right = pnew;
return pnew;
}
//---------------------------------------------------------------------------
// Обход дерева
void print_tree(Node *p, int level){
if (p){
print_tree(p->left, level+1); // вывод левого поддерева
for (int i = 0; i<level; i++) cout << " ";
cout << p->d << endl; // вывод корня поддерева
print_tree(p->right, level+1); // вывод правого поддерева
}
}[/codebox]

Моя попытка написать программу
[codebox]
#include <vcl.h>
#include <iostream.h>
#include <string.h>

#pragma hdrstop
#pragma argsused
// Структура:
struct tree
{
char eng[40]; //английское слово
char rus[40]; //русский перевод
int count; //количество обращений
tree *left;
tree *right;
};
char temp_eng[40];
char temp_rus[40];
int temp_count;
using namespace std;
//---------------------------------------------------------------------------
// Прототипы функций:
// Функция добавления элемента в дерево
tree *first (char eng, char rus, int count);
tree *search_insert (tree *root, char eng, char rus, int count);
// Функция удаления узла дерева
// Функция показа дерева
tree *print_tree (tree *p, int level);
// Функция поиска перевода
//---------------------------------------------------------------------------
// Главная функция:
int main()
{int vibor;
tree *root=0;
menu2:
cout<<"Najmite: "<<endl;
cout<<"1) Dobavit slovo i ego perevod v slovar"<<endl;
// cout<<"2) Ввести английское слово и искать его перевод"<<endl;
// cout<<"3) Удалить слово из словаря"<<endl;
cout<<"2) Vihod"<<endl;
cin>>vibor;
switch (vibor)
{
case 1: {cout<<"Vvedite angliskoe slovo: "<<endl;
cin>>temp_eng[40];
cout<<"Vvedite russkoe slovo: "<<endl;
cin>>temp_rus[40];
cout<<"Vvedite znachenie schetchika: "<<endl;
cin>>temp_count;
if (root!=0) tree *root=first(temp_eng[40], temp_rus[40], temp_count);
//создание первого элемента дерева
else tree *root=search_insert (root, temp_eng[40], temp_rus[40], temp_count);
//создание элементо-потомков дерева
};
break;
case 2: {goto vihod;};
break;
}
// default: cout<<"Нужно нажать клавишу от 1 до 4"<<endl;
//break;
goto menu2;
vihod:
return 0;
}
//---------------------------------------------------------------------------
// Функции программы:
// Функция фрмирования первого элемента дерева:
tree *first (string eng, string rus, int count)
{int i;
tree *pv=new tree;
pv->eng=*eng;
pv->rus=rus;
pv->count=count;
pv->left=0;
pv->right=0;
return pv;
}
// Функция поиска и добавления элемента в дерево:
tree *search_insert (tree *root, string eng, string rus, int count)
{
tree *pv=root, *prev;
bool found=false;
//------//переменные//----------------------------
//поиск по дереву
while (pv&&!found) {
prev=pv;
if (eng==pv->eng) found = true;
else if (count < pv->count) pv=pv->left;
else pv=pv->right;
}
if (found) return pv;
//создание нового узла
tree *pnew=new tree;
pnew->eng=eng;
pnew->rus=rus;
pnew->count=count;
pnew->left=0;
pnew->right=0;
if (count < prev->count) prev->left=pnew; //присоединение к левому поддереву предка
else prev->right=pnew; //присоединение к правому поддереву предка
return pnew;
}
// Функция удаления узла дерева:

// Функция показа дерева
tree *print_tree (tree *p, int level)
{if (p)
{print_tree(p->left, level+1);
for (int i=0; i<level; i++)
cout<<" ";
cout<<p->eng;
cout<<p->rus;
cout<<p->count;
print_tree (p->right, level+1);
}
}
// Функция поиска перевода
[/codebox]

Прикрепил архив с исходниками прогаммы (не моей, прога работает) реализующей (не полностью, почему-то) это задание в виде приложения Windows.
 

Вложения

  • auto2.rar
    auto2.rar
    688,3 КБ · Просмотры: 208
Кто знает как переделать из С++ Builder в Visual C++? Помогите пожалуйста!!
Я сделал программу текстового редактора на билдере, а надо в VC++
Или может у кого-нибудь есть готовый текстовый редактор? Можно консольный..
 

Вложения

Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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