Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Вниз

Задачки по Си   Найти похожие ветки 

 
БарЛог ©   (2005-08-31 19:30) [0]

Дайте пожалуйста несколько задачек. А то задачника нету, а скоро экзамен сдавать. :(
За Си не садился уже несколько лет, но недавно синтаксис повторил.

Хотелось бы что-нибудь типо: заполнить матрицу по спирали...
В общем, хотелось бы пройтись по всем основным операторам.
Заранее спасибо.


 
БарЛог ©   (2005-08-31 19:31) [1]

А то когда придумываешь сам себе, то в процессе придумывания уже начинаешь думать над алгоритмом решения. В итоге задачка получается простая. :(
Хотелось бы задачки из другой головы.


 
Mystic ©   (2005-08-31 19:39) [2]

Абрамов, Гнездилова, Зима...
Задачи по программированию
Поищи в библиотеке


 
БарЛог ©   (2005-08-31 19:59) [3]

Хотелось бы в электронном виде, а то у нас библиотека... поселок в общем :(

Гугл на "Абрамов задачи по программированию скачать" не помогает :(


 
Igorek ©   (2005-08-31 20:23) [4]

Си или Си++?


 
БарЛог ©   (2005-08-31 20:27) [5]

си-си. под дос которая :)


 
palva ©   (2005-08-31 20:32) [6]

Тогда у Кернигана-Ричи. В Интернете должно быть, очень старая и классическая вещь. Они написали не только учебник но и задачник.


 
Kerk ©   (2005-08-31 20:41) [7]

Если надо могу выложить:
Kernighan, Ritchie - The C Programming Language.djvu
Navia - A quick introduction to the C language.djvu
Plauger - The standart C library.djvu
Богатырев - Язык С в cистеме UNIX.pdf
Голуб - Веревка достаточной длины чтобы выстрелить себе в ногу.pdf
Керниган, Ричи - Язык C.pdf

Только не все сразу :)

Задачников нет. :(


 
begin...end ©   (2005-08-31 20:48) [8]

> БарЛог ©   (31.08.05 19:30)

Даю простую задачу.

Имеется массив из 10 чисел. Обратить массив (на место 1-го элемента поставить 10-й, на место 2-го -- 9-й и т.д.).


 
Kerk ©   (2005-08-31 21:07) [9]

begin...end ©   (31.08.05 20:48) [8]

Оч смешно :P


 
begin...end ©   (2005-08-31 21:12) [10]

> Kerk ©   (31.08.05 21:07) [9]

Э-э-э... а что смешного-то? Человек попросил задачу -- ну, я и дал первую, что пришла в голову. Что не так?


 
Kerk ©   (2005-08-31 21:13) [11]

begin...end ©   (31.08.05 21:12) [10]

А. точно.. извини :)


 
БарЛог ©   (2005-08-31 21:23) [12]

begin...end ©   (31.08.05 20:48) [8]

# include <stdio.h>
main();
{
int i,j,mas[10];
for (i=0;i<=3;i++)
 {
 j=mas[i];
 mas[i]=mas[9-i];
 mas[9-i]=j;
 }
}

пасиба.
если кто работает в си, или помнит - проверьте синтаксис, плиз.
ну и если в алгоритме чего напутал...

А задачка и правда простая, но все равно спасибо.


 
БарЛог ©   (2005-08-31 21:25) [13]

> если кто работает в си, или помнит - проверьте синтаксис, плиз.
а то компилятора на работе нету, а где скачать - не знаю :(

ЗЫ Еще бы задачек...

ЗЗЫ Kerk ©   (31.08.05 20:41) [7]
Кернигана я уже скачал...
А что там про веревку? Это программирование?


 
Kerk ©   (2005-08-31 21:28) [14]

БарЛог ©   (31.08.05 21:25) [13]
А что там про веревку? Это программирование?


Название этой книги отражает то, что я считаю основной трудностью при
работе как с Си++, так и с Си: эти языки дают вам столько гибкости, что
если у вас нет желания и способности призвать себя к порядку, то в итоге
вы можете получить гигантский модуль не поддающейся сопровождению
тарабарщины, притворяющейся к тому же компьютерной программой. Вы
можете поистине делать все при помощи этих языков, даже если вы этого
не хотите. В этой книге делается попытка дать средство для преодоления
этой трудности в виде собрания практических правил программирования
на Си++ и Си — правил, которые, надеюсь, уберегут вас от
неприятностей, если вы будете их использовать с самого начала. Хотя
большинство из приводимых здесь правил применимы равно при
программировании как на Си, так и на Си++, я включил много материала,
относящегося лишь к миру Си++ и сконцентрированного по мере
возможности в заключительном разделе. Если вы программируете лишь
на Си, то просто игнорируйте материал по Си++, встречающийся вам в
более ранних разделах.


занимательная книжка


 
Димитрий ©   (2005-08-31 21:36) [15]

1. Дана матрица N x M случайным образом заполненная нулями и единицами. Заменить на двойки все единицы, образующие замкнутые области.
Пример:
из
10010
00101
00101
10010

получить
10020
00202
00202
10020

2. Дана матрица N x M заполненная целыми числами слева направо и сверху вниз, пример:
1 2 3 4
5 6 7 8
требуется переставить элементы, чтобы получилась матрица, заполненная сверху вниз и слева направо, пример:
1 3 5 7
2 4 6 8


 
Mystic ©   (2005-08-31 21:46) [16]

Напишу программу, которая бы в го играла ;)


 
Kerk ©   (2005-08-31 21:53) [17]

Mystic ©   (31.08.05 21:46) [16]

У меня кстати есть делфийские исходники такой проги.


 
palva ©   (2005-08-31 21:55) [18]

БарЛог ©   (31.08.05 21:23) [12]
> for (i=0;i<=3;i++)
for (i=0;i<=4;i++)


 
БарЛог ©   (2005-08-31 22:03) [19]

Димитрий ©   (31.08.05 21:36) [15]

#include <stdio.h>
main()
{
int m,n;
/*тут задаем m= ; n= ;*/
int mas[m][n],i,j,i2,j2,k;

/*сначала заполним массив*/
for (j=0; j<=n-1; j++)
 for (i=0; i<=m-1; i++)
    mas[i,j]=i+j;  /*хоть убейте - не помню, как к элементу массива обратиться, вроде так*/

/*теперь сама сортировка*/
for (j=0; j<=n-1; j++)
 for (i=0; i<=m-1; i++)
   for (j2=0; j2<=m-1; j2++)
     for (i2=0; i2<=n-1; i2++)
       {
         k=mas[i,j];
         mas[i,j]=mas[i2,j2];
         mas[i2,j2]=k;
       }
}

Четыре фора, конечно, на лицо... Но сразу почему-то ничего в голову не приходит :(
Да и спустя некоторое время не приходит :(
Над первым надо слишком много думать :(
Если есть алгоритмы - скинь плиз.

palva ©   (31.08.05 21:55) [18]
> for (i=0;i<=4;i++)
Кажись, цикл выполняется, пока условие2 истинно (i=4 нам не надо) - нумерация элементов массива с нуля. Разве не так?


 
БарЛог ©   (2005-08-31 22:04) [20]

Mystic ©   (31.08.05 21:46) [16]
Что такое го - напомни плиз.


 
Димитрий ©   (2005-08-31 22:16) [21]


> БарЛог ©   (31.08.05 22:03) [19]


> Если есть алгоритмы - скинь плиз.

Да где-то валялись, правда на Java :)


 
palva ©   (2005-08-31 22:21) [22]

> i=4 нам не надо
А чтобы поменять местами 4-й и 5-й элементы? Или я чего-то не понял?


 
БарЛог ©   (2005-08-31 22:30) [23]

Димитрий ©   (31.08.05 22:16) [21]
ды хоть на ассемблере - разобрать то можно (ну на асме, конечно, не надо :) )

palva ©   (31.08.05 22:21) [22]
Да, большое спасибо! Ошибка действительно есть. Извиняюсь, что сам запутался и вас запутал :)


 
Agent13 ©   (2005-08-31 23:16) [24]


> Kerk ©   (31.08.05 21:53) [17]
> Mystic ©   (31.08.05 21:46) [16]
>
> У меня кстати есть делфийские исходники такой проги.

Да ну? А я где-то читал, что в го компьютер заиграет ещё не скоро.


 
Канадец   (2005-08-31 23:38) [25]

БарЛог ©   (31.08.05 22:03) [19]

int m,n;
/*тут задаем m= ; n= ;*/
int mas[m][n]...


Лихо ты объявил статический массивчик в С. Смотри, погонят тебя с экзамена за такие штучки ;)

Как мимнимум так надо

const int m =3,n=5; // Whatevere dimension you have
int mas[m][n]...


И вот это

mas[i,j]

меняй на это

mas[i][j]

P.S.
Логику не проверял


 
Kerk ©   (2005-08-31 23:52) [26]

Agent13 ©   (31.08.05 23:16) [24]
Да ну? А я где-то читал, что в го компьютер заиграет ещё не скоро.


Он играет давно уже. Но достаточно серьезного игрока обыгрывать не скоро еще начнет.


 
Наиль ©   (2005-09-01 02:48) [27]

Своим студентам даю такую задачу.
В результате перестановок N цифр получается N! (факториал) комбинаций.
Например. Для 3 цифр: 123, 132, 213, 231, 312, 321. Всего 1*2*3=6 комбинаций. Найти все комбинации для 5 цифр (120 шт.) по возрастанию (т.е. без сортировки).

Думаю, в данном случае, можно в любом порядке.


 
Джо ©   (2005-09-01 04:59) [28]


>  [27] Наиль ©   (01.09.05 02:48)

По-моему, условие задачи сформулировано некорректно.

> В результате перестановок N цифр получается N! (факториал)
> комбинаций

Такому условию удовлетворяет также и "111", "222", "333". И даже: "456", "890".


 
БарЛог ©   (2005-09-01 08:19) [29]

Канадец   (31.08.05 23:38) [25]
Спасибо.
Про константы я думал, но забыл как их обьявлять :(
Про массивы тож забыл :(

Наиль ©   (01.09.05 02:48) [27]
>  Найти все комбинации для...
Кажется, это перестановками и называется.


 
Igorek ©   (2005-09-01 09:49) [30]

1.
int i = 0;
i += i+++++i;

чему равно i?

2.напиши выражение min(x,y,z)


 
palva ©   (2005-09-01 11:13) [31]

С подколкой:

char c1;
char c2[5];
char c3[5,5];
char c4[] = "***";

Чему равно
1. sizeof(c1)
2. sizeof(c2)
3. sizeof(c3)
4. sizeof(c4)


 
default ©   (2005-09-01 11:19) [32]

докажи гипотезу 3x+1 и беги на ближайший матфакультет для написания кандидатской
нужно доказать что при любом натуральном x следующий код завершит работу

while x <> 1 do
 if Odd(x) then x := 3 * x + 1
   else X := x div 2


 
alpet ©   (2005-09-01 11:31) [33]

С форума wasm.ru: написать программу вычисляющую все возможные состояния кубика рубика размером 2x2 (если есть желание - с любым кол-вом размерностей, но это весьма сложно).

default ©   (01.09.05 11:19) [32]

Он завершит, но это зависит не от алгоритма, а от разрядности числа x (наиболее долго будет с int64, а если div заменить на / то с Extended). Реальная же проверка должна быть на больших(очень) числах, что кстати тоже интересная задача - написать к примеру на Си алгоритм умножения 256-байтных чисел.


 
Mystic ©   (2005-09-01 11:40) [34]

Правила:
http://go.hobby.ru/school-02.htm

Тут с объяснениями и задачками:
http://www.playgo.to/interactive/russian/

Тут программка для разминки на поле размером 9x9 (оригинал 19x19)
Позволяет понять правила :)
http://www.kiseido.com/download.htm

Страничка, посвященная игре:
http://go.hobby.ru/

Тут можно порешать задачки:
25-15 кю: http://gobase.org/studying/problems/academy/?lev=1&off=0
15-5 кю: http://gobase.org/studying/problems/academy/?lev=2&off=0
5-1 кю: http://gobase.org/studying/problems/academy/?lev=3&off=0
1 кю - 4 дан: http://gobase.org/studying/problems/academy/?lev=4&off=0

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

>>> У меня кстати есть делфийские исходники такой проги.
Можешь поделиться?


 
БарЛог ©   (2005-09-02 12:51) [35]

Igorek ©   (01.09.05 09:49) [30]
1. 1 байт
2. 5 байт + длина массива тоже наверно хранится = 6 байт
3. 5*5 байт + 2 байта (размерность массива) = 27 байт
4. А так разве можно? :)

Прав?


 
Тульский ©   (2005-09-02 13:08) [36]


> Димитрий ©   (31.08.05 21:36) [15]

Задача №1 это фрагмент реализации игры Го. "Точки" по-русски.


 
Mystic ©   (2005-09-02 13:56) [37]

> "Точки" по-русски.

Точки это далеко не го. Точки это скорее всего вариант атари-го, да и то нечеткий.


 
БарЛог ©   (2005-09-02 14:46) [38]

alpet ©   (01.09.05 11:31) [33]
> написать к примеру на Си алгоритм умножения 256-байтных чисел.
Не совсем понял... это числа, которые max=(8^256)-1 ?


 
wal ©   (2005-09-02 15:08) [39]


> Не совсем понял... это числа, которые max=(8^256)-1 ?
Это [0..256^256-1]


 
Lamer@fools.ua ©   (2005-09-02 16:00) [40]

>>БарЛог ©   (02.09.05 12:51) [35]

>1. 1 байт
2. 5 байт + длина массива тоже наверно хранится = 6 байт
3. 5*5 байт + 2 байта (размерность массива) = 27 байт
4. А так разве можно? :)


1. Да.
2. Нет.
3. Нет.
4. Можно.


 
БарЛог ©   (2005-09-02 19:36) [41]

Lamer@fools.ua ©   (02.09.05 16:00) [40]
Кажется в 4. мы, как я понял, создаем массив из 3-х элементов "*".

Вот с "памятью" у меня не очень :(

Не подскажете правильные ответы?
Желательно с пояснениями.


 
Канадец   (2005-09-02 20:12) [42]

palva ©   (01.09.05 11:13) [31]

char c3[5,5];


Это что за объявление такое?

char c1;
char c2[5];
char c3[5,5];
char c4[] = "***";

>БарЛог ©   (02.09.05 19:36) [41]

1. 1 байт. Пояснения я думаю не требуются.
2. 5 байт. Никаких размеров массива в С нет.
3. Как palva © объяснит чего такого он хотел объявить, тогда и посчитаем :)
4. 4 байта. Три символа в строке + символ конца строки


 
БарЛог ©   (2005-09-02 20:55) [43]

Канадец   (02.09.05 20:12) [42]
Тьфу ты! Как все просто :)
(Особенно про строку в конце!)
Думаю, в "char c3[5,5];" имеется ввиду char "c3[5][5];" ... это все паскаль\делфи - привычка.


 
Lamer@fools.ua ©   (2005-09-04 22:50) [44]

>>БарЛог ©   (02.09.05 19:36) [41]

1. = sizeof(char)
2. = sizeof(char) * 5
3. = sizeof(char) * 5 * 5
4. char c4[] = "***"
эквивалентно char* c4 = "***"
То есть sizeof(c4) = sizeof(char*) = sizeof(void*) = размеру указателя: в Win32 - 4 байта, в DOS - зависит от модели сборки (tiny, small, large, huge etc.).


 
palva ©   (2005-09-04 23:37) [45]

3. Как palva © объяснит чего такого он хотел объявить, тогда и посчитаем :)
3. = sizeof(char) * 5 * 5

Правильный ответ 5 (конечно, если sizeof(char) равно единице, я не знал, что бывает иначе).

При описании массива в квадратных скобках должен стоять размер массива, который должен представлять собой константное выражение.
Например, m[2+3] имеет размер 5, m[2,3] имеет размер 3, потому что выражение 2,3 равно 3. В си имеется операция ",", которая означает последовательное вычисление операндов и взятие последнего вычисленного значения. По старшинству эта операция располагается непосредственно перед операцией присваивания.
Следующая программа, в которой ошибочно для отделения дробной части числа применена запятая, напечатает 15

#include <stdio.h>
void main() {
 printf("%d\n", (4*2,5+10));
}

Если убрать внутренние скобки то будет напечатано 8, поскольку символ "," будет рассматриваться уже не как арифметическая операция, а как символ разделения списка параметров при обращении к функции.

char c4[] = "***"
не эквивалентно
char* c4 = "***"
В первом случае компилятор выделит четыре байта и заполнит их соответственно. Во втором случае будет создан указатель и дополнительно массив из четырех байтов, на который этот указатель указывает. sizeof будет одинаковый (Win32), но смысл будет разный. В первом случае это размер массива, во втором - размер указателя.


 
Канадец   (2005-09-05 02:51) [46]

>Lamer@fools.ua © [44]
То есть sizeof(c4) = sizeof(char*) = sizeof(void*) = размеру указателя

Читай последний абзац palva © [45], он всё доходчиво объяснил. От себя лишь добавлю: тот факт что в С имя массива фактически означает  указатель на его начало, совсем не означает, что sizeof от этого имени даёт размер указателя.

>palva © [45]
При описании массива в квадратных скобках должен стоять размер массива, который должен представлять собой константное выражение.
Например, m[2+3] имеет размер 5, m[2,3] имеет размер 3, потому что выражение 2,3 равно 3. В си имеется операция ",", которая означает последовательное вычисление операндов и взятие последнего вычисленного значения. По старшинству эта операция располагается непосредственно перед операцией присваивания.


IHMO совсем не факт, что компилятор разберётся в подобных хитросплетениях. Например последний от Microsoft посылает сразу с жалобой на то, что ожидается константа. Других у меня нет чтобы попробовать.

Вообще это всё конечно интересно с чисто познавательной точки зрения, но упаси Господи встретить такое в коде.... Хотя есть такие индивидумы, которые стараются сказку сделать былью не думая башкой, что этот код кто-то после них разбирать будет. Как то на заре своей юности я очень долго чесал репу кода разбирая чей-то код увидел что-то вроде этого:


char c2[5];
2[c2] = "s";


 
Джо ©   (2005-09-05 02:53) [47]


> char c2[5];
> 2[c2] = "s";

Это шо ж такое?


 
Lamer@fools.ua ©   (2005-09-05 09:18) [48]

>>Канадец   (05.09.05 02:51) [46]

Да. С 4-м я лопухнулся.


 
palva ©   (2005-09-05 10:50) [49]

Канадец   (05.09.05 02:51) [46]
> Например последний от Microsoft посылает сразу с жалобой на то, что ожидается константа.
Да, здесь я был неправ, нужно было проверить на компьютере. char m[3+5] срабатывает, а char m[3,5] нет. Если поставить дополнительные скобки char m[(3,5)], то работать будет, но сразу же будет раскрыта замаскированная подколка. Более продвинутые сишники на Форуме, наверно, объяснят почему такая разница между операциями "+" и ",". Нужно было придумать другую задачу с маскировкой операции запятая.

> упаси Господи встретить такое в коде
Паскалисты переходя на си делают такую ошибку ОЧЕНЬ часто. См. выше в этой ветке в [19]
mas[i,j]=mas[i2,j2];
В данном случае компилятор сообщит об ошибке, потому что не сможет присвоить указатель. Но может быть ситуация, когда подобная ошибка не вызовет диагностики - просто работать будет не так как ожидалось. Например программа
#include <stdio.h>
void main() {
 int c[3][5];
 c[1][1] = 5;
 printf("%d\n", c[1,1]);
}

Откомпилируется и будет работать, но печатать будет некое большое число, а не 5.


 
MOA ©   (2005-09-05 11:16) [50]

>если sizeof(char) равно единице, я не знал, что бывает иначе
Хм, а разве иначе бывает? Я был уверен, что по стандарту sizeof(char) тождественно равно 1 - так определена операция sizeof.
(Вот в подтверждение кусок из MSDN - другого учебника по С быстро не найти:
The sizeof operator yields the size of its operand with respect to the size of type char.)
Другое дело, что к-во битов в char может быть разным ;).
И позвольте тоже парочку примеров:

int a, b, c;
...
//Как проще записать следующие операции?
a = ~a + 1;
b <<=1;
c >>=1;

:)



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.04 c
1-1124972628
lehich
2005-08-25 16:23
2005.09.25
запрос значения параметра (XMLDocument)


3-1123694565
Aleksandr.
2005-08-10 21:22
2005.09.25
Как снять ReadOnly с поля TADOQuery?


1-1125391752
nikolas
2005-08-30 12:49
2005.09.25
Пошаговое тестирование DLL


4-1122890368
Fin
2005-08-01 13:59
2005.09.25
Электронный справочник по Api


4-1122615320
Shamov Andrew
2005-07-29 09:35
2005.09.25
Процесс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский