• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C シャープ クラスの使われたコードについて)

C#クラスの使われたコードについて

このQ&Aのポイント
  • C#初心者がクラスについて勉強しています。教科書のサンプルコードから要点を抽出し、クラスの使われ方を説明します。
  • CarpetCalculatorクラスの以下のメソッドが使われています: - PricePerSqYard: 物件の価格を取得または設定するプロパティ - CarpetCalculator(double price): 引数を指定してインスタンスを生成するコンストラクタ - DetermineTotalCost(): 総コストを計算するメソッド - SetNoOfSqYards(double length, double width): 長さと幅から面積を計算し、物件の面積を設定するメソッド - ToString(): 結果を文字列に変換するメソッド
  • CarpetCalculatorAppクラスの以下のメソッドが使われています: - Main(): ユーザーから長さと幅を入力し、CarpetCalculatorのインスタンスを生成して結果を表示するメソッド

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> 別クラスを使ってプログラムを作った場合コールされるものとされないものが出てくるので、まだ慣れて > いないからか読みにくいんです。 多分、後から使われるものも一緒に宣言しているのでしょうから、 その都度説明があってもいいような気がしますけど、 あまり親切じゃないんですねその本・・・。 使われてるのは前に記した通りですよ。 CarpetCalculatorAppクラスから見て呼び出されている『クラス』は1つ(CarpetCalculator)ですが、 CarpetCalculatorクラスの『メンバ』が5つ利用されてます。 (.NET Framework標準クラスを除く) ToString()はConsole.Write()した時に暗黙的に呼び出されます。

jikitarisu1
質問者

お礼

大変遅くなりました。有難うございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

多分こういうことが聞きたいのだと思いますが・・・。 CarpetCalculatorAppクラス内から使われているCarpetCalculatorクラスのpublicメンバは コンストラクタ CarpetCalculator(double price) メソッド SetNoOfSqYards(double length, double width) アクセサ(set) PricePerSqYard メソッド ToString() の順で、 ToString()が走行した際、CarpetCalculatorクラス内部で メソッド DetermineTotalCost() が使われてます。 教本があるなら、そこに説明文はありませんか?

jikitarisu1
質問者

補足

私が使っている教本は私が疑問に思ったことに限って説明していないんです。 Main()のあるクラス内でメソッドを使いプログラムを作るのなら、全てのメソッドが使われるのでデータがどう動くのか分かりやすいのですが、別クラスを使ってプログラムを作った場合コールされるものとされないものが出てくるので、まだ慣れていないからか読みにくいんです。 つまりこのコードではnaktakさんもおっしゃっているこの5つのクラスだけがコールされている、ということでよろしいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C#のプログラミングについて(基礎・・)

    どうしても エラーが出ます エラーの表示は 下のようなものなのですが、どういう意味かわかりません。 C:\Documents and Settings\gc60117\デスクトップ\Project3\CodeFile1.cs(20): 引数を '2' 個指定できる、メソッド 'Vector' のオーバーロードはありません。  自分なりのプログラミングデータを記述します。 間違いを指摘していただけると助かります。 using System; class Vector { private double x; private double y; public double Length { get{return Math.Sqrt(x*x+y*y);} } public void Write() { Console.Write("({0},{1})",x,y); } public static Vector I { get{return new Vector(1,0);} } public static Vector J { get{return new Vector(0,1);} } public static Vector operator*(double k,Vector a) { Vector t= new Vector(); t.x=k*a.x; t.y=k*a.y; return t; } public static double operator*(Vector a, Vector b) { double z= new double(); z=a.x*b.x+a.y+b.y; return z; } public static Vector operator+(Vector a,Vector b) { Vector u=new Vector(); u.x=a.x+b.x; u.y=a.y+b.y; return u; } public static double Angle(Vector A,Vector B) { double r=new double(); r=A*B/(A.Length*B.Length); r=Math.Acos(r); r=r/6.28*360; return r; } } class kadai53 { static void Main() { Vector A; double x, y; Console.Write("ベクトルAの成分を入力してください\n"); Console.Write("x成分は ? "); x = double.Parse(Console.ReadLine()); Console.Write("y成分は ? "); y = double.Parse(Console.ReadLine()); A = x * Vector.I + y * Vector.J; //静的プロパティと,一つ目の*演算子,+演算子の呼び出し Console.Write("A = "); A.Write(); Vector B = new Vector(0, 1); Console.Write("\nB = "); B.Write(); Console.WriteLine("\nベクトルAとベクトルBの内積の値は{0}です", A*B);//二つ目の*演算子の呼び出し Console.Write("ベクトルAとベクトルBがなす角度は{0}度です\n", Vector.Angle(A,B)); } }

  • C#で独自の型を定義したい

    C# 2010 version 4.0を使用しています。 次のようなint型とstring型を混合したMixedという型を定義したいのですが、 public class Mixed { private int _TheInt = 0; public int TheInt { get { return _TheInt; } set { _TheInt = value; } } private string _TheString = null; public string TheString { get { return _TheString; } set { _TheString = value; } } public static implicit operator int(Mixed m) { return m.TheInt; } public static implicit operator Mixed(int x) { Mixed m = new Mixed(); m.TheInt = x; return m; } public static implicit operator string(Mixed m) { return m.TheString; } public static implicit operator Mixed(string x) { Mixed m = new Mixed(); m.TheString = x; return m; } } //Mixed m = 1; //Console.WriteLine(m); //これだとコンパイルエラーになる //Console.WriteLine(m.TheInt.ToString()); //「1」と表示される int i = 1; Console.WriteLine(i); //「1」と表示される object o = 1; Console.WriteLine(o); //「1」と表示される Console.WriteLineなどで表示する場合に 例えばint型なら int i = 1; Console.WriteLine(i); //「1」と表示される という具合にそのまま「1」と表示されます。 でもこのMixedの場合、 Mixed m = 1; Console.WriteLine(m.TheInt.ToString()); //「1」と表示される これでは「1」と表示されるのですが、 Console.WriteLine(m); //これだとコンパイルエラーになる このやり方だとエラーになります。 なんとかしてint型やobject型のようにToString()を使わずに 表示させることはできないでしょうか?

  • エレメントクラス?

    Javaを勉強しているのですが、 web系で有るJavaBeansのような機能を javaアプリケーソン等でもエレメントクラス?と言って使えるらしいのですが、 どの様に使えばいいのでしょうか、 JavaBeansだと public class 名前{ private String num; public void setNumd(String num)  { this. num= num;  } public String getNum()  {    return this.num; } } この様な構造で、 newしてセットやゲットしいたりすると思いますが(サーブレット上)、 エレメントクラスではどうしたらいいのか分かりません? エレメントクラスの構造は基本構造はJavaBeans(上記)と同じで、 public class 名前{ private String num;  コンストラクタ( String num ) { setNum(num) } コンストラクタ( クラス型 名) { this. num= num; } public void setNumd( String num )  { this. num= num;  } public String getNum()  {    return this.num; } } 上記の様に2つのコンストラクタ追加された構造らしいのですが、 JavaBeansの同じようにnewしてセットやゲットしいようとしてもうまく出来ません? 教えてもらったエレメントクラスで調べても言葉としては出てくるのですが、 詳しい情報がなくセットやゲットしかたや構造が上記の様でいいのか分かりません、 まだ、初歩の初歩までしかやっていないので済みませんが教えて下さい。

  • C#

    C#の質問です。 『クラスIntArrayを作成し、作成したクラスが正常に動作するか検証するためのクラスを作成してください。』 というプログラムを組んでおり、クラスIntArrayとその動作を検証するクラスを作成したのですが、クラスIntArrayについて「問題文で指定された通りに作成されていません。」という指摘を受けました。 何度も見直したのですが、どの部分が指定された通りになっていないのか、自分では見つけることが出来ませんでした; 私が作成したクラスIntArrayとその仕様については、下記のとおりです。 お分かりになる方がいらっしゃいましたら、ご助言をお願いいたします。 【クラスIntArray 仕様】 <インスタンス変数> int型の配列data <コンストラクタ> 以下の3種類を用意します。 ・int型の配列を受け取り、そのコピーを内部的に保持します。 ・第1引数で指定された要素数を持つ配列を確保し、全ての要素に初期値として第2引数で指定された値をセットします。 ・第1引数で指定された要素数を持つ配列を確保し、全ての要素に初期値としてゼロをセットします。 <メソッド> ・Sort 内部的に保持している配列を、引数の値がtrueであれば昇順、falseであれば降順にソートする ・Length IntArrayが保持している配列の要素数を取得する ・GetElement 引数に指定された要素番号の値を取得する ・SetElement 第1引数に指定された要素番号に第2引数で指定された値を格納する ・GetArray IntArrayが保持している配列のコピーを取得する 【作成したクラスIntArray】 using System; private int[] data; public IntArray(int[] array) { this.data = new int[array.Length]; array.CopyTo(this.data, 0); for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } public IntArray(int args1, int args2) { int[] myarray = new int[args1]; for (int index = 0; index < args1; index++) { myarray[index] = args2; } for (int index = 0; index < myarray.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(myarray[index]); } Console.WriteLine(); } public IntArray(int args) { int[] myarray = new int[args]; for (int index = 0; index < args; index++) { myarray[index] = 0; } for (int index = 0; index < myarray.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(myarray[index]); } Console.WriteLine(); } public void Sort(bool flg) { Array.Sort(this.data); //昇順にソート if (!flg)  //降順にソート { Array.Reverse(this.data); } for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } public int Length() { return this.data.Length; } public int GetElement(int args) { int getvalue = this.data[args]; return getvalue; } public void SetElement(int args1, int args2) { this.data[args1] = args2; } public void GetArray() { for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } }

  • javascriptのコードについて

    以下のコードなのですが、 エンクロージャー関数の ローカル変数hogeをさらに、エンクロージャー内部で定義された 関数ででクロージャーとして保持させたいメソッドのコードですが var Method = function (){ var hoge = "初期値"; var getter = function (){ return hoge; } var setter = function (param){ hoge = param; return hoge; } return {"set" : setter,"get" : getter} } var obj = Method(); console.log(obj); console.log(obj . get()); obj.set("初期値変更"); console.log(obj.get()); obj . set("更に変更"); console.log(obj.get()); この場合、メソッドの返り値として、一般的な文献に乗っている関数(関数オブジェクト)を返すのではなく オブジェクトリテラルとして返しています。 この場合でも、動きとしてはクロージャーの動きをしているのでhogeという変数の保持はできているっぽいんですが クロージャーって関数内で定義された関数であれば、どういう返り値の返し方でも クロージャーになるのですかね? また、この方法は、一般的にjsで関数コンストラクタ呼び出しをしてインスタンスを作る際privateメンバを実現する方法として紹介されていますが、 これはクロージャーとして生成するたんびに内部の変数を保持するためメモリ食い虫になるらしいのですが まず間違いなく、このクラス(便宜上そう呼びます)のインスタンスはひとつしかつくることはない!!という仕様だとしても いけないのでしょうか? というかもう現状javascripのバッドノウハウ的なものになっているのでしょうか?

  • C#における++演算子のオーバーロードについて

    はじめまして。 いろいろ調べてみたのですが、わからなかったので、質問させてください。 C#における++演算子のオーバーロードについてなのですが、 まずは、以下のコードをご覧ください。 ================================================================ using System; class Test { private int Num; public Test(int x) { this.Num = x; } public static Test operator ++(Test t) { Test result = new Test(t.Num + 1); return result; } public override string ToString() { return this.Num.ToString(); } } class TestDemo { public static void Main() { Test t = new Test(0); Console.Write(t++ + "\n"); Console.Write(t + "\n"); Console.Write(++t + "\n"); Console.Write(t + "\n"); } } ================================================================ 実行結果 0 1 2 2 ================================================================ ++演算子のオーバーロード関数の実装が一つなのに 前置インクリメントと後置インクリメントが適切に行われています。 二つのインクリメントが行われるときに同じメソッドが 呼び出されていると思うのですが、同一の実装で、振る舞いが 異なるのは、なぜなのでしょうか?どのようなカラクリで 実行されているのでしょうか?全くわかりません。どなたか 教えてください。よろしくお願いします。

  • C言語を実行すると-infが出てきて困っています。

    C言語を実行すると-infが出てきて困っています。 コンパイラはgccを使っています。 よろしくお願いします。 #include <stdio.h> #include <math.h> #include <stdlib.h> #define data 100//計算回数 double seiki(void)//正規乱数 { double n; double i; double y; double x1,x2; double sigma; double mean; double Pi = 2*asin(1); sigma = 1; mean = 0; { x1 = (double)rand()/(RAND_MAX); x2 = (double)rand()/(RAND_MAX); y = sigma*sqrt(-2*log(x1))*sin(2*Pi*x2) + mean; //printf("%f\n",y); } return (y); } int main(void) { double* price; int i, j, k; double a, b, c; //メモリ確保 price=(double*)malloc(sizeof(double)*data+10); for(i = 0;i<data;i++) { price[i+1] = price[i]+seiki(); printf("%lf\n",price[i+1]); } return 0; }

  • C#のソースコードについての質問です

    using System; public class kkk { public static void Main() { ddd d = new ddd(); int i = d.knapsack(0, 0); Console.WriteLine("" + i); } } public class ddd { int[] ws = new int[] { 3, 4, 1, 2, 3, }; int[] ps = new int[] { 2, 3, 2, 3, 6 }; int maxw = 10; public int knapsack(int n, int w) { if (w > maxw) return -1; if (n >= ws.Length) return 0; return Math.Max(knapsack(n + 1, w), knapsack(n + 1, w + ws[n]) + ps[n]); } } このコードを書いたらエラー 1 静的でないフィールド、メソッド、またはプロパティ 'kkk.d' で、オブジェクト参照が必要です というエラーがでてきました、構文が間違っているところが分かりません どなたか教えてください

  • C#のGraphicsクラスについてです。

    C#のGraphicsクラスを用いて画像をフェードインで表示させよとしています。 まず以下のコードをごらんください。 ただ、フェードインで画像は表示されるものの、フォームの操作が一切できなくなってしまいます。 そのためマルチスレッドにしようとしたのですが using System; using System.IO; using System.Windows.Forms; using System.Drawing; using System.Web; using System.Net; using System.Text; using System.Threading; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Diagnostics; public class MainClass{ public static void Main(string [] args){ NewForm formObj = new NewForm(); Application .Run(formObj); } } public class NewForm : Form { //インスタンス変数の宣言 public Graphics g ; public Bitmap mapObj ; public Image imageObj; public ImageAttributes ia; public ColorMatrix cm; public Thread th ; public ParameterizedThreadStart ts; public PaintEventArgs e; public Rectangle rec; public int flag = 0; public delegate void TestDelegate(); public TestDelegate deleObj; public NewForm(){ Button buttonObj = new Button(); buttonObj.Width=100; buttonObj.Height = 30; //フェードさせるためのイベント発行用ボタンの設置 buttonObj.Click += new EventHandler(this.SetMethod); this.Controls.Add(buttonObj); } public void SetMethod(object sender , EventArgs e){ this.Paint += new PaintEventHandler(this.ThreadMethod); //フォームコントロールの再描画を促す this.Invalidate(); } public void ThreadMethod(object sender ,PaintEventArgs eventObj){ this.ts = new ParameterizedThreadStart(this.ThreadRenderMethod); this.th = new Thread(this.ts); this.th.Start(eventObj); MessageBox.Show("ThreadMethod実行後"); MessageBox.Show(InvokeRequired.ToString()); this.th.Join(); } public void ThreadRenderMethod(object paintObj){ MessageBox.Show(InvokeRequired.ToString()); this.deleObj =delegate(){ //無現ループしてしまうので、再描画イベント後イベントハンドラーを削除 this.Paint -= new PaintEventHandler(this.ThreadMethod); PaintEventArgs e = (PaintEventArgs)paintObj; try{ Console.WriteLine("paint メソッド発生"); this. g = e.Graphics; this.mapObj = new Bitmap(this.Width,this.Height); this.imageObj = Image.FromFile("C:\\c#\\test.jpg"); //this.g = Graphics.FromImage(this.mapObj); this.cm = new ColorMatrix(); this.cm.Matrix00 = 1; this.cm.Matrix11 = 1; this.cm.Matrix22 = 1; this.cm.Matrix33 = 0.0F; this.cm.Matrix44 = 1; this.ia = new ImageAttributes(); this.ia.SetColorMatrix(this.cm); this.rec = new Rectangle(0, 0, this.Width, this.Height); this.g.DrawImage(this.imageObj,rec,0,0,this.imageObj.Width,imageObj.Height,GraphicsUnit.Pixel,this.ia); this.BackgroundImage = mapObj; for(double i = 0.0; i <= 1.0; i = i + 0.001){ this.cm.Matrix33 = (float) i; this.ia.SetColorMatrix(this.cm); this.g.DrawImage(this.imageObj,rec,0,0,this.imageObj.Width,imageObj.Height,GraphicsUnit.Pixel,this.ia); this.BackgroundImage = this.mapObj; Thread.Sleep(100); } //this.imageObj.Dispose(); //this.g.Dispose(); }catch(Exception ex){ Console.WriteLine(ex.ToString()); } Console.WriteLine("paint end"); }; this.deleObj(); //this.Invoke(this.deleObj); this.BackgroundImage = Image.FromFile("C:\\c#\\test.jpg"); } } 上記コードでも、フェードは動作するものの、やはりフォームの操作ができなくなります。 どう対処したらよいでしょうか? 識者の方、よろしくご教授ください お願いいたします

  • コンストラクタの変数を別のコンストラクタで使えますか?

    いつも大変勉強にさせてもらってます。 C#・・というかプログラミング初心者です。 勉強はとにかくしているんですが、躓いてばかりです・・。 多分基本的なことだとは思うんですが、調べても、本を読んでもわからなかったので、ご教授願います。 public void Set_ComboBox(string ColumnNo, string ColumnName, object CmbName) { System.Windows.Forms.ComboBox Cmb_WK; Cmb_WK = (System.Windows.Forms.ComboBox)CmbName; Cmb_WK.DataSource = this.M_KIJITableAdapter.GetDataById_Hinmei().Copy(); Cmb_WK.DisplayMember = "sname"; Cmb_WK.ValueMember = "id"; string sname = Cmb_WK.SelectedValue.ToString(); string id = Cmb_WK.GetItemText(Cmb_WK.SelectedValue).ToString(); } private void KijiCmbBox1_SelectedIndexChanged(object sender, EventArgs e) { Console.WriteLine("商品名" + sname + "ID" + id); } 上のコンストラクタで作った sname と id を下のコンストラクタで使いたいのですが、publicだからそのまま書いても使えるかと思ったんですけど、エラーになります。 さらに以下のようにソースを付け足してみたのですが、System.StackOverflowExceptionがでてしまい困っています。 public string sname{ get { return sname; } set { sname = value; } } public string id { get { return id; } set { id = value; } } そもそもコンテキストが違うとアクセスできないということでしょうか? ご存知の方、よろしければ教えてください。