Вход

Решение задач на C\C++

Научись общаться с машиной и научи других. Все вопросы связанные с программированием и разработкой программ.

Модератор: AxeL

СообщениеНовичок bagel bagel 0
Оставил 24 сообщений с 03 июл 2009
ФР: 697
19 декабря 2009 в 21:17

дима347632174828394,
[code:1]
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
// размер массива
const int size = 200;

int a [size] = {0}; // обнулить массив
srand(time(NULL)); // генератор случ чисел

for (int i = 0; i < size; i++) // заполняем массив
a[i] = rand() % 100;

int max = 0; // максимальная сумма

for (int i = 0; i < 10; i++)
max += a[i]; // изначально она равна сумме первых 10 элементов массива

int s10 = max; // сумма 10 элементов
int b = 0; // начало интервала

for (int i = 10; i < size; i++) // начинаем с 11 элемента и до конца массива
{
s10 = s10 - a[i - 10] + a[i]; // считаем сумму текущих 10 элементов : вычитается самый первый, прибавляется следующий
if (s10 > max) { max = s10; b = i - 10 + 1; } // проверка: если сумма текущих 10 больше чем макс, то макс обновляется
}

cout << b << endl; // вывод начала интервала

system("PAUSE");
return EXIT_SUCCESS;
}
[/code:1]

в ответе получишь число B - это начало итервала из 10 элементов, сумма которых максимальна в массиве
типа того
0
В авторитете

СообщениеВ авторитете DisKom DisKom 0
Оставил 2642 сообщений с 30 апр 2007
ФР: 12597
19 декабря 2009 в 23:44

[code:1]#include <stdio.h>
#include <math.h>

#define N 3
#define M 4

int i,j,n,m;
double k,fc;
double s[N][M], **d;

void staticArray(double a[N][M], int u, int w, int A){
double b[M];

printf("\nStatic array:\n");

for(i=0; i<u; i++)
{
for(j=0; j<w; j++)
printf("%10.3lg ", a[i][j]);
printf("\n");
}

printf("\n");

for(j=0; j<w; j++)
for(i=0, b[j]=0; i<u; i++)
if(a[i][j]>A) b[j]++;

for(j=0; j<w; j++)
printf("%10.3lg ", b[j]);
}


void dynamicArray(double **a, int u, int w, int A){
double *b;

b = new double[w];

printf("\nDynamic array:\n");

for(i=0; i<u; i++)
{
for(j=0; j<w; j++)
printf("%10.3lg ", a[i][j]);
printf("\n");
}

printf("\n");

for(j=0; j<w; j++)
for(i=0, b[j]=0; i<u; i++)
if(a[i][j]>A) b[j]++;

for(j=0; j<w; j++)
printf("%10.3lg ", b[j]);

}

void main(){
while(1){
n = N;
m = M;

d = new double*[n];

printf("\nEnter the array %dx%d (END - <Ctrl+Z>): ", N,M);
for(i=0;i<n;i++)
{
d[i] = new double[m];
for(j=0;j<m;j++)
{
if(scanf("%lg", &s[i][j])==EOF) break;
d[i][j] = s[i][j];
}
}

printf("\nEnter the number for comparison (END - <Ctrl+Z>): ");
if(scanf("%lg", &fc)==EOF) break;

staticArray(s,N,M,fc);
printf("\n");
dynamicArray(d,N,M,fc);

}
}[/code:1]

Подскажите пожалуйста, каким образом сделать, чтобы функция возвращала массив. У меня массив итоговый выводится прямо в функциях staticArray и dynamicArray. А мне надо, чтобы они отрабатывали и возвращали массив, который я потом уже в основном теле программы мог использовать.
0

СообщениеНовичок bagel bagel 0
Оставил 24 сообщений с 03 июл 2009
ФР: 697
20 декабря 2009 в 00:17

в С это невозможно, массив это указатель на память
но ты можешь юзать вектор или создать структуру, содержащую массив. структуру вернуть можно
0
В авторитете

СообщениеВ авторитете DisKom DisKom 0
Оставил 2642 сообщений с 30 апр 2007
ФР: 12597
20 декабря 2009 в 14:12

bagel, как это не возможно?

раз препод требует, значит возможно
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
20 декабря 2009 в 14:25

в чем проблема возвращать указатель на массив?
0
В авторитете

СообщениеВ авторитете DisKom DisKom 0
Оставил 2642 сообщений с 30 апр 2007
ФР: 12597
20 декабря 2009 в 15:22

teran, это типа return b; или как?
0

Сообщение Гость 20 декабря 2009 в 17:14

сделай массив глобальным. если ты создаешь его внутри функи, как ты хочешь получить к нему доступ, когда функа завершится? это локальная переменная. сам знаешь. верунть его нельзя , вы с преподом недопоняли друг друга
0
В авторитете

СообщениеВ авторитете DisKom DisKom 0
Оставил 2642 сообщений с 30 апр 2007
ФР: 12597
20 декабря 2009 в 17:23

Гость писал(а):сделай массив глобальным. если ты создаешь его внутри функи, как ты хочешь получить к нему доступ, когда функа завершится? это локальная переменная. сам знаешь. верунть его нельзя , вы с преподом недопоняли друг друга


окай, сделаю глобальным.
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
20 декабря 2009 в 20:29

Гость писал(а):сделай массив глобальным. если ты создаешь его внутри функи, как ты хочешь получить к нему доступ, когда функа завершится? это локальная переменная. сам знаешь. верунть его нельзя , вы с преподом недопоняли друг друга

ну если переменная статическая то не вернуть. а если динамическая то еще как вернуть.

добавлено спустя 2 минуты:

teran, это типа return b; или как?

да как то так. только функця уже собственно не void будет.
[code:1]double* dynamicArray(double **a, int u, int w, int A){
double *b;
b = new double[w];
return b;
}[/code:1]
0
Старик

СообщениеСтарик glorden glorden 0
Оставил 1092 сообщений с 11 май 2007
ФР: -16063
20 декабря 2009 в 21:22

[code:1] //Прямой ход метода Гаусса
for ( k = 0; k < n; k++ )
{ //На какой позиции должен стоять главный элемент
glavelem( k, mas, n, otv ); //Установка главного элемента, матрица приводится к треугольному виду
if ( fabs( mas[k] [k] ) < 0.0001 )
{
printf( "Система не имеет единственного решения" );
return ( 0 );
}
for ( j = n; j >= k; j-- )
mas[k] [j] /= mas[k] [k];
for ( i = k + 1; i < n; i++ )
for ( j = n; j >= k; j-- )
mas[i] [j] -= mas[k] [j] * mas[i] [k];
}
[/code:1]
кто-нибудь может пояснить цикл по j и по i,j ?
0
В авторитете

СообщениеВ авторитете DisKom DisKom 0
Оставил 2642 сообщений с 30 апр 2007
ФР: 12597
20 декабря 2009 в 21:32

[code:1] for ( j = n; j >= k; j-- )
mas[k] [j] /= mas[k] [k];[/code:1]
если этот, то вроде можно так записать
[code:1] for ( j = n; j >= k; j-- )
mas[k] [j] = mas[k] [j] / mas[k] [k]; [/code:1]
Последний раз редактировалось DisKom Вс дек 20, 2009 21:43, всего редактировалось 1 раз.
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
20 декабря 2009 в 21:42

glorden, тебе что именно не понятно? реализация или вообще смысл алгоритма?
0
В авторитете

СообщениеВ авторитете DisKom DisKom 0
Оставил 2642 сообщений с 30 апр 2007
ФР: 12597
20 декабря 2009 в 21:45

teran, а для статического массива подобный трюк не пройдет? для него необходимо создавать отдельно глобальный массив?
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
20 декабря 2009 в 21:51

DisKom, ну если ты статический массив локально в функции объявляешь то при вызове функции под него память выделяется, а по окончании работы она освобождается. как и с любой другой переменной локальной.
мб конечно я и не прав. но должно быть так вроде
0
Старик

СообщениеСтарик glorden glorden 0
Оставил 1092 сообщений с 11 май 2007
ФР: -16063
20 декабря 2009 в 22:26

DisKom, это я уже понял, Теран пояснил =)
teran, реализация не понятна. Переменная "к" за что отвечает?
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
20 декабря 2009 в 23:24

процитирую википедию
http://ru.wikipedia.org/wiki/Метод_Гаусса писал(а):Алгоритм решения СЛАУ методом Гаусса подразделяется на два этапа.

* На первом этапе осуществляется так называемый прямой ход, когда путём элементарных преобразований над строками систему приводят к ступенчатой или треугольной форме, либо устанавливают, что система несовместна.
А именно, среди элементов первого столбца матрицы выбирают ненулевой, перемещают его на крайнее верхнее положение перестановкой строк и вычитают получавшуюся после перестановки первую строку из остальных строк, домножив её на величину, равную отношению первого элемента каждой из этих строк к первому элементу первой строки, обнуляя тем самым столбец под ним. После того, как указанные преобразования были совершены, первую строку и первый столбец мысленно вычёркивают и продолжают пока не останется матрица нулевого размера. Если на какой-то из итераций среди элементов первого столбца не нашёлся ненулевой, то переходят к следующему столбцу и проделывают аналогичную операцию.

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

добавлено спустя 1 минуту:

Переменная "к" за что отвечает?

цикл по строками матрицы вероятно.
0
Старик

СообщениеСтарик glorden glorden 0
Оставил 1092 сообщений с 11 май 2007
ФР: -16063
20 декабря 2009 в 23:34

teran, xD я пока писал следующий вопрос, уже сам на него ответил =) Спасибо. Действительно надо было внимательней читать вики.
0

Сообщение виталий1986 26 декабря 2009 в 17:01

помогите, пожалуйста с решение м такой вот задачи.
заданы два массива А(5) и В(4). первымна печат вывести массив, содержащий наименьшее значение. Напечатать его порядковый номер и это значение.
я вот написал и не могу найти в чем ошибка.
#include <stdio.h>
#include <conio.h>

void main()
{
int a[5],b[4], min, imin,i, n;

printf("\nVvodi elementi massiva A:");
for (i=0; i<5; i++)
{
printf("\n a[%d]=", i);
scanf("%d", a+i);
}

printf("\nMASSIV:\n");

for (i=0; i<5; i++)
printf("%5d\n", *(a+i));
//Найдем минимальный элемент
//массива A и его позицию.
int mina=*a, imina=0;

for (i=1; i<5; i++)
if (*(a+i)<mina)
{
mina=*(a+i);
imina=i; }

printf("\nVvodi elementi massiva B:");
for (i=0; i<4; i++)
{
printf("\n b[%d]=", i);
scanf("%d", b+i);
}

printf("\nMASSIV:\n");

for (i=0; i<4; i++)
printf("%5d\n", *(b+i));
//Найдем минимальный элемент
//массива B и его позицию.
int minb=*a, iminb=0;

for (i=1; i<4; i++)
if (*(b+i)<minb)
{
minb=*(b+i);
iminb=i; }

imin=0;
if (mina<minb)
min=mina;

else
min=minb;

if (min=mina)
{
printf("\nMASSIV A, soderzhaschiy naimen'shee znachenie :\n");
for (i=0; i<5; i++)
printf("%5d\n", *(a+i));
}
else
{
printf("\nMASSIV B, soderzhaschiy naimen'shee znachenie:\n");
for (i=0; i<4; i++)

printf("%5d\n", *(b+i));
}

printf("minimal'noe znachenie iz dvuh massivov=%d\n", min);

if(min=mina)
imin=imina;
if(min=minb)
imin=iminb;

printf("pozicija %d\n", imin);
getch();
}
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
26 декабря 2009 в 17:06

виталий1986, а a[i] b[i] не эстетичней выглядит?
оформляйте исходный код с помощью тега [code]
0

Сообщение виталик1986 28 декабря 2009 в 12:43

помогите плиз с решением такой вот задачи по си.
заданы два массива А(5) и В(4) Первым на печать вывести массив, содержащий наименьшее значение. напечатать также это значение и его порядковый номер.
Вот что я написал, ошибок не выдает, но и не считает.
[code:1]
#include <stdio.h>
#include <conio.h>

void main()
{
int a[5],b[4], min, imin,i, n;

printf("\nVvodi elementi massiva A:");
for (i=0; i<5; i++)
{
printf("\n a[%d]=", i);
scanf("%d", a+i);
}

printf("\nMASSIV:\n");

for (i=0; i<5; i++)
printf("%5d\n", *(a+i));
//Найдем минимальный элемент
//массива A и его позицию.
int mina=*a, imina=0;

for (i=1; i<5; i++)
if (*(a+i)<mina)
{
mina=*(a+i);
imina=i; }

printf("\nVvodi elementi massiva B:");
for (i=0; i<4; i++)
{
printf("\n b[%d]=", i);
scanf("%d", b+i);
}

printf("\nMASSIV:\n");

for (i=0; i<4; i++)
printf("%5d\n", *(b+i));
//Найдем минимальный элемент
//массива B и его позицию.
int minb=*a, iminb=0;

for (i=1; i<4; i++)
if (*(b+i)<minb)
{
minb=*(b+i);
iminb=i; }

imin=0;
if (mina<minb)
min=mina;

else
min=minb;

if (min=mina)
{
printf("\nMASSIV A, soderzhaschiy naimen'shee znachenie :\n");
for (i=0; i<5; i++)
printf("%5d\n", *(a+i));
}
else
{
printf("\nMASSIV B, soderzhaschiy naimen'shee znachenie:\n");
for (i=0; i<4; i++)

printf("%5d\n", *(b+i));
}

printf("minimal'noe znachenie iz dvuh massivov=%d\n", min);

if(min=mina)
imin=imina;
if(min=minb)
imin=iminb;

printf("pozicija %d\n", imin);
getch();
}

[/code:1]
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
28 декабря 2009 в 20:49

виталик1986,
[code:1]int minb=*a[/code:1] наверное все таки стоит заменить на [code:1]int minb=*b[/code:1]
а во всех условных операторах
[code:1]if (min=mina) ...
if(min=mina) ...
if(min=minb) ...
[/code:1] использовать оператор сравнения == вместо оператора присваивания =
т.е
[code:1]if (min==mina) ...
if(min==mina) ...
if(min==minb) ...
[/code:1]

добавлено спустя 37 минут:

[code:1]#include <stdio.h>
#include <conio.h>

void input(int *x,char name,int size){
printf("Input array %c elements: \n",name);
for(int i=0;i<size;i++){
printf("%c[%d] = ",name,i);
scanf("%d",&x[i]);
}
return;
}
void output(int *x,char name,int size){
printf("Array %c elements : \n",name);
for(int i=0;i<size;i++){
printf("%c[%d] = %d\n",name,i,x[i]);
}
}
int getMin(int *x, int &index, int size){
int minValue = x[0];
index = 0;
for(int i=1;i<size;i++){
if(x[i] < minValue){
minValue = x[i];
index = i;
}
}
return minValue;
}

void main(){
int a[5]={0},b[4]={0};
int min=0, imin=0, imina, iminb;

clrscr()

input(a,'A',5);
output(a,'A',5);
input(b,'B',4);
output(b,'B',4);

int mina = getMin(a,imina,5);
int minb = getMin(b,iminb,4);

printf("array with minimal value: \n");
if(mina < minb){
output(a,'A',5);
min = mina;
imin = imina;
}
else{
output(b,'B',4);
min = minb;
imin = iminb;
}

printf("minimal'noe znachenie iz dvuh massivov=%d\n", min);
printf("pozicija %d\n", imin);

getch();
}[/code:1]
0

Сообщение виталик1986 29 декабря 2009 в 16:57

teran,
Спасибо. Все пошло как нужно. Буду разбираться дальше.
0

Сообщение виталик1986 29 декабря 2009 в 19:38

Может кто поможет еще с такой задачей? нужно предусмортеть захват и освобождение динамической памяти(сalloc и malloc) решение оформить в виде отдельной функции, возвращающей результат. на печать в виде таблиц вывести исходный двухмерный массив.
Дан целочисленный прямоугольный массив. определить сумму элементов в тех строках, которае содержат хотя бы один отрицательный элемент. Я вот че-то написал, но походу не правильно вызываю функцию из printf и не получается с захватом памяти.
[code:1]
#include <conio.h>
#include <stdio.h>
#include <math.h>

double calculate(double, int);
void main()
{
int a[100], i, n;
double arr;
printf("\nVvedi n:");
scanf("%d", &n);

printf("\nVvodi elementi:");
for (i=0; i<n; i++) {

printf("\n a[%d]=", i);
scanf("%d", a+i); }

printf("\nMASSIV:\n");

for (i=0; i<n; i++)
printf("%5d\n", *(a+i));

printf("summa elementov massiva, raspolozhennyh mezhdu pervym i vtorym");
printf("%d\n", calculate(*arr,n));
getch();
}


double calculate(double *arr, int n)
{
double summ = 0.;
int f = -1, s = -1, i;

/*найдем первый и второй отрицательные элементы*/
for(i=0; i<n; i++)
{
if(arr[i] < 0 && f == -1)
f = i;
else
if(arr[i] < 0 && f != -1 && s == -1)
{
s = i;
break;
}
}

/*найдем сумму элементов*/
for(i = f+1; i < s; i++)
summ += arr[i];

return summ;
}[/code:1][/code]
0

Сообщение залупа 30 декабря 2009 в 01:49

почему malloc и calloc, а не new и delete ?
0
Продвинутый

СообщениеПродвинутый Elverion Elverion 0
Оставил 644 сообщений с 10 ноя 2008
ФР: -52215
30 декабря 2009 в 03:01

Потому что это C, а не C++

А где в программе двухмерный массив?
Выделяется так:

[code:1]
int** A;
A = malloc(n * sizeof(int*));
for (i = 0; i < n; i++)
A[i] = malloc(n * sizeof(int));
[/code:1]

Чистится так:
[code:1]
for (i = 0; i < n; i++)
free(A[i]);

free(A);
[/code:1]

А все остальное вообще неправильно, если я условие задачи правильно понял конечно.
0

Сообщение виталик1986 2 января 2010 в 12:05

мужики, помогите с контрольной. Я написал код для контрольной. задаются регистрационный номер книги, автор, год издания, название, количество страниц. Но забыл про издательство. сейчас доавил издательство, но теперь прога не работает. Может че забыл.
[code:1]
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <fstream>
using namespace std;
// TRUE åñëè Author1 ïî àëôàâèòó èäåò ðàíüøå Author2
bool CmpAuthor(char *Author1, char *Author2)
{ int i;
i=0;
while (Author1[i]!=0x0 || Author2[i]!=0x0)
{
if (Author1[i]<Author2[i]) return TRUE;
if (Author1[i]>Author2[i]) return FALSE;
++i;
};
return FALSE;
};
// Âõîä String - àäðåñ ñòðîêè
// Max - ìàêñèìàëüíîå êîëè÷åñòâî ââîäèìûõ ñèìâîëîâ
void RdString(char *String, short Max)
{
int i=0;
char ch=0x0;
while (ch!=0x0A && ch!=0xD && i<=Max){
ch=getch();
putch(ch);
if (ch!=0xA && ch!=0xD){
String[i]=ch;
++i;
}; // if
}; // while
String[i]=0x0;
return;
}

struct Book{
unsigned int RegNumber; // Ðåãèñòðàöèîííûé íîìåð êíèãè
char Author[40]; // Àâòîð
char Title[80]; // Íàçâàíèå
unsigned int PrintYear; // Ãîä èçäàíèÿ
char Publishing[40]; // Èçäàòåëüñòâî
unsigned int Pages; // Ê-âî ñòðàíèö
};
class BookList
{
public:
Book ListElement;
BookList* Next; // Ñëåäóþùàÿ êíèãà â ñïèñêå
BookList* Prev;
BookList(BookList* Prev=NULL, BookList* Next=NULL)
{
this->Next=Next;
this->Prev=Prev;
}
~BookList()
{
if (this->Next!=NULL && this->Prev!=NULL)
{
this->Next->Prev=this->Prev;
this->Prev->Next=this->Next;
} else
if (this->Next!=NULL && this->Prev==NULL)
this->Next->Prev=NULL;
else
if (this->Prev!=NULL && this->Next==NULL)
this->Prev->Next=NULL;
}
private:
int i;
};
// ===========================================================================================================================================
void main()
{
FILE *F;
BookList * LastItem; // Ïîñëåäÿÿ êíèãà â ñïèñêå
BookList * CurrentBook; // Òåêóùàÿ êíèãà (òà, íà êîòîðóþ óñòàíîâëåí óêàçàòåëü)
BookList * Marked;
BookList * NewBook; // Õåíäë äëÿ ðàáîòû ñ âíîâü ñîçäàííîé êíèãîé
Book Buffer;
char ch=0x0;
int i,t;
LastItem=NULL;
while (ch!='x'){
system("cls");
CurrentBook=LastItem;
while(CurrentBook!=NULL){
if(CurrentBook==Marked) printf("\n->"); else printf("\n ");
printf("%d)%s '%s' year:%d '%s' pages:%d ",CurrentBook->ListElement.RegNumber,CurrentBook->ListElement.Author,
CurrentBook->ListElement.Title,CurrentBook->ListElement.Publishing,CurrentBook->ListElement.PrintYear,CurrentBook->ListElement.Pages);
CurrentBook=CurrentBook->Prev;
};
printf("\n(A)dd,(D)elete,(N)ext,(P)revious,(S)Sort,(R)ead,(W)rite,(E)dit,e(X)it");
printf("\nYour choice(A,D,S,L,R,E,W,X,N,P):");
ch=getch();
putch(ch);
switch (ch)
{
case 'a': NewBook = new BookList(NULL,NULL);
if (LastItem!=NULL)
{
LastItem->Next=NewBook;
NewBook->Prev=LastItem;
NewBook->Next=NULL;
} else
{
NewBook->Next=NULL;
NewBook->Prev=NULL;
};
printf("\nEnter registration number:");
scanf("%d",&NewBook->ListElement.RegNumber);
printf("\nEnter name of author:");
RdString(NewBook->ListElement.Author,40);
printf("\nEnter title of book:");
RdString(NewBook->ListElement.Title,80);
printf("\nEnter year of printing:");
scanf("%d",&NewBook->ListElement.PrintYear);
printf("\nEnter Publishing:");
RdString(NewBook->ListElement.Publishing,40);
printf("\nEnter pages #");
scanf("%d",&NewBook->ListElement.Pages);
LastItem=NewBook;
Marked=LastItem;
break;
case 'd': if (Marked==LastItem) if (Marked->Next!=NULL) LastItem=Marked->Next;
else if (Marked->Prev!=NULL) LastItem=Marked->Prev;
else LastItem=NULL;
delete Marked;
Marked=LastItem;
break;
case 'w': F=fopen("books.dat","w+b");
CurrentBook=LastItem;
while (CurrentBook!=NULL){
fwrite(&CurrentBook->ListElement,sizeof(Book),1,F);
CurrentBook=CurrentBook->Prev;
};
fclose(F);
break;
case 'r': F=fopen("books.dat","rb");
CurrentBook=LastItem;
while (CurrentBook!=NULL){
LastItem=CurrentBook;
CurrentBook=CurrentBook->Prev;
delete LastItem;
};
LastItem=NULL;
CurrentBook=NULL;
do{
NewBook = new BookList(NULL,NULL);
if (LastItem!=NULL)
{
LastItem->Next=NewBook;
NewBook->Prev=LastItem;
NewBook->Next=NULL;
} else
{
NewBook->Next=NULL;
NewBook->Prev=NULL;
};
LastItem=NewBook;
Marked=LastItem;
}while(fread(&NewBook->ListElement,1,sizeof(Book),F )==sizeof(Book));
LastItem=LastItem->Prev;
delete Marked;
Marked=LastItem;
break;
case 'e':
printf("\nEnter registration number:");
scanf("%d",&Marked->ListElement.RegNumber);
printf("\nEnter name of author:");
RdString(Marked->ListElement.Author,40);
printf("\nEnter title of book:");
RdString(Marked->ListElement.Title,80);
printf("\nEnter year of printing:");
scanf("%d",&Marked->ListElement.PrintYear);
printf("\nEnter Publishing:");
RdString(NewBook->ListElement.Publishing,40);
printf("\nEnter pages #");
scanf("%d",&Marked->ListElement.Pages);
break;
case 's':
i=0;
CurrentBook=LastItem;
while (CurrentBook!=NULL){CurrentBook=CurrentBook->Prev; ++i;};
for (t=0;t!=i;t++){
CurrentBook=LastItem;
while (CurrentBook!=NULL){
if (CurrentBook->Prev!=NULL &&
!CmpAuthor(CurrentBook->ListElement.Author,CurrentBook->Prev->ListElement.Author))
{
Buffer=CurrentBook->ListElement;
CurrentBook->ListElement=CurrentBook->Prev->ListElement;
CurrentBook->Prev->ListElement=Buffer;
};
CurrentBook=CurrentBook->Prev;
};
};
printf("\nEnter printing year:");
t=0x0;
scanf("%d",&t);
// âûâîä òîëüêî òåõ êíèã, ãîä èçäàíèÿ êîòîðûõ áîëüøå ëèáî ðàâåí çàäàííîìó
CurrentBook=LastItem;
while(CurrentBook!=NULL){
if (CurrentBook->ListElement.PrintYear>=t)
printf("\n%d)%s '%s' year:%d pages:%d ",CurrentBook->ListElement.RegNumber,CurrentBook->ListElement.Author,
CurrentBook->ListElement.Title,CurrentBook->ListElement.Publishing,CurrentBook->ListElement.PrintYear,CurrentBook->ListElement.Pages);
CurrentBook=CurrentBook->Prev;};
printf("\nPress ENTER");
getch();
break;
case 'p': if (Marked->Prev!=NULL) Marked=Marked->Prev;
break;
case 'n': if (Marked->Next!=NULL) Marked=Marked->Next;
break;
case 'x': printf("\nExiting"); break;
default: printf(" Unknown command. Press any key."); getch(); break;
};
}; // while;
return;
}[/code:1]
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
2 января 2010 в 13:03

что то у меня сомнение какое возникает что это вы писали ну да ладно.
где вобще учат писать код типа
[code:1]while (Author1[i]!=0x0 || Author2[i]!=0x0)[/code:1]
или условные операторы в одну строку записывать
[code:1]if(CurrentBook==Marked) printf("\n->"); else printf("\n "); [/code:1]

по поводу ошибки внимательней при выводе
[code:1]printf("%d)%s '%s' year:%d '%s' pages:%d ",
CurrentBook->ListElement.RegNumber,
CurrentBook->ListElement.Author,
CurrentBook->ListElement.Title,
CurrentBook->ListElement.Publishing,
CurrentBook->ListElement.PrintYear,
CurrentBook->ListElement.Pages
);
[/code:1]


вы conio.h зачем подключали? [code:1]system("cls"); [/code:1]
0

Сообщение виталик 1986 5 января 2010 в 11:27

Циклический алгоритм: Одномерные массивы

Написать функцию, решающую указанную ниже задачу. Массив создается в динамической области памяти стандартной функцией calloc(). При обращении к элементам массива воспользоваться взаимосвязью массивов с указателями (косвенная адресация)
В одномерном массиве, состоящем из n вводимых с клавиатуры целых элементов, вычислить: сумму элементов массива, расположенных между первым и вторым отрицательными элементами.
[code:1]
#include <conio.h>
#include <stdio.h>
#include <math.h>

double calculate(double, int);
void main()
{
int a[100], i, n;
double arr;
printf("\nVvedi n:");
scanf("%d", &n);

printf("\nVvodi elementi:");
for (i=0; i<n; i++) {

printf("\n a[%d]=", i);
scanf("%d", a+i); }

printf("\nMASSIV:\n");

for (i=0; i<n; i++)
printf("%5d\n", *(a+i));

printf("summa elementov massiva, raspolozhennyh mezhdu pervym i vtorym");
printf("%d\n", calculate(*arr,n));
getch();
}


double calculate(double *arr, int n)
{
double summ = 0.;
int f = -1, s = -1, i;

/*найдем первый и второй отрицательные элементы*/
for(i=0; i<n; i++)
{
if(arr[i] < 0 && f == -1)
f = i;
else
if(arr[i] < 0 && f != -1 && s == -1)
{
s = i;
break;
}
}

/*найдем сумму элементов*/
for(i = f+1; i < s; i++)
summ += arr[i];

return summ;
}
[/code:1]
0

Сообщение виталик 1986 5 января 2010 в 11:30

проблема в том, что не получается у меня вызвать функцию из printf("%d\n", calculate(*arr,n));
пишет illegal indirection
0

СообщениеНовичок bagel bagel 0
Оставил 24 сообщений с 03 июл 2009
ФР: 697
5 января 2010 в 11:46

звездочку убери перед arr
0

Сообщение ыыыы 5 января 2010 в 11:50

[code:1]double calculate(double, int);[/code:1]
[code:1]printf("%d\n", calculate(*arr,n)); [/code:1]
calculate возвращает вещественный тип, а в printf спецификатор целого :)
0

Сообщение виталик1986 5 января 2010 в 13:07

я уже вс пробовал. и звездочку убрал. когда убираю звезду пишет ошибку: error LNK2001: unresolved external symbol "double __cdecl calculate(double,int)" (?calculate@@YANNH@Z)
0

Сообщение виталик1986 5 января 2010 в 13:10

когда заменяю printf("%d\n", calculate(*arr,n)); на printf("%f\n", calculate(*arr,n)); пишет illegal inderection
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
5 января 2010 в 14:14

[code:1]double calculate(double, int)
double calculate(double *arr, int n) [/code:1]
мб конечно я и не прав но в объявлении функции первом должно быть double* или нет?

а звездочку все таки убери и f вместо d поставь (:

добавлено спустя 5 минут:

[code:1]double arr; [/code:1]
судя по коду функции calculate это у тебя должен быть массив все таки.

добавлено спустя 3 минуты:

хотя вообще судя по всему определение double arr; из main надо убрать ибо делать ему там нечего вообще.
а вызов вывода суммы надо заменить на
[code:1]printf("%f\n", calculate(a,n));[/code:1]
ибо считаешь сумму ты массива А; т.е передаешь не то что надо. вообще не понятно что можно сказать.
0

Сообщение Гость 5 января 2010 в 16:08

для double не %f а %lf
поправьте если ошибаюсь
0

Сообщениеидиотъ daggert daggert 8
Оставил 11162 сообщений с 22 окт 2005
Блог: Просмотр блога (1)
ФР: 125569
WWW
9 января 2010 в 22:21

Шалом программистам сяшникам!

Интересует вопрос: Ктонибудь делал клиента для PHP сервера?
Вкратце: есть поле на форме, которое при нажатии кнопки должно заполнится информацией с БД через PHP посредника (который играет роль авторизатора)...
0

Сообщение виталик 986 10 января 2010 в 15:10

Перевести числа Х5=С37F000 и X6=42C68000 из формата FPU32 (стандарт IEEE 754) в десятичную систему счисления. я перевел, но там оказывается должна быть скрытая единица. Что за она не смог нигде найти информацию.
0

Сообщение Очередной гость) 10 января 2010 в 16:18

Привет всем!) Помогите пожалуйста разобраться, есть программка обход графа в ширину:
#include <iostream.h>
#include <conio.h>
#include <fstream.h>
int i,j,k,p,cup;
int Start,N,M;
main()
{
int *Label;
int *FIFO;
int **Graf;
ifstream input("input.txt");
input>>N>>M>>Start;
Label=new int [N];
FIFO=new int [N];
Graf=new int *[N];
for (i=0;i<N;i++)
Graf[i]=new int[N];
for (k=0;k<M;k++)
{
input>>i>>j;
Graf[i][j]=1;
}
for(i=0;i<M;i++)
{
FIFO[i]=0;
Label[i]=32767;
}
p=0;
k=1;
FIFO[p]=Start;
Label[Start]=0;

while (p!=k)
{
cup=FIFO[p];
p++;
for (i=0;i<N;i++)
if (Graf [cup][i]==1 && Label[i]>Label[cup]+1)
{
FIFO[k]=i;
k++;
Label[i]=Label[cup]+1;
}
}
for (i=0;i<N;i++)
cout<<Label[i]<<" ";
getch();
return 0;
}

В текстовом файле указываю:
5 // кол-во вершин
0 0 0 1 1 0 // матрица смежности
0 0 1 0 1 0
0 1 0 1 1 1
1 0 1 0 0 0
1 1 1 0 0 1
0 0 1 0 1 0

Сначала результат выводился:01000
Теперь не понятно с чего 0 4434496 0 0 0 можете пояснить что из этого правильно?(((((
0

Сообщение Очередной гость) 10 января 2010 в 16:21

Нашел еще один алгоритм обхода в ширину
Но не знаю как доделать чтобы работал
http://e-maxx.ru/algo/bfs

vector < vector<int> > g; // граф
int n; // число вершин
int start; // стартовая вершина

// считываем граф
...

// собственно поиск
vector<int> q (n); // очередь посещения вершин
int h=0, t=0; // указатели на начало и конец очереди
vector<bool> used (n); // покрашена вершина или нет
vector<int> parent (n); // предки для восстановления пути
q[t++] = start; used[start] = true; parent[start] = -1; // идём в стартовую вершину
while (h < t)
{
int cur = q[h++];
for (unsigned i=0; i < g[cur].size(); ++i)
{
int to = g[cur][i];
if (!used[to])
{
used[to] = true;
q[t++] = to;
}
}
}

// вывод какого-то найденного пути
int to = ...;
if (!used[to])
cout << "No path!";
else
{
vector<int> path;
for (int cur = to; cur != -1; cur = parent[cur])
path.push_back (cur);
cout << "Path: ";
for (unsigned i = path.size(); i-- > 0; )
cout << path[i] << \' \';
}
0
Скромный

СообщениеСкромный ViLPy ViLPy 0
Оставил 187 сообщений с 12 мар 2007
ФР: 9925
10 января 2010 в 17:47

daggert, это конечно лютый изврат в С++ получать доступ к БД через пхп интерфейс :)
Ну, а вообще
[code:1]#include <string>
#include <iostream>
#include <stdio.h>

// запускаем команду на исполнение и получаем все что она возвращает
std::string exec(char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}

int main()
{
std::cout << exec("php\\php.exe -r \"echo 'ok';\""); // просто команда
std::cout << exec("php\\php.exe 1.php"); // через пхп-файл
return 0;
}[/code:1]
Для MS VS может понадобится заменить popen и pclose на _popen и _pclose соответственно
0

Сообщение Гость 11 января 2010 в 13:53

Помогите, плиз с такой проблемой.В одномерном массиве, состоящем из n вводимых с клавиатуры целых элементов, вычислить: сумму элементов массива, расположенных между первым и вторым отрицательными элементами. Нужно заменить {
cout << "X[" << i+1 << "]=";
cin >> X[i];
}
на printf и scanf, т.к. должны бытьь использованы только функции Си а не си++. Я пишу printf("x[%d]="); scanf("%d", &X[i]); но тогда он выводит на экран только сам массив, но не считает суммы

[code:1]
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
#include <process.h>
char* Rus(const char* text);
char bufRus[255];
char* Rus(const char* text)
{
CharToOem(text,bufRus);
return bufRus;
}
void main(void)
{
int i, i1=-1, i2=-1;
double sum=0;
double *X = NULL;
int n;
printf(Rus("Введите размерность массива X:"));
scanf("%d", &n);
X= (double *) calloc(n, sizeof(double));
printf(Rus ("\Введите элемента массива X:\n"));
for (i=0; i<n; i++)
{
cout << "X[" << i+1 << "]=";
cin >> X[i];
}


printf(Rus("Массив X:"));
for (i=0; i<n; i++) cout << X[i] << " ";


for (i=0; i<n; i++)
{
if (X[i]<0)
{
if (i1==-1) i1=i;
else
{
i2=i;
break;
}
}
}

if ((i1!=-1) && (i2!=-1))
{
for (i=i1+1; i<i2; i++)
sum+=X[i];
printf(Rus("Сумма элементов между первым и вторым отрицательным элементами:%f"), sum);

}
else
printf(Rus("Нет двух отрицательных элементов"));


getch();
free(X);
}[/code:1]
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
11 января 2010 в 17:44

Гость, ваша замена не влияет на подсчет суммы. проверьте правильность ввода самого массива. в частности в scanf перед x[i] наверное не нужен амперсанд.
в общем отладчик никто не отменял.

зы: зачем вам столько заголовочных файлов?
0

Сообщение Очередной Гость 11 января 2010 в 20:08

Ну помогите с обходом в ширину((((((
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
11 января 2010 в 22:08

Очередной Гость, разбор данного алгоритма смотрете на предыдущих страницах был. там было.
0

Сообщение Очередной Гость 11 января 2010 в 23:07


Очередной Гость, разбор данного алгоритма смотрете на предыдущих страницах был. там было.


Я просмотрел, там в основном для задач о двудольности и Дейкстры.
А мне бы хотелось понять почему в моей программе такие косяки и как их исправить, может в коде что не так(((( прото переписывать заново нет времени, или другой код, уже завтра нужно сдать(((((
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
11 января 2010 в 23:58

Я просмотрел, там в основном для задач о двудольности и Дейкстры.

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

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

выводы делайте сами.
0

Сообщение Очередной Гость 12 января 2010 в 00:47

Я привел два алгоритма, и по большей части меня интересует этот!:

#include <iostream.h>
#include <conio.h>
#include <fstream.h>
int i,j,k,p,cup;
int Start,N,M;
main()
{
int *Label;
int *FIFO;
int **Graf;
ifstream input("input.txt");
input>>N>>M>>Start;
Label=new int [N];
FIFO=new int [N];
Graf=new int *[N];
for (i=0;i<N;i++)
Graf[i]=new int[N];
for (k=0;k<M;k++)
{
input>>i>>j;
Graf[i][j]=1;
}
for(i=0;i<M;i++)
{
FIFO[i]=0;
Label[i]=32767;
}
p=0;
k=1;
FIFO[p]=Start;
Label[Start]=0;

while (p!=k)
{
cup=FIFO[p];
p++;
for (i=0;i<N;i++)
if (Graf [cup][i]==1 && Label[i]>Label[cup]+1)
{
FIFO[k]=i;
k++;
Label[i]=Label[cup]+1;
}
}
for (i=0;i<N;i++)
cout<<Label[i]<<" ";
getch();
return 0;
}
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
12 января 2010 в 00:58

Сначала результат выводился:01000
Теперь не понятно с чего 0 4434496 0 0 0 можете пояснить что из этого правильно?(((((

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

во вторых
В текстовом файле указываю:
5 // кол-во вершин
0 0 0 1 1 0 // матрица смежности
0 0 1 0 1 0
0 1 0 1 1 1
1 0 1 0 0 0
1 1 1 0 0 1
0 0 1 0 1 0

вы откуда такой формат исходных данных взяли?
не смущает [code:1]input>>N>>M>>Start; [/code:1] для ввода количества вершин, lуг и стартовой вершины обода?
[code:1]for (k=0;k<M;k++)
{
input>>i>>j;
Graf[i][j]=1;
} [/code:1]
ничего что граф вводится с помощью указания дуг? где дуга указывается виде пары вершин ?
0

Сообщение Очередной Гость 12 января 2010 в 01:04

тогда исходный должен выглядеть так:?

1 3 // пара вершин
2 4
5 6
0
Легенда форума

СообщениеЛегенда форума teran teran 89
Оставил 6352 сообщений с 23 янв 2004
ФР: 127698
12 января 2010 в 01:04

попробуйте на вход задайте
[code:1]6 8 1
1 4
1 5
2 3
2 5
3 4
3 5
3 6
5 6
[/code:1]
для приведенной матрицы
0



Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3