LINUX.ORG.RU

Обучение программированию

 , , ,


1

4

Привет, а есть желающие поучить меня программировать?=)

Вдруг, кто-то хотел поучить родственников или друзей, а не вышло, но желание обучать осталось.

Уровень: хеллоуворлдщик.
Код1, Код2

Для тех кому лень качать линки на pastebin:
код1_pastebin, код2_pastebin

PS. Не троллинг. Проблема с кодировкой из-за того, что код писался в оффтопике.


Привет, а есть желающие поучить меня программировать?=)

Привет, а ты симпатичный?

Deleted ()
Ответ на: комментарий от olibjerd

Вполне возможно, код писался в винде.
Kwrite показывает норм, а вот Geany уже нет.

ChuCha ()

по второму примеру: попробуй вынести работу со Stack в отдельный модуль. для повторного использования, например.

conalex ★★★ ()

Сенсеи не существуют. Ни у кого, кроме книг не хватит терпения нас учить. А правильный код - залог опыта и ошибок, а не подзатыльников от старшего.

Weres ★★★ ()
Ответ на: комментарий от Weres

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

ChuCha ()
Ответ на: комментарий от LongLiveUbuntu

Мне не принципиально на чем учиться, если Вы можете за меня взяться, я буду изучать Ваш lang_name. С си начинал, потому что везде его советуют. На самом деле, надо было с паскаля начинать, там проще, намного проще все.

ChuCha ()

я тебе немного первую сократил

#include <stdio.h>
#include <string.h>

int main()
{
    char str[666];
    printf("Enter a string: ");
    fgets(str, sizeof(str), stdin);

    int count[128] = {0};
    int len = strlen(str);

    for (int i = 0; i < len; i++)
        if (str[i] > 32)
            count[(int)str[i]]++;

    for (int i = 32; i < 128; i++)
        if (count[i])
            printf("%c - %d\n", i, count[i]);
}
mix_mix ★★★★★ ()
Ответ на: комментарий от mittorn

Ну, если надо.

Сенсеи существуют. У всех, кроме книг, хватит терпения нас учить. А правильный код - залог не опыта и ошибок, а подзатыльников от старшего.

Weres ★★★ ()

лень разбирать и комментировать..

первое что в бросается в глаза - кривые комменты

        // Массив full_alphabet[total_number_letters] заполнить нулями
        for (i = 0; i < total_number_letters; i++)
                alphabet_matches[i] = 0;

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

ps/ неплохая практика - сначала художественно писать базовые коменты на родимом языке, а потом код который их реализует. Почти literacy programming

MKuznetsov ★★★★★ ()

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

pon4ik ★★★★★ ()
Ответ на: комментарий от ChuCha

навскидку, из того что имеется под рукой - сорцы тикля. Вообще как пример для подражания можешь взять почти любой проект прошедший «корпоративное горнило», то есть долго существовавший за чьи-то кровные деньги, а не чисто комьюнити

вот упомянутое

/*
 *----------------------------------------------------------------------
 *
 * CompileExprObj --
 *	Compile a Tcl expression value into ByteCode.
 *
 * Results:
 *	A (ByteCode *) is returned pointing to the resulting ByteCode.
 *	The caller must manage its refCount and arrange for a call to
 *	TclCleanupByteCode() when the last reference disappears.
 *
 * Side effects:
 *	The Tcl_ObjType of objPtr is changed to the "bytecode" type,
 *	and the ByteCode is kept in the internal rep (along with context
 *	data for checking validity) for faster operations the next time
 *	CompileExprObj is called on the same value.
 *
 *----------------------------------------------------------------------
 */

static ByteCode *
CompileExprObj(
    Tcl_Interp *interp,
    Tcl_Obj *objPtr)
{
    Interp *iPtr = (Interp *) interp;
    CompileEnv compEnv;		/* Compilation environment structure allocated
				 * in frame. */
    register ByteCode *codePtr = NULL;
				/* Tcl Internal type of bytecode. Initialized
				 * to avoid compiler warning. */

    /*
     * Get the expression ByteCode from the object. If it exists, make sure it
     * is valid in the current context.
     */
    if (objPtr->typePtr == &exprCodeType) {
	Namespace *namespacePtr = iPtr->varFramePtr->nsPtr;

	codePtr = objPtr->internalRep.twoPtrValue.ptr1;
	if (((Interp *) *codePtr->interpHandle != iPtr)
		|| (codePtr->compileEpoch != iPtr->compileEpoch)
		|| (codePtr->nsPtr != namespacePtr)
		|| (codePtr->nsEpoch != namespacePtr->resolverEpoch)
		|| (codePtr->localCachePtr != iPtr->varFramePtr->localCachePtr)) {
	    FreeExprCodeInternalRep(objPtr);
	}
    }
    if (objPtr->typePtr != &exprCodeType) {
	/*
	 * TIP #280: No invoker (yet) - Expression compilation.
	 */

	int length;
	const char *string = TclGetStringFromObj(objPtr, &length);

	TclInitCompileEnv(interp, &compEnv, string, length, NULL, 0);
	TclCompileExpr(interp, string, length, &compEnv, 0);

	/*
	 * Successful compilation. If the expression yielded no instructions,
	 * push an zero object as the expression's result.
	 */

	if (compEnv.codeNext == compEnv.codeStart) {
	    TclEmitPush(TclRegisterNewLiteral(&compEnv, "0", 1),
		    &compEnv);
	}

	/*
	 * Add a "done" instruction as the last instruction and change the
	 * object into a ByteCode object. Ownership of the literal objects and
	 * aux data items is given to the ByteCode object.
	 */

	TclEmitOpcode(INST_DONE, &compEnv);
	TclInitByteCodeObj(objPtr, &compEnv);
	objPtr->typePtr = &exprCodeType;
	TclFreeCompileEnv(&compEnv);
	codePtr = objPtr->internalRep.twoPtrValue.ptr1;
	if (iPtr->varFramePtr->localCachePtr) {
	    codePtr->localCachePtr = iPtr->varFramePtr->localCachePtr;
	    codePtr->localCachePtr->refCount++;
	}
#ifdef TCL_COMPILE_DEBUG
	if (tclTraceCompile == 2) {
	    TclPrintByteCodeObj(interp, objPtr);
	    fflush(stdout);
	}
#endif /* TCL_COMPILE_DEBUG */
    }
    return codePtr;
}

MKuznetsov ★★★★★ ()
Ответ на: комментарий от ChuCha

Не, я с паскаля начинал, по-моему с сей лучше. Задачки то найти не трудно, гугли всякие этюды для программистов, задачки на собеседованиях, можешь открывать rosetta code и делать задания сам, потом сравнивать, там категории есть и все такое.

Серьезнее небольших програмок уже наверное стоит смотреть проекты на гитхабе, например которые сам юзаешь, пробовать что-то в них менять и контрибьютить, вобщем все это тут написано http://www.catb.org/esr/faqs/hacking-howto.html

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

loz ★★★★★ ()
Ответ на: комментарий от ChuCha

Если хочешь реально чему-то научиться, а не быть посредственным мусором - забудь о такой отговорки, как «учебный код». Твой код либо на уровне, либо ты ни на что не годный мусор.

И да, выкинь свой маздайскую говнометодичку по С/С++. Спрашивать про сишку на лоре, где кроме школьников и с89старообрядцев с уровнем осиляторства в районе максимум 20-30% никого нет.

TrueTsar1C ()
Ответ на: комментарий от TrueTsar1C

ты терминировался не закончив предложение?

anonymous ()
Ответ на: комментарий от TrueTsar1C

Вообще мне не принципиален язык, умея программировать на одном, смогу на других. Маздайскую говнометодичку - это какая? C++ не нравится.

ChuCha ()
Ответ на: комментарий от MKuznetsov

Почитают обязательно, на русском, было бы конечно полезней, но спасибо

ChuCha ()
Ответ на: комментарий от mix_mix

на том же арме будет бо-бо

Я другое имел в виду. Хоть в массиве ты выделяешь 128 мест, на русских буквах не будет выхода за границы. Только вот сходу это не понятно.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

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

mittorn ★★★★★ ()
Последнее исправление: mittorn (всего исправлений: 1)
Ответ на: комментарий от ChuCha

Приношу свои глубочайшие извинения некоей оскорбленной группе «тупых учеников» ;)

Сосредоточься на обучении программированию :)

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от mittorn

В glibc учитываются signed/unsigned. Например функции isalpha, isupper и другие аналогичные из ctype.h хоть принимают параметром int, работают корректно на входном диапазоне [-128..255].

Ну и всегда есть -fsigned-char.

i-rinat ★★★★★ ()

Результат маллока кастовать не нужно.

Если уж комменты в C99-стиле, то можно и итераторы цикла объявлять в for: for (int i = ...

anonymous ()
Ответ на: комментарий от Hertz

Двачую этого адеквата. Если цель учить алгоритмы, а не байтоёбствовать — то нужны удобные языки для описания структур данных.

anonymous ()
Ответ на: комментарий от anonymous

Код на си был предоставлен исключительно из того, что на лоре он воспринимается более адекватно. А не потому что я привязан к языкам.

ChuCha ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.