補足01

C++によるプログラミング入門補足1
constについて前編

 C++入門で言い残したことについていくつかコメントをしようと思います。C++入門のモットーは、楽しいプログラミングでした。(どうでしたか?)私なりにがんばったつもりですが、いくつか気になることもあります。というのは、初心者に、はじめからあまり細かいことを言うと、嫌になると思い、省略した話がいくつかあります。あとは各自勉強してください、、、と思ったのですが、やはりいくつか、補足を書くことにしました。

 今日は、constの話です。ちょっと下のプログラムを見てください。

//const_sample0.cpp
#include <iostream>
using namespace std;

int main()
{
    int suji[5];  //数字

    cout << "5個の数字を入力してください。" << endl;
    for(int i = 0; i < 5; i++)
        cin >> suji[i];

    //本当のプログラムではここで何かやるはずですが、、、
    //簡単のため、単に打ち出すだけにします。

    cout << "数字を打ち出します。" << endl;

    for(int i = 0; i < 5; i++)
        cout << suji[i] << " ";
}

 プログラム自体はおもしろくもなんともないですね。ユーザに数字を5つ入力させ、その数字をまた打ち出しているだけです。実際のプログラムではもう少し複雑なことをするはずですが、説明を簡単にするために上のようなプログラムを作ったのです。例えば、簡易(?)データベースプログラム(名前を入力させ、名簿を作り、それを打ち出すようなやつ)など、ちゃんとしたプログラムを想像しながら、説明を読んでください。
 さて、上のプログラムでは、5つの数字を扱っています。もし、数字の数を7にしたくなったらどうしますか?簡単だよ、、、と思った人は、良く勉強した人です。実際、上のプログラムの5を7に書き直せばよいのですから、簡単です、、、か?本当に簡単ですか?もちろん、この位の短いプログラムなら簡単です。しかし、もっと実際的な長いプログラムが上のように書かれていたら、たぶん、プログラム中にたくさんの数字があって、どれをどうなおすのか混乱すると思います。例えば、1000行以上のプログラムで、必要な数字だけ書き換えることを考えてください。もし、別の文脈で5という数字があれば、その5は7に直すべきではないかもしれません。良く考えなければならないとっても嫌なところです。
 この問題を避けるために、プログラムのはじめの方で

#define TOTAL 5

を使うという方法があります。(最後に「;」は付けません。)このように書くと、プログラム中のTOTALが5と解釈されるのです。ここで、TOTALという名前は、プログラマが勝手に付けて良い名前なので、別の名前でも問題ありません

#define KAZU 5

なら、KAZUが5になります。この#defineを使うと、上のプログラムは

//const_sample1.cpp
#include <iostream>
#define TOTAL 5
using namespace std;

int main()
{
    int suji[TOTAL];  //数字

    cout << TOTAL << "個の数字を入力してください。" << endl;
    for(int i = 0; i < TOTAL; i++)
        cin >> suji[i];

    //本当のプログラムではここで何かやるはずですが、、、
    //簡単のため、単に打ち出すだけにします。

    cout << "数字を打ち出します。" << endl;

    for(int i = 0; i < TOTAL; i++)
        cout << suji[i] << " ";
}

と書けるのです。実行すると、前のプログラムと同じ動作をします。
 この書き方の良さは、わかりましたか?つまり、5個の数字を7個の数字にするために、書き換えるところは、ひとつだけなのです。つまり、#defineのところを、

#define TOTAL 7

とすれば良いのですね。とても簡単です。この方法なら、プログラムがどんなに長くても、大丈夫です。これは、Cでよく使われる手法です。


 しかし、一般に、C++では別の方法が推奨されています。それを見る前に、こんなプログラムを考えたらどうでしょう。

//const_sample2.cpp
//エラー!!! 
#include <iostream>
using namespace std;

int total = 5;

int main()
{
    int suji[total];  //数字

    cout << total << "個の数字を入力してください。" << endl;
    for(int i = 0; i < total; i++)
        cin >> suji[i];

    //本当のプログラムではここで何かやるはずですが、、、
    //簡単のため、単に打ち出すだけにします。

    cout << "数字を打ち出します。" << endl;

    for(int i = 0; i < total; i++)
        cout << suji[i] << " ";
}


ありゃ。エラーだ。

 これは上のプログラムとほとんど同じですが、#defineなどというものを使わずに、intを使おうとしているのです。#defineは便利ですが、論理的なミスを見つけにくいという欠点があるのです。それなら、C++(やC)の一部である変数を使えばよいだろうという発想です。変数であれば、何かミスをしたときには、コンパイラが教えてくれるそうだからです。
 変数totalの定義をmainの外でしていますが、このこと自身に問題はありません。これは、あくまでmainという関数の外で(そして、他のどの関数の中でもない場所で)変数を定義しているだけです。
 しかし、実際にコンパイルしてみると、エラーになってしまうのです。int suji[total];のように配列を定義するのに、totalが変数であってはいけないのです。コンパイラはここには定数を使えと文句を言っいるのです。(私は初心者の頃、これでとても悩みました。)CやC++ではそのように決められているのです。
 ところが、この解決方法は、実は簡単です。int total=5;をconst int total=5;と書き直せばよかったのです。くどいですが、ちゃんと書いて見ましょうか。

//const_sample3.cpp
//エラーでない!!!
#include <iostream>
using namespace std;

const int total = 5;

int main()
{
    int suji[total];  //数字

    cout << total << "個の数字を入力してください。" << endl;
    for(int i = 0; i < total; i++)
        cin >> suji[i];

    //本当のプログラムではここで何かやるはずですが、、、
    //簡単のため、単に打ち出すだけにします。

    cout << "数字を打ち出します。" << endl;

    for(int i = 0; i < total; i++)
        cout << suji[i] << " ";
}


コンパイルも実行もオッケー

 constは、以下に定義されている「変数」が実は「定数」であることを示しているのです。そのため、配列の定義にも使えたのです。それは、それが「定数」だからです。
 constはこのようにも使えるキーワードなのです。

 ところで、プログラム中の誤ったコードのおかげで、間違ってデータを書き換えてしまうということがよく起こります。(プログラムをタイプしていて直接データを書き間違うという意味ではなく、「変更したくないデータを書き換えてしまうコード」などを間違って書いてしまうという意味です。)
 そんな、ばかな?いえ、本当です。このような、プログラマが意識していない「データの書き換え」はやっかいです。こういうことが起こると悪夢のデバッグ(エラー直し)がはじまるのです。
 ところで、このデータは絶対に書き換えないぞ、と思っている場合なら、実は、const宣言してしまえば良いのです。こうしておけば、それは定数として扱われるので、変更ができなくなるのです。そのため、あとで知らずにそのデータを書き換えるようなコードを書くと、コンパイラがわかりやすいエラーメッセージで知らせてくれるのです。(初心者はコンパイル時にでるエラーを恐れたりしますが、実は、コンパイル時に出るエラーなんて、ものの数ではないのです。というか、コンパイル時にエラーになってくれた方が、実行中に突然プログラムが暴走したりするのより、ずっと良いのです。)そういうわけでconstはとても重要なのです。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值