Форум: "Потрепаться";
Текущий архив: 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