Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Непонятка с массивом (С)  (Прочитано 1627 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Непонятка с массивом (С)
« : 23 Декабря 2009, 14:46:08 »
Здравствуйте.
Решил я на досуге спрограммировать олимпиадную задачу по информатике на С (на самой олимпиаде писал на паскале). Суть её такова: имеется решётка заданных размеров (задаём сами). Потом эту сетку заселяют бактериями (в каждую ячейку заданной строки или столбца добавляют по столько-то бактерий). После n заселений надо вывести кол-во бактерий в самой заселённой ячейке и её координаты.
Вот код.
//#include <iostream.h>
#include <stdio.h>

int main(void)
{
int x; //размер решётки по x
int y; //размер решётки по y
int w; w=0; //расчётная переменная
int w1; w1=0; //расчётная переменная 2
int maxv; maxv=0; //служит для записи макс. значения решётки
int maxvx; maxvx=0; //служит для записи x-координаты макс. значения
int maxvy; maxvy=0; //служит для записи y-координаты макс. значения
scanf("%d", &x, "%d", &y);
if (((x>=1) && (x<=10000)) && ((y>=1) && (y<=10000)))
{
int grid [ x ] [y]; //создание решётки (здесь поставил пробелы для форума, а то он квадратик рисовал)
}
else goto a; //останов, если нарушает допустимые границы
int qop; //кол-во операций заселения
scanf("%d\n", &qop);
if ((qop<0) || (qop>100000))
{
goto a; //останов, если нарушает допустимые границы
}
int qb; //кол-во заселённых бактерий
int cell; //строка/столбец, в которую будут заселены бактерии
int ori; //направление заселения: 1=строка, 2=столбец
w=0; w1=0;
while (w!=qop)
{
scanf("%d", &ori, "%d", &cell, "%d", &qb, "\n");
if ((ori<1) || (ori>2) || (qb<0) || (qb>10000))
{
goto a; //останов, если нарушает допустимые границы
}

if (ori==1)
{
while (w1!=x)
{
grid[cell][w1]=grid[cell][w1]+qb;
w1=w1+1;
}
}
if (ori==2)
{
while (w1!=y)
{
&grid[w1][cell]=&grid[w1][cell]+&qb;
w1=w1+1;
}
}
}
w=0; w1=0;
while (w!=x)
{
while (w1!=y)
{
if (grid[w][w1] > maxv)
{
maxv=grid[w][w1];
maxvx=w;
maxvy=w1;
}
}
}
printf(&maxv, " ", &maxvx, " ", &maxvy, " ");
a:
getch();
return 0;
}
И вот вывод.
(Нажмите, чтобы показать/скрыть)
ЧЯДНТ?
« Последнее редактирование: 23 Декабря 2009, 14:49:33 от DarknetAlpha »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Непонятка с массивом (С)
« Ответ #1 : 23 Декабря 2009, 15:05:34 »
Для начала.
У Вас grid описан внутри if.

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Re: Непонятка с массивом (С)
« Ответ #2 : 23 Декабря 2009, 15:07:27 »
Это плохо?
Попробую вывернуть...

Пользователь решил продолжить мысль 23 Декабря 2009, 13:20:28:
Поправил соответствующий кусок.
if (((x<1) || (x>10000)) || ((y<1) || (y>10000)))
{
goto a; //останов, если нарушает допустимые границы
}
int grid[x][y]; //создание решётки
Старые ашыпки исчезли. Появилась незамеченная.
main.c:16: error: jump into scope of identifier with variably modified type
Кстати, подскажите, пожалуйста, команду неизврашённой остановки программы.
Моей фантазии хватило на halt, stop, exit. Ни одна не работает.
« Последнее редактирование: 23 Декабря 2009, 15:22:09 от DarknetAlpha »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Непонятка с массивом (С)
« Ответ #3 : 23 Декабря 2009, 15:33:27 »
Это не басик, goto забудьте (это для Вас источник ошибок).
Остановкой будет окончание (выполнение программы). Есть еще варианты, exit, return,break, но Вам достаточно {} правильно использовать.
Стиль пока ужасный, т.е. у Вас большие перспективы. :coolsmiley:
Изучите.
if() {
...
}
else {
...
}
и другие варианты.
« Последнее редактирование: 23 Декабря 2009, 15:42:31 от alexander.pronin »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Непонятка с массивом (С)
« Ответ #4 : 23 Декабря 2009, 18:03:44 »
int x; //размер решётки по x
int y; //размер решётки по y
int grid[x][y];
   
Это принципиально неправильно.
Welcome to hell, hehe!  :knuppel2: Это вам не паскаль и не додиез (C#).

Размер массива должен задаваться константами и не может задаваться переменными.

Если Вам нужен массив переменного размера, объявляете указатель, потом выделяете память, а в конце освобождаете.
А двумерный массив - это массив указателей.

Как-то так:

int **grid;
int i,x,y;

grid=(int **)malloc(x*sizeof(int *));
for(i=0;i<x;i++){
  grid[i]=(int *)malloc(y*sizeof(int)); //к указателю можно обращаться как к массиву
}

// работаем

//в конце
for(i=0;i<x;i++){
  free(grid[i]);
}
free(grid);

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

if (((x>=1) && (x<=10000)) && ((y>=1) && (y<=10000)))
{
int grid [ x ] [y]; //создание решётки (здесь поставил пробелы для форума, а то он квадратик рисовал)
}
Здесь переменная grid появляется внутри оператора if, а при выходе из него исчезает, и больше не видна.

А неизвращенная остановка программы - оператором return из функции main(), либо функцией exit(), но чтобы последняя заработала, надо подключить заголовок stdlib.h
Что же касается оператора break, упомянутого предыдущим оратором, то он прерывает выполнение цикла или оператора switch, и к завершению программы не приводит. Если компилятор увидит его вне цикла или свитча, выдаст ошибку.
« Последнее редактирование: 23 Декабря 2009, 18:16:24 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Упс

  • Старожил
  • *
  • Сообщений: 3231
    • Просмотр профиля
Re: Непонятка с массивом (С)
« Ответ #5 : 23 Декабря 2009, 18:28:18 »
Дочитал до scanf("%d", &x, "%d", &y);
Дальше не стал.
int scanf(const char *__format, .....)
xUbuntu 12.04

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Непонятка с массивом (С)
« Ответ #6 : 23 Декабря 2009, 18:30:08 »
Ничего-ничего, все в порядке! :)

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

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Непонятка с массивом (С)
« Ответ #7 : 26 Декабря 2009, 08:20:47 »
Мой совет: купите книжку по Си и начните с простенького.
Только вот не надо брать в библиотеке книжки 80х годов. и там где есть слово Windows иначе перекорежите и без того кривые знания.
А программулину в Юмор рекомендую определить.

И ты еще не добрался до самого сложного вопроса "на миллион": где взять getch()?
« Последнее редактирование: 26 Декабря 2009, 08:23:41 от Yurror »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Непонятка с массивом (С)
« Ответ #8 : 28 Декабря 2009, 12:29:42 »
А как же классика - Керниган и Ричи "Язык программирования Си"?
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Непонятка с массивом (С)
« Ответ #9 : 29 Декабря 2009, 11:33:44 »
А как же классика - Керниган и Ричи "Язык программирования Си"?
Уже вышел новый стандарт и мне не очень нравится их стиль оформления исходников ;)

 

Страница сгенерирована за 0.025 секунд. Запросов: 22.