Скрипты, содержащие структуры и объекты.



Задача №1

Создать текстовый файл, записать в него построчно данные, которые вводит пользователь. Окончанием ввода служит пустая строка.

Node.js Replit Node.js Tutorialspoint
const fs = require("fs"); fs.open("hello.txt",'w', (error) => {    if(error) throw error;    console.log('File created'); }); var x=prompt() let y=x while (x!=="") { x=prompt() y=y+x fs.writeFile("hello.txt", y, function(error){ if(error) throw error; // если возникла ошибка } ) } const fs = require("fs"); let rl = require("readline-sync"); function readline() { return rl.question(); } let x=readline()    y=x while (+(x = readline()) !== 0) y += x;  fs.writeFile("hello.txt", y, function(error){ if(error) throw error; // если возникла ошибка } )

 

Строго говоря, метод prompt() не поддерживается в Node.js, но разработчики онлайн-среды для программирования Replit сделали некую гибридную версию JavaScript/Node.js, благодаря инсталлированию дополнительных пакетов. А в онлайн-среде Tutorialspoint.com мы получим сообщение об ошибке:

Поэтому для решения задачи в классическом Node.js необходимо подключить модуль Readline-sync. Для подключения этого модуля в среде Replit необходимо зайти в раздел Packages, найти нужный модуль и нажать кнопку «+»:

 

 

Задача №2

Составить программу с использованием записи «Студент», включая следующие поля: ФИО студента, дату рождения, адрес, курс, группа.

Ассоциативный массив Класс
var stud=[] var n=parseInt(prompt()) for (i=0;i<n;i++) {  stud[i]={ name:prompt("ФИО"), age:prompt("Дата"),addr:prompt("Адрес"), kurs:prompt("Курс"),gr:prompt("Группа") }} for (i=0;i<n;i++) console.log(stud[i].name,stud[i].age, stud[i].addr,stud[i].kurs,stud[i].gr) function student(name, data, addr, course, group) { this.name=name this.data=data this.addr=addr this.course=course this.group=group this.getInfo=function(){ let info=this.name+" "+this.data+" "+this.addr+" "+this.course+" "+this.group return info } } let stud=[] var n=parseInt(prompt("Количество")) for (i=0;i<n;i++) stud[i]=new student(prompt("ФИО"),prompt("Дата"),prompt("Адрес"),prompt("Курс"),prompt("Группа")) for (i=0;i<n;i++) console.log(stud[i].getInfo())

 

Результат:

Примечания к коду:

При решении первым способом код получился короче, но при втором способе скрипт легче редактировать, не теряя наглядности.

 

Задача №3

Создать базу данных студентов. Определить студентов с баллом выше среднего.

Ассоциативный массив Класс
var stud=[] var n=parseInt(prompt()) for (i=0;i<n;i++) {  stud[i]={ name:prompt("fio"), ball:parseInt(prompt("ball"))}} let sum = 0.0; for (i=0;i<n;i++){ sum += stud[i].ball; } let avg=sum/n for (i=0;i<n;i++){ if (stud[i].ball>avg) console.log(stud[i].name) } function student(name, mark) { this.name=name this.mark=mark this.getInfo=function(){  let info=this.name  return info } this.Summa=function(){ let sum = 0.0;    sum+=parseInt(this.mark) return sum } } let stud=[] var n=parseInt(prompt("Количество")) for (i=0;i<n;i++) stud[i]=new student(prompt("Фамилия"),prompt("Оценка")) let sum1=0 for (i=0;i<n;i++) sum1+=stud[i].Summa() let avg=sum1/n for (i=0;i<n;i++) if (parseInt(stud[i].mark)>avg) console.log(stud[i].getInfo())

 

Результат:

Примечания к коду:

Внутри объявления класса можно использовать как несколько свойств, так и несколько методов. Минус второго способа состоит в том, что нельзя посчитать количество экземпляров класса внутри объявления метода.

 

Задача №4

Выполнить операции над комплексными числами: сумма, разность и произведение.

Класс Модуль complex.js
function Complex(real, imaginary) { this.x = real; // Вещественная часть числа this.y = imaginary; // Мнимая часть числа } Complex.prototype.magnitude = function() { return Math.sqrt(this.x*this.x + this.y*this.y); } Complex.prototype.negative = function() { return new Complex( -this.x, -this.y); }; Complex.prototype.add = function(that) { return new Complex(this.x + that.x, this.y + that.y); } Complex.prototype.multiply = function(that) { return new Complex(this.x * that.x, this.y * that.y, this.x*that.y + this.y * that.x); } Complex.add = function (a, b) { return new Complex(a.x + b.x, a.y + b.y); }; Complex.multiply = function(a, b) { return new Complex(a.x * b.x, a.y * b.y, a.x * b.y + a.y * b.x)}; Complex.prototype.toString = function() { return "{" + this.x + "," + this.y + "}"; }; var x1=parseFloat(prompt()) var x2=parseFloat(prompt()) var y1=parseFloat(prompt()) var y2=parseFloat(prompt()) let a=new Complex(x1,x2) let b=new Complex(y1,y2) let s=a.add(b) let z=b.negative() let r=a.add(z) let m=a.multiply(b) console.log(s.toString(),r.toString(),m.toString()) let Complex=require("complex.js") let a=parseInt(prompt("Re")) let b=parseInt(prompt("Im")) let c=parseInt(prompt("Re")) let d=parseInt(prompt("Im")) let x=new Complex(a,b) let y=new Complex(c,d) console.log(x.add(y)) console.log(x.sub(y)) console.log(x.mul(y)) console.log(x.div(y))

 

Результат:

Примечания к коду:

1) Для работы над комплексными числами вида a+bi, где a – действительная часть числа, b – мнимая часть числа, можно написать собственный класс Complex с помощью функции-конструктора. Но существуют готовые модули, которые достаточно подключить к сценарию. Второй вариант решения гораздо короче благодаря использованию модуля complex.js.

2) Для второго варианта задачи в решение добавлен метод деления комплексных чисел.

3) Рассмотрим третий вариант скрипта с использованием модуля math.js. Подключим этот модуль по прямой ссылке с сервера https://cdnjs.cloudflare.com/ajax/libs/mathjs/10.0.0/math.js и реализуем функции add, subtract, multiply, divide:

<!DOCTYPE HTML>

<html>

<head>

<script

src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/10.0.0/math.js"

type="text/javascript"></script>

</head>

<body>

Введите реальную часть 1-ого числа<input type="text" class="real1">

Введите мнимую часть 1-ого числа<input type="text" class="imagine1"><br>

Введите реальную часть 2-ого числа <input type="text" class="real2">

Введите мнимую часть 2-ого числа   <input type="text" class="imagine2"><br>

<input type="submit" class="button">

<div id=id_div>Ответ: <br></div>

<script type="text/javascript">

let real1Input = document.querySelector('.real1');

let imagine1Input = document.querySelector('.imagine1');

let real2Input = document.querySelector('.real2');

let imagine2Input = document.querySelector('.imagine2');

let out=document.querySelector("#id_div");

let button = document.querySelector('.button');

button.addEventListener('click', () => {

    let real1 = Number(real1Input.value);

    let imagine1 = Number(imagine1Input.value);

    let real2 = Number(real2Input.value);

    let imagine2 = Number(imagine2Input.value);   

let a=math.complex(real1,imagine1)

let b=math.complex(real2,imagine2)

let s1=math.add(a,b).toString()+"<br>"

let s2=math.subtract(a,b).toString()+"<br>"

let s3=math.multiply(a,b).toString()+"<br>"

let s4=math.divide(a,b).toString()

out.innerHTML=s1+s2+s3+s4

});

</script>

</body>

</html>

Результат:

Задача №5

В заданном числовом промежутке [20;100] найти числа, кратные 6, и посчитать их количество.

Функция последовательности Итератор Генератор Множество
function linSeq(x0, xN) { return linspace(x0, xN, Math.abs(xN-x0)+1); } function linspace(x0, xN, n){ dx = (xN - x0)/(n-1); var x = []; for(var i =0; i < n; ++i){    x.push(x0 + i*dx); } return x; } var mn = linSeq(20,100).filter(function(number) { return number % 6===0; }); console.log(mn.length) const iterable = { [Symbol.iterator]() { return { current: 20, end: 100, next() { if (this.current <= this.end ) { return { value: this.current++, done: false }; } return { done: true }; } }; } }; let k=0 for (const value of iterable) if (value%6==0) { console.log(value); k++ } console.log(k) function* naturalRowGenerator() { let current = 20; while (current <= 100) {    if (current%6===0)    yield current;    current++; } } let k=0 for (let num of naturalRowGenerator()) { console.log(num); k++ }  console.log(k) const arr=[] let j=0 for (i=20;i<=100;i++)   if (i%6===0) { arr[j]=i j++ } const numbers = new Set(arr) console.log(numbers) console.log(numbers.size)

 

Результат:

Примечания к коду:

1) Функцию-генератор можно упростить с помощью цикла, сделав аналог метода range, используемого в языках PHP и Python:

function* range(start, end) {

for (let i = start; i <= end; i++) {

if (i%6===0)

   yield i;

}

}

a=[...range(20,100)]

console.log(a)

console.log([...range(20,100)].length)

 

Задача №6

С клавиатуры вводится последовательность целых чисел, ограниченная нулем (ноль не входит в последовательность). Получить и вывести квадраты нечетных чисел, не превышающих 15

Фильтрация массива Итератор Генератор
arr=[] var n=1 do { var x=parseInt(prompt()) arr[n]=x n++ } while (x!==0) function condition(value, index, array) { var result = false; if (value %2 == 1 && value<=15) {    result = true; } return result; }; var filteredNumbers = arr.filter(condition); for(var i=0; i < filteredNumbers.length; i++) console.log(filteredNumbers[i]*filteredNumbers[i]); const iterable = { [Symbol.iterator]() { return { current: 2,      next() {    if (this.current !==0 ) {      return { value: this.current=parseInt(prompt()), done: false };    }    return { done: true }; } }; } }; let k='' for (const value of iterable) if (value%2!=0 &&value<=15) { k+=(value**2).toString()+' ';  } console.log(k) function* naturalRowGenerator() { let current = parseInt(prompt()); while (current !=0) {    if (current%2!=0&&current<=15)    yield current**2;    current= parseInt(prompt()); } } let k="" for (let num of naturalRowGenerator()) { k+=num.toString()+" "     }  console.log(k);

 

Результат:

 

Контрольные вопросы и тесты

Дополнительные вопросы

1. Может ли хакер, написав скрипт на JS, проникнуть в файловую систему клиентского компьютера?

2. Всегда ли необходимо обрабатывать исключения с кодом ошибки при чтении и записи файла?

3. Для чего служит модуль fs в Node.js?

4. Чем отличается ассоциативный массив от словаря?

5. Каким образом можно создать объект в классе объектов?

6. Чем по своей сути являются свойства объектов?

7. Могут ли описания классов содержать более одного метода?

8. Можно ли в задачах использовать генератор без итератора?

9. Чем отличаются структуры queue и stack?

10. Какая реализация стека и очереди удобней, через массив или через класс?

 

Тесты с выбором варианта ответа

1. Модуль работы с файлами подключается командой:

1) require fs = const ('fs');

2) var fs = require('fs');

3)const fs = require('writeFile');

4) fs.writeFile();

2. Методы чтения из файла делятся на:

1) прямой и обратный;

2) текстовый и двоичный;

3) синхронный и асинхронный;

4) последовательный и параллельный.

3. Массив, в котором индекс является строковым ключом, называется:

1) объектным;

2) множественным;

3) ассоциативным;

4) текстовым.

4. Функции для обработки свойств объектов называются:

1) методы;

2) классы;

3) конструкторы;

4) данные.

5. Для возврата следующего элемента последовательности используется:

1) генератор;

2) итератор;

3) нумератор;

4) конструктор.

6. Возврат значения функции-генератора осуществляется с помощью оператора:

1) next;

2) count;

3) yield;

4) range.

7. Структура, в которой элементы располагаются по принципу LIFO, называется:

1) стек;

2) очередь;

3) множество;

4) список.

8. Добавление нового элемента в стек осуществляется методом:

1) pop();

2) pip();

3) push();

4) peek().

9. Для добавления элемента в множество применяется метод:

1) add();

2) push();

3) set();

4) has().

10. Для возврата значения по ключу в коллекции map используется метод:

1) map.set(key);

2) map.get(key);

3) set.map(key);

4) get.add(key).

11. Создание экземпляра класса имеет вид:

1) имя класса = new экземпляр();

2) класс.экземпляр.функция(параметры);

3) экземпляр = new имя_класса(параметры);

4) объект = new (параметры).класс.

12. Методы сложения, вычитания, умножения и деления комплексных чисел в модуле math.js:

1) add, negative, multy, divisor;

2) add, subtract, multiply, divide;

3) add, neg, mul, div;

4) plus +, minus -, asterix *, slash /.

 

Тесты без выбора варианта ответа

1. Дан скрипт:

var fs = require('fs');

fs.writeFile('hello.txt', 'Hello, world!', function(err) {

if(err) return console.error(err);

});

Переделать вывод информации в текстовый файл с помощью синхронного метода.

 

2. Дан скрипт:

const student={

name:"Иванов",

mark:"5",

 }

console.log(student)

Какая структура (коллекция) называется student – объект или ассоциативный массив?

 

3. Дан скрипт, содержащий ошибки:

range[Symbol.iterator] = function() {

let current = 1;

let last = 3;

return {

next() {

if (current <= last) {

   return {

     done: false,

  yield current++

}

}

const ids = Generator();

 for (let i of Generator())

console.log(next().value);

   };

Выяснить, с помощью чего была создана последовательность – итератора или генератора. Исправить ошибки.

 

4. Укажите верные утверждения:

А) словарь map может использовать только строковые ключи, а ассоциативный массив также и числовые.

Б) в массиве элементы не повторяются, а в множестве могут повторяться.

В) ассоциативный массив является объектом.

Г) объект в классе можно создать с помощью конструктора.

 

5. Укажите неверные утверждения:

А) элементы в очереди расположены по принципу FIFO.

Б) работа с файловой системой поддерживается в JavaScript.

В) из стека нельзя удалить элемент.

Г) для работы с комплексными числами разработаны сторонние библиотеки.

 


Дата добавления: 2021-12-10; просмотров: 20; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!