За последние 24 часа нас посетили 59677 программистов и 1851 робот. Сейчас ищут 1518 программистов ...

Массивы

Тема в разделе "PHP для новичков", создана пользователем agent669212, 28 фев 2010.

  1. agent669212

    agent669212 Активный пользователь

    С нами с:
    15 дек 2009
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Новосибирск
    Помогите новичку. Скажите нафига нужны массивы, а то в книгах как то заумно пишут. Объясните понятным языком
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    agent669212
    удобно данными управлять из массива...
    допустим у тебя есть сайт с расписанием на занятий , расписание хранится в базе по дням недели
    с понедельника по субботу, вытаскиваешь данные sql запросом все сразу, и запихиваешь в javascript массив из 6 ячеек,
    и читаешь из него когда тебе надо, допустим человек нажал на "вторник" ему ячейка массива для вторника показывается, без дополнительных запросов к базе...
    или допустим у меня кеш файл читается в массив, там много категорий в общем удобно...
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Массивы нужны для разных задач. Обычно для того, чтобы хранить вместе логически связаные между собой данные.
    Например, без массив хранить данные пользователей надо было бы так:
    PHP:
    1. <?php
    2. // Пользователи
    3. $user1_name = 'Alex';
    4. $user1_password = '123qwe';
    5. $user2_name = 'Vasya';
    6. $user2_password = '75227';
    7. // Просмотр данных
    8. echo 'Пользователь 1, Имя: ', $user1_name, ' пароль: ', $user1_password, '<br>';
    9. echo 'Пользователь 2, Имя: ', $user2_name, ' пароль: ', $user2_password, '<br>';
    10.  
    а с массивами удобнее:
    PHP:
    1. <?php
    2. // Пользователи
    3. $users = array();
    4. $users[1] = array('name' => 'Alex', 'password' => '123qwe');
    5. $users[2] = array('name' => 'Vasya', 'password' => '75227');
    6. // Просмотр данных
    7. foreach ($users as $n => $user)
    8. {
    9.      echo 'Пользователь ',$n, ', Имя: ', $user['name'], ' пароль: ', $user['password'], '<br>';
    10. }
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Код (Text):
    1. #include <cstdlib>
    2. #include <cstdio>
    3. #include <cmath>
    4.  
    5. using namespace std;
    6.  
    7. int main()
    8. {
    9.     // Массив с данными
    10.     __int16 Degrees[] = {30, 45, 60, 90, 180, 270, 360};
    11.     const double PI = asin((float)1)*2;
    12.  
    13.     // Считаем синусы углов в массиве
    14.     for(int i = 0; i < (sizeof Degrees / sizeof(__int16));i++) {
    15.         printf("sin %d = %f\n", *(Degrees + i), sin(Degrees[i]*PI/180));
    16.     }
    17.  
    18.     return EXIT_SUCCESS;
    19. }
    Может, уважаемый автор темы, у вас есть другой вариант без массивов?
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Apple
    слушай, есть в Си++ норм таймер в миллисекундах, нужно замерить время работы функции
    чё-то вот это даёт больно мелкие значения...

    Код (Text):
    1. long double UpdateTime(){
    2.     long double deltaTime;
    3.     static __int64 gTime,gLastTime;
    4.     __int64 freq;
    5.     QueryPerformanceCounter((LARGE_INTEGER *) &gTime);
    6.     QueryPerformanceFrequency((LARGE_INTEGER *) &freq);
    7.     deltaTime = (long double)((long double)(gTime - gLastTime)/(long double)freq);
    8.     gLastTime = gTime;
    9.     return deltaTime;
    10. }
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    точнее плохой точности
     
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Mr.M.I.T.
    http://codelab.ru/task/microsec_counter/
    Вот по такому типу, готового в С++ ничего нет =)
    Твой вариант ты можешь просто формировать подобным образом:

    Код (Text):
    1. std::printf("%f\n", timer->Get()*10E4);
    Значащие цифры довольно точные получаются, но такты зависят уже от системы.
    Можно использовать встроенную функцию clock (смотри доку по ctime.h).
    Там идет отсчет со времени работы программы, его брать за абсолютную величину.
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Переменная - это ящик. Массив - шкаф с ящиками.
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    не я имею ввиду, что значения времени выполнения функции сильно варьируется
     
  10. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ну это нормально =)
    Встроенного таймера в С++ нет, т.е считать микросекунды мы не можем, просто вызвав функцию.
    Обходные пути - это WinAPI с фиксированым хендлером.
    Значение времени выполнения и должно быть разным, можно из нескольких запусков брать среднее арифметическое/геометрическое, от него уже не будет отличаться.
    А так - нет.
    Хотя может я чего не понял, но это вполне нормальное поведение измерений.
     
  11. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Kreker
    убило, ржу))
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    вообще прикол в том, что время для первого выбранного метода возвращается всегда около 0.000096
    для остальных около 0.00010

    всё это дело в цикле
    Код (Text):
    1. while(1){
    2.        string method;
    3.        cout <<"Enter operation type(MPD,MN,MPI)"<<endl;
    4.        cin >>method;
    5.        transform(method.begin(),method.end(),method.begin(),toupper);
    6.        long double timer=UpdateTime();
    7.        switch(methods[method]){
    8.          case MPD:
    9.              result=MethodMPD();
    10.              timer=UpdateTime();
    11.          break;
    12.          case MN:
    13.              result=MethodMN();
    14.              timer=UpdateTime();
    15.          break;
    16.          case MPI:
    17.              result=MethodMPI();
    18.              timer=UpdateTime();
    19.          break;
    20.          default:
    21.              cout <<"Error: Method "<<method<<" not exists"<<endl;
    22.              goto end;
    23.        }
    что-то тут не так всётаки с


    Код (Text):
    1. long double UpdateTime(){
    2.     long double res;
    3.     static __int64 gTime=NULL,gLastTime=NULL;
    4.     QueryPerformanceCounter((LARGE_INTEGER *) &gTime);
    5.     if(!gLastTime){
    6.         gLastTime=gTime;
    7.         res=(long double)gTime;
    8.     }else{
    9.         __int64 freq;
    10.         QueryPerformanceFrequency((LARGE_INTEGER *) &freq);
    11.         res=(long double)(gTime - gLastTime)/(long double)freq;
    12.         gLastTime=NULL;
    13.     }
    14.     return res;
    15. }
     
  13. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Слух, я набросал тебе пример, плиз, разберись с ним сам)
    Мне лень разбивать его на функцию отдельную =)
    А вообще, я предпочел бы класс с методами Start, Stop, Clear и Get

    Код (Text):
    1. #include <cstdlib>
    2. #include <cstdio>
    3. #include <windows.h>
    4.  
    5.  
    6. /**
    7.  * Entry Point
    8.  */
    9. int main(int argc, char* argv[])
    10. {
    11.     unsigned __int64 freq, start, end;
    12.  
    13.     // Инициализируем
    14.     QueryPerformanceFrequency((LARGE_INTEGER*) &freq);
    15.     QueryPerformanceCounter((LARGE_INTEGER*) &start);
    16.  
    17.     // Выполняем херню разную на время
    18.     for(int i = 0; i <= 2048; i++) {
    19.         std::printf("%d\n", (i*i));
    20.     }
    21.  
    22.     // Фиксируем время остановки таймера
    23.     QueryPerformanceCounter((LARGE_INTEGER*) &end);
    24.  
    25.     // Вернем правильный результат =)
    26.     std::printf("----\n\nTime: %f\n\n", ((float)(end - start) / freq));
    27.  
    28.     system("pause");
    29.     return 0;
    30. };
     
  14. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    у меня вроде тож самое
     
  15. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Проверь в работе на результат =))
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    тоже прыгает. от 0.072 до 0.089

    Код (Text):
    1. #include <cstdlib>
    2. #include <cstdio>
    3. #include <windows.h>
    4.  
    5.  
    6. /**
    7.  * Entry Point
    8.  */
    9. int main(int argc, char* argv[])
    10. {
    11.    signed __int64 freq, start, end;
    12.  
    13.    // Инициализируем
    14.    QueryPerformanceFrequency((LARGE_INTEGER*) &freq);
    15.    QueryPerformanceCounter((LARGE_INTEGER*) &start);
    16.  
    17.    // Выполняем херню разную на время
    18.    for(int i = 0; i <= 2048; i++) {
    19.       printf("%d\n", (i*i));
    20.    }
    21.  
    22.    // Фиксируем время остановки таймера
    23.    QueryPerformanceCounter((LARGE_INTEGER*) &end);
    24.  
    25.    // Вернем правильный результат =)
    26.    printf("----\n\nTime: %f\n\n", ((float)(end - start) / freq));
    27.  
    28.    system("pause");
    29.    return 0;
    30. };