PDA

Просмотр полной версии : Учю C =)


nix
01.07.2006, 07:44
Вобщем решил наконецто таки поучить немного C вот что из этого вышло, хочю услышать как вам это для первого раза и есть ли задатки на более что то крупнее =) . строго не судить. И сразу вопрос к знатокам можно ли писать по русски ? Несчитая каменты //....

//Скрипт переводит унции в стаканы, там где я живу там используют унции...

# include "stdio.h"
int o_to_c (int ounces);

main ( )
{
int ounces, cup;
printf("\n Number of ounces ", ounces) ;
scanf("%d", &ounces);
cup = o_to_c(ounces);
prinf("\n%d ounces equal %d cumps\n\n", ounces, cup);
return;
}

//Считаем стаканы...
int o_to_c (int ounces1)
{
int cup1;
if (ounces1)
{
if (!(ounces1 % 8))
cup1 = ounces1 / 8;
else
cup1 = ounces1 / 8 + 1;
}
else
cup1 = 0;
return (cup1);
}

nerezus
01.07.2006, 09:04
main ( ) не указан тим main()

return; return не может использоваться без параметров.

ну и оформление кода жестоко кривое =)

Smith
01.07.2006, 20:54
Ну во первых, тип main можно и не указывать, и так прекрасно линкуется и работает.
Во вторых, return может быть без параметров, и используется для принудительного завершения функции.
Ну и в третьих, для того, чтобы текст отображался по-русски, используй функцию
CharToOem(char*,char*);
необходимо подключение хедера windows.h

Пример:

#include <windows.h>
...

char str[]="Количество унций";
CharToOem(str,str);
cout<<str; //или printf

//--------------------------

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

2nerezus
таким ламерам, как ты, вообще не следует лезть в форумы по кодингу, пока язык не выучишь

ZaCo
01.07.2006, 21:18
2Smith есть выражение - можно, но не нужно. нужно делать как надо, а не как можно.

Smith
01.07.2006, 21:23
2ZaCo

А нужно так, как этого требует данный код.
int main()
void main()
int main(int argc, char *argv[])
как нужно? спорный вопрос. Пусть пишет, как хочет

ZaCo
01.07.2006, 21:26
да пусть делает вообще че хочет) данный kод требует void main()

nerezus
01.07.2006, 22:22
Повторю. Если компилятор принимает кривой код, это не значит, что код правильный.

Smith, более того, ты даже не знаешь отличия между с и с++ (советуешь ему cout<<str), а уже лезешь учить тех, кто в отличии от тебя хоть что-то знает.

nerezus
01.07.2006, 22:25
спорный вопрос не спорный. пшел-ка читать спецификацию =)

даже компиляторы твой бред не в состоянии проглотить:return type of `main' is not `int'

Deem3n®
01.07.2006, 22:34
Что вы к main придрались? Хорошим стилем программирования считается указание типа возвращаемого значения для всех функций, КРОМЕ main (сами подумайте почему).

ЗЫ:
кто предложит альтернативу выражения:cup1 = ounces1 / 8;которая будет работать быстрее получит +

hidden
01.07.2006, 22:42
cup1 = ounces1>>3;

Deem3n®
01.07.2006, 22:45
адназначно + =))

nix
02.07.2006, 03:25
Спасиб Smith терь буду знать как по русски писать :)
Кода компилировал ошибок небыло, и скрипт работал :)
cc cups.c

nerezus
04.07.2006, 10:22
Что вы к main придрались? Хорошим стилем программирования считается указание типа возвращаемого значения для всех функций, КРОМЕ main (сами подумайте почему). Ой, а давай ты не будешь нести бред, договорились? Причем еще так пафосно(КРОМЕ main (сами подумайте почему)).

Вот:
The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }

Deem3n®
04.07.2006, 10:58
Ты что не знаешь что если не указывать тип возвращаемого значения, то это по умолчанию int?
nerezus - и к чему твоя цитата?
И еще:
Хороший стиль программирования.
Несмотря на то, что пропущенный тип возвращаемого значения по умолчанию int, всегда задавайте тип возвращаемого значения явным образом. Исключением является функция main, для которой тип возвращаемого значения обычно не указываетсяБудешь придиратся к словам - попадешь в игнор.

nerezus
04.07.2006, 11:05
nerezus - и к чему твоя цитата? к тому, что надо писать int main()

Ты что не знаешь что если не указывать тип возвращаемого значения, то это по умолчанию int? если не указывать тип возвращаемого значения, то это ошибка:

At least one type specifier shall be given in the declaration specifiers in each declaration

Учи C =)

Будешь придиратся к словам - попадешь в игнор. Я не придираюсь к неточностям, опечаткам и т.д. но если написано в корне неверно, то я обычно это сразу замечаю и говорю, что это неправильно. Вдруг новички прочитают и будут делать так же?

Deem3n®
04.07.2006, 11:18
если не указывать тип возвращаемого значения, то это ошибка
http://img88.imageshack.us/img88/3733/untitled3qz.jpg
ну ну
мля, спор ни о чем
ЗЫ:
Учи C =)учу, учу - зырь мой статус :D

nerezus
04.07.2006, 11:29
Кстати, к чему картинка?
Усли компилер проглотил ошибку - это не значит, что ее нету ;)
Сейчас вроде ни один компилер полноценно не соблюдает c99. Но это еще не значит, что можно писать неправильно.


мля, спор ни о чем Как это ни о чем? Это же фундаментальные основы языка =)
ну и к тому же я оказался прав(подтвердил цитатами из спецификации) =)
А вообще я этот гребаный сишнег не знаю и знать не хочу

Deem3n®
04.07.2006, 11:47
Эп .. а мои цитаты не в счет? Мля наверное я слепой, но не вижу ни одной ошибки (компилер проглотил ошибку - ну ну). Дабы не превращать тему в клоунаду, я закрою топик и каждый отстанется при своем мнении.

nerezus
04.07.2006, 12:25
Мля наверное я слепой, но не вижу ни одной ошибки Мда... Я же тебе их указал. И привел цитаты из спецификации.

Я понял: ты путаешь язык C и его конкретную реализацию в Visual Studio.
С точки зрения языка это ошибка. С точки зрения Visual Studio - не ошибка.

Но говорим то мы про язык.

nerezus
04.07.2006, 16:10
я закрою топик а вдруг кто-нить высказаться захочет? =)

кстати, еще и это подсказали:
Major changes from the previous edition include:
...
— remove implicit int

qBiN
04.07.2006, 17:40
По мойму return; можно не указывать тип main нельзя.
Стандарт поддерживает мало компиляторов,почитайте Криса Касперски он говорил который ближе к стандарту...

nc.STRIEM
07.07.2006, 00:22
По мойму return; можно не указывать тип main нельзя.

Ниче не понял из того что ты сказал)))
Вобще в C можно не указывать твз а вот идеология С++ этого требует! и под майкрософтом 6 это будет ошибкой!

nerezus
07.07.2006, 11:07
Вобще в C можно не указывать нельзя. Выдержка из стандартов на предыдущей странице.

Deem3n®
07.07.2006, 11:25
нельзя. Выдержка из стандартов на предыдущей странице.Самое интересное то что я не упоминал о стандартах, а о хорошем стиле программирования.
Я всегда писал и буду писать main() без int до тех пор пока компилятор не будет выдавать предупреждение или ошибку потому что в многих компиляторах если не указывать тип возвращаемого значения, то это по умолчанию int

nerezus
07.07.2006, 12:32
а о хорошем стиле программирования. разве нарушения синтаксиса языка может являться хорошим стилем?

ответь на этот вопрос.

Deem3n®
07.07.2006, 12:47
Отвечу вопросом на вопрос.
cейчас вроде ни один компилер полноценно не соблюдает c99Разве эти компиляторы можно считать С компиляторами?

sn0w
07.07.2006, 13:35
хороший стиль, это когда код спокойно читается, а не выглядит продуктом обфускатора.

Rabid Rabbit
07.07.2006, 14:27
Короче попытаюсь рассудить пока до мордобоя не дошло=)
"считается хорошим стилем программирования" - где и кем считается? возможно в других местах и другими людьми считается "хорошим стилем программирование" как раз обратное?
ты путаешь язык C и его конкретную реализацию в Visual Studio.
С точки зрения языка это ошибка. С точки зрения Visual Studio - не ошибка.
Это не ошибка также с точки зрения борланд Си, ватком Си да и куче других, так что ни микрософт ни висуал студия тут никаким боком.
если не указывать тип возвращаемого значения, то это по умолчанию int а вот тут вы все неправы. тип возвращаемого значения зависит от интерпретации: это может быть char, short, int и даже long (знаковые или без - как хотите) если нужно. применительно же к консольным приложениям и функции main() в частности - это всего-навсего char. А в общем смысле - все что на выходе функции находится в регистре eax/ax/al (иногда компиляторы используют пару dx:ax/edx:eax если нужно вернуть б`ольшее значение) - и есть возвращаемое значение функции.

Ну все, хватит об этом, ато все вцепились в мэин и даже никто не заметил что:
printf("\n Number of ounces ", ounces);
а также что
int o_to_c (int ounces1)
{
int cup1;
if (ounces1)
{
if (!(ounces1 % 8))
cup1 = ounces1 / 8;
else
cup1 = ounces1 / 8 + 1;
}
else
cup1 = 0;
return (cup1);
}
можно записать попроще:

int o_to_c (int ounces1){
int cup1=ounces1>>3;
if (ounces1&7) cup1++;
return cup1;
}

da_ff
11.07.2006, 12:30
Емли уж такая херня со стилем пошла еще от себя могу добавить:
cup1 = !(ounces1 % 8) ? ouncess1>>3 : ounces1 >>3 + 1;

А что касается main то если компилятор сьел отсутствие типа то это не ошибка всеравно в eax запишется integer и программа никак не упадет из-за этого.

Rabid Rabbit
12.07.2006, 19:54
da_ff, дружочек, % - это деление а & - побитовый AND с маской. как ты думаешь что работает быстрее? И еще скобочки забыл, да: (ounces1 >>3) + 1; ?

nerezus
12.07.2006, 22:53
Пох что работает быстрей, т.к. понятность намного важнее, чем скорость работы.

da_ff
13.07.2006, 00:01
Для временно незрячих: написано СТИЛЬ, а не СКОРОСТЬ, а так согласен, однако глупая тема для спора.

Rabid Rabbit
13.07.2006, 11:34
Ну блин, какой такой стиль? В этом сезоне весна-лето принято програмить вот так-то и так-то. А тот кто програмит не так - немодный пацан? =) Програмить нужно практично. т.е. какой вообще смысл использовать % по модулю степени двойки, если можно записать оптимальнее? А тот для кого это недостаточно наглядно может идти доучиваться дальше. Если я один чегото там пишу то я пишу прежде все так как мне удобней чтобы легко разбираться самому в своем же коде. А если мы пишем в группе, или исходный текст планируется сделать общедоступным, - тогда можно воспользоваться венгерской нотацией, структурным, процедурным, логическим или объектно-ориентировочным подходом.

ЗЫ. Вы же сами себе противоречите: почему тогда >>3 а не /8 ? =)

da_ff
13.07.2006, 12:25
Ну епте яж уже согласился, так продуктивнее, под стилем я имел ввиду конструкцию замещающую if(){}else{}.
И еще порабы закончить тему, за ненадобностью.