Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Простейшая программа двумерный массив.


Автор: a11en 24.1.2007, 20:28
Вообщем прорамма должна создавать матрицу 5*5 записывать в элемент сумму значения его строки и столбца, т.е. A[0][1]=1, A[3][3]=6 и тд., и считать сумму элементов строки,
Код

#include<iostream.h>
#define SZ 5
void main()
{
    int A[SZ][SZ];//объявление двумерного массива
    int b[SZ];//объявление одномерного массива для получение суммы
    for(int i=0; i<SZ;i++)for(int j=0;j<SZ;j++)A[i][j]=i+j;//присваивание элементам значений
    for(i=0; i<SZ;i++)for(int j=0;j<5;j++) b[i]+=A[i][j];//присваивание элементу, суммы строки
    for(i=0; i<SZ;i++)cout<<"Сумма элементов"<<i+1<<"строки ="<<b[i]<<endl;//вывод суммы
}

собственно проблема в том что выводит какую-то чушь. Програму пишу в VC++6.0

Ну что бы не было такого простого вопроса, объясните мне для чего используется, #define или ссылочку на это дайте.

Автор: Sartorius 24.1.2007, 20:32
 массив b не проинициализирован... чего же ты хочешь?

Автор: a11en 24.1.2007, 20:47
Спасибо, так протупил, извените...

Автор: Xenon 24.1.2007, 20:50
Код

const int SZ = 5;
int main(int argc, char* argv[])
{
    int A[SZ][SZ];//объявление двумерного массива
    int b[SZ];//объявление одномерного массива для получение суммы
    for(int i=0; i<SZ;i++)
    {
        for(int j=0;j<SZ;j++)
        {
            A[i][j] = i + j;//присваивание элементам значений
        }
    }
    for(int i=0; i<SZ;i++)
    {
        b[i]=0;
        for(int j=0;j<5;j++)
        {
            b[i]+=A[i][j];//присваивание элементу, суммы строки
        }
    }
    for(int i=0;i<SZ;i++)
    {
        cout << "Сумма элементов" << i+1 <<"строки =" << b[i] << endl;
    }//вывод суммы
    _getch();
    return 0;
}


На всякий пожарный

Автор: a11en 24.1.2007, 21:13
ну и код(!!!) на всякий пожарный, вот вполне рабочий.

Код

#include<iostream.h>
#define SZ 5
void main()
{
    int A[SZ][SZ];
    int b[SZ];
    for(int i=0; i<SZ;i++)for(int j=0;j<SZ;j++){A[i][j]=i+j; b[i]=0;}
    for(i=0; i<SZ;i++)for(int j=0;j<5;j++) b[i]+=A[i][j];
    for(i=0; i<SZ;i++)cout<<b[i]<<endl;
}


Или я дурак(нас учили писать как можно лаконичнее) или у вас много лишнего(я не осуждаю,возможно для наглядности, а быть может я чего не знаю), про мой Define молчу ибо так нас массивы учили описывать а руки не доходят найти инф что это вообще такое
1. нафиг константу еще и интом объявлять?
2. Ну и гетч в VC++ не нужна.(ну ясно что не только в этой среде пишут)
3. Зачем делать int main() и return 0, если можно просто void main().
4. Зачем фигурные скобки для 1-го действия.

Автор: zkv 24.1.2007, 21:24
Цитата(a11en @  24.1.2007,  21:13 Найти цитируемый пост)
1. нафиг константу еще и интом объявлять?

а есть альтернативы? те вы знаете способ объявить константу без указания типа?
Цитата(a11en @  24.1.2007,  21:13 Найти цитируемый пост)
2. Ну и гетч в VC++ не нужна.

вообще то программу пишут для получения ехе файла (упрощенно), а в нем уже никаких задержек не будет перед выходом
Цитата(a11en @  24.1.2007,  21:13 Найти цитируемый пост)
3. Зачем делать int main и return 0, если можно просто.

int - хороший тон, а ретурн все равно подставят, хотите вы или нет smile
Цитата(a11en @  24.1.2007,  21:13 Найти цитируемый пост)
4. Зачем фигурные скобки для 1-го действия. 

не обязательно, но и на скорость никак не повлияют

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

#define SZ 5 - директива компилятору везде где он встретит SZ воспринимать ее как число 5

Автор: JackYF 24.1.2007, 21:24
Цитата(a11en @  24.1.2007,  21:13 Найти цитируемый пост)
нафиг константу еще и интом объявлять?


1. А константа - она тоже тип имеет. И может иметь далеко не только интовый тип. Здесь, может, и не важно, а вот в более сложных программах...
3. Нельзя. Не по стандарту. По стандарту С++ объявления главной функции должно быть int main() (можно с параметрами, можно без).
4. Да. Можно и без них. Но с ними читабельней.

Добавлено @ 21:26 
 smile  smile Опоздал на секунды... 

Автор: Dov 24.1.2007, 21:35
Цитата(a11en @  24.1.2007,  20:13 Найти цитируемый пост)
Или я дурак(нас учили писать как можно лаконичнее)

Не правильно вас учили. Так нада экономить:
Код
void main(){int A[SZ][SZ];int b[SZ];for(int i=0; i<SZ;i++)for(int j=0;j<SZ;j++){A[i][j]=i+j; b[i]=0;}for(i=0; i<SZ;i++)for(int j=0;j<5;j++) b[i]+=A[i][j];for(i=0; i<SZ;i++)cout<<b[i]<<endl;}


Автор: Sartorius 24.1.2007, 21:40
Dov,  smile  это +

Автор: a11en 24.1.2007, 21:59
У коршуны;), спасибо за пояснения, буду благодарен если дадите ссылочку на то как писать стандартно и на то что влияет на скорость программы и про #define поподробнее не только же для этого используется и чем отличается если объявить то же SZ константой.
Еще если не трудно поясните, что эти параметры делают int main(int argc, char* argv[])

2Dov, оригинал слов нету, вот еврей он и есть еврей(естествено шутка, не в обиду)

Добавлено @ 22:00 
Я в этот форум влюблен, нигде больше не встречал таких отзывчивых людей!

Автор: Sartorius 24.1.2007, 22:17
 Вот статейка по оформлению 
http://www.codenet.ru/progr/cpp/C-Style.php

На http://www.rsdn.ru/ советую философию программирования посмотреть.

 Из книжек - Страуструп и Скот Майерс. Прочитай что найдешь - не пожалеешь. Люди действительно не просто стандарт описывают, а показывают как надо код писать.



Автор: KpoHyc 24.1.2007, 22:18
a11en, argc - хранит количество аргуметнов коммандной строки, argv - сами их параметры...

JackYF
Цитата(JackYF @  24.1.2007,  21:24 Найти цитируемый пост)
По стандарту С++ объявления главной функции должно быть int main() (можно с параметрами, можно без).


 сцылку - а пока бред...main функция должна отличаться от остальных в плане объявления...и то не обязательно хоть все функции void'ом хоть int'ом...

Автор: a11en 24.1.2007, 22:29
KpoHyc, ничего не понял наверное надо подробнее читать!

Автор: KpoHyc 24.1.2007, 23:37
Код

main (int argc, char *argv[])
{
  for(int i=1; i<argc; i++) printf(argv[i]);
}

Автор: Xenon 24.1.2007, 23:54
a11en, нагнал на меня тут  smile 
Ну я просто пишу почти по всем канонам правильности smile) Ну чтобы максимально приятнее читать было. Просто на код с фигурными скобками глянешь быстро - все понятно станет и редактировать его проще, быстрее. 
Это дело каждого. Я делаю так. Думаю, читать код в таком стиле не противно

Добавлено @ 00:06 
KpoHyc, это стандартом считается. Потому что в linux`e, например, нормальным завершением программы считается завершение, при котором возвращается 0. Ну, и по дефолту это int

Автор: V.A.KeRneL 25.1.2007, 05:25
Привет, a11ensmile

Насчёт argc и argv можешь почитать на этом же форуме: 
1) http://forum.vingrad.ru/topic-128494.html[http://forum.vingrad.ru/topic-128494.html]http://forum.vingrad.ru/topic-128494.html
2) http://forum.vingrad.ru/topic-130471/0.html
3) http://forum.vingrad.ru/topic-131796/unread-1/0.html[http://forum.vingrad.ru/topic-131796/unread-1/0.html]http://forum.vingrad.ru/topic-131796/unread-1/0.html

А насчёт coding style, то лучшим_стандартным_на_мой_взгляд_несомненно_является (((http://www.google.com/search?hl=en&q=GNU+programming+style&btnG=Google+Search))). Советую просмотреть все ссылки, по крайней мере, с 1-ой страницы, хотя бы кусочки кодов.

З.Ы. Учись пользоваться поиском. Удачи! smile

Автор: a11en 25.1.2007, 09:23
Xenon, я поэтому и спросил, чтобы понять зачем все это, мне лично циклы удобнее смотреть в том виде в котором я их написал, теперь буду писать подробне))) и еще раз говорю нас сначала учили писать через int main(), а тут пришли к другому преподу она нам говорит вы дебилы надо подругому писать... ну хотя она и private в класах не пишет по-моему потом совсем запутаешься где какие данные, считаю что писать его надо...

V.A.KeRneL, я умею пользоваться поиком, просто попросили 10 программ такого типа вчера написать не до поиска было, хотя на каждую прогу не больше 10 минут, а с этой которая в шапке час провозился, ну бывают заскоки.

Автор: Shaggie 25.1.2007, 09:45
Учись писать понятный код! Это очень важно! С такими однострочниками в любой конторе тебя пошлют далеко и надолго, так как нормальный чел в одного большой проект не напишет -> народ пишет совместимые модули -> в любой момент любому товарищу может понадобиться взглянуть на твой код, проверить чего... Поверь, нет ничего хорошего, когда один чел неделю разбирает код другого.

Рано или поздно товарищ уходит из конторы, на его место садится другой. Вот это подлянка ему достанется в наследство!

Автор: Ustus 25.1.2007, 13:39
Цитата(KpoHyc @  24.1.2007,  22:18 Найти цитируемый пост)
сцылку - а пока бред...main функция должна отличаться от остальных в плане объявления...и то не обязательно хоть все функции void'ом хоть int'ом... 

ISO/IEC 14882:1998 
3.6.1 - Main function
smile

Автор: a11en 25.1.2007, 23:35
Shaggie, у меня мало практики, но вобще проги пишу аккуратно и понятно, просто для меня понятнее(как и для того кому я это писал), когда цикл, естественно если он не большой, в одну строку, но спасибо за совет.

Автор: Rockie 26.1.2007, 01:49
Цитата(a11en @  24.1.2007,  21:59 Найти цитируемый пост)
на то что влияет на скорость программы

a11en, эта задача может решаться за 1 проход и без использования дополнительного массива.
Код

#include<iostream>

int main()
{
    const int s = 5;
    int A[s][s];                                                  //объявление двумерного массива

    for(int i=0;i<s;i++)
    {
      int sum = 0;

      for(int j=0;j<s;j++)
        {   
           std::cout<<( A[i][j]=i+j )<<' ';                       //присваивание элементам значений
           sum+=A[i][j];
        } 

      std::cout<<" sum of " <<i+1 <<" string = " <<sum <<std::endl;   //вывод суммы
    }

    return 0;
}


Добавлено @ 01:59 
KpoHyc, это не Си. http://search.msdn.microsoft.com/search/default.aspx?__VIEWSTATE=&query=C4430&siteid=0&tab=0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)