Разговорник Pascal — C — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(#5)
 
(не показано 7 промежуточных версий этого же участника)
Строка 80: Строка 80:
  
 
<source lang="Pascal">
 
<source lang="Pascal">
// Сумма цифр целого двузначного числа
+
{ Сумма цифр целого двузначного числа }
 
program Digits;
 
program Digits;
  
Строка 160: Строка 160:
  
 
begin
 
begin
  // Случайное целое от 0 до 99
+
    { Случайное целое от 0 до 99 }
  var n: integer;
+
    var n: integer;
  n := Random(100);
+
    n := Random(100);
  Writeln(n);
+
    Writeln(n);
  
  // Случайное целое от 10 до 99
+
    { Случайное целое от 10 до 99 }
  var n2: integer;
+
    var n2: integer;
  n2 := Random(10, 100);
+
    n2 := Random(10, 100);
  Writeln(n2);
+
    Writeln(n2);
  
  // Случайное вещественное от 0 до 1
+
    { Случайное вещественное от 0 до 1 }
  var d: real;
+
    var d: real;
  d := Random;
+
    d := Random;
  Writeln(d);
+
    Writeln(d);
 
end.
 
end.
 
</source>
 
</source>
Строка 219: Строка 219:
  
 
== Определение функций ==
 
== Определение функций ==
В примерах ниже опущено включение (#include) уже знакомых заголовочных файлов и директивы using (примеры см. выше).
+
В примерах ниже опущено включение (#include) уже знакомых заголовочных файлов (примеры см. выше).
  
 
0. Написать подпрограмму, печатающую «Здравствуй, мир!» на консоль и вызвать её в основной программе.
 
0. Написать подпрограмму, печатающую «Здравствуй, мир!» на консоль и вызвать её в основной программе.
 
<source lang="Pascal">
 
<source lang="Pascal">
// Печать «Здравствуй, мир!» на консоль
+
{ Печать "Здравствуй, мир!" на консоль }
 
procedure HelloWorld;
 
procedure HelloWorld;
 
begin
 
begin
Строка 234: Строка 234:
 
</source>
 
</source>
  
<source lang="Cpp">
+
<source lang="C">
// Печать «Здравствуй, мир!» на консоль
+
/* Печать "Здравствуй, мир!" на консоль -- обязательный комментарий перед функцией */
void HelloWorld() { // void указывает на отсутствие возвращаемого значения — аналог процедуры
+
void hello_world()
     cout << "Здравствуй, мир!" << endl;
+
/* тип возвращаемого значения — void указывает на отсутствие  
 +
                        возвращаемого значения — аналог процедуры */
 +
{
 +
     printf("Здравствуй, мир!\n");
 
}
 
}
 
+
int main() {
+
int main()  
     std::locale::global(std::locale(""));
+
{
     HelloWorld(); // Обратите внимание: () и ; необходимы!!!
+
     setlocale(LC_ALL, "");
 +
     hello_world();
 
}
 
}
 
</source>
 
</source>
Строка 249: Строка 253:
 
1. Написать функцию, вычисляющую гипотенузу по заданным катетам.
 
1. Написать функцию, вычисляющую гипотенузу по заданным катетам.
 
<source lang="Pascal">
 
<source lang="Pascal">
// Значение гипотенузы по двум заданным катетам
+
{ Значение гипотенузы по двум заданным катетам }
 
function Hypotenuse(a, b : real) : real;
 
function Hypotenuse(a, b : real) : real;
 
begin
 
begin
Строка 256: Строка 260:
 
</source>
 
</source>
  
<source lang="Cpp">
+
<source lang="C">
 
// Значение гипотенузы по двум заданным катетам
 
// Значение гипотенузы по двум заданным катетам
double hypotenuse(double a, double b) {
+
float hypotenuse(float a, float b)
 +
{
 
     return sqrt(a*a + b*b);
 
     return sqrt(a*a + b*b);
}
+
}</source>
</source>
 
  
  
2. Написать подпрограмму, принимающую три целых числа и печатающую на консоль «Given sequence is monotonic: x», где x — истинностное значение условия: полученные числа составляют монотонную последовательность.
+
2. Написать функцию, которая принимает три целых числа и возвращает истинностное значение условия: полученные числа составляют монотонную последовательность. С её помощью создать программу, печатающую на консоль «Данная последовательность монотонна: x», где x — истинностное значение данного условия (true/false или 1/0).
 
<source lang="Pascal">
 
<source lang="Pascal">
// Проверка трёх чисел на монотонность
+
{ Проверка трёх чисел на монотонность }
procedure IsMonotonic(a, b, c : integer);
+
function IsMonotonic(a, b, c : integer): boolean;
 
begin
 
begin
    Writeln("Given sequence is monotonic: ",
+
    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="Cpp">
+
<source lang="C">
// Проверка трёх чисел на монотонность
+
/* Проверка трёх чисел на монотонность */
void isMonotonic(int a, int b, int c) {
+
int is_monotonic(int a, int b, int c)
     cout << "Given sequence is monotonic: " <<
+
{
        (((a < b) && (b < c)) || ((c < b) && (b < a))) << endl;
+
     /* версия 1: все возможные  скобки --- тяжело читается
 +
    return (((a < b) && (b < c)) || ((c < b) && (b < a))); */
 +
 
 +
    /* версия 2:  без лишних скобок с учетом (естественного) приоритета операций */
 +
    return a < b && b < c || c < b && b < a;
 
}
 
}
</source>
+
 
<source lang="Cpp">
+
int main()
// Проверка трёх чисел на монотонность
+
{
void isMonotonic(int a, int b, int c) {
+
    /* необходимые действия: объявление переменных a, b, c, set_locale, ввод
     cout << "Given sequence is monotonic: " <<
+
      ...
        // ver. 2 --  без лишних скобок с учетом приоритета операций
+
    */
        (a < b && b < c || c < b && b < a) << endl;
+
 
 +
     printf("Данная последовательность монотонна: %d", is_monotonic(a, b, c));
 
}
 
}
 
</source>
 
</source>
Строка 292: Строка 308:
 
3. Написать подпрограмму, которая по заданному двухзначному целому числу ''n'' возвращает два однозначных числа, определённых первой и второй цифрами ''n''.
 
3. Написать подпрограмму, которая по заданному двухзначному целому числу ''n'' возвращает два однозначных числа, определённых первой и второй цифрами ''n''.
 
<source lang="Pascal">
 
<source lang="Pascal">
// разбиение целого двузначного числа n на цифры
+
{ разбиение целого двузначного числа n на цифры }
 
procedure Figures(n: integer; var first, second : integer);
 
procedure Figures(n: integer; var first, second : integer);
 
begin
 
begin
Строка 299: Строка 315:
 
end;
 
end;
 
</source>
 
</source>
<source lang="Cpp">
+
<source lang="C">
// разбиение целого двузначного числа n на цифры
+
/* разбиение целого двузначного числа n на цифры */
void figures(int n, int & first, int & second) {
+
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>
  
Строка 319: Строка 337:
 
end;
 
end;
 
</source>
 
</source>
<source lang="Cpp">
+
<source lang="C">
int f(int x) {
+
int f(int x)  
     if (x < -2 || 2 < x) // ver. 1 -- оператор if
+
{
        return 2 * x;
+
     /* версия 1: условный оператор + ненужный else
    else
+
      if (x < -2 || 2 < x)  
        return -3 * x;
+
          return 2 * x;
}
+
      else
</source>
+
          return -3 * x;
<source lang="Cpp">
+
    */
int f(int x) {
+
 
     // ver. 2 -- условная операция(?:) :
+
    /* версия 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);
 
}
 
}
Строка 337: Строка 361:
 
5. Даны целые числа K и N (N > 0). Вывести N раз число K.
 
5. Даны целые числа K и N (N > 0). Вывести N раз число K.
 
<source lang="Pascal">
 
<source lang="Pascal">
// Печать числа K ровно N раз
+
{ Печать числа K ровно N раз }
 
procedure PrintNtimes(K, N: integer);
 
procedure PrintNtimes(K, N: integer);
 
var i : integer;
 
var i : integer;
Строка 345: Строка 369:
 
end;
 
end;
 
</source>
 
</source>
<source lang="Cpp">
+
<source lang="C">
// Печать числа K ровно N раз
+
/* Печать числа K ровно N раз */
void printNtimes(int K, int N) {
+
void print_n_times(int K, int N)
     for (int i = 0; i < N; ++i) {
+
{
         cout << K << " ";
+
    int i;
 +
     for (i = 0; i < N; ++i)
 +
    {
 +
         printf("%d ", K);
 
     }
 
     }
 
}
 
}
 
</source>
 
</source>
  
[[Категория:C++]]
+
 
 +
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>
 +
 
 +
 
 +
[[Категория: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. Написать функцию целочисленного аргумента, возвращающее целое число по правилу:
If25-formula.gif

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;
    }
}