2009-11-19 15 views
7

मैं एक होमवर्क असाइनमेंट किया है, यहाँ है समस्या बयान:सी # फ़ाइल आई/ओ क्षमता

आपका कार्यक्रम के रूप में काम करना चाहिए इस प्रकार है:

  1. उपयोगकर्ता से पूछें कि आप एक फ़ाइल नाम देने के लिए। फ़ाइल का नाम प्राप्त करें और इसे सेव करें।
  2. फ़ाइल खोलें।
  3. फ़ाइल से तापमान और हवा की गति को पढ़ें। दोनों मानों को डबल के रूप में घोषित चर में संग्रहीत किया जाना चाहिए। फ़ाइल एक पाठ फ़ाइल है। फ़ाइल की प्रत्येक पंक्ति में तापमान और हवा की गति मान होता है।
  4. एक प्रोग्रामर लिखा पद्धति का उपयोग करके सर्द हवा कारक की गणना करें, और के रूप में परिणाम प्रदर्शित:

    टी के लिए = फ़ाइल हवा सर्द सूचकांक से फ़ाइल और वी = हवा की गति से तापमान = गणना परिणाम डिग्री फेरनहाइट ।

    दशमलव बिंदु के बाद दो अंकों के साथ सभी संख्याओं को दिखाएं। (याद रखें- कोई जादू संख्या नहीं!)

  5. फ़ाइल के अंत तक इन चरणों को दोहराएं।

मैं काम पूरा कर लिया है, मेरे कोड के नीचे है, अगर वहाँ इसे और अधिक कुशल बनाने के लिए किसी भी तरह से था मैं बस सोच रहा था, या अगर कोई कुछ अलग और रचनात्मक तरीकों से इस समस्या को पूरा करने के लिए कर रहे हैं, मैं पहले से ही कर दिया इसमें 50/50 मिल गया, लेकिन मैं सिर्फ उत्सुक हूं कि आप में से कुछ उन्नत और कुशल प्रोग्रामर इस समस्या से कैसे संपर्क करेंगे।

using System; 
using System.IO; 

class Program 
{ 
    // declare constants to use in wind chill factor equation - no magic numbers 
    const double FIRST_EQUATION_NUMBER = 35.74; 
    const double SECOND_EQUATION_NUMBER = 0.6215; 
    const double THIRD_EQUATION_NUMBER = 35.75; 
    const double FOURTH_EQUATION_NUMBER = 0.4275; 
    const double EQUATION_EXPONENT = 0.16; 
    const int DEGREE_SYMBOL_NUMBER = 176; 

    static void Main() 
    { 
     // declare and initialize some variables 
     string filePath = ""; 
     string line = ""; 
     double temperature = 0.0; 
     double windSpeed = 0.0; 
     double windChillFactor = 0.0; 
     char degreeSymbol = (char)DEGREE_SYMBOL_NUMBER; 

     // ask user for a file path 
     Console.Write("Please enter a valid file path: "); 
     filePath = Console.ReadLine(); 

     // create a new instance of the StreamReader class 
     StreamReader windChillDoc = new StreamReader(@filePath); 

     // start the read loop 
     do 
     { 
      // read in a line and save it as a string variable 
      line = windChillDoc.ReadLine(); 

      // is resulting string empty? If not, continue execution 
      if (line != null) 
      { 
       string[] values = line.Split(); 
       temperature = double.Parse(values[0]); 
       windSpeed = double.Parse(values[1]); 

       windChillFactor = WindChillCalc(temperature, windSpeed); 

       Console.WriteLine("\nFor a temperature {0:f2} F{1}", temperature, degreeSymbol); 
       Console.WriteLine("and a wind velocity {0:f2}mph", windSpeed); 
       Console.WriteLine("The wind chill factor = {0:f2}{1}\n", windChillFactor, degreeSymbol); 
      } 
     } while (line != null); 

     windChillDoc.Close(); 

     Console.WriteLine("\nReached the end of the file, press enter to exit this program"); 

     Console.ReadLine(); 
    }//End Main() 

    /// <summary> 
    /// The WindChillCalc Method 
    /// Evaluates a wind chill factor at a given temperature and windspeed 
    /// </summary> 
    /// <param name="temperature">A given temperature</param> 
    /// <param name="ws">A given windspeed</param> 
    /// <returns>The calculated wind chill factor, as a double</returns> 
    static double WindChillCalc(double temperature, double ws) 
    { 
     double wci = 0.0; 
     wci = FIRST_EQUATION_NUMBER + (SECOND_EQUATION_NUMBER * temperature) - (THIRD_EQUATION_NUMBER * (Math.Pow(ws, EQUATION_EXPONENT))) + (FOURTH_EQUATION_NUMBER * temperature * (Math.Pow(ws, EQUATION_EXPONENT))); 
     return wci; 
    } 
}//End class Program 

मुझे यह बताने में संकोच न करें कि आप इसके बारे में क्या सोचते हैं।

+1

जब आपके पास एक ऐसा फ़ंक्शन होता है जो एक सेट समीकरण के आधार पर गणना परिणाम देता है, तो समारोह के सारांश में समीकरण समीकरण करना अच्छा होता है। –

उत्तर

7

आप सी # में फ़ाइल IO के लिए उससे ज़िप्पीयर नहीं प्राप्त करने वाले हैं। डेटा सेट के आकार के आधार पर यह एक buffered पाठक का उपयोग करने लायक हो सकता है, लेकिन पर्याप्त रूप से छोटी फ़ाइलों के लिए, यह सिर्फ इसके लायक नहीं है। मैं इसे छोड़ दूंगा।

+0

अभी तक एकमात्र व्यक्ति अपने "मुख्य" प्रश्न का उत्तर देने के लिए सीधे :) –

+0

उत्तर के लिए धन्यवाद, बिल्कुल सही है, इस तरह की एक साधारण फ़ाइल आईओ प्रोग्राम के साथ, आप पूरी तरह से अधिक कुशल नहीं हो सकते हैं। पीएस आपके सभी सुझावों के लिए धन्यवाद, वे सभी सहायक थे। – Alex

+0

मैं इंगित करता हूं कि उसने सीधे यह नहीं पूछा, "मैं सिर्फ इतना उत्सुक हूं कि आप में से कुछ उन्नत और कुशल प्रोग्रामर इस समस्या से कैसे संपर्क करेंगे।" – RCIX

6

आपकी अधिकांश टिप्पणियां अपरिपक्व हैं। The code should tell you how...the comments should tell you why.

+2

आप सही हैं, लेकिन मेरे अनुभव में, कई विश्वविद्यालयों को टिप्पणी के अनावश्यक स्तर की आवश्यकता होती है। –

+0

यह सच है। मेरे प्रोफेसरों के पास टिप्पणियों के लिए एक अनोखा प्यार था और अक्सर हम उन्हें वहां शामिल करने के लिए शामिल करते थे। यदि आप मुझसे पूछें तो यह समय की एक बड़ी बर्बादी है। टिप्पणियां केवल तभी जरूरी होनी चाहिए जब कार्यान्वयन स्पष्ट नहीं है (या आप एक दस्तावेज प्रणाली बना रहे हैं)। –

+0

हां, मैं व्यक्तिगत रूप से माइक के लिंक से सहमत हूं, लेकिन मेरे प्रोफेसर को हमारे असाइनमेंट में बहुत अधिक टिप्पणी की आवश्यकता है। – Alex

9

आपका तरीका अच्छा लग रहा है, लेकिन:

  • यह अच्छे यदि आप स्थिरांकों के लिए PascalCase इस्तेमाल किया विचार करेंगे, के रूप में है कि सी # उपयोग के लिए सम्मेलनों कोडन क्या है।
  • आपको स्ट्रीमरडर को एक प्रयोग कथन में लपेटना चाहिए, इसलिए इसे पूरा करने के बाद इसे ठीक से निपटान किया जाता है।
  • आपको यह सुनिश्चित करने के लिए कि आपको FileNotFound अपवाद नहीं मिलता है, आपको संभवतः इसे एक प्रयास ब्लॉक (और अपवाद को ठीक से पकड़ने के लिए पकड़) में लपेटना चाहिए।
  • यह शायद अपने जबकि पाश निम्नलिखित तरीके की संरचना करने के लिए एक बेहतर विचार है:

while((line = windChillDoc.ReadLine()) != null) { ... } [! अरे स्वरूपण सही काम नहीं करेगा]

उसके अलावा, हालांकि, मैं के रूप में पता नहीं मैं मौसम की गणना से परिचित नहीं हूं :)

+2

+1। http://msdn.microsoft.com/en-us/library/yh598w02.aspx –

+2

मैं इस बात से सहमत नहीं हूं कि यह 'अच्छा' दिखाई देगा, लेकिन आप सही हैं - सम्मेलन बताते हैं कि पास्कलकेस का उपयोग स्थिरांक के लिए किया जाना चाहिए । मैं UPPERCASE_WITH_UNDERSCORES शैली की तरह हूं, क्योंकि यह स्पष्ट रूप से टिप्पणियों को अलग करता है और इस तरह के लंबे समय तक उपयोग किया जाता है। –

+0

'foreach (File.ReadAllLines (fileName) में स्ट्रिंग लाइन) {...}' –

4

क्यों करें?अपने में पर आप शून्य की जांच करें। आपके में जबकि आप शून्य के लिए जांचते हैं। क्यों न केवल बनाते हैं जबकि कथन?

string line; 
while((line = windChillDoc.ReadLine()) != null) 
{ 
    //Logic 
} 

संपादित: संकलन त्रुटि फिक्स्ड। मजेदार बात यह थी कि मैं मूल रूप से था। इस रिच टेक्स्ट बॉक्स को एक कंपाइलर की जरूरत है! : पी

+1

बस मेरे प्रश्न पर एक ही बिंदु जोड़ा! – RCIX

+1

मैंने चेक नहीं किया है, लेकिन मुझे लगता है * आपको लूप के बाहर 'लाइन' घोषित करने की आवश्यकता है। –

+0

उह, मैं हमेशा उन फ़्लिप क्यों करता हूं? * उत्तर * नहीं * प्रश्न *! – RCIX

5
string filePath = ""; 
... 
filePath = Console.ReadLine(); 

उन मानों के साथ प्रारंभ न करें जिनका उपयोग कभी नहीं किया जाता है; और घोषणा और एक साथ प्रारंभ पास रखें:

string filePath = Console.ReadLine(); 

using उल्लेख किया गया है - लेकिन अनावश्यक रूप से @ का उपयोग नहीं करते:

new StreamReader(filePath); 

:

new StreamReader(@filePath); 

सिर्फ होना चाहिए

व्यक्तिगत रूप से, मैं लाइन-रीडर के लिए LINQ का उपयोग करता हूं, लेकिन यह सिर्फ मुझे है ;-

6

माइनर नाइटपिक, लेकिन यदि आप अंग्रेजी विधि नामों का उपयोग कर रहे हैं तो "WindChillCalc" "CalcWindChill" होना चाहिए (क्रिया जाता है प्रथम)।

+0

आह, पकड़ के लिए धन्यवाद। – Alex

0

इस तरह के छोटे अकादमिक कार्यक्रमों में, जब तक कि आप वास्तव में कुछ गूंगा नहीं करते हैं, प्रदर्शन कोई मुद्दा नहीं होगा। यह बताने का एक आसान तरीका है कि प्रदर्शन एक मुद्दा है या नहीं: "क्या यह मुझे इंतजार कर रहा है?"

यदि इनपुट की भारी मात्रा में थे, तो मैं पूछूंगा कि इनपुट कौन प्रदान कर रहा है और आउटपुट कौन पढ़ रहा है। यह मुझे बताएगा कि क्या मैं पाठ के बजाय बाइनरी में I/O कर सकता हूं, क्योंकि यह है कि, प्रसंस्करण का बड़ा हिस्सा इनपुट पर संख्याओं में रूपांतरण के रूप में होगा, और आउटपुट पर पाठ के लिए संख्याएं, विशेष रूप से तैरनेवाला स्थल।

2

आप शैली आदि पर चिह्नित कर रहे हैं तो फिर वहाँ एक जोड़े को बेहद मामूली बातों

  • 0,0 करने के लिए प्रारंभ करने डबल्स है बेमानी है।
  • string.Empty बजाय "के"
  • आपका windchill विधि बदला जा सकता है बस के लिए पसंद किया जाता है (हालांकि, संकलन के दौरान, मुझे लगता है कि WCI बाहर अनुकूलित किया जाएगा - तो यह कार्यात्मक रूप ही है):

(अतः पठनीयता के लिए स्वरूपण में परिवर्तन किया गया)

static double WindChillCalc(double temperature, double ws) 
{ 
    return FIRST_EQUATION_NUMBER + 
     (SECOND_EQUATION_NUMBER * temperature) - 
     (THIRD_EQUATION_NUMBER * (Math.Pow(ws, EQUATION_EXPONENT))) + 
     (FOURTH_EQUATION_NUMBER * temperature * (Math.Pow(ws, EQUATION_EXPONENT))); 
} 
3

हालांकि वास्तव में प्रदर्शन करने के लिए (मुख्य प्रश्न)

संबंधित नहीं IMO:

const double FIRST_EQUATION_NUMBER = 35.74; 
const double SECOND_EQUATION_NUMBER = 0.6215; 
const double THIRD_EQUATION_NUMBER = 35.75; 
const double FOURTH_EQUATION_NUMBER = 0.4275; 
const double EQUATION_EXPONENT = 0.16; 

एक जादू संख्या से कहीं ज्यादा बेहतर नहीं है। यह देखते हुए कि मुझे नहीं पता कि FIRST_EQUATION_NUMBER का उपयोग कहीं समीकरण के अलावा अन्य के लिए किया जाता है, और मैं यह नहीं बता सकता कि वे एक ही समीकरण में हैं या आपके पास चार समीकरण हैं जो विभिन्न संख्याओं का उपयोग करते हैं?उन्हें वास्तविक विधि में भी रखा जा सकता है क्योंकि उनका उपयोग केवल एक ही स्थान पर किया जाता है।

मैं बाद में एक कॉन्स int से काम करने के बजाय degreeSymbol को एक कॉन्स में बदल दूंगा।

const char DEGREE_SYMBOL = (char)176; 
संबंधित मुद्दे