Вопрос по С++

xxxFAFNIRxxx

Вечный студент :)
ну описан двохмерный массив, а в прототипе функции одномерный.

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

quant

yeah
как-то так
Код:
#include <stdio.h>
#define Ax 2
#define Ay 7
#define Bx 1
#define By 4

void vvod(int *z, int n, int m, char q) {
	for(int j, i = 0; i < n; ++i) {
		for(j = 0; j < m; ++j) {
			printf("%c[%d][%d] = ", q, i, j);
			scanf("%d", z + i * m + j);
		}
	}
	putchar('\n');
}

void print(int* z, int n, int m, char q) {
	printf("\n%c:\n", q);
	for(int j, i = 0; i < n; ++i) {
		for(j = 0; j < m; ++j) {
			printf ("%d ", z[i * m + j]);
		}
		putchar('\n');
	}
}

void main() {
	int a[Ax][Ay], b[Bx][By], min, numi, numj;
	vvod(&a[0][0], Ax, Ay, 'a');
	vvod(&b[0][0], Bx, By, 'b');
	print(&a[0][0], Ax, Ay, 'a');
	print(&b[0][0], Bx, By, 'b');
}
 
ну описан двохмерный массив, а в прототипе функции одномерный.

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

А в примере нужно найти минимальный элемент в матрица а (2,7) и б(1,4) и найти его номер строки и столбца.

Я реализовывал ее примерно вот так:

#include <stdio.h>
#include <conio.h>
#define Ax 2
#define Ay 7
#define Bx 1
#define By 4

void vvod(int z[], int n, int m, char q);
void fn(int z[], int n, int m, int *min, int *numi, int *numj);

void main(void)
{
int a[Ax][Ay], b[Bx][By], min, numi, numj;
vvod(a, Ax, Ay, 'a');
vvod(b, Bx, By, 'b');

fn(a, Ax, Ay, &min, &numi, &numj);
printf("Min element masiva a=%d ego stroka=%d stolbec=%d\n",min,numi,numj);
fn(b, Bx, By, &min, &numi, &numj);
printf("Min element masiva b=%d ego stroka=%d stolbec=%d\n",min,numi,numj);
}

void vvod(int z[], int n, int m, char q)
{
int i, j;

for (i=0; i<n; i++) {
for (j=0; j<m; j++) {
printf("Vvedite %c[%d][%d] \n",q,i,j);
scanf("%d",&z[j]);
}
}
}


void fn(int z[], int n, int m, int *min, int *numi, int *numj)
{
int i,j;
*min=z[0][0];
*numi=0;
*numj=0;

for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
if (z[j]<*min)
{
*min=z[j];
*numi=i;
*numj=j;
}
}
}
}
 
Останнє редагування:
как-то так
Код:
#include <stdio.h>
#define Ax 2
#define Ay 7
#define Bx 1
#define By 4

void vvod(int *z, int n, int m, char q) {
	for(int j, i = 0; i < n; ++i) {
		for(j = 0; j < m; ++j) {
			printf("%c[%d][%d] = ", q, i, j);
			scanf("%d", z + i * m + j);
		}
	}
	putchar('\n');
}

void print(int* z, int n, int m, char q) {
	printf("\n%c:\n", q);
	for(int j, i = 0; i < n; ++i) {
		for(j = 0; j < m; ++j) {
			printf ("%d ", z[i * m + j]);
		}
		putchar('\n');
	}
}

void main() {
	int a[Ax][Ay], b[Bx][By], min, numi, numj;
	vvod(&a[0][0], Ax, Ay, 'a');
	vvod(&b[0][0], Bx, By, 'b');
	print(&a[0][0], Ax, Ay, 'a');
	print(&b[0][0], Bx, By, 'b');
}
Это получается что мы через указатель все вычисляем?
 

quant

yeah
Это получается что мы через указатель все вычисляем?
да, для передачи одномерного масива тоже нужны были бы указатели, z[] - это тоже *z
двумерный массив n x m представляю как одномерный размером n * m и обращаюсь с индексами i є [0,n), j є [0,m), [i + j * m] как к [j]
 
да, для передачи одномерного масива тоже нужны были бы указатели, z[] - это тоже *z
двумерный массив n x m представляю как одномерный размером n * m и обращаюсь с индексами i є [0,n), j є [0,m), [i + j * m] как к [j]


Спасибо, по написанному выше примеру получилось сделать программу, но я не пойму принципа вот этих строк, и почему они разные?
scanf("%d", z + i * m + j);
printf ("%d ", z[i * m + j]);


и написанный в цитате фрагмент [i + j * m], почему мы умножаем j*m, а в примере i*m?
 

quant

yeah
фрагмент [i + j * m], почему мы умножаем j*m, а в примере i*m?
а это я мазонул, правильно как в примере
scanf("%d", z + i * m + j); - z[10] это массив, а z это указатель на первый элемент массива, указатель на третий элемент массива будет z + 3 или &z[3], дело в том что scanf нужно передавать указатель на элемент в который считаются данные
printf ("%d ", z[i * m + j]); - а тут нужно передать не указатель а значение печатаемого
 

appalach

Member
Вопрос по C++ Builder, а точнее по работе c Exel-server-ом
нужно получить из ячейки значение примерно такого формата: 6:40:15

пытался например таким образом:

vVarApp=CreateOleObject("Excel.Application");

for(int row=14;row<=132;row+=4)
for(int col=2;col<=2;col++)
{
ListBox1->Items->Add((vVarApp.Exec(PropertyGet("Cells")<<row<<col)));
}
получаю вычисляемое значение, чтото типа 0,73****....
пытался также получить формулу, но результат такойже
 

appalach

Member
уже ненужно), пока писал сообщение придумал как сделать))
TTime t;
for(int row=14;row<=132;row+=4)
for(int col=2;col<=2;col++)
{
t=(TTime)(vVarApp.Exec(PropertyGet("Cells")<<row<<col));
ListBox1->Items->Add(t);
}
 
Зверху