Саратовский Государственный Университет
Отчет по информатике(практика)
Подготовила:
Студентка 222 группы
Ловкова Татьяна
Проверила:
Доцент кафедры ИиП факультета КНиИТ
Огнёва М. В.
Саратов 2012
|.4. В файле input.txt содержатся данные о группе студентов в формате:
номер группы;
запись о каждом студенте группы содержит следующие сведения: фамилия, имя, отчество, год рождения, оценки по пяти предметам.
Переписать данные файла input.txt в файл output.txt, отсортировав их по убыванию суммы оценок методом «пузырька»(сумму оценок вывести в файл output.txt для каждого студента);
#include "fstream"
#include "string"
#include "iostream"
#include "iomanip"
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
struct mas //объявляем структуру mas
{
string fam,name,secondname;//вводим переменные
int year, ses[5];
double key;//средняя оценка
void print();//объявляем функцию print
};
void mas::print()//рассматриваем структура mas из области видимости функции print
{
out<<setw(12)<<left<<fam<<setw(10)<<name<<setw(15)<<secondname;
out<<setw(5)<<year;
for(int i=0;i<5;i++)//цикл для оценок
out<<setw(5)<<ses[i];
out<<setw(5)<<key<<endl;
}
void sort(mas*a,int n)//сортировка массива записей методом "пузырька"
{ mas temp;//рабочая переменная, которая используется для перестановки местами 2-х элементов массива
int i,j;//ключевое поле
for(i=0;i<n-1;i++)//i -счетчик
for(j=n-1;j>i;j--)//j- индекс элементов
if(a[j].key>a[j-1].key){temp=a[j]; a[j]=a[j-1]; a[j-1]=temp;}
}
int main()
{
int n=0,m,i;
mas stud[20];
if(!in) cout<<"Ошибка при открытии файла input.txt\n";
else
{
in>>m;//считываем номер группы
while(in.peek()!=EOF)//считываем данные про всех студентов
{
cout<<"n="<<n<<endl;
in>>stud[n].fam;
cout<<stud[n].fam<<endl;
in>>stud[n].name;
cout<<stud[n].name<<endl;
in>>stud[n].secondname;
cout<<stud[n].secondname<<endl;
in>>stud[n].year;
cout<<stud[n].year<<endl;
//считываем оценки и высчитываем сумму
stud[n].key=0;
for(i=0;i<5;i++)// для все элементов с 0 по 4
{
in>>stud[n].ses[i];//помещаем в поток оценки
cout<<stud[n].ses[i]<<endl;
stud[n].key+=stud[n].ses[i];//накапливаем сумму
}
cout<<stud[n].key<<endl;//выводим на экран сумму
n++;//переключаем счетчик на 1
}
sort(stud,n);//сортируем массив записей
//выводим отсортированные данные в файл output.txt
out<<m<<endl;
for(i=0;i<n;i++)
stud[i].print();
}
in.close();out.close();//закрываем файлы
return 0;
}
Пример работы программы:
222
Иванов И.И. 1993 5 3 4 3 5 Петров Р. С. 1992 2 3 5 5 1 Каймашников В. С. 1994 3 5 4 4 5 Гудзенко А. С. 1993 3 4 2 5 5 Кириченко Е. Ю. 1992 5 4 4 2 3
|
222
Каймашников В. С. 1994 3 5 4 4 5 21 Иванов И. И. 1993 5 3 4 3 5 20 Гудзенко А. С. 1993 3 4 2 5 5 19 Кириченко Е.Ю. 1992 5 4 4 2 3 18 Петров Р. С. 1992 2 3 5 5 1 16 |
||. 4. Дана матрица размерностью nxn, содержащая целые числа. Отсортировать каждый столбец матрицы по возрастанию элементов методом выбора.
#include "fstream"
#include "iostream"
#include "iomanip"
using namespace std;
ifstream in("input1.txt");
ofstream out("output1.txt");
void sort(int *a,int n)
{int temp;
int lowindex,lowkey,i,j;
for(int i=0;i<n-1;i++)
{
lowindex=i;
lowkey=a[i];
for (j=i+1;j<n;j++)
if(a[j]<lowkey)
{
lowkey=a[j];
lowindex=j;
}
temp=a[i];
a[i]=a[lowindex];
a[lowindex]=temp;
}
}
int main()
{
int n,m,i,j;
int a[10][10];
in>>n>>m;
for(i=0;i<n;i++)
for (j=0;j<m;j++)
in>>a[i][j];
int b[10];
for (j=0;j<m;j++)
{
for (i=0;i<n;i++)
b[i]=a[i][j];
sort(b,n);
for (i=0;i<n;i++)
a[i][j]=b[i];
}
out<<n<<'\t'<<m<<'\n';
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
out<<setw(5)<<a[i][j];
out<<'\n';
}
in.close(); out.close();
return 0;
}
Примеры работы программы:
4 5 23 54 65 -9 0 8 96 -4 -7 6 100 12 90 1 2 2 -1 4 -5 -12 |
4 5 2 -1 -4 -9 -12 8 12 4 -7 0 23 54 65 -5 2 100 96 90 1 6 |
Классы: 2. Реализовать класс Money для работы с денежными суммами. Объекты класс определяются парой чисел(рубли, копейки). Реализовать методы сложения, вычитания, деления сумм, сравнение двух сумм, умножение и деление на число.
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
class money {//объявляем класс money
private://закрытые поля или члены данные rub и kop
int rub, kop;
public://открытые члены функции
money() {rub = 0; kop = 0;}//конструктор
void perev () {//функция, которая считает рубли и копейки
rub += kop / 100;
kop %= 100;
}
void read() {//функция считывает значения рублей и копеек
cout << "rubli = ";
cin >> rub;
cout << "kopeiki = ";
cin >> kop;
perev();
}
void print () {// выводит на экран
cout << rub << "r." ;
cout << kop << "k.";
}
money sum (money b) {// объявляем метод sum с параметром b типа money
money ans;// объявляем переменную ans
ans.rub = rub + b.rub;// поле, указывающее на значение rub= значение rub - поле, указывающее на значение rub
ans.kop = kop + b.kop;
ans.perev();
return ans;
}
money raz (money b) {// метод raz
money ans;
if (kop < b.kop) {
--rub;
kop += 100;
}
ans.rub = rub - b.rub;//поле. указывающее на значение руб=знач руб - поле ук на зн руб
ans.kop = kop - b.kop;
ans.perev();//возвращ полученное значение
return ans;
}
double del (money b) {
double x = rub + kop / 100;
double y = b.rub + b.kop / 100;
double ans = x / y;
return ans;
}
bool srav (money b) {
if (rub > b.rub)
return true;
else
if (rub == b.rub)
if (kop > b.kop)
return true;
else return false;
else return false;
}
void proz_scal (int x) {
rub *= x;
kop *= x;
perev();
return;
}
void del_sc (int x) {
rub /= x;
kop /= x;
perev();
return;
}
};
int main () {
money sum, raz;
bool flag;
double del;
int del_sc, proz_sc;
money a, b;
cout << "Vvedite a:" << endl;
a.read();
cout << endl;
cout << "Vvedite b:" << endl;
b.read();
cout << endl;
a.print();
cout<<"+ ";
b.print();
cout<< "= ";
a.sum(b).print();
cout << endl;
cout << endl;
a.print();
cout<<"- ";
b.print();
cout<< "= ";
a.raz(b).print();
cout << endl;
cout << endl;
del = a.del(b);
cout << "a / b:" << endl << del << endl;
cout << "Vvedite na chto razdelit a:" << endl << "del_sc = ";
cin >> del_sc;
a.del_sc(del_sc);
cout << endl;
cout << endl;
cout << "Posle delenia a / del_sc , a teper:" << endl;
a.print();
cout << endl;
cout << endl;
cout << "Vvedite na chto umnozit a:" << endl << "proz_sc = ";
cin >> proz_sc;
a.proz_scal(proz_sc);
cout << endl;
cout << endl;
cout << "Posle umnozenia a * proz_sc , a teper:" << endl;;
a.print();
cout << endl;
cout << endl;
flag = a.srav(b);
if (flag == true)
cout << "a > b";
else cout << "a < b";
cout << endl;
return 0;
}
Примеры работы программы:
Введите а Рубли = 32 Копейки = 45
Введите b Рубли = 65 Копейки = 32
32р. 45к. + 65р. 32к. = 97р. 77к.
32р. 45к. - 65р. 32к. = -33р. 13к.
a/b 0.492308 Введите на что разделить а N=3 После деления а = 10р. 15к.
Введите на что умножить а N=2 После умножения а = 20р. 30к.
|
2. Создать список из целых чисел. Подсчитать сумму положительных элементов. Создать из положительных элементов новый список.
1 вариант: стек
#include "stdio.h"
#include <cstdlib>
#include <iostream>
using namespace std;
struct elem {
int val;//значение переменной которую мы заносим в стек
elem *next;//указатель на следующий елемент
};
class stack {// закрытые члены денные
elem *top;//указатель на верхний элемент
public://откр члены функции
stack() {//конструктор
top = NULL;
}
void push(int x) {//функция, которая добавляет элемент
elem *e = new elem;
e->val = x;
e->next = top;
top = e;
}
int peek() {//просмотр списка на пустоту
if (top != NULL)
return top->val;
else {
cout << "Stack is empty" << endl;
return 0;
}
}
int pop() {//
if (top == NULL) {//если стек пустой
cout << "Stack is empty" << endl;
return 0;
}
elem *e = top;// указ е устанавливаем туда куда и top, т. е. на 1 -й элемент
int val = e->val;// запоминаем значение из элемента на который указывает е
top = e->next;//top устан на след элемент за элементом на который указывает е
delete e;//очищ память на которую указывает е
return val;
}
};
void main() {
stack a;
int n;
cin >> n;
for(int i=0;i<n; i++){
int z;
cin >> z;
a.push(z);
}
stack s;
int sum = 0;
for(int i=0;i<n;i++){
if (a.peek()>0){
sum += a.peek();
s.push(a.peek());
}
a.pop();
}
cout << sum;
}
Примеры работы программы:
Введите количество чисел N=8 3 -5 8 2 =9 -3 2 5 Сумма положительных чисел = 20 |
2 вариант: очередь
#include "stdio.h"
#include <cstdlib>
#include <iostream>
using namespace std;
class queue//объявляется класс очередь
{
private://закрытые члены данные
struct telem
{
int inf;//значение переменной которую мы заносим в очередь
telem *next;// переменная которая указывает на следующий элемент
};
telem *head, *tail;//поля класса указатели на конец и начало очереди
public:// открытые поял класса
queue()
{
head=tail=NULL;//конструктор который делает очередь пустой, присваивает NULL всем указателям
}
int peek() {//функция просматривает первый элемент в очереди
if (head != NULL)// если указатель на первый элемент не указывает ни на что то он равен NULL и значит очередь пуста
return head->inf;
else {
cout << "Queue is empty" << endl;
return 0;
}
}
void push(int x)//функция кладет элемент х в очередь
{
telem *e = new telem;//освобождается память под новый элемент
e->inf = x;// в информационное поле e->inf записывается значение х
if(head == NULL){// если начало пустое
head = e;//начало становится е
tail = e;// конец становится е
return;
}
tail->next = e;// значение поля tail->next присваивается значение е
tail = e;// конец становится е
}
int pop() {//функция, которая удаляет и возвращает первый элемент очереди
if (head == NULL) {//если стек пустой
cout << "Queue is empty" << endl;
return 0;
}
telem *e = head;// указ е устанавливаем туда куда и top, т. е. на 1 -й элемент
int val = e->inf;// запоминаем значение из элемент на кот указывает е
head = e->next;//top устанавливаем на следующий элемент за элементом на который указывает е
delete e;//очищаем память на которую указывает е
return val;
}
};
void main() {
queue a;//новая очередь а
int n;
cin >> n;
for(int i=0;i<n; i++){//цикл для всех чисел
int z;
cin >> z;
a.push(z);// помещаем число в очередь
}
queue s;// переменная типа очередь
int sum = 0;
for(int i=0;i<n;i++){
if (a.peek()>0){
sum += a.peek();
s.push(a.peek());
}
a.pop();
}
cout << sum;
}
Введите примеры работы программы
Введите количество чисел N=5 3 -2 6 -4 5 Сумма положительных чисел =14 |
3. Односвязный список