Разговорник Pascal — C — различия между версиями
Ulysses (обсуждение | вклад) м (small changes; adduse to C90) |
Ulysses (обсуждение | вклад) |
||
(не показано 9 промежуточных версий этого же участника) | |||
Строка 43: | Строка 43: | ||
<source lang="C"> | <source lang="C"> | ||
+ | #include <locale.h> | ||
+ | /* ^ для работы с набором региональных настроек (локалью), в том числе | ||
+ | кодировкой символов; для использования setlocale и LC_ALL */ | ||
+ | |||
#include <stdio.h> | #include <stdio.h> | ||
/* ^ для printf, scanf -- ввод с клавиатуры */ | /* ^ для printf, scanf -- ввод с клавиатуры */ | ||
− | + | /* Порядок include обычно соответствует алфавитному порядку имён | |
− | + | включаемых файлов: locale.h, затем stdio.h */ | |
− | |||
int main() | int main() | ||
Строка 77: | Строка 80: | ||
<source lang="Pascal"> | <source lang="Pascal"> | ||
− | + | { Сумма цифр целого двузначного числа } | |
program Digits; | program Digits; | ||
Строка 93: | Строка 96: | ||
<source lang="c"> | <source lang="c"> | ||
+ | #include <locale.h> | ||
#include <stdio.h> | #include <stdio.h> | ||
− | |||
− | int main() { | + | int main() |
+ | { | ||
int n, d1, d2, dSum; /* целочисленные переменные */ | int n, d1, d2, dSum; /* целочисленные переменные */ | ||
Строка 124: | Строка 128: | ||
begin | begin | ||
− | + | Writeln('Введите значение угла в радианах'); | |
− | + | var x: double; | |
− | + | Readln(x); | |
− | + | Writeln('Проверяем основное тригонометрическое тождество: 1 = ', | |
sqr(sin(x)) + sqr(cos(x))); | sqr(sin(x)) + sqr(cos(x))); | ||
end. | end. | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="C"> |
− | #include < | + | #include <locale.h> |
− | #include < | + | #include <math.h> |
− | #include < | + | #include <stdio.h> |
− | + | int main() | |
− | + | { | |
− | int main() { | + | double x; /* для получения угла в радианах от пользователя */ |
− | + | setlocale(LC_ALL, ""); | |
− | + | printf("Введите значение угла в радианах: "); | |
− | + | scanf("%f", &x); | |
− | + | printf("Проверяем основное тригонометрическое тождество: 1 = %f\n", | |
− | + | pow(sin(x), 2) + pow(cos(x), 2)); | |
− | |||
} | } | ||
</source> | </source> | ||
Строка 157: | Строка 160: | ||
begin | begin | ||
− | + | { Случайное целое от 0 до 99 } | |
− | + | var n: integer; | |
− | + | n := Random(100); | |
− | + | Writeln(n); | |
− | + | { Случайное целое от 10 до 99 } | |
− | + | var n2: integer; | |
− | + | n2 := Random(10, 100); | |
− | + | Writeln(n2); | |
− | + | { Случайное вещественное от 0 до 1 } | |
− | + | var d: real; | |
− | + | d := Random; | |
− | + | Writeln(d); | |
end. | end. | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="C"> |
− | #include < | + | #include <locale.h> |
− | |||
− | |||
− | + | #include <stdio.h> | |
− | + | #include <stdlib.h> | |
− | + | /* ^ для использования генератора случайных чисел */ | |
− | + | #include <time.h> | |
− | + | /* ^ функции времени для инициализации генератора с. ч. */ | |
− | + | /* объявление констант: */ | |
− | + | #define a 10 | |
− | + | #define b 100 | |
− | + | int main() | |
− | + | { | |
− | + | int n1, n2; | |
− | + | double d; | |
− | + | ||
+ | setlocale(LC_ALL, ""); | ||
+ | srand(time(0)); /* инициализации генератора с. ч. -- | ||
+ | выполняется однажды в самом начале программы */ | ||
− | + | /* rand() генерирует псевдослучайное целое число от 0 до | |
− | + | константы RAND_MAX, значение которой не меньше, чем 32767 */ | |
− | + | ||
+ | /* Случайное целое от 0 до 99 */ | ||
+ | n1 = rand() % 100; | ||
+ | printf("%d\n", n1); | ||
+ | |||
+ | /* Случайное целое от a=10 до (b - 1)=99 */ | ||
+ | n2 = rand() % (b - a) + a; | ||
+ | printf("%d\n", n2); | ||
+ | |||
+ | /* Случайное вещественное от 0 до 1 */ | ||
+ | d = (double)(rand()) / RAND_MAX; | ||
+ | printf("%f\n", d); | ||
} | } | ||
</source> | </source> | ||
== Определение функций == | == Определение функций == | ||
− | В примерах ниже опущено включение (#include) уже знакомых заголовочных файлов | + | В примерах ниже опущено включение (#include) уже знакомых заголовочных файлов (примеры см. выше). |
0. Написать подпрограмму, печатающую «Здравствуй, мир!» на консоль и вызвать её в основной программе. | 0. Написать подпрограмму, печатающую «Здравствуй, мир!» на консоль и вызвать её в основной программе. | ||
<source lang="Pascal"> | <source lang="Pascal"> | ||
− | + | { Печать "Здравствуй, мир!" на консоль } | |
procedure HelloWorld; | procedure HelloWorld; | ||
begin | begin | ||
Строка 219: | Строка 234: | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="C"> |
− | / | + | /* Печать "Здравствуй, мир!" на консоль -- обязательный комментарий перед функцией */ |
− | void | + | void hello_world() |
− | + | /* тип возвращаемого значения — void указывает на отсутствие | |
+ | возвращаемого значения — аналог процедуры */ | ||
+ | { | ||
+ | printf("Здравствуй, мир!\n"); | ||
} | } | ||
− | + | ||
− | int main() { | + | int main() |
− | + | { | |
− | + | setlocale(LC_ALL, ""); | |
+ | hello_world(); | ||
} | } | ||
</source> | </source> | ||
Строка 234: | Строка 253: | ||
1. Написать функцию, вычисляющую гипотенузу по заданным катетам. | 1. Написать функцию, вычисляющую гипотенузу по заданным катетам. | ||
<source lang="Pascal"> | <source lang="Pascal"> | ||
− | + | { Значение гипотенузы по двум заданным катетам } | |
function Hypotenuse(a, b : real) : real; | function Hypotenuse(a, b : real) : real; | ||
begin | begin | ||
Строка 241: | Строка 260: | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="C"> |
// Значение гипотенузы по двум заданным катетам | // Значение гипотенузы по двум заданным катетам | ||
− | + | float hypotenuse(float a, float b) | |
+ | { | ||
return sqrt(a*a + b*b); | return sqrt(a*a + b*b); | ||
− | } | + | }</source> |
− | </source> | ||
− | 2. Написать | + | 2. Написать функцию, которая принимает три целых числа и возвращает истинностное значение условия: полученные числа составляют монотонную последовательность. С её помощью создать программу, печатающую на консоль «Данная последовательность монотонна: x», где x — истинностное значение данного условия (true/false или 1/0). |
<source lang="Pascal"> | <source lang="Pascal"> | ||
− | + | { Проверка трёх чисел на монотонность } | |
− | + | function IsMonotonic(a, b, c : integer): boolean; | |
begin | begin | ||
− | + | result := | |
((a < b) and (b < c)) or ((c < b) and (b < a))); | ((a < b) and (b < c)) or ((c < b) and (b < a))); | ||
end; | end; | ||
+ | |||
+ | var a, b, c: integer; | ||
+ | |||
+ | begin | ||
+ | { ввод a, b, c... } | ||
+ | Writeln("Данная последовательность монотонна: ", IsMonotonic(a, b, c)) | ||
+ | end. | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="C"> |
− | / | + | /* Проверка трёх чисел на монотонность */ |
− | + | int is_monotonic(int a, int b, int c) | |
− | + | { | |
− | + | /* версия 1: все возможные скобки --- тяжело читается | |
+ | return (((a < b) && (b < c)) || ((c < b) && (b < a))); */ | ||
+ | |||
+ | /* версия 2: без лишних скобок с учетом (естественного) приоритета операций */ | ||
+ | return a < b && b < c || c < b && b < a; | ||
} | } | ||
− | + | ||
− | + | int main() | |
− | / | + | { |
− | + | /* необходимые действия: объявление переменных a, b, c, set_locale, ввод | |
− | + | ... | |
− | + | */ | |
− | + | ||
+ | printf("Данная последовательность монотонна: %d", is_monotonic(a, b, c)); | ||
} | } | ||
</source> | </source> | ||
Строка 277: | Строка 308: | ||
3. Написать подпрограмму, которая по заданному двухзначному целому числу ''n'' возвращает два однозначных числа, определённых первой и второй цифрами ''n''. | 3. Написать подпрограмму, которая по заданному двухзначному целому числу ''n'' возвращает два однозначных числа, определённых первой и второй цифрами ''n''. | ||
<source lang="Pascal"> | <source lang="Pascal"> | ||
− | + | { разбиение целого двузначного числа n на цифры } | |
procedure Figures(n: integer; var first, second : integer); | procedure Figures(n: integer; var first, second : integer); | ||
begin | begin | ||
Строка 284: | Строка 315: | ||
end; | end; | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="C"> |
− | / | + | /* разбиение целого двузначного числа n на цифры */ |
− | void figures(int n, int | + | void figures(int n, int * first, int * second) |
− | first = n / 10; | + | { |
− | second = n % 10; | + | *first = n / 10; |
+ | *second = n % 10; | ||
} | } | ||
+ | /* вызов: figures(n, &d1, &d2); -- по аналогии со scanf */ | ||
</source> | </source> | ||
Строка 304: | Строка 337: | ||
end; | end; | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="C"> |
− | int f(int x) { | + | int f(int x) |
− | if (x < -2 || 2 < x) | + | { |
− | + | /* версия 1: условный оператор + ненужный else | |
− | + | if (x < -2 || 2 < x) | |
− | + | return 2 * x; | |
− | + | else | |
− | + | return -3 * x; | |
− | < | + | */ |
− | + | ||
− | // | + | /* версия 2: условный оператор без ненужного else |
+ | if (x < -2 || 2 < x) | ||
+ | return 2 * x; | ||
+ | return -3 * x; | ||
+ | */ | ||
+ | |||
+ | /* версия 3: тернарная условная операция */ | ||
return (x < -2 || 2 < x) ? (2 * x) : (-3 * x); | return (x < -2 || 2 < x) ? (2 * x) : (-3 * x); | ||
} | } | ||
Строка 322: | Строка 361: | ||
5. Даны целые числа K и N (N > 0). Вывести N раз число K. | 5. Даны целые числа K и N (N > 0). Вывести N раз число K. | ||
<source lang="Pascal"> | <source lang="Pascal"> | ||
− | + | { Печать числа K ровно N раз } | |
procedure PrintNtimes(K, N: integer); | procedure PrintNtimes(K, N: integer); | ||
var i : integer; | var i : integer; | ||
Строка 330: | Строка 369: | ||
end; | end; | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="C"> |
− | / | + | /* Печать числа K ровно N раз */ |
− | void | + | void print_n_times(int K, int N) |
− | for ( | + | { |
− | + | int i; | |
+ | for (i = 0; i < N; ++i) | ||
+ | { | ||
+ | printf("%d ", K); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | 6. Дано целое число. Определить количество цифр в нём. | ||
+ | <source lang="Pascal"> | ||
+ | function DigitCount(n: integer): integer; | ||
+ | begin | ||
+ | if (n = 0) then | ||
+ | begin | ||
+ | result := 1; | ||
+ | exit; | ||
+ | end; | ||
+ | while n <> 0 do | ||
+ | begin | ||
+ | n := n div 10; | ||
+ | result := result + 1; | ||
+ | end; | ||
+ | end; | ||
+ | </source> | ||
+ | <source lang="C"> | ||
+ | int digit_count(int n) | ||
+ | { | ||
+ | int res = 0; | ||
+ | if (!n) | ||
+ | return 1; | ||
+ | while (n) | ||
+ | { | ||
+ | /* n % 10 -- очередная цифра числа; если требуется */ | ||
+ | n /= 10; | ||
+ | ++res; | ||
+ | } | ||
+ | return res; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | 7. Дана последовательность целых чисел, заканчивающаяся нулём, подсчитать её длину. | ||
+ | <source lang="Pascal"> | ||
+ | function SeqLength: integer; | ||
+ | var x: integer; | ||
+ | begin | ||
+ | while true do | ||
+ | begin | ||
+ | Readln(x); | ||
+ | if x = 0 then | ||
+ | break; | ||
+ | result := result + 1; | ||
+ | end; | ||
+ | end; | ||
+ | </source> | ||
+ | <source lang="C"> | ||
+ | void seq_length() | ||
+ | { | ||
+ | int x, res = 0; | ||
+ | while (1) | ||
+ | { | ||
+ | scanf("%d", &x); | ||
+ | if (!x) | ||
+ | break; | ||
+ | ++res; | ||
} | } | ||
} | } | ||
</source> | </source> | ||
− | [[Категория:C | + | |
+ | [[Категория:C]] | ||
+ | [[Категория:Разговорники]] |
Текущая версия на 14:28, 11 сентября 2013
Содержание
Ниже приведены примеры программ на двух языках: на Pascal и на C. В комментариях отмечены основные отличительные черты языка C — прочитайте эти комментарии внимательно.
Простейшие программы
1. Вывести приветствие "Hello, world".
begin
Writeln('Hello, world');
end.
#include <stdio.h>
/* ^ вставка текста стандартного заголовочного файла stdio.h
для использования стандартных средств
ввода-вывода (в данном случае — функции printf) */
int main()
{
printf("Hello, world\n"); // вызов функции printf
// обратите внимание на
// двойные кавычки для строковых литералов!
// \n -- символ перехода на новую строку
}
2. Вычислить площадь треугольника по заданным основанию и высоте.
program TriangleSquare;
var a, h: real;
begin
Writeln('Введите основание и высоту');
Readln(a, h);
Writeln('S = ', a * h / 2);
end.
#include <locale.h>
/* ^ для работы с набором региональных настроек (локалью), в том числе
кодировкой символов; для использования setlocale и LC_ALL */
#include <stdio.h>
/* ^ для printf, scanf -- ввод с клавиатуры */
/* Порядок include обычно соответствует алфавитному порядку имён
включаемых файлов: locale.h, затем stdio.h */
int main()
{
/* две вещественные переменные ("переменные с плавающей точкой"): */
float a, h; /* переменные следует объявлять как можно ближе
к месту первого использования, но только в начале
блока (то есть сразу после символа '{') */
setlocale(LC_ALL, ""); /* позволит отображать кириллицу в консоли */
printf("Введите основание и высоту: ");
/* чтение с клавиатуры: */
scanf("%f %f", &a, &h);
/* арг #1: формат вводимых данных; %f - для числа с плавающей точкой
арг #2, 3: адреса (&) переменных для записи результата */
printf("S = %f\n", a * h / 2);
/* %f - "местоблюститель" (placeholder) для числа с плавающей
точкой (float); вместо %f будет подставлено значение, заданное
во втором аргументе printf */
}
3. Вычислить сумму цифр заданного целого двузначного числа.
{ Сумма цифр целого двузначного числа }
program Digits;
var n, d1, d2, digitsSum: integer;
begin
Writeln('Введите целое двузначное число');
Readln(n);
d1 := n div 10;
d2 := n mod 10;
digitsSum := d1 + d2;
Writeln('S = ', digitsSum);
end.
#include <locale.h>
#include <stdio.h>
int main()
{
int n, d1, d2, dSum; /* целочисленные переменные */
setlocale(LC_ALL, "");
printf("Введите целое двузначное число: ");
/* чтение с клавиатуры: */
scanf("%d", &n);
/* арг #1: формат вводимых данных;
%d - для целого числа в десятичной форме (decimal)
арг #2: адреса переменной для записи результата */
d1 = n / 10; // серия даже коротких операций пишется ТОЛЬКО В СТОЛБИК
d2 = n % 10; // то есть переход на новую строку обязателен!
dSum = d1 + d2; // этого требуют соглашения об оформлении исходных
// кодов, но не сам язык
printf("Сумма цифр в числе %d равна %d\n", n, dSum);
}
4. Проверить, выполняется ли основное тригонометрическое тождество для заданного угла в радианах.
program SinCos;
begin
Writeln('Введите значение угла в радианах');
var x: double;
Readln(x);
Writeln('Проверяем основное тригонометрическое тождество: 1 = ',
sqr(sin(x)) + sqr(cos(x)));
end.
#include <locale.h>
#include <math.h>
#include <stdio.h>
int main()
{
double x; /* для получения угла в радианах от пользователя */
setlocale(LC_ALL, "");
printf("Введите значение угла в радианах: ");
scanf("%f", &x);
printf("Проверяем основное тригонометрическое тождество: 1 = %f\n",
pow(sin(x), 2) + pow(cos(x), 2));
}
5. Вывести случайные целые от 0 до 99 и от 10 до 99, а также случайное вещественное от 0 до 1.
program Randoms;
begin
{ Случайное целое от 0 до 99 }
var n: integer;
n := Random(100);
Writeln(n);
{ Случайное целое от 10 до 99 }
var n2: integer;
n2 := Random(10, 100);
Writeln(n2);
{ Случайное вещественное от 0 до 1 }
var d: real;
d := Random;
Writeln(d);
end.
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
/* ^ для использования генератора случайных чисел */
#include <time.h>
/* ^ функции времени для инициализации генератора с. ч. */
/* объявление констант: */
#define a 10
#define b 100
int main()
{
int n1, n2;
double d;
setlocale(LC_ALL, "");
srand(time(0)); /* инициализации генератора с. ч. --
выполняется однажды в самом начале программы */
/* rand() генерирует псевдослучайное целое число от 0 до
константы RAND_MAX, значение которой не меньше, чем 32767 */
/* Случайное целое от 0 до 99 */
n1 = rand() % 100;
printf("%d\n", n1);
/* Случайное целое от a=10 до (b - 1)=99 */
n2 = rand() % (b - a) + a;
printf("%d\n", n2);
/* Случайное вещественное от 0 до 1 */
d = (double)(rand()) / RAND_MAX;
printf("%f\n", d);
}
Определение функций
В примерах ниже опущено включение (#include) уже знакомых заголовочных файлов (примеры см. выше).
0. Написать подпрограмму, печатающую «Здравствуй, мир!» на консоль и вызвать её в основной программе.
{ Печать "Здравствуй, мир!" на консоль }
procedure HelloWorld;
begin
Writeln('Здравствуй, мир!');
end;
begin
HelloWorld
end.
/* Печать "Здравствуй, мир!" на консоль -- обязательный комментарий перед функцией */
void hello_world()
/* тип возвращаемого значения — void указывает на отсутствие
возвращаемого значения — аналог процедуры */
{
printf("Здравствуй, мир!\n");
}
int main()
{
setlocale(LC_ALL, "");
hello_world();
}
1. Написать функцию, вычисляющую гипотенузу по заданным катетам.
{ Значение гипотенузы по двум заданным катетам }
function Hypotenuse(a, b : real) : real;
begin
result := sqrt(sqr(a) + sqr(b));
end;
// Значение гипотенузы по двум заданным катетам
float hypotenuse(float a, float b)
{
return sqrt(a*a + b*b);
}
2. Написать функцию, которая принимает три целых числа и возвращает истинностное значение условия: полученные числа составляют монотонную последовательность. С её помощью создать программу, печатающую на консоль «Данная последовательность монотонна: x», где x — истинностное значение данного условия (true/false или 1/0).
{ Проверка трёх чисел на монотонность }
function IsMonotonic(a, b, c : integer): boolean;
begin
result :=
((a < b) and (b < c)) or ((c < b) and (b < a)));
end;
var a, b, c: integer;
begin
{ ввод a, b, c... }
Writeln("Данная последовательность монотонна: ", IsMonotonic(a, b, c))
end.
/* Проверка трёх чисел на монотонность */
int is_monotonic(int a, int b, int c)
{
/* версия 1: все возможные скобки --- тяжело читается
return (((a < b) && (b < c)) || ((c < b) && (b < a))); */
/* версия 2: без лишних скобок с учетом (естественного) приоритета операций */
return a < b && b < c || c < b && b < a;
}
int main()
{
/* необходимые действия: объявление переменных a, b, c, set_locale, ввод
...
*/
printf("Данная последовательность монотонна: %d", is_monotonic(a, b, c));
}
3. Написать подпрограмму, которая по заданному двухзначному целому числу n возвращает два однозначных числа, определённых первой и второй цифрами n.
{ разбиение целого двузначного числа n на цифры }
procedure Figures(n: integer; var first, second : integer);
begin
first := n div 10;
second := n mod 10;
end;
/* разбиение целого двузначного числа n на цифры */
void figures(int n, int * first, int * second)
{
*first = n / 10;
*second = n % 10;
}
/* вызов: figures(n, &d1, &d2); -- по аналогии со scanf */
4. Написать функцию целочисленного аргумента, возвращающее целое число по правилу:
function f(x: integer) : integer;
begin
if (x < -2) or (2 < x) then
result := 2 * x
else
result := -3 * x;
end;
int f(int x)
{
/* версия 1: условный оператор + ненужный else
if (x < -2 || 2 < x)
return 2 * x;
else
return -3 * x;
*/
/* версия 2: условный оператор без ненужного else
if (x < -2 || 2 < x)
return 2 * x;
return -3 * x;
*/
/* версия 3: тернарная условная операция */
return (x < -2 || 2 < x) ? (2 * x) : (-3 * x);
}
5. Даны целые числа K и N (N > 0). Вывести N раз число K.
{ Печать числа K ровно N раз }
procedure PrintNtimes(K, N: integer);
var i : integer;
begin
for i := 1 to N do
Write(K, ' ');
end;
/* Печать числа K ровно N раз */
void print_n_times(int K, int N)
{
int i;
for (i = 0; i < N; ++i)
{
printf("%d ", K);
}
}
6. Дано целое число. Определить количество цифр в нём.
function DigitCount(n: integer): integer;
begin
if (n = 0) then
begin
result := 1;
exit;
end;
while n <> 0 do
begin
n := n div 10;
result := result + 1;
end;
end;
int digit_count(int n)
{
int res = 0;
if (!n)
return 1;
while (n)
{
/* n % 10 -- очередная цифра числа; если требуется */
n /= 10;
++res;
}
return res;
}
7. Дана последовательность целых чисел, заканчивающаяся нулём, подсчитать её длину.
function SeqLength: integer;
var x: integer;
begin
while true do
begin
Readln(x);
if x = 0 then
break;
result := result + 1;
end;
end;
void seq_length()
{
int x, res = 0;
while (1)
{
scanf("%d", &x);
if (!x)
break;
++res;
}
}