《錢能c++》的3道題,沒有思路,還請各位高人指教,不勝感激!


我單獨將《錢能c++》的習題做了,但下面的題目都是沒有出結果的,自己能力有限,
還請高手賜教。很少上網,故一次問個夠。


  一.chap 11.5 p259:
  編寫一個類,實現簡單的棧(提示:用鏈表實現)。數據的操作按先進后出(FIFO)
的順序。

   成員函數為:
   void statck::put(int item);
   int statck::get();

   數據成員為:
一個指向鏈表的指針

   鏈表結構為:
   struct Node
   {
       int a;
       Node *next;
   };
 
   使用對象的過程: 
   stack st;
   st.put(10);
   st.put(12);
   st.put(14);

   cout << st.get() << endl;        // 輸出14,棧中剩下10,12
   cout << set.get() << endl;       // 輸出12,棧中剩下10


   二.chap 13.2  p311 (這道題,我實在被相互之間的聯系搞糊塗了,思路是有,可
一上機,全亂了)

  題目:
  描述課程類和學生類,用重用類的多文件程序結構形式,編制面相對象應用程序。
學生有名字,學生最多可學五門課程,學生實際學的門數,可以給定學生的名字,可以
得到學生的名字,可以得到學生給定課程的成績,可以得到學生所學課程的平均成績,
可以給學生增加一門課(同時在該課程中增加一個學生)。
  課程最多有30個學生,課程有實際學生數,課程有實際學生名單,課程有學分數,
課程有每個學生成績,課程可以得到學分數,課程可以設置學分數,課程可以得到
班平均成績,課程可以得到某個學生成績。
  現有數學課,張三學數學,成績3.1分,李四學數學,成績為4.5分。求其平均成績,
求張三的數學成績。
  現有物理課,學時為4,張三學物理,成績為4分。求張三所學課程的平均成績。


   三. chap9.2 p203
  讀下列程序,該程序生成有十個整數的安全數組。要把值放入數組中,使用put()函數
,然后取出該值,使用get()函數,put()和get()中若遇下標越界立即終止程序運行。
其運行結果為后面所示,請完成倆個未寫出的函數定義。

  #include <iostream.h>
  
  int & put(int n);         // put value into the array
  int get(int n);           // obtain a value from the array
 
  int vals[10];
  int error = -1;

 void main()
 {
     put(0) = 10;         // put values into the array
     put(1) = 20;
     put(9) = 30;

     cout << get(0) << endl;
     cout << get(1) << endl;
     cout << get(9) << endl;

     put(12) = 1;         // out of range
  }
  
  運行結果為:
  
  10
  20
  30 
  
  range error input value!

7 个解决方案

#1


看數據結構,懂了,用stl

#2


只要去學一下《數據結構》這些問題就不是問題了,
我的學習過程跟你一樣

#3


我幫你弄下第3題
int & put(int n)
{
     if (n >= 10 || n < 0)
     {
          cout<<"range error input value!"<<endl;
          exit(1);
      }
      return vals[n]; 
}

int get(int n)
{
      if (n >= 10|| n < 0)
     {
          cout<<"range error input value!"<<endl;
          exit(1);
      }
      return vals[n];   
}

#4


//iStack.h
#ifndef _ISTACK_H
#define _ISTACK_H

#include <vector>

using namespace std;

class iStack
{
public:
iStack(int capa);

          bool pop(int & val);//彈棧
bool push(int val);//壓棧

bool empty(void);//判斷是否為空
bool full(void);//判斷是否已滿

void display(void);//顯示現有元素

int size(void);//得到棧大小
bool peek(int & val);//偷看 棧頂元素 但不彈出

private:
int         _top;
vector<int> _stack;
};

#endif

//iStack.cpp
#include "iStack.h"

#include <iostream>

using namespace std;

iStack::iStack(int capa):_stack(capa),_top(0)
{
};

bool iStack::pop(int &val)
{
if (_top == 0)
{
return false;
}

val=_stack[--_top];

cout<<"iStack::pop() :"<<val<<endl;

return true;
};

bool iStack::push(int val)
{
if (_top >= (_stack.size()-1))
{
return false;
}

cout<<"iStack::push("<<val<<")"<<endl;

_stack[_top++]=val;
    return true;
};

bool iStack::empty()
{
return ((_top == 0) ? true : false );
};

bool iStack::full()
{
return (_top<(_stack.size()-1) ? false :true);
};

int iStack::size()
{
return _top;
};

void iStack::display()
{
if (_top == 0)
{
cout<<"empty stack."<<endl;
return;
}

cout<<"stack size("<<size()<<"):{ ";
for ( int i=0; i < _top; i++)
{
cout<<_stack[i]<<" ";
}
cout<<"}"<<endl;
};

bool iStack::peek(int & val)
{
if (_top == 0)
{
cout<<"peek on empty stack!"<<endl;
    return false;
}

val=_stack[_top-1];
cout<<"peek :"<<val<<endl;
return true;
};


這個是我以前看c++primer的時候 做的一個棧,用容器實現的 你可以參考一下

#5


//ab.h
class stack
{
public:
void put(int item);
int  get ();


typedef struct Node 
{
int a;
struct Node *next;
}Node;

};
//
//a.cpp
#include "ab.h"
#include <iostream.h>

stack::Node *top=new stack::Node;

void stack::put(int item)
{
Node *p=new Node;
top->a=item;
p->next=top;
top=p;
}
int stack::get()
{
int temp;
Node *op=top;
top=top->next ;
temp=(top)->a;
delete op;
return temp;
}
void main()
{
   stack st;
   st.put(10);
   st.put(12);
   st.put(14);

   cout << st.get() << endl;        // 輸出14,棧中剩下10,12
   cout << st.get() << endl;
}

#6


可以為類寫一個構造函數,在其中初始化top;
並將top 的聲明放在ab.h中,將它和結構體聲明為私有
構造函數為:
stack::stack():top(new Node)
{
}

#7


No1

struct Node
{
int a;
Node *next;
};

class stack
{
public:
stack();
~stack();

void put(int item);
int get();

protected:
Node *header;

};
//
stack::stack()
: header(NULL)
{
}

stack::~stack()
{
while (header != NULL)
{
Node *p = header->next;
delete p;
header = p;
}
}

void stack::put(int item)
{
Node *p = new Node;
p->a = item;
p->next = header;
header = p;
}

int stack::get()
{
assert(header);

int a = header->a;
Node *n = header->next;
delete header;
header = n;

return a;
}

No.2
course.h

class student;
class course
{
public:
course(void);
~course(void);

double get_credit() const;
void set_credit(double credit);
double get_average() const;
double get_score(student *std);
void add_student(student *std);

protected:
student *m_stds[30];
int m_n_stds;
double m_credit;
};

course.cpp
#include "student.h"

using namespace std;

course::course(void)
: m_n_stds(0)
, m_credit(0)
{
}

course::~course(void)
{
}

double course::get_credit() const
{
return m_credit;
}

void course::set_credit(double credit)
{
m_credit = credit;
}

double course::get_average() const
{
double sum = 0;
for (int i = 0; i < m_n_stds; i++)
{
sum += m_stds[i]->get_score(this);
}
return m_n_stds == 0 ? 0 : sum / m_n_stds;
}

double course::get_score(student *std)
{
return std->get_score(this);
}

void course::add_student(student *std)
{
if (m_n_stds < 30)
{
m_stds[m_n_stds] = std;
m_n_stds++;
}
else
{
cout<<"course's student is full"<<endl;
}
}

student.h

class course;
class student
{
public:
student(void);
~student(void);

const char *get_name() const;
void set_name(const char *name);
double get_score(const course *crs) const;
void set_score(const course *crs, double score);
double get_average() const;
void add_course(course *crs);

protected:
char m_name[11];
course *m_crs[5];
double m_scores[5];
int m_n_crs;
};

student.cpp

using namespace std;

student::student(void)
: m_n_crs(0)
{
strcpy(m_name, "nil");
}

student::~student(void)
{
}

const char *student::get_name() const
{
return m_name;
}

void student::set_name(const char *name)
{
strcpy(m_name, name);
}

void student::set_score(const course *crs, double score)
{
for (int i = 0; i < m_n_crs; i++)
{
if (m_crs[i] == crs)
{
m_scores[i] = score;
return;
}
}

cout<<m_name<<" not study ** course"<<endl;
}

double student::get_score(const course *crs) const
{
for (int i = 0; i < m_n_crs; i++)
{
if (m_crs[i] == crs)
{
return m_scores[i];
}
}

cout<<m_name<<" not study ** course"<<endl;

return 0;
}

double student::get_average() const
{
double sum = 0;
for (int i = 0; i < m_n_crs; i++)
{
sum += m_scores[i];
}
return m_n_crs == 0 ? 0 : sum / m_n_crs;
}

void student::add_course(course *crs)
{
if (m_n_crs < 5)
{
m_crs[m_n_crs] = crs;
m_n_crs++;

crs->add_student(this);
}
else
{
cout<<m_name<<" \'s course is full"<<endl;
}
}

No3

int vals[10];
int error = -1;

static int &put(int n)         // put value into the array
{
if (n < 10)
{
return vals[n];
}
else
{
cout<<"range error input value!"<<endl;
exit(0);
}
}

static int get(int n)           // obtain a value from the array
{
if (n < 10)
{
return vals[n];
}
else
{
cout<<"range error input value!"<<endl;
exit(0);
}
}

test codes:

// No.1
stack st;
st.put(10);
st.put(12);
st.put(14);

cout << st.get() << endl;        // 輸出14,棧中剩下10,12
cout << st.get() << endl;       // 輸出12,棧中剩下10

// No.2
put(0) = 10;         // put values into the array
put(1) = 20;
put(9) = 30;

cout << get(0) << endl;
cout << get(1) << endl;
cout << get(9) << endl;

//put(12) = 1;         // out of range

// No.3
// 現有數學課,張三學數學,成績3.1分,李四學數學,成績為4.5分。求其平均成績,
// 求張三的數學成績。
//  現有物理課,學時為4,張三學物理,成績為4分。求張三所學課程的平均成績。

course physics, math;
student zs, ls;

zs.set_name("ZhangSan");
ls.set_name("LiSi");
zs.add_course(&math);
zs.set_score(&math, 3.1);
ls.add_course(&math);
ls.set_score(&math, 4.5);
physics.set_credit(4);
zs.add_course(&physics);
zs.set_score(&physics, 4);

cout<<"Average of math: "<<math.get_average()<<endl;
cout<<"ZhangSan's math score: "<<zs.get_score(&math)<<endl;
cout<<"ZhangSan's average: "<<zs.get_average()<<endl;

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com