Программирование на языке Си/§7
В этой лекции мы обобщим полученный ранее материал и углубимся в него. Попробуйте вначале самостоятельно выполнить задания, а лишь потом просмотреть листинги. Проанализируйте по шагам работу каждой программы в листинге.
Задачи:
- Написать программу обрабатывающую результаты контрольной работы.
- Написать программу проверяющую, является ли введённая матрица "магическим" квадратом.
- Написать программу находящую строку матрицы с максимальной суммой элементов.
Задача №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();
}
У программиста есть очень важное правило: программа всегда пишется для "дурака". Т.е. интерфейс должен быть интуитивно понятен. В этих трёх программах мы сделали в том числе и интерфейс, который объясняет пользователю, что ему делать. В следующей практической лекции мы уже будем реализовывать полноценные пользовательские интерфейсы.
Домашняя работа
править- Напишите программу которая выдаёт знак зодиака который был в ведённом году. Ограничение программы: года от 0 года н.э. до 5000 г. н.э.. Подсказка, первый год н.э. был годом обезьяны.
- Напишите программу вычисляющую определитель матрицы второго порядка.