Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2008, 15:23   #1
EwwwA
 
Регистрация: 30.09.2008
Сообщений: 8
Восклицание С++ Ошибка в программе

Здравствуйте! Помогите, пожалуйста, исправить ошибки. Времени уже совсем нет.
1) Сформировать одномерный массив X[N] из положительных элементов строк матрицы, попутно определяя номера строк матрицы, в которых отсутствуют положительные элементы.

Код:
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>


int _tmain(int argc, _TCHAR* argv[])
{
    int mas[50][50], i, j, m, n, masB[50], l, k=0;
	printf ("Vvedite n:");
	scanf ("%d", &n);
    printf ("Vvedite m:");
	scanf ("%d", &m);
	printf ("Vvedite elementi matritsi:\n");
	for (i=0; i<n; ++i)
		for (j=0; j<m; ++j)
		{
		scanf ("%d", &m);
		printf("mas[%d][%d]=%d", i, j, mas[i][j]);
		}
	for (i=0; i<n; ++i)
		for (j=0; j<m; ++j)
		{
			if (mas[i][j]>0)
			{
				masB[k]=mas[i][j];
				k=k+1;
			}
			else {l=i;}
			printf ("Nomera strok - %d", l);
		}
	
    getchar();
	getchar();
	return 0;
}
А вот с этой задачей бьюсь уже неделю. Даже стыдно показывать, что получается. Тупость полнейшая. А преподователь говорит, что она легкая. Помогите!
2) Напечатать список лиц, работающих/учащихся в институте, по алфавиту.
EwwwA вне форума Ответить с цитированием
Старый 29.12.2008, 02:55   #2
NextU
 
Регистрация: 29.12.2008
Сообщений: 7
По умолчанию

Цитата:
for (i=0; i<n; ++i)
for (j=0; j<m; ++j)
{
if (mas[i][j]>0)
{
masB[k]=mas[i][j];
k=k+1;
}
else {l=i;}
printf ("Nomera strok - %d", l);
}
Замени вот этот кусок кода на
Код:
printf ("Nomera strok - ");
int f;
for(i=0; i<n; ++i)                          //for(int i=0; i<n; ++i)
{
        f = true;
        for(j=0; j<m; ++j)                //for(int j=0; j<m; ++j)
             if(mas[i][j] > 0){
                   f = false;
                   masB[k]=mas[i][j];
	        k=k+1;                      //++k;
              }
       if(f == true)                              //if(f)
              printf("%d ", i);
}

Последний раз редактировалось NextU; 29.12.2008 в 03:01.
NextU вне форума Ответить с цитированием
Старый 30.12.2008, 16:23   #3
breate
Пользователь
 
Аватар для breate
 
Регистрация: 30.12.2008
Сообщений: 78
По умолчанию

Через что писать?
1 - матрицы
2 - структуры
3 - классы
и так мимо
int strcmp(
const char *string1,
const char *string2
)
возвращаемые значения

Value Relationship of string1 to string2
< 0.................. string1 less than string2

0......................string1 identical to string2

> 0...................string1 greater than string2
Моя работа - Создание сайтов
breate вне форума Ответить с цитированием
Старый 05.01.2009, 23:10   #4
Tycoos
 
Регистрация: 05.01.2009
Сообщений: 3
По умолчанию Помогите отыскать ошибку в тексте

Программа считывает матрицу из файла. Все проходит успешно. Но, если изменить исходные данные, то функция branch не выполняется. Пример "верного" исходника:
FeaturesNum=2
MachinesNum=2
Feature=2
Feature=2
Resource=15
Feature=3
Feature=4
Resource=24
Performance=4
Performance=5
Пример "нерабочего"
FeaturesNum=3
MachinesNum=2
Feature=2
Feature=2
Resource=15
Feature=3
Feature=4
Resource=24
Feature=0
Feature=-1
Resource=-2
Performance=4
Performance=5
Вот текст программы: (Visual C++ 6.0)

З.Ы. Код еще не оптимизировал, читабельность низкая, но все-же надеюсь кто поможет
Tycoos вне форума Ответить с цитированием
Старый 05.01.2009, 23:11   #5
Tycoos
 
Регистрация: 05.01.2009
Сообщений: 3
По умолчанию

Код:
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<process.h>
#include<math.h>
#include<windows.h>
#include<string.h>


struct readinfo_return{float *mass; int M; int N;};

readinfo_return readinfo(void)
{
FILE *inputfile=fopen("input.txt","r");
if(inputfile==NULL) cerr<<"Input file not found\n";
fseek(inputfile,0,SEEK_END);
int max_str_len=ftell(inputfile);
rewind(inputfile);
char *string = new char[max_str_len];
fgets(string,max_str_len,inputfile); int m=atoi(strchr(string,'=')+1)+1;
fgets(string,max_str_len,inputfile); int n=atoi(strchr(string,'=')+1)+1;
float *mass=new float [m*n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
fgets(string,max_str_len,inputfile);
if(i<m-1) mass[i*n+j]=atoi(strchr(string,'=')+1);
else mass[i*n+j]=-atoi(strchr(string,'=')+1);
}
mass[m*n-1]=0;
fclose(inputfile);
readinfo_return RTN; RTN.mass=mass; RTN.M=m; RTN.N=n;
return(RTN);
}

void display(float *mass, int m, int n){for(int i=0;i<m;i++){for(int j=0;j<n;j++)cout<<mass[i*n+j]<<"\t";cout<<"\n\n\n";}}

int check(float *mass, int m, int n)
{
int count=0, control=0;
for(int i=0 ; i<m-1 ; i++)
	if(mass[i*n+n-1]<0)
	{
		count=0;int j=0;
		while((mass[i*n+j]>=0)&&(j<n-1))	{ count++ ; j++ ; }
		if(count==(n-1)) return 0; else control++;
	}
if(control!=0) return 2; else return 1;
}


int define(float *mass, int m, int n, int control, int *R)
{
	int i, j, k, error=0;
	float temp;
	switch(control)
		{
		case 1:
			for(j=0;j<n-1;j++) if(mass[(m-1)*n+j]<0) {error=1; break;}
			if(error==0) return 1;
			break;
		case 2:
			for(i=0;i<m-1;i++) if(mass[i*n+n-1]<0) break;
			for(j=0;j<n-1;j++) if(mass[i*n+j]<0) break;
			break;
		}

	error=0;
	for(i=0;i<m-1;i++) if(mass[i*n+j]!=0) {error=1;break;}
	if(error==0) return 2;

	temp=mass[i*n+n-1]/mass[i*n+j];
	k=i;
	for(i++;i<m-1;i++)
	if(mass[i*n+j]!=0)
		if(fabs(mass[i*n+n-1]/mass[i*n+j])<fabs(temp))
			{
				k=i;
				temp=mass[i*n+n-1]/mass[i*n+j];
			}

R[0]=k;
R[1]=j;
return 0;
}


int simplex(float *mass, int m, int n, float *pos)
{
	int i, j, p, q, k, count;
	float *massB=new float [m*n];
	int R[2];
	int state;
	do
	{
		count=0;
		state=define(mass,m,n,check(mass,m,n),&R[0]);
		//cout<<"\nFunction Check returns "<<check(mass,m,n)<<endl;getch();
		p=R[0];
		q=R[1];
		//cout<<"p="<<p<<"  q="<<q<<endl;getch();
		if(state!=0) return state;
		for(i=0;i<m;i++) for(j=0;j<n;j++)
			if(i==p&&j==q) massB[i*n+j]=1/mass[p*n+q];
			else  if(i==p) massB[i*n+j]=mass[i*n+j]/mass[p*n+q];
			else  if(j==q) massB[i*n+j]=-mass[i*n+j]/mass[p*n+q];
			else massB[i*n+j]=(mass[i*n+j]*mass[p*n+q]-mass[p*n+j]*mass[i*n+q])/mass[p*n+q];
		for(k=0;k<m*n;k++) mass[k]=massB[k];
		pos[(p+1)*(n+1)]=pos[q+1];
		pos[q+1]=0;
		for(k=1;k<n;k++) if(mass[(m-1)*n+k]<0) count++;
	} while(count!=0);
return 0;
}


float* prepare(float* mass, float* assumed, int m, int n,int control, int pos)
{int i,j;
float* massP=new float[(m+1)*n];
for(i=0;i<m+1;i++) for(j=0;j<n;j++)
if(i<m) massP[i*n+j]=assumed[i*n+j]; else massP[i*n+j]=0;
if(control==0) massP[m*n+pos-1]=1;
else massP[m*n+pos-1]=-1;
if(control==0) massP[(m+1)*n-1]=floor(mass[(pos-1)*n+n-1]);
else massP[(m+1)*n-1]=-ceil(mass[(pos-1)*n+n-1]);
float temp;
for(j=0;j<n;j++)
{
temp=massP[(m-0)*n+j];
massP[(m-0)*n+j]=massP[(m-1)*n+j];
massP[(m-1)*n+j]=temp;
}
massP[(m+1)*n-1]=0;
return(massP);
}
Tycoos вне форума Ответить с цитированием
Старый 05.01.2009, 23:12   #6
Tycoos
 
Регистрация: 05.01.2009
Сообщений: 3
По умолчанию

Код:
int branch(float *mass, float *assumed, int m, int n, float *pos)
{
	float *P1=new float [(m+1)*n];
	float *P2=new float [(m+1)*n];
	float *sP1=new float [(m+1)*n];
	float *sP2=new float [(m+1)*n];
	int ss1,ss2,k,success=1;
	float Z1,Z2;
	float *pos1=new float [(m+1)*(n+1)];
	float *pos2=new float [(m+1)*(n+1)];
	cout<<"\nFunction Branch has started successfully\n";
	getch();	
	
	for(int i=0;i<m;i++)
	if((mass[i*n+n-1]-floor(mass[i*n+n-1]))!=0 && pos[(i+1)*(n+1)]!=0) break;
	P1=prepare(mass,assumed,m,n,0,pos[(i+1)*(n+1)]);
	P2=prepare(mass,assumed,m,n,1,pos[(i+1)*(n+1)]);

	//display(P1,m+1,n);getch();
	
	for(k=0;k<(m+1)*n;k++) sP1[k]=P1[k];
	for(k=0;k<(m+1)*n;k++) sP2[k]=P2[k];
	
	for(k=0;k<(m+2)*(n+1);k++) pos1[k]=0;
	for(k=1;k<n;k++) pos1[k]=k;
	ss1=simplex(sP1,m+1,n,pos1);
	cout<<"\nSiplex state is "<<ss1<<endl;
	Z1=sP1[(m+1)*n-1];
	//cout<<"\nPerformance is "<<Z1<<endl;

	for(k=0;k<(m+2)*(n+1);k++) pos2[k]=0;
	for(k=1;k<n;k++) pos2[k]=k;
	ss2=simplex(sP2,m+1,n,pos2);
	//cout<<"\nSiplex state is "<<ss2<<endl;
	Z2=sP2[(m+1)*n-1];
	//cout<<"\nPerformance is "<<Z2<<endl;

	if(ss1==0 && ss2==0)
		if(Z1>Z2)
		{
			for(k=0;k<(m+1)*n;k++) mass[k]=sP1[k];
			for(k=0;k<(m+1)*n;k++) assumed[k]=P1[k];
			for(k=0;k<(m+2)*(n+1);k++) pos[k]=pos1[k];
		}
		else
		{
			for(k=0;k<(m+1)*n;k++) mass[k]=sP2[k];
			for(k=0;k<(m+1)*n;k++) assumed[k]=P2[k];
			for(k=0;k<(m+2)*(n+1);k++) pos[k]=pos2[k];
		}
		else if(ss1==0)
		{
			for(k=0;k<(m+1)*n;k++) mass[k]=sP1[k];
			for(k=0;k<(m+1)*n;k++) assumed[k]=P1[k];
			for(k=0;k<(m+2)*(n+1);k++) pos[k]=pos1[k];
		}
		else if(ss2==0)
		{
			for(k=0;k<(m+1)*n;k++) mass[k]=sP2[k];
			for(k=0;k<(m+1)*n;k++) assumed[k]=P2[k];
			for(k=0;k<(m+2)*(n+1);k++) pos[k]=pos2[k];
		}

	for(i=0;i<m+1;i++)
		if((mass[i*n+n-1]-floor(mass[i*n+n-1]))!=0 && pos[(i+1)*(n+1)]!=0) break;
		if(i==m+1)
			{
				success=0;
				cout<<"\nOptimal solution was found and will be written to output.txt\n";
				//display(mass,m+1,n);
				exit(0);
			}
	

	//display(pos,m+2,n+1);

	return success;
}






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

int simplex_state;

readinfo_return Q=readinfo();

float *TEMP=new float [Q.M*Q.N];
for(int k=0;k<Q.M*Q.N;k++) TEMP[k]=Q.mass[k];

if(check(TEMP,Q.M,Q.N)==0)
{
	cerr<<"\nTask is incorrect\nPress any key to exit";
	exit(1);
}

float *pos=new float [(Q.M+1)*(Q.N+1)];
for(k=0;k<(Q.M+1)*(Q.N+1);k++) pos[k]=0;
for(k=1;k<Q.N;k++) pos[k]=k;

simplex_state=simplex(TEMP,Q.M,Q.N,pos);
cout<<"\nSiplex state is "<<simplex_state<<endl;

if(simplex_state==0)
{
	for(int i=0;i<Q.M;i++)
		if((TEMP[i*Q.N+Q.N-1]-floor(TEMP[i*Q.N+Q.N-1]))!=0 && pos[(i+1)*(Q.N+1)]!=0) break;
		if(i==Q.M)
			{
				cout<<"\nOptimal solution was found and will be written to output.txt\n";
				//display(TEMP,Q.M,Q.N);
				exit(0);
			}
}


int branch_state;
cout<<"\nFunction Branch has called successfully\n"; getch();
branch_state=branch(TEMP,Q.mass,Q.M,Q.N,pos);
cout<<"\nBranch state is "<<branch_state<<endl;

display(TEMP,Q.M+1,Q.N);
}
Tycoos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе на рекурсию vitekbest Помощь студентам 13 14.06.2008 20:54
Ошибка в программе. Массивы RECREATOR Общие вопросы Delphi 5 21.12.2007 12:13
Помогите, ошибка в программе. делфи Absent Помощь студентам 5 18.12.2007 17:36
Ошибка в программе RoadTrain Общие вопросы Delphi 5 24.10.2007 22:16