मुझे अपनी समस्या का समाधान करने के लिए getchar() पद्धति का उपयोग करके संख्याओं को फ़्लोट में बदलने में समस्या हो रही है। मेरी समस्या के लिए मुझे वर्णों को fixed size = 50 की एक सरणी में संग्रहीत करने की आवश्यकता है। साथ ही, एक सरणी में भंडारण केवल तब होता है जब कोई स्थान होता है ' ' या एक नई लाइन \n getchar() का उपयोग करके पढ़ी जाती है। यह EOF पढ़े जाने तक होता है। अंत में, फ्लोट नंबर और यह डबल है (टैब स्पेस के साथ) printf का उपयोग करके वापस और प्रिंट किया जाता है।

निर्देशों के अनुसार, केवल getchar() की अनुमति है। scanf(), fgets(), atoi(), atol(), atof(), strtol(), strtoul() या एक अतिरिक्त सरणी जैसे कार्य नहीं हो सकते हैं उपयोग किया गया।

यहाँ मैं अब तक के साथ आया हूँ। (नीचे नमूना इनपुट और आउटपुट देखें)

#include <stdio.h>
#define SIZE 50    // assume no more than 50 literals in input
int main(){
 
  float c;
  float u;
  float value = 0.0;
  float resu[SIZE];
  int index = 0;
  int i;
  char sub = '0';

  value = 0;
  c = getchar();
  while ( c != EOF){ 
    if(c == '.'){
      u = 0.1;
    }

    else if (c == ' ' || c == '\n'){ 
      if(u == 0.1){
        value = value * 0.1;
    } 
      resu[index] = value;
      index++;
      value = 0;
    }

    if( c >= '0' && c <= '9'){
        value = value * 10 + (c-sub);
    }
    c = getchar(); // read next
  }
 
  //printing the result
  for(i=0; i < index; i++)
    printf("%.4lf \t %.4lf\n", resu[i],resu[i] *2.0);
 
  return 0;
}

(नोट- मूल संख्या के बीच एक टैब होता है और यह दोगुना होता है)

Sample Input: 
2.3 4.56
43.3 43 5.3
.3 1.2

Sample Output: 
2.3000    4.6000
45.6000    91.2000 //ERROR
43.3000    86.6000
4.3000    8.6000   //ERROR
5.3000    10.6000
0.3000    0.6000
1.2000    2.4000
0
Nzed 29 जिंदा 2021, 15:30
if(u == 0.1) ठीक से काम नहीं करेगा। if(u == 0.1f) बेहतर होगा।
 – 
MikeCAT
29 जिंदा 2021, 15:33
value = value + (c-sub) * 0.1; मुझे नहीं लगता कि आप गणना में c का उपयोग करना चाहते हैं जब यह ' ' या \n हो।
 – 
Johnny Mopp
29 जिंदा 2021, 15:36
जब तक यह एक व्यायाम के लिए नहीं है, आपको इसके बजाय स्कैनफ का उपयोग करना चाहिए। फ़्लोट्स पार्स करने के लिए बहुत मुश्किल हो सकते हैं।
 – 
Devolus
29 जिंदा 2021, 15:40
1
अभी ऐसा लगता है कि आप दशमलव बिंदु से अधिक से अधिक एक अंक को संभालते हैं। मुझे लगता है कि आप एकाधिक को संभालना चाहते हैं। मैं कहूंगा कि जब आप . देखते हैं तो आप तुरंत value के साथ कुछ भी नहीं करना चाहते हैं। मैं कहूंगा कि आप केवल यह याद रखने के लिए एक ध्वज सेट करना चाहते हैं कि आपने दशमलव बिंदु देखा है। यदि आपने दशमलव बिंदु नहीं देखा है, तो प्रत्येक अंक वर्ण c के लिए जो आप देखते हैं, आप value = value * 10 + (c-sub) करते हैं, जैसा कि अभी है। लेकिन अगर आपने दशमलव बिंदु देखा है, तो आप कुछ और करना चाहेंगे। हो सकता है कि आप u को 0.1, 0.01, 0.001, आदि पर जाना चाहें।
 – 
Steve Summit
29 जिंदा 2021, 16:09

1 उत्तर

सबसे बढ़िया उत्तर

दो चीजें जो आप नहीं करते हैं वह है u को इनिशियलाइज़ करना या प्रत्येक शब्द के लिए u को रीसेट करना।

float u = 0;
....
    else if (c == ' ' || c == '\n') { 
        if (u == 0.1){
            value = value * 0.1;
        } 
        resu[index] = value;
        index++;
        value = 0;
        u = 0;       // Reset it for next number
    }

इसके अलावा, आप u = 0.1 को हार्ड-कोड करते हैं, लेकिन यह केवल तभी काम करता है जब केवल 1 दशमलव स्थान हो। इस असाइनमेंट के लिए यह ठीक हो सकता है, लेकिन दशमलव के बाद अंकों की गणना करना एक बेहतर विकल्प होगा।

#include <stdbool.h>
#include <math.h>
#include <ctype.h>
...
int digits_after_decimal = 0;
bool have_decimal_point = false;
int value = 0;
int c;
while ((c = getchar()) != EOF) {
    // Decimal point found?
    if ('.' == c) {
        have_decimal_point = true;
    }
    else if (isdigit(c)) {
        // Add this digit to integer value
        // Parentheses not required but added for clarity
        value = (value * 10) + (c - '0');
        // If decimal point already found, increment count
        if (have_decimal_point) digits_after_decimal += 1;
    }
    // Complete word. Save and reset
    // TODO: Multiple spaces between words?
    else if (' ' == c || '\n' == c) {
        // Divide by the correct power of 10 based on
        // the number of digits after the decimal point
        resu[index++] = value / pow(10, digits_after_decimal);
        if (index == SIZE) break;  // Avoid overflow
        // Reset for next number
        digits_after_decimal = 0;
        have_decimal_point = false;
        value = 0;
    }
    // TODO: Negative numbers?
}
0
Johnny Mopp 29 जिंदा 2021, 17:52
सहायता के लिए धन्यवाद। इस अभ्यास के लिए मुझे ऋणात्मक संख्याओं की उपेक्षा करनी होगी। कोड अब काम करता है।
 – 
Nzed
29 जिंदा 2021, 17:54