Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

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

 
БарЛог ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.029 c
14-1125377598
stud
2005-08-30 08:53
2005.09.25
литература по SQL SERVER 2000


2-1124355965
Гость22
2005-08-18 13:06
2005.09.25
Как в поле DBLookupComboBox1 уствновить необходимое ...


14-1125250066
Ксардас
2005-08-28 21:27
2005.09.25
Что это за сетевая атака такая Helkern?


8-1115675408
ronyn
2005-05-10 01:50
2005.09.25
Как типизировать DragQueryFile в разделе var?


1-1125307874
Виталька2005
2005-08-29 13:31
2005.09.25
Прога не запускается с диска