Программирование на языке Си/§7

Материал из Викиверситета

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

Задачи:

  1. Написать программу обрабатывающую результаты контрольной работы.
  2. Написать программу проверяющую, является ли введённая матрица "магическим" квадратом.
  3. Написать программу находящую строку матрицы с максимальной суммой элементов.

Задача №1[править]

#include <stdio.h>
#include <stdlib.h>
#define N 6
void main()
{
  int kol[N], sum, i;
  float p[N];
  char *oc[N]= {"\0","\0","двоек\0", "троек\0","четвёрок\0","пятёрок\0"};// объявляем символьный массив
  puts("введите данные об оценках");
  /*вводим данные*/  
  for(i=5;i>=2;i--)
  {
        printf("%s = ", oc[i]);
        scanf("%i",&kol[i]);
        sum+=kol[i]; // находим общее количество оценок
    }
  /* вычисляем процент каждой оценки*/
    for(i=2;i<6;i++)
    p[i]=(float)kol[i]/sum*100;
   /*выводим данные на экран*/ 
    puts("---------------------------");
    for(i=5;i>=2;i--)
  {
        printf("%8s %3i  %2.0%\n ", oc[i],kol[i], p[i]);
        
    }
    getch();
}

Задача №2[править]

"Магическим" квадратом называется матрица в которой сумма каждого горизонтального ряда равна сумме в каждом вертикальном ряду и по каждой из диагоналей.

 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 10
void main()
{
  int mat[N][N], n, yd=1,i,j,sum,sumt; 
/*где n - размерность матрицы
      yd - идентификатор, если 1 матрица "магическая", иначе нет.
      sum - сумма элементов главной диагонали
      sumt - сумма элементов строки, столбца, второй диагонали
*/
 
  puts ("введите размерность квадратной матрицы\n");
  scanf("%i",&n);
  puts ("введите матрицу по строчно");
  for(i=0;i<n;i++)
   {
        printf("%i строка\n",i+1);
        for(j=0;j<n;j++)
          scanf("%i",&mat[i][j]);
    }
 /*вычислим сумму главной диагонали*/
   for(i=0;i<n;i++)
     sum+=mat[i][i];
 /*вычислим сумму каждой строки*/
   i=0;
   do 
   {
   // сумма текущей (i) строки
        sumt=0; 
        for(j=0;j<n;j++)
          sumt+=mat[i][j];
        if(sumt!=sum) yd=0;// если сумма текущей строки не равна сумме главной диагонали, то yd=0
        i++; // проверяем следующую строку
    }
    while (yd&&i<n);// выполняем до тех пор, пока yd не равен нулю или пока мы не проверим всю матрицу. 
    
    if(yd) //если условие yd не равен нулю, т.е. 
    {
        j=0;
        do
        {
    // сумма текущего (i)столбца
            sumt=0; 
            for(i=0;i<n;i++)
              sumt+=mat[i][j];
            if (sumt!=sum) yd=0;// если сумма текущего столбца не равна сумме главной диагонали, то yd=0
            j++; //проверяем следующий столбец
        }
        while (yd && i<n);// выполняем до тех пор, пока yd не равен нулю или пока мы не проверим всю матрицу. 
    }
    if (yd) // если yd не равен нулю
    {
/*сумма второй главной диагонали*/
        sumt=0; 
        i=n-1;
        for(j=0;j<n;j++)
          sumt+=mat[i--][j];
        if(sumt!=sum) yd=0;
    }
    puts("Введённая матрица");
    if(!yd)
      puts("не является магическим квадратом");
    else
      puts("является магическим квадратом");
    getch();
}

Задача №3[править]

 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 10
void main()
{ 
  int max=0, mat[N][N-1],i,j,n;
  printf("введите размерность матрицы\n");
  scanf("%i",&n);
  printf("Введите матрицу по строчно\n");
  for(i=0;i<n;i++)
   {
         printf("введите %i строку\n",i+1);
           for(j=0;j<n;j++)
              scanf("%i",&mat[i][j]);
    }
/*вычисляем сумму элементов строки*/
  for(i=0;i<n;i++)
  {
        mat[i][n]=0;
        for(j=0;j<n;j++)
         mat[i][n] += mat[i][j];
  }

/*найдём строку с максимальной суммой*/
for(i=0;i<n;i++)
   if(mat[i][n]>mat[max][n])
     max=i;
     printf("\n В %i сумма максимальна и равна %i",max+1,mat[max][n]);
  getch();
}

У программиста есть очень важное правило: программа всегда пишется для "дурака". Т.е. интерфейс должен быть интуитивно понятен. В этих трёх программах мы сделали в том числе и интерфейс, который объясняет пользователю, что ему делать. В следующей практической лекции мы уже будем реализовывать полноценные пользовательские интерфейсы.

Домашняя работа[править]

  1. Напишите программу которая выдаёт знак зодиака который был в ведённом году. Ограничение программы: года от 0 года н.э. до 5000 г. н.э.. Подсказка, первый год н.э. был годом обезьяны.
  2. Напишите программу вычисляющую определитель матрицы второго порядка.