โจทย์ชุดที่ 1
ศึกษาโปรแกรมต่อไปนี้แล้วตอบคำถามด้านล่าง เราขอให้คุณตอบคำถามโดยดูเฉพาะซอร์สโค้ดเท่านั้น กล่าวคือ โปรดอย่าคัดลอกมาเป็นไฟล์ คอมไพล์ และตอบคำถามเนื่องจากการเรียกใช้โค้ด ซึ่งจะนำความสนุกทั้งหมดออกไป
int main() {
int counter, first, last, next;
first = 1; last = 2;
for (counter = first; counter <= last; counter++) {
cout << "\n " << counter;
next = counter * counter;
cout << " " << next;
}
counter = first;
while (counter <= last) {
cout << "\n " << counter;
next = counter * counter;
cout << " " << next;
counter++;
}
counter = first;
do {
cout << "\n " << counter;
next = counter * counter;
cout << " " << next;
counter++;
} while (counter < last);
}
คำถามที่ 1: ผลที่ได้จากโปรแกรมนี้คืออะไร
| ก) |
1 2 2 4 1 2 2 4 1 2 2 4 |
| ข) |
1 1 2 4 1 1 2 4 1 1 2 4 |
| ค) |
1 1 2 4 1 1 2 4 1 1 |
| ง) |
1 1 2 4 1 1 1 1 2 4 |
| จ) | ไม่ได้แสดงผลลัพธ์ใดๆ - มีข้อผิดพลาดทางไวยากรณ์ |
คำถามที่ 2: จะเกิดอะไรขึ้นหากเรานำการเริ่มต้น "ตัวนับ" ออก ก่อนที่จะทำวนซ้ำ
| ก) | ลูปที่ไม่สิ้นสุด - ลูปที่ต้องทำขณะที่จะแสดงผลลัพธ์เป็น 1 |
| ข) | เอาต์พุตของโปรแกรมจะไม่เปลี่ยนแปลง |
| ค) | เอาต์พุตแบบวนซ้ำในขณะทำงานจะเป็น 2 และ 4 |
| ง) | การวนซ้ำระหว่างดำเนินการจะไม่แสดงผลใดๆ |
| จ) | เอาต์พุตแบบวนซ้ำที่ต้องทำขณะนั้นจะแสดงที่ 3 และ 9 |
คำถามที่ 3: สมมติว่าโปรแกรมเดิมอยู่ที่ด้านบนของหน้านี้ นำบรรทัดเริ่มต้นตัวแปรตัวนับออกก่อนทำการเล่นวนซ้ำ อะไร จะเกิดขึ้นหากเรานำบรรทัด counter++ ภายในลูป ขณะที่ลูปออกด้วย เช่น ต่อไปนี้คืออะไร
| ก) | การวนซ้ำวิดีโอไม่แสดงผลใดๆ |
| ข) | ขณะที่วนซ้ำเอาต์พุตเป็น 1 และ 1 การวนซ้ำในระหว่างดำเนินการไม่แสดงผลใดๆ |
| ค) | เอาต์พุตของการเล่นวนซ้ำจะเหมือนกับเมื่อทั้ง 2 บรรทัด รวมไว้ด้วย |
| ง) | ระบบจะแสดงตัวเลขแบบสุ่มจนกว่าเราจะเปลี่ยนคอมพิวเตอร์ ปิดอยู่ |
| จ) | ลูปขณะกำลังวนซ้ำ |
คำถามที่ 4: จะเกิดอะไรขึ้น เมื่อพิจารณาจากโปรแกรมต้นฉบับที่ด้านบนของหน้านี้ ถ้าลูป ขณะที่มีลักษณะเช่นนี้
counter = first;
while (counter <= last) {
cout << "\n" << counter;
if (first % 2 == 0)
next = counter * counter;
cout << " " << next;
counter++;
}| ก) | เอาต์พุตของการเล่นวนซ้ำเหมือนกับในโปรแกรมเดิม |
| ข) | ลูปขณะกำลังไม่แสดงข้อมูลใดเลย |
| ค) | เอาต์พุตของลูปขณะคือ 1 1 และ 1 4 |
| ง) | เอาต์พุตของลูปขณะคือ 1 2 และ 2 4 |
| จ) | เอาต์พุตของวนซ้ำคือ 1 4 และ 2 4 |
| ฉ) | เอาต์พุตของ ขณะที่วนซ้ำคือ 2 4 และ 2 4 |
คำถามที่ 5: จะเกิดอะไรขึ้นหากตัวแปรแรกมากกว่าตัวแปรสุดท้าย
| ก) | ขณะที่ลูปจะแสดงผลลัพธ์บางอย่าง แต่ไม่มีผลลัพธ์อื่นๆ ปรากฏขึ้น |
| ข) | คำสั่ง ขณะที่วนซ้ำจะแสดงผลลัพธ์บางอย่าง และจะไม่แสดงผลอย่างอื่น |
| ค) | จะไม่มีเอาต์พุตเลย |
| ง) | โปรแกรมจะมองหาข้อผิดพลาดหรือข้อขัดข้อง |
| จ) | for-loop จะแสดงผลลัพธ์บางอย่าง แต่จะไม่ส่งผลลัพธ์อื่น |
คำถามที่ 6: โปรแกรมจะแสดงอะไรหากเราเริ่มต้นตัวแปรแรก ให้เหมือนกับตัวแปรสุดท้าย
| ก) | คำสั่ง ขณะที่วนซ้ำจะแสดงผลลัพธ์บางอย่าง และจะไม่แสดงผลอย่างอื่น |
| ข) | ขณะที่ลูปจะแสดงผลลัพธ์บางอย่าง แต่ไม่มีผลลัพธ์อื่นๆ ปรากฏขึ้น |
| ค) | การวนซ้ำแต่ละรอบจะแสดง 1 บรรทัด |
| ง) | ขณะที่ Do ขณะที่ลูปจะแสดงเอาต์พุต 2 บรรทัด และอีกเส้นหนึ่งจะวนซ้ำ 1 บรรทัด |
| จ) | จะไม่แสดงผลใดๆ |
| ฉ) | for-loop จะแสดงผลลัพธ์บางอย่าง แต่จะไม่ส่งผลลัพธ์อื่น |
โจทย์ชุดที่ 2
ตามชุดปัญหาก่อนหน้านี้ นี่คือโปรแกรมให้คุณพิจารณา โปรดตอบคำถามที่ตามมาโดยดูเฉพาะซอร์สโค้ด
#include <iostream>
using namespace std;
int main() {
int Boys = 3, Girls = 5;
void F1(int males, int females);
void F2(int &m, int &f);
F1(Boys, Girls);
cout << "\nAfter calling F1, within main()";
cout << "\n\tBoys = " << Boys; // #2
cout << "\n\tGirls = " << Girls;
F2(Boys, Girls);
cout << "\nAfter calling F2, within main()";
cout << "\n\tBoys = " << Boys; // #4
cout << "\n\tGirls = " << Girls;
}
void F1(int b, int g) {
b += 3, g += 4;
cout << "\nF1";
cout << "\n\tBoys = " << b; // #1
cout << "\n\tGirls = " << g;
}
void F2(int &b, int &g) {
b = b + 8, g = g + 5;
cout << "\nF2";
cout << "\n\tBoys = " << b; // #3
cout << "\n\tGirls = " << g;
}คำถามที่ 1: เอาต์พุตของตัวแปร Boys คืออะไรในบรรทัดที่มีการทำเครื่องหมาย
| ก) |
#1: 6 #2: 3 #3: 11 #4: 11 |
| ข) |
#1: 6 #2: 3 #3: 11 #4: 3 |
| ค) |
#1: 6 #2: 6 #3: 11 #4: 11 |
| ง) | และไม่แสดงผลใดๆ เนื่องจากไม่ได้คอมไพล์หรือเรียกใช้ |
คำถามที่ 2: เลือกทุกข้อที่เกี่ยวข้องกับบรรทัดต่อไปนี้ของโปรแกรม
void F1(int males, int females); void F2(int &m, int &f);
| ก) | กฎ C++ ระบุว่าเราสามารถลบ 2 บรรทัดนี้ได้ตราบใดที่ วิธีการถูกกำหนดก่อนใช้งาน |
| ข) | กฎ C++ ระบุว่าชื่ออาร์กิวเมนต์ต้องเหมือนกันระหว่าง การประกาศและคำจำกัดความ |
| ค) | โปรแกรมนี้จะขัดข้องถ้าเราลบสองบรรทัดนี้ออก |
| ง) | เป็นเรื่องปกติที่ประกาศจะประกาศต่อสาธารณะทั่วโลก |
| จ) | ซึ่งเราเรียกว่าการประกาศแบบส่งต่อ |
คำถามที่ 3: หากเราย้ายบรรทัดต่อไปนี้จาก main() และวางไว้ในทั่วโลก จะเกิดอะไรขึ้น
int Boys = 3, Girls = 5;
| ก) | ซึ่งเอาต์พุตจะเหมือนเดิม |
| ข) | เด็กผู้ชายจะ = 3 และเด็กผู้หญิงจะ = 5 ในผลลัพธ์ทั้งหมด |
| ค) | เด็กผู้ชายจะ = 3 และเด็กผู้หญิงจะ = 5 เฉพาะในเอาต์พุตจาก main() |
คำถามที่ 4: หากเราเปลี่ยนช่วงเริ่มต้นของโปรแกรมให้มีลักษณะดังนี้
// We have moved moved these to global scope
const int Boys = 3;
const int Girls = 5;
void main() {
//int Boys = 3, Girls = 5;| ก) | โปรแกรมจะรวบรวมแต่จะขัดข้องเมื่อเราลองเรียกใช้ |
| ข) | เอาต์พุตจะไม่มีการเปลี่ยนแปลง |
| ค) | ผลลัพธ์จะเป็นเด็กผู้ชาย = ผู้หญิง 3 คน = 5 คนตลอดระยะเวลาของโปรแกรม |
| ง) | เอาต์พุตจะเป็น Boys = 3 Girls = 5 เฉพาะในเอาต์พุตจาก main() |
| จ) | โปรแกรมอาจไม่ได้คอมไพล์ (ขึ้นอยู่กับคอมไพเลอร์) |
คำถามที่ 5: มีการส่งข้อมูลด้วยค่าใน F2
| ก) | จริง |
| ข) | เท็จ |
โจทย์ชุดที่ 3
ตามชุดปัญหาก่อนหน้านี้ นี่คือโปรแกรมให้คุณพิจารณา โปรด ตอบคำถามที่ตามมาโดยดูเฉพาะซอร์สโค้ดอันนี้ ที่น่าสนใจกว่าสองรูปแบบก่อนหน้านี้ - ติดตามโค้ดอย่างรอบคอบ
#include <iostream>
using namespace std;
const int MAX_SIZE = 20;
typedef int ARR2D[MAX_SIZE][MAX_SIZE];
void Print(ARR2D in_array, int rows, int cols);
void Fill(ARR2D in_array, int rows, int cols);
int main() {
ARR2D matrix;
int row, col;
do {
cout << "Please enter the size of the matrix to generate (rows and cols) :" << endl;
cin >> row >> col;
} while (row <= 0 || row > MAX_SIZE || col <= 0 || col > MAX_SIZE);
Fill(matrix, row, col);
Print(matrix, row, col);
return(0);
}
void Print(ARR2D in_array, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
cout << '\t' << in_array[i][j];
cout << endl;
}
}
void Fill(ARR2D in_array, int rows, int cols) {
for(int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
in_array[i][j] = 0;
const int limit = rows * cols;
int cNum = 1;
int cRow = 0;
int cCol = 0;
int cDir = 0; // 0-north, 1-east, 2-south, 3-west
while(true) {
// Place the number.
in_array[cRow][cCol] = cNum;
cNum++;
if (cNum > limit) break;
int fRow = cRow;
int fCol = cCol;
while (true) {
fRow = cRow;
fCol = cCol;
switch(cDir) {
case 0: fRow--; break;
case 1: fCol++; break;
case 2: fRow++; break;
case 3: fCol--; break;
}
if ( fRow >= 0 && fRow < rows && fCol >= 0 && fCol < cols && in_array[fRow][fCol] == 0)
break;
cDir = (cDir + 1) % 4;
}
cRow = fRow;
cCol = fCol;
}
}คำถามที่ 1: โปรแกรมนี้แสดงผลลัพธ์ด้วยอินพุต 3 สำหรับแถวและ 4 สำหรับค่าใด ได้อย่างไร
| ก) |
1 2 3 4 5 6 7 8 9 10 11 12 |
| ข) |
1 2 3 4 5 6 7 8 9 10 11 12 |
| ค) |
12 11 10 9 8 7 6 5 4 3 2 1 |
| ง) |
1 3 2 4 8 6 7 5 9 11 10 12 |
| จ) |
1 2 3 4 10 11 12 5 9 8 7 6 |
| ช) |
9 8 7 6 10 11 12 5 1 2 3 4 |
| ซ) | ไม่ได้แสดงผลลัพธ์ใดๆ - ตรรกะไม่ถูกต้อง |
| 1) | และไม่แสดงผลลัพธ์ใดๆ - มีข้อผิดพลาดทางไวยากรณ์ |
| J) | ซึ่งไม่ได้แสดงผลลัพธ์ใดๆ แต่ไม่เป็นอย่างที่ควร |
| พัน) | โดยจะแสดงผลตัวเลข 12 ตัวแรกที่นึกถึงในขณะที่คุณกำลังรอให้โปรแกรมทำงาน |
คำถามที่ 2: จะเกิดอะไรขึ้นหากเราเพิ่มบรรทัดต่อไปนี้ในฟังก์ชัน main() ของเรา
MAX_SIZE = 10;
| ก) | ซึ่งไม่อนุญาตใน C++ |
| ข) | เราอนุญาต โปรแกรมจะทำงานโดยมี MAX_SIZE ที่ตั้งค่าเป็น 20 |
| ค) | เราอนุญาต โปรแกรมจะทำงานโดยมี MAX_SIZE ที่ตั้งค่าเป็น 10 |
คำถามที่ 3: พิจารณาข้อความ 4 บรรทัดต่อไปนี้จากโปรแกรมด้านบน
const int MAX_SIZE = 20; typedef int ARR2D [MAX_SIZE][MAX_SIZE]; void Print (ARR2D A, int rows, int cols); void Fill (ARR2D A, int rows, int cols);
1) สามารถใช้ Const ใน typedef ได้ไหม
2) เป็นไปได้หรือไม่ที่จะใช้ typedef ในการประกาศก่อนที่จะมีการประกาศตัวแปรประเภทดังกล่าว
| ก) | 1) ใช่ 2) ใช่ |
| ข) | 1) ไม่ควร 2) ไม่ |
| ค) | 1) ไม่ใช่ 2) ใช่ |
| ง) | 1) ใช่ 2) ไม่ใช่ |
คำถามที่ 4: เราจะใช้สิ่งต่อไปนี้ได้ไหม
#define MAX_SIZE 20
const int MAX_SIZE = 20;
| ก) | ใช่ ได้ผล และคุณสามารถใช้ #define สำหรับค่าคงที่ใน C++ |
| ข) | ใช้ได้ แต่เรามักไม่ใช้ #define สำหรับค่าคงที่ ใน C++ |
| ค) | #define ไม่พร้อมใช้งานใน C++ |
| ง) | คุณไม่สามารถทำสิ่งที่กล่าวมาข้างต้นใน C |
Question 5: typedef ใช้เพื่อสร้างชื่อแทนสำหรับชื่อประเภท
| ก) | จริง |
| ข) | เท็จ |
คำถามที่ 6: จะเกิดอะไรขึ้นถ้าเราไม่กำหนดค่าเริ่มต้นอาร์เรย์เป็น 0 ในฟิลด์ Fill()
| ก) | โมเดลจะทํางานแต่เอาต์พุตจะเป็นแบบ 12 ทั้งหมด |
| ข) | โค้ดจะสามารถทำงานได้อย่างถูกต้อง และสร้างเอาต์พุตเดียวกันกับในกรณีที่อาร์เรย์ เริ่มต้นเป็น 0 |
| ค) | โปรแกรมจะไม่ทำงานหรือขัดข้อง |
| ง) | จะเรียกใช้ แต่เอาต์พุตจะเป็น 0 ทั้งหมด |
| จ) | จะทำงานแต่อาจไม่สร้างเอาต์พุตใดๆ |
คำถามที่ 7: เลือกได้หลายคำตอบ ทำไมเราถึงใช้ Const สำหรับ MAX_SIZE ในโปรแกรมนี้ การพิมพ์ "20" จะง่ายกว่าใช่ไหม แทนที่จะเป็น MAX_SIZE ไม่ว่าที่ใด หากจำเป็น
| ก) | MAX_SIZE คือค่า C++ ในตัวที่ทุกคนสามารถใช้ได้ เพิ่งตั้งค่า และใช้งานได้เลย |
| ข) | ควรหลีกเลี่ยงข้อเสียร่วมเช่นเดียวกับตัวแปรร่วม |
| ค) | การใช้ Const ทำให้โปรแกรมของเราเข้าใจได้ง่ายขึ้น |
| ง) | ตัวเลขเวทมนตร์ในโปรแกรมถือเป็นแนวทางปฏิบัติที่ดี |
| จ) | หากเราต้องการเปลี่ยนแปลง MAX_SIZE เราจำเป็นต้องเปลี่ยนแปลงเพียงครั้งเดียว สถานที่ |
คำถามที่ 8: คำสั่ง Switch ในฟังก์ชัน Fill() ควรมีค่าเริ่มต้น เพราะถือว่าเป็นรูปแบบที่เหมาะสมในการใส่รูปแบบ
| ก) | จริง |
| ข) | เท็จ |
คำถามที่ 9: ประกาศในฟังก์ชันFill() เราจะประกาศตัวแปรระหว่างคำสั่ง ตัวอย่างเช่น cNum และ cRow จะได้รับการประกาศและเริ่มต้นหลังจากที่ for-loop ทำงาน คำสั่งนี้จะทำงานใน C++ ได้ไหม หรือต้องประกาศตัวแปรทั้งหมดไว้ที่ด้านบนสุดของ ฟังก์ชันได้อย่างไร
| ก) | สามารถทำได้ |
| ข) | โดยต้องประกาศตัวแปรทั้งหมดที่ด้านบนของฟังก์ชัน |
| ค) | ทั้งสองวิธีนี้ไม่ถูกต้อง - C++ ไม่อนุญาตให้ใช้ตัวแปรที่ตำแหน่งใดๆ ใน ของโปรแกรม |
| ง) | ต้องประกาศตัวแปรทั้งหมดในขอบเขตส่วนกลาง |
โจทย์ชุดที่ 4
ต่อไปนี้เป็นชุดของไฟล์ที่กำหนดและทดสอบคลาสง่ายๆ เช่นเคย ตอบคำถามที่ตามมาโดยอ้างอิงซอร์สโค้ดเท่านั้น
ต่อไปนี้คือไฟล์ส่วนหัว (cow.h)
#ifndef COW_H
#define COW_H
using namespace std;
typedef enum Color {black, brown, beige, blackandwhite, nocolor};
class Cow {
public:
Cow();
~Cow();
// accessors
double weight() { return weight_; };
string name() { return name_; };
Color color() { return color_; };
// mutators
void set_name(string inName) { name_ = inName; };
void set_color(Color inColor) { color_ = inColor; };
void set_weight(double inWeight) {weight_ = inWeight; };
void Moo();
void Properties();
private:
Color color_;
double weight_;
string name_;
};
#endifไฟล์ .cc ที่เกี่ยวข้อง (cow.cc) มีดังนี้
#include <iostream>
#include "cow.h"
using namespace std;
Cow::Cow() {}
Cow::~Cow() {}
void Cow::Moo() {
cout << name() << " says MOO." << endl;
}
void Cow::Properties() {
cout << name() << " weighs " << weight() << ", is "
<< color() << " and says MOO." << endl;
}และนี่คือโปรแกรมลูกค้าสำหรับชั้นเรียนนี้ (cowmain.cc):
#include <iostream>
#include "cow.h"
using namespace std;
int main() {
Cow cow1;
cow1.set_name("betsy");
cow1.set_weight(400.0);
cow1.set_color(black);
cow1.Moo();
cow1.Properties();
}คำถามที่ 1: โปรแกรมนี้แสดงผลอะไรบ้าง
| ก) | Betsy พูดว่า MOO Betsy หนัก 400 มีค่า 0 และพูดว่า MOO |
| ข) | Betsy พูดว่า MOO Betsy หนัก 400 ตัวดำและพูดว่า MOO |
| ค) | Betsy พูดว่า MOO betsy หนัก 400 |
คำถามที่ 2: เราไม่ควรวางโค้ดสำหรับตัวเข้าถึงและเมธอด Mutator ในไฟล์ส่วนหัว (โปรดทราบว่าตัวเข้าถึงคือเมธอดที่แสดงผลค่า และ Mutator เป็นเมธอดที่มีการแก้ไขค่า)
| ก) | จริง |
| ข) | เท็จ |
คำถามที่ 3: เราต้องใช้ "วัว::" ไหม ก่อนคำนิยามของฟังก์ชันแต่ละรายการ ใน cow.cc ไหม
| ก) | ไม่ใช่ - เนื่องจากมี cow.h ด้วย |
| ข) | ใช่ |
คำถามที่ 4: บทบาทหน้าที่:
#ifndef COW_H #define COW_H ... #endif
เล่นในไฟล์ส่วนหัวได้ไหม
เลือกได้หลายคำตอบ
| ก) | ไม่มีจุดประสงค์ใดๆ เพราะชื่อไฟล์คือ "วัว" ไม่ใช่ COW_H |
| ข) | หากเราไม่ได้ดำเนินการดังกล่าว เราจะได้รับข้อผิดพลาดรันไทม์ |
| ค) | หากเราไม่ได้ดำเนินการดังกล่าว เราอาจรวมไฟล์มากกว่า 1 ครั้ง |
| ง) | พวกเขาไม่ดำเนินการใดๆ เพราะคีย์เวิร์ดอย่างน้อย 1 คำสะกดผิด |
| จ) | จึงไม่ทำอะไรเนื่องจากคลาส Cow มีไฟล์ส่วนหัวเพียงไฟล์เดียว |
คำถามที่ 5: จะเกิดอะไรขึ้นหากเราเพิ่มบรรทัดต่อไปนี้ใน cowmain.cc
cow1.weight_ = 24;
| ก) | โปรแกรมจะทำงาน และปรับตัวแปรน้ำหนัก ที่บรรทัดนี้ |
| ข) | โปรแกรมจะรวบรวมและเรียกใช้ แต่เกิดข้อขัดข้องในบรรทัดนั้น |
| ค) | C++ ไม่อนุญาต |
| ง) | โปรแกรมจะรวบรวมและเรียกใช้ แต่ตัวแปรน้ำหนักไม่ ที่เปลี่ยนแปลงในบรรทัดนี้ |
คำถามที่ 6: เมื่อมีการดำเนินการกับบรรทัดต่อไปนี้ เครื่องมือสร้างในคลาส Cow จะถูกเรียก:
Cow cow1;
ลักษณะเฉพาะที่สำคัญของผู้สร้างมีอะไรบ้าง
เลือกได้หลายคำตอบ
| ก) | ซึ่งมักจะไม่แสดงค่าใดๆ |
| ข) | ถ้าเราไม่ให้นักเรียนสร้างกับชั้นเรียน ชั้นเรียนจะ ไม่คอมไพล์ |
| ค) | เครื่องมือสร้างในคลาส Cow นั้นผิดปกติเนื่องจากไม่มีการเริ่มต้น ตัวแปรส่วนตัว |
| ง) | โดยจะมีชื่อเดียวกับชั้นเรียนเสมอ |
| จ) | เราสามารถมีตัวสร้างได้หลายตัวในชั้นเรียน ตราบใดที่อาร์กิวเมนต์ แตกต่าง |
| ฉ) | มีการเรียกใช้เครื่องมือสร้างเมื่อชั้นเรียนเริ่มต้นทันที |
คำถามที่ 7: คุณลักษณะที่สำคัญของผู้ทำลายมีอะไรบ้าง
| ก) | ระบบจะเรียกตัวทำลายเมื่อวัตถุอยู่นอกขอบเขต |
| ข) | ตัวทำลายมีชื่อเหมือนกับคลาส แต่นำหน้าด้วย "~" |
| ค) | ในตัวทำลายอะไรบางอย่างใน cow.cc ด้วย ไม่ทำอะไรเลย |
| ง) | ถ้าเราไม่สร้างผู้ทำลายชั้นเรียน ชั้นเรียนจะไม่ คอมไพล์ |
คำถามที่ 8: จากวิธีที่โปรแกรมของลูกค้าใช้ชั้นเรียน ให้พิจารณา ดังต่อไปนี้:
การแบ่งสมาชิกออกเป็นแบบสาธารณะและส่วนตัวในชั้นเรียนวัวนั้นไม่เหมาะสม นั่นคือ บางสิ่งที่เป็นส่วนตัวควรเป็นแบบสาธารณะ หรือสาธารณะควรเป็นแบบส่วนตัว
| ก) | จริง |
| ข) | เท็จ |
คำถามที่ 9: จะเกิดอะไรขึ้นหากเราเพิ่มตัวสร้างอื่นนอกเหนือไปจาก เราต้องว้าว.cc ตัวสร้างใหม่มีหน้าตาแบบนี้
Cow::Cow(string inName, double inWeight, Color inColor) {
set_name(inName);
set_weight(inWeight);
set_color(inColor);
}และเราเพิ่มบรรทัดต่อไปนี้ไปยัง main():
Cow cow2("milly", 350.2, brown);
cow2.Moo();
cow2.Properties();เราสามารถดำเนินการได้หรือไม่
เลือกได้หลายคำตอบ
| ก) | บรรทัดใน main() ที่เราเริ่มต้น cow2 จะขัดข้อง |
| ข) | เรามีตัวสร้างได้เพียงรายการเดียว |
| ค) | กรณีนี้พบได้บ่อยใน C++ |
| ง) | ใช่ แต่นี่ไม่ใช่การใช้งาน C++ ตามปกติ |
| จ) | คำสั่งนี้จะทำงานได้ แต่จะไม่แสดงข้อมูลใดๆ เพราะ จะไม่มีการเริ่มต้น "ส่วนตัว" |
| ฉ) | เราไม่สามารถเรียก setName(), setColor() และ setweight() จากภายใน วิธีการของชั้นเรียนเดียวกัน |
คำถามพิเศษ
คำถามที่ 1) ผลที่ตามมาคืออะไร
#include <iostream>
using namespace std;
void HelpMe(int *p, int *num, int *q);
void WhereAmI(int *p, int *q, int a);
void HelpMe(int *p, int *num, int *q) {
int a;
a = 2;
q = &a;
*p = *q + *num;
num = p;
}
void WhereAmI(int *p, int *q, int a) {
a = 6;
*p = a + *p;
*q = a + 3;
HelpMe(q, &a, p);
}
int main() {
int *p;
int q;
int *num;
int a;
a = 3;
q = 5;
p = &a;
num = &q;
HelpMe(&a, p, num);
WhereAmI(&q, p, *num);
cout << "*p = " << *p << " q = " << q << " *num = " << *num << endl;
}
คำถามที่ 2) พิจารณาข้อความต่อไปนี้ โดยสมมติว่ามีคลาส Apple อยู่แล้วและมีการเริ่มต้นใช้งานแล้ว คลาส Apple มีตัวแปร color_instance ดังต่อไปนี้
Apple* granny_smith = new Apple;
เลือกทุกข้อความด้านล่างที่เป็นจริง
| ก) | Apple* granny_smith = NULL; if (granny_smith == NULL)... ค่านี้ไม่ใช่ - NULL ไม่ใช่ค่าที่สามารถตรวจสอบได้ในลักษณะนี้ |
| ข) | Apple* granny_smith, fuji; การดำเนินการนี้จะประกาศเคอร์เซอร์ 2 ตัวไปยังออบเจ็กต์ Apple |
| ค) | ตัวแปร granny_smith มีค่าตัวแปรอินสแตนซ์ที่เชื่อมโยงกับออบเจ็กต์ Apple |
| ง) | Apple* granny_smith = NULL; ไม่เป็นไร |
| จ) | ตัวแปร granny_smith มีที่อยู่สำหรับออบเจ็กต์ Apple |
| ฉ) | string gs_color = *(granny_smith.get_color()); คำสั่งนี้จะแสดงสีของออบเจ็กต์ granny_smith โดยถือว่าได้มีการเริ่มต้นไว้แล้ว |
| ช) | พื้นที่เก็บข้อมูลสำหรับออบเจ็กต์ Apple ใหม่มีการจัดสรรในฮีป |
| ซ) | พื้นที่เก็บข้อมูลสำหรับออบเจ็กต์ Apple ใหม่มีการจัดสรรบนสแต็กรันไทม์ |
| 1) | int* a = &b; วิธีนี้จะใส่ที่อยู่ของ b ลงใน a |
คำถามที่ 3) ผลที่ได้จากโปรแกรมต่อไปนี้คืออะไร
#include <iostream>
using namespace std;
const int kNumVeggies = 4;
void Grill(int squash, int *mushroom);
int Saute(int onions[], int celery);
void Grill(int squash, int *mushroom) {
*mushroom = squash/4;
cout << *mushroom + squash << endl;
}
int Saute(int onions[], int celery) {
celery *= 2;
onions[celery]++;
Grill(onions[0], &onions[3]);
cout << celery << " " << onions[3] << endl;
return celery;
}
int main() {
int broccoli, peppers[kNumVeggies], *zucchini;
for (broccoli = 0; broccoli < kNumVeggies; broccoli++)
peppers[broccoli] = kNumVeggies - broccoli;
zucchini = &peppers[Saute(peppers,1)];
Grill(*zucchini, zucchini);
zucchini--;
cout << peppers[3] + *zucchini + *(zucchini + 1) << endl;
}
คำตอบแบบทดสอบ
คุณควรพยายามตอบคำถามด้านบนทั้งหมดโดยไม่ดูคำตอบ คุณควรขอความช่วยเหลือจากใครสักคนแทนที่จะเดินตรงไปยังใบคำตอบเพื่อขอความช่วยเหลือ
คุณสามารถดูคำตอบของปัญหาข้างต้นได้ที่นี่