8

私はCのコース(最初のプログラミングコース)の宿題をしています。割り当ての一部は、ユーザーが最大9桁の数字を入力するようにコードを記述することであり、プログラムは、この数字が「増加」/「真に増加」/「減少」/「真に減少」/であるかどうかを判断する必要があります。増加および減少」/「真に減少および真に増加」/「減少および増加しない」。(合計7つのオプション)

これは私たちの最初の課題であるため、クラスで教えられたもの以外のものを使用することは許可されていません。

do-while、for、whileループ、else-if、if、break、continue scanf、printf、modulo、および基本演算子

(stdio.h以外のライブラリは使用できません)

それでおしまい。配列やgetcharそのようなものは使用できません。ユーザーからの入力を受け取るために使用できる唯一の関数はですscanf

これまでのところ、フローチャートとすべてを使用してアルゴリズムを作成しましたが、ユーザーの入力を個別の数字に分ける必要があります。

たとえば、ユーザーが「1234 ...」と入力した場合、aに1、bに2などを保存し、すべての桁を比較して、たとえば、すべてが等しいかどうか(増減)を判断します。 )またはa> b> c ...(減少)など。

%および/演算子を使用して各桁を区切る方法は知っていますが、後で比較に使用できる変数にこれらの値を「保存」する方法がわかりません。

これは私がこれまでに持っているものです:

printf("Enter a positive number : ");

do {
    scanf ("%ld", &number);
    if (number < 0) {
        printf ("invalid input...enter a positive integer: ");
        continue;
    }
    else break;
} while (1);

while (number < 0) {
    a = number % 10;
    number = number - a;
    number = number / 10;
    b = a;
}
4

7 に答える 7

5

それらを文字(文字列)としてスキャンしてみませんか?次に、ASCII文字コードから48のオフセットを引くことにより、配列オフセットを介してそれらにアクセスできます。isdigitfrom ctype.hを使用して、文字が数字であることを確認できます。


編集

あなたの教授が設定した信じられないほどぼんやりした制限のために:

#include <stdio.h>

int main()
{
  int number;
  printf("Enter a positive number: ");

  do
  {
    scanf ("%ld", &number);
    if (number < 0)
    {
      printf ("invalid input...enter a positive integer: ");
      continue;
    }
    else break;
  } while (1);

  int a = -1;
  int b = -1;
  int c = -1;
  int d = -1;
  int e = -1;
  int f = -1;
  int g = -1;
  int h = -1;
  int i = -1;

  while (number > 0)
  {
    if (a < 0) a = number % 10;
    else if (b < 0) b = number % 10;
    else if (c < 0) c = number % 10;
    else if (d < 0) d = number % 10;
    else if (e < 0) e = number % 10;
    else if (f < 0) f = number % 10;
    else if (g < 0) g = number % 10;
    else if (h < 0) h = number % 10;
    else if (i < 0) i = number % 10;

    number /= 10;
  }

  /* Printing for verification. */

  printf("%i", a);
  printf("%i", b);
  printf("%i", c);
  printf("%i", d);
  printf("%i", e);
  printf("%i", f);
  printf("%i", g);
  printf("%i", h);
  printf("%i", i);

  return 0;
}

最後の有効な数値は正になるため、さまざまな条件を満たすために検証する数値です。

于 2012-04-06T14:58:49.763 に答える
2

連続する数字を比較するだけでよいので、配列なしでこれを行うための洗練された方法があります。

int decreasing = 2;
int increasing = 2;

while(number > 9)
{
  int a = number % 10;
  int b = (number / 10) % 10;

  if(a == b)
  {
    decreasing = min(1, decreasing);
    increasing = min(1, increasing);
  }
  else if(a > b)
    decreasing = 0;
  else if(a < b)
    increasing = 0;

  number /= 10;
}

10ここでは、 1桁だけが残るまで、(で割って)数値をウォークスルーします。この時点までの数に関する情報を格納します。これは、真に増加/減少することdecreasingを意味し、増加/減少することを意味し、増加/減少しないことを意味します。increasing210

各ステップで、aは1桁で、bは10です。次に、との比較に基づいて変更しincreasingます。decreasingab

increasing最後に、との値をdecreasing必要な最終的な答えに変えるのは簡単なはずです。

注:この関数minは、2つの引数のうち小さい方を返します。if独自の行を作成するか、それらの行をステートメントまたは条件に置き換えることができるはずです。

于 2012-04-06T15:48:54.087 に答える
1

あなたがこの番号23654を持っているとしましょう

23654 % 10000 = 2 and 3654
3654 % 1000 = 3 and 654
654 % 100 = 6 and 54
54 % 10 = 5 and 4
4

このようにして、すべての桁を取得できます。もちろん、最初の除数を知るには、その数が10000、1000、100、または10より大きいかどうかを知る必要があります。

巨大なif...elseステートメントを回避するために、sizeofで遊んで整数のサイズを取得します

編集:

見てみましょう

if (number>0) {
    // Well, whe have the first and only digit
} else if (number>10) {
    int first_digit = number/10;
    int second_digit = number % 10;
} else if (number>100) {
    int first_digit = number/100;
    int second_digit = (number % 100)/10;
    int third_digit = (number % 100) % 10;
} ...

などなど、私は推測します

于 2012-04-06T15:04:09.817 に答える
1

配列なしでループを実行するように依頼するのはばかげていますが、それは先生のせいであり、あなたのせいではありません。

そうは言っても、私は次のようなことをします。

char c;
while (1) {
    scanf("%c", &c);
    if (c == '\n')    /* encountered newline (end of input) */
        break;
    if (c < '0' || c > '9')
        break;        /* do something to handle bad characters? */
    c -= '0';
    /*
     * At this point you've got 0 <= c < 9. This is
     * where you do your homework :)
     */
}

ここでの秘訣は、プログラムに数値を入力するときに、一度に1文字ではなく、一度にバッファーを送信することです。つまり、最初のscanfは、文字列全体(つまり、「123823」など)が改行文字('\ n')とともに一度に到着するまでブロックされます。次に、このループはその文字列を自由に解析します。

編集数字の増減をテストするために、文字列全体を格納する必要があると思うかもしれませんが、それは真実ではありません。次のような重要な情報を覚えておくために、いくつかの追加の変数を定義するだけです。

int largest_digit_ive_seen, smallest_digit_ive_seen, strict_increasing_thus_far;

などなど。

于 2012-04-06T15:14:19.613 に答える
1
// u_i is the user input, My homework asked me to extract a long long, however, this should also be effective for a long.

int digits = 0;
long long d_base = 1;
int d_arr[20];
while (u_i / d_base > 0)
{
    d_arr[digits] = (u_i - u_i / (d_base * 10) * (d_base * 10)) / d_base;
    u_i -= d_arr[digits] * d_base;
    d_base *= 10;
    digits++;
}

編集:抽出された個々の桁は、int配列d_arrに存在するようになりました。私はCが苦手なので、配列宣言を最適化できると思います。

于 2018-12-11T14:25:02.503 に答える
0

プレーンCでの実例を次に示します。

#include <stdio.h>

unsigned long alePow (unsigned long int x, unsigned long int y);

int main( int argc, const char* argv[] )
{
   int enter_num, temp_num, sum = 0;
   int divisor, digit, count = 0;

    printf("Please enter number\n");
    scanf("%d", &enter_num);

   temp_num = enter_num;

   // Counting the number of digits in the entered integer
   while (temp_num != 0)
   {
       temp_num = temp_num/10;
       count++;
   }

   temp_num = enter_num;

   // Extracting the digits
   printf("Individual digits in the entered number are ");
   do
   {
       divisor = (int)(alePow(10.0, --count));
       digit = temp_num / divisor;
       temp_num = temp_num % divisor;

       printf(" %d",digit);
       sum = sum + digit;
   }
   while(count != 0);

   printf("\nSum of the digits is = %d\n",sum);

   return 0;
}


unsigned long alePow(unsigned long int x, unsigned long int y) {

    if (x==0) { return 0; } 
    if (y==0||x==1) { return 1; } 
    if (y==1) { return x; }
    return alePow(x*x, y/2) * ((y%2==0) ? 1 : x);
}
于 2012-04-06T15:13:18.363 に答える
0

ループ展開をお勧めします。

int a=-1, b=-1, c=-1, d=-1, e=1, f=-1, g=-1, h=-1, i=-1; // for holding 9 digits
int count = 0; //for number of digits in the given number


if(number>0) {
i=number%10;
number/=10;
count++;
}

if(number>0) {
h=number%10;
number/=10;
count++;
}

if(number>0) {
g=number%10;
number/=10;
count++;
}
....
....
/* All the way down to the storing variable a */

これで、桁数(変数数)がわかり、どの変数に格納されているかがわかります。これですべての数字が得られ、それらの「減少」、「増加」などを多くのifで確認できます。

あなたのすべての条件を考えると、私は本当にこれ以上の解決策を考えることはできません。

于 2012-04-06T15:21:09.617 に答える