Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Дайте задачек для относительно начинающего плз
 
 автор: ser60v   (27.11.2007 в 18:27)   письмо автору
 
 

Ченибудь типа, чтоб рассмотерь функции побырее научицо...

   
 
 автор: exp   (27.11.2007 в 22:56)   письмо автору
 
   для: ser60v   (27.11.2007 в 18:27)
 

смотря насколько относительно чего начинающего (:
тут в каждой теме задачи всех уровней начинаемости.

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

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

<p>Рассмотрим применение этих макросов для обработки параметров функции
вычисляющей среднее значение произвольной последовательности целых чисел.
Поскольку функция имеет переменное число параметров будем считать концом списка
значение равное -1. Поскольку в списке должен быть хотя бы один элемент, у
функции будет один обязательный параметр.
<p>Пример:
<pre>
   #include <starg.h>
   int main()
   { int n;
     int sred_znach(int,...);
     n=sred_znach(2,3,4,-1);
                     /* вызов с четырьмя параметрами */
     printf("n=%d",n);
     n=sred_znach(5,6,7,8,9,-1);
                    /* вызов с шестью параметрами   */
     printf("n=%d",n);
     return (0);
   }

   int sred_znach(int x,...);
   {
      int i=0,  j=0,  sum=0;
      va_list uk_arg;
      va_start(uk_arg,x);  /*  установка указателя uk_arg на  */
                           /*  первый необязятельный параметр */
      if (x!=-1) sum=x;    /*  проверка на пустоту списка     */
      else return (0);
      j++;
      while ( (i=va_arg(uk_arg,int))!=-1)
                                   /* выборка очередного   */
      {                            /* параметра и проверка */
        sum+=i;                    /* на конец списка      */
        j++;
      }
      va_end(uk_arg);         /* закрытие списка параметров   */
      return (sum/j);
   }
</pre>

<h4><a name="153">1.5.3. Передача параметров функции main</a></h4>
<p>Функция main, с которой начинается выполнение СИ-программы, может быть
определена с параметрами, которые передаются из внешнего окружения, например,
из командной строки. Во внешнем окружении действуют свои правила представления
данных, а точнее, все данные представляются в виде строк символов. Для
передачи этих строк в функцию main используются два параметра, первый параметр
служит для передачи числа передаваемых строк, второй для передачи самих строк.
Общепринятые (но не обязательные) имена этих параметров argc и argv. Параметр
argc имеет тип int, его значение формируется из анализа командной строки и
равно количеству слов в командной строке, включая и имя вызываемой программы
(под словом понимается любой текст не содержащий символа пробел). Параметр argv
это массив указателей на строки, каждая из которых содержит одно слово из
командной строки. Если слово должно содержать символ пробел, то при записи
его в командную строку оно должно быть заключено в кавычки.</p>
нужно обработать текст между <pre></pre>
преобразовать <> в &lt;&gt; что-бы они отображались
и выделить все слова одним цветом, "неслова" другим цветом
а комментарии (они могут быть только в /**/) третьим цветом
или подсветить как-нибудь по другому


можете попробовать решить :) у меня пока не получается , пробую не первый день :)

   
 
 автор: winflip   (27.11.2007 в 23:07)   письмо автору
 
   для: exp   (27.11.2007 в 22:56)
 

у меня где то тема такая была. а что тяжелого? регулярные выражения вперед!!!

   
 
 автор: exp   (27.11.2007 в 23:52)   письмо автору
 
   для: winflip   (27.11.2007 в 23:07)
 

я пока не смог сделать оптимально :)
обработчик примерно такой замыслил
<?php
$contents 
file_get_contents('test.txt');

echo 
$contents preg_replace('#<pre>(.+?)</pre>#se'"'<pre style=\"font: 22px Lucida Console; color: grey;\">' . codlight('\$1') . '</pre>'"$contents );
?>

только саму функцию codlight() не придумал ) и загвоздка как-раз с этими <> и всякими >=

но если хотите можете усложнить подсветив ещё некоторые слова :)
$funcshns = array('abort', 'abs', 'access', 'acos', 'alloca', 'asctime',
'asin', 'assert', 'atan', 'atan2', 'atof', 'atoi', 'atol',
'bdos', 'bessel', 'bsearch', 'cabs', 'calloc', 'ceil',
'cgets', 'chdir', 'chmod', 'chsize', '_clear87',
'clearerr', 'close', '_control87', 'cos', 'cosh', 'cprintf',
'cputs', 'creat', 'cscanf', 'ctime', 'dieeetomsbin', 'dmsbintoieee',
'difftime', 'dosexterr', 'dup', 'dup2', 'ecvt', 'eof', 'execl',
'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp',
'execvpe', 'exit', '_exit', 'exp', '_expand', 'fabs', 'fclose',
'fcloseall', 'fcvt', 'fdopen', 'feof', 'ferror', 'fflush',
'_ffree', 'fgetc', 'fgetchar', 'fgets', 'fieeetomsbin',
'fmsbintoieee', 'filelength', 'fileno', 'floor', 'flushall', '_fmalloc',
'fmod', '_fmsize', 'fopen', 'FP_OFF', 'FP_SEG', '_fpreset',
'fprintf', 'fprint', 'fputc', 'fputchar', 'fputs', 'fread',
'free', '_freect', 'freopen', 'frexp', 'fscanf', 'fscek', 'fseek',
'fstat', 'ftell', 'ftime', 'fwrite', 'gcvt', 'getc', 'getchar',
'getch', 'getche', 'getcwd', 'getenv', 'getpid', 'gets', 'getw',
'gmtime', 'halloc', 'hfree', 'hypot', 'inp', 'int86', 'int86x',
'intdos', 'intdosx', 'isatty', 'isalnum', 'isalpha', 'isascii',
'iscntrl', 'isdigit', 'isgraph', 'islower', 'isprint', 'ispunct',
'isspace', 'isupper', 'isxdigit', 'itoa', 'kbhit', 'labs', 'ldexp',
'lfind', 'lsearch', 'localtime', 'locking', 'log', 'log10',
'longjmp', 'lseek', 'ltoa', 'malloc', 'matherr', '_memavl',
'memccpy', 'memchr', 'memcmp', 'memcpy', 'memicmp', 'memset',
'mkdir', 'mktemp', 'modf', 'movedata', '_msize', '_nfree',
'_nmalloc', '_nmsize', 'onexit', 'open', 'outp', 'perror',
'pow', 'printf', 'putc', 'putchar', 'putch', 'putenv', 'puts',
'putw', 'qsort', 'rand', 'read', 'realloc', 'remove', 'rename',
'rewind', 'rmdir', 'rmtmp', 'sbrk', 'scanf', 'segread', 'setbuf',
'setjmp', 'setmode', 'setvbuf', 'signal', 'sin', 'sinh',
'sopen', 'spawnl', 'spawnle', 'spawnlp', 'spawnlpe', 'spawnv',
'spawnve', 'spawnvp', 'spawnvpe', 'sprintf', 'sqrt', 'srand',
'sscanf', 'stackavail', 'stat', '_status87', 'strcat', 'strchr',
'strcmp', 'strcmpi', 'strcpy', 'strcspn', 'strdup', 'strerror',
'stricmp', 'strlen', 'strlwr', 'strncat', 'strncmp', 'strncpy',
'strnicmp', 'strnset', 'strpbrk', 'strrchr', 'strrev', 'strset',
'strspn', 'strstr', 'strtod-strtol', 'strtok', 'strupr',
'swab', 'system', 'tan', 'tanh', 'tell', 'tempnam', 'tmpnam',
'time', 'tmpfile', 'toascii', 'tolower', 'toupper', '_tolower',
'_toupper', 'tzset', 'ultoa', 'umask', 'ungetc', 'ungetch',
'unlink', 'utime', 'va_arg', 'va_end', 'va_start', 'vfprintf',
'vprintf', 'vsprintf', 'write');
$keywords = array('auto', 'double', 'int', 'struct', 'break',
'else', 'long', 'switch', 'register', 'tupedef', 'char',
'extern', 'return', 'void', 'case', 'float', 'unsigned',
'default', 'for', 'signed', 'union', 'do', 'if', 'sizeof',
'volatile', 'continue', 'enum', 'short', 'while');
$reservwords = array('_asm', 'fortran', 'near', 'far', 'cdecl',
'huge', 'paskal', 'interrupt');
есть ещё const , stdin, stdout, stderr, stdax и возможно что-то пропустил

   
 
 автор: Trianon   (28.11.2007 в 00:40)   письмо автору
 
   для: exp   (27.11.2007 в 23:52)
 

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

   
 
 автор: exp   (28.11.2007 в 01:57)   письмо автору
 
   для: Trianon   (28.11.2007 в 00:40)
 

и ещё если подсвечивать строки заключённые в "" или '' в которых будет \" или \'
например
<pre>
 #include <stdio.h>
    main ()       /* Преобразовать шестьнадцатеричное или восьмеричное
                    число к десятичному виду */
    {
     int numassigned,val;
     printf("Введи шестьнадцатеричное и восьмеричное #, или 00 выход:\n");
     do  {
          printf(" #=");
          numassigned = scanf("%i, &val);
          printf("Десятичное = %i\n", val);
          }
      while ( val && numassigned);
      /* Цикл закончится, когда введут 00 или scanf не сможет
         преобразовать входное поле */
    }  
</pre>
если будет printf("\"Десятичное\" число = %i\n", val);

до этого я пока не додумывался :) но подсвеченные слова обесцветил в комментариях

   
 
 автор: SHAman   (30.11.2007 в 19:47)   письмо автору
 
   для: exp   (28.11.2007 в 01:57)
 

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

есть квадратная матрица. Любого размера. Пусть, 5х5. Каждая клетка матрицы - сад. В каждом саду есть яблоки. Количество яблок указано в ячейке матрицы. В ячейке 1:1 есть ёжик. Ёжик немного пьян, поэтому может бежать только вправо и вниз по матрице, собирая по пути все живое(яблоки). Задача у ёжика совсем непростая: таким вот зигзугом пробежать до ячейки n:n (у нас 5:5) и собрать по пути максимально возможное количество яблок.

Задачка кажется простой, но на самом деле имеет очень элегантное и красивое решение.

Если отойти от абстрактных задачек и подойти к практическим, дающим опыт, то нужно делать что-то конкретное, которым можно пользоваться. Я вот написал пару сайтов, постоянно решаю задачки какие-то, использую программы в повседневной жизни. Нужна мне прога для красивого однотипного переименования файлов в указанной директории по шаблону - написал. Заодно C# немного поизучал. Нужна прога, которая чистит html из ворда - написал. Просто делайте мир лучше и опыт придет.

   
 
 автор: exp   (01.12.2007 в 12:24)   письмо автору
 
   для: SHAman   (30.11.2007 в 19:47)
 

в задаче с ёжиком не хватает инфы :) но он только может пройти 8 ячеек и что-бы собрать всё
надо запускать из 1:1 пять таких ёжиков ))

моя задача была нужная мне , но нечаянно стёр файл который надо-было перезаписать :(
, дайте пожалста , если знаете ссылку на справочник библиотечных функций С , просто в текстовом формате , файл ещё назывался страннол как-то SIFUNC.DSF кажется.

не скажу что правильно решил свою задачку, помоему правильнее делать как-то построчно , но мне только надо-было перезаписать , а не для постоянного использования.
например такой набросок к перл
<?php
define
('COMENT_COL''grey'); // коменты
define('STRI_COL''black'); // строки
define('P_VARS_COL''red'); // переменные
define('KEYW_COL''blue'); // ключ.сл.
define('P_OPS_COL''#222299'); // операторы
define('FNC_COL''#992222'); // функции
define('STYLE_COD''font: 26px Arial Unicode MS; color: #009900;');

function 
test_reg(&$item)
{
    
$item '#\b(' $item ')\b#i';
}

function 
codlight($document$simv ''# $simv эт так, заплатка
{
if (
$simv !== ''$document str_replace('\\' $simv$simv$document);

$document str_replace(array('<''>''"'), array('&lt;''&gt;''&quot;'), $document); 
    
# строки 
$str '#((\'|&quot;).*?((?<!\x5c)\\2))#s'
$replace '<font color="' STRI_COL '">$1</font>'
  
$document preg_replace($str$replace$document); 
    
# коментарии 
$str = array('"((?:(?<!\$)#|\/\/).*)$"me''#(\/\*.*?\*\/)#se'); 
$replace '\'<font color="' COMENT_COL '">\' . strip_tags(\'$1\') . \'</font>\''
  
$document preg_replace($str$replace$document); 
    
# массив
$document preg_split('#((?:<font.+?</font>\s*)+)#s'$document, -1PREG_SPLIT_DELIM_CAPTURE PREG_SPLIT_NO_EMPTY);

$p_vars '"((?:\$#?|\@|%)(\w+|\_|\~|\!))"';

$keywords = array('break''case''continue''default''die''do''else''elsif''for''foreach''if''goto''last''next''switch''return''redo''sub''until''while');
array_walk($keywords'test_reg');

$funcshns = array('chop''close''closedir''delete''each''eof''eval'
    
'fopen',  'fwrite''grep''index''join','keys''length'
    
'open''opendir''pack''pop''print''printf''push',
    
'require''reverse''rindex','rewinddir',  
    
'scalar''seek''seekdir''shift''sort''splice''split''sprintf'
    
'substr''sysread''syswrite''telldir',
    
'_toupper''tzset''ultoa''umask''unshift''unpack');    
array_walk($funcshns'test_reg');

$p_ops '#((&(?:lt|gt);|[\*\+\/\-\=\!\?\|\~\.\,\:\;\[\]\(\)\{\}\|]+|&+)[\2]*?\s*)#s';

for (
$i 0$i count($document); $i++)
{
    if (
strpos($document$i ],'<') === 0) continue;
    
$document$i ] = preg_replace($p_ops'<font color="' P_OPS_COL '"><b>$1</b></font>'$document$i ]);
    
$document$i ] = preg_replace($p_vars'<font color="' P_VARS_COL '"><b>$1</b></font>'$document$i ]);
    
$document$i ] = preg_replace($keywords'<font color="' KEYW_COL '"><b>$1</b></font>'$document$i ]);
    
$document$i ] = preg_replace($funcshns'<font color="' FNC_COL '"><b>$1</b></font>'$document$i ]);    
}

return  
'<pre style="' STYLE_COD '">' implode(''$document) . '</pre>';
}

$contents file_get_contents('Perl' $pg '.txt'); 
echo 
$contents preg_replace('#[perl](.+?)[/perl]#se'"codlight('\\1', '\"')"$contents );
?>
с файлом 50kb работает где-то 0.4 секунды ,а эт много

   
 
 автор: SHAman   (01.12.2007 в 14:33)   письмо автору
 
   для: exp   (01.12.2007 в 12:24)
 

Надо собрать не все, а максимум яблок. Нужно проложить маршрут от 1-1 к н-н, при котором можно набрать максимальное количество яблок.

Кстати, задачка весьма интересна с точки зрения алгоритма:)

   
 
 автор: kasmanaft   (01.12.2007 в 15:38)   письмо автору
 
   для: SHAman   (01.12.2007 в 14:33)
 

Никогда не умел по-умному решать подобные задачки... Ну пока везде не пробежишься, не узнаешь же ведь как лучше бежать. Итог - тупой перебор :)

---->>

Хы.. получилось, что ежик может бегать не только по квадратным матрицам.. По любым бегает :) в том числе непрямоугольным..

   
 
 автор: kasmanaft   (01.12.2007 в 15:47)   письмо автору
 
   для: kasmanaft   (01.12.2007 в 15:38)
 

А вот, кстати, когда-то делал подсветку... Доделывать можно сколь угодно долго (а сейчас уже не хотца :) ), но если exp'у (или кому еще) будет интересно - выкладываю..

Всё номально подсвечивает - как и "чтобы выделяя коментарии одним цветом, не выделять в них ключевые слова и прочие лексемы (если они там окажутся)", так и "ещё если подсвечивать строки заключённые в "" или '' в которых будет \" или \' .... "

Работает, вроде, довольно быстро.

   
 
 автор: g-tech   (01.02.2008 в 06:34)
 
   для: SHAman   (01.12.2007 в 14:33)
 

Задачка скажем так очень сильно касается теории графов!

Скажу так, я почти ноль в PHP, пока не успел изучить! Но если забыть о синтаксисе могу предложить логический ход мыслей:
- для начала надо анализировать предоставленныю матрицу, ячейки имеют двойную индексация, так сказать координаты по x и по y, соответственно в опеределенной ячейке под определенной координатой записано определенное число. Необходимо выявить соответствие координат и "количества яблок". вообщем необходимо составить двумерный массив из записей, каждая запись будет содержать следующие параметры: координата x; координата y; число яблок;
- учтем то, что в любом случае у ежа всего 8 ходов ((n*2)-2), почему это и "ежу" понятно;
- надо учесть что "еж пьян" и при передвижении его координаты только прибавляются, то есть сдвиг вправо есть x+1 сдвиг вниз есть y+1;
- начальное количество яблок то, которое находится в ячейке (1;1); Далее анализируем ячейки справа и снизу от положения "ежа", т.е. ячейки (крд яжа + 1; крд яжа) и (крд ежа; крд ежа + 1), а точнее сопоставляем значение обозначающее количество яблок в этих ячейках. Хагаем в ту ячейку в которой число яблок больше; Координатам ежа, соответственно, присваиваем координаты выбранной ячейки; Значение собранных яблок увеличиваем на число яблок в выбранной ячейке;
- учтем, что при каждом шаге необходимо проверять значение координаты x и y ежа; если x ежа равно 5, то идем далее исключительно вниз, а если y равно 5, то, соответственно вправо;

Попрошу прокомментироват если я что-то упустил!

   
 
 автор: THERAPYbrother   (01.02.2008 в 14:59)   письмо автору
 
   для: g-tech   (01.02.2008 в 06:34)
 

где-то я видел уже.)
P.S.
как-то раз попал на сайт,там было много обычных задач,которые предлагается решить
путем какого-нибудь языка программирования,только забыл я этот сайт(((

   
 
 автор: constructor   (01.02.2008 в 19:33)   письмо автору
 
   для: g-tech   (01.02.2008 в 06:34)
 

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

  function go (x, y, a, n);  // a  - двухмерный массив. n - размер.
  {
    if (x = n) and (y = n) return a[x][y];
    if (x = n) and (y < n) return a[x][y] + go (x, y + 1, a, n);
    if (x < n) and (y = n) retrun a[x][y] + go (x + 1, y, a, n);
    if (x < n) and (y < n)
    { 
      s = go (x + 1, y, a, n);
      t = go (x, y + 1, a, n);
      if (s > t)
         return s + a[x][y]
         else return t + a[x][y];
     }
 }

Вот и сама идея... В алгоритме могут быть ошибки, не проверял.
Можно ещё добавить массив, чтобы быстрее работала, но это уже оптимизация.
P.S Когдато решал похожую задачу только на паскале. И ещё, эта задача не очень касается графов.

   
 
 автор: bronenos   (06.02.2008 в 22:14)   письмо автору
 
   для: constructor   (01.02.2008 в 19:33)
 

Сравнение с 2 равно

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования