• ベストアンサー

一番大きい奇数を表示する

scanf関数を使用して、文字列を10回入力し一番大きい文字列を表示するプログラムを作ったのですが、 一番大きい「奇数」を表示するように条件を加えた場合どうすればよいのでしょうか? 偶数=割り切れる 奇数=割り切れない ということまでは分かるのですがその先が分かりません。 一応一番大きい文字列を表示するプログラムを貼っておきます。 #include <stdio.h> int main(void) { char str[1024]; char buf[10]; int i; printf("文字列を10回入力して下さい:\n"); memset(str, 0, sizeof(str)); for (i = 0; i < 10; i++) { memset(buf, 0, sizeof(buf)); printf("input>\n"); scanf("%s", buf); } if (strcmp(buf, str) > 0) { strcpy(str, buf); } printf("output>\n%s\n" , str); getchar(); }

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

  • ベストアンサー
noname#22058
noname#22058
回答No.1

#include <stdio.h> int main(void) { int num[10], max, maxodd, i; puts("10個の整数を入力します"); for (i = 0; i < 10; i++) { printf("%d個目:", i + 1); scanf("%d", &num[i]); } max = maxodd = num[0]; for (i = 1; i < 10; i++) { if (num[i] > max) { max = num[i]; } if (num[i] % 2 == 1 && num[i] > maxodd) { maxodd = num[i]; } } printf("いちばん大きい数 :%d\n", max); if (maxodd % 2 == 1) { printf("いちばん大きい奇数:%d\n", maxodd); } else { printf("入力した数の中に奇数がありませんでした\n"); } return 0; }

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★『一番大きい文字列』というより『一番大きい整数値』ですよね。 ・考え方(アルゴリズム)は次のように! ・まずは『scanf』で整数を受け取るようにします。→文字列ではなく。 ・そしたら整数値が『偶数』、『奇数』か判定します。→割り切れない。 ・『奇数』の時に最初に保存されていた『一番大きい奇数値』と比較します。→最初は『0』にしておく。 ・新しく『scanf』で受け取った『奇数値』が大きければ保存し直します。 ・これを 10 回繰り返せばよいのです。→これで最後に代入された『値』こそ『一番大きい奇数値』です。 サンプル: int main( void ) {  int max = 0; ←最大値の変数(0で初期化しておくこと)  int n; ←整数値の変数  int i; ←繰り返し変数    printf( "文字列を10回入力して下さい:\n" );    for ( i = 0 ; i < 10 ; i++ ){   printf( "input>" ); ←『\n』は削除したほうが良い。なぜ?(考えてみよう)   scanf( "%d", &n );  ←ここで『整数値』を受け取る。      if ( (n % 2) != 0 ){ ←ここで2では割り切れないと判定(奇数なので)。    if ( n > max ){ ←ここで比較する。     max = n; ←ここで代入しなおす。    }   }  }  printf( "output>%d\n" , max ); ←ここで結果表示  getchar(); } 補足: ・『偶数』判定は、整数値を2で割りあまりが0。   →(n % 2) == 0 ・『奇数』判定は、整数値を2で割りあまりが0以外。→(n % 2) != 0 ・ほかにも『奇数』判定は『if ( n & 0x1 )』でも判定できますよ。  続けて『else』を使えば『偶数』判定も可能ですな。 ・どうですか。理解できましたか。最後に『scanf』をお勉強しましょう。

関連するQ&A

  • 一番大きい奇数を表示する

    scanf関数を使って数字を10回入力して一番大きなものを表示させるプログラムをつくったのですが、 さらに一番大きな奇数を表示するにはどうすればいいのでしょうか? 偶数=割り切れる 奇数=割り切れない というところまでは分かるのですが、以下のプログラムに奇数を判別するソースを追加するのにはどうすればいいのでしょうか。 #include <stdio.h> int main(void) { char str[1024]; char buf[10]; int i; int w; printf("文字列を10回入力して下さい:\n"); memset(str, 0, sizeof(str)); for (i = 0; i < 10; i++) { memset(buf, 0, sizeof(buf)); printf("input>\n"); scanf("%s", buf); } for (i = 0; i < 10; i++) { if ((buf[i] & 1) == 1) /* 奇数であるか */ { if (strcmp(buf, str) > 0) { strcpy(str, buf); } } } printf("output>\n%s\n" , str); getchar(); }

  • ポインタについて

    #include<stdio.h> int main(void) { char str[10]; char *ptr = str; printf("文字列を入力してください。\n"); scanf("%s",ptr); printf("文字列は%sです。",str); return 0; } 上記のプログラムのscanf("%s",ptr);の ptrに&をつけるとなぜ先頭の4文字は入力しても 表示されなくなってしまうのでしょうか? よろしくお願いします。

  • ポインタ勉強中です。しかも実行するとおかしいです。

    <本に載ってたソース> #include<stdio.h> #include<string.h> int main() { char msg[20]; char *str=NULL; int i; int cnt; str=&msg[0]; printf("文字を入力してください"); scanf("%s",&str); cnt=strlen(msg); str=msg+cnt; for(i=cnt;i>=0;i--){ printf("%c",*(str--)); } printf("\n"); return 0; } char *str=NULL;は、ポインタstrを空にするということでしょうか? いつもながらstrlenとsizeofが混じります。 sizeofがバイトの大きさで、strlenが、文字数でしたっけ?

  • fgets関数を使用したときの文字あふれについて

    fgets関数を用いて文字列を入力し、その長さを測るプログラムを作っています。 #include <stdio.h> #include <string.h> #define MAX 256 int main ( int, char *[] ); int main ( argc, argv ) int argc; char *argv[]; { char buf[( MAX )]; while ( 1 ){ memset ( buf, 0, sizeof( buf )); fgets ( buf, MAX, stdin ); if( fgets == NULL ){ break; } printf("入力した文字列の長さは%dです\n" ,strlen( buf )); } return 0; } このプログラムでは、256までしか文字列の長さを測ることができません。 もしこのプログラムで256を超える文字列を入力してしまうと、文字のあふれが発生し、 「入力した文字列の長さは256です」 「入力した文字列の長さは(あふれた文字列の長さ)です」 とこのようになってしまいます。 このプログラムで256以上の文字を読み捨てて、 「入力した文字列の長さは(あふれた文字列の長さ)です」 を表示しないようにできるのでしょうか? また読み捨てた文字列の長さを知ることはできるのでしょうか? もしかしたらfgets関数を使用すると不可能なのではないか?と思っています。 分かる方が居ましたらどうか教えて下さい。 よろしくお願いします。

  • 文字列

    下のプログラムは何をするためのプログラムなのか教えてください。 個人的にはJISコードに関係していると思うのですがさっぱりわかりません。 どなたか詳しい説明お願いします。 #include <stdio.h> #define LEN 255 int main(void) { char str[LEN]; char cipher[LEN]; int ikey; int i,n; printf("文字列を入力せよ : "); scanf("%s", str); printf("鍵を入力 : "); scanf("%d", &ikey); i = 0; while (str[i]!='\0') { n = (str[i]-'A'+ikey)%26; cipher[i] = 'A'+n; ++i; } cipher[i] = '\0'; printf("%s\n", cipher); return 0; }

  • 空白を含んだ文字列がうまく格納(表示)できない

    こんにちわ。 空白(スペース)の入った文字列の格納(表示)について質問させてください。 以下のプログラムを実行すると、空白の含む文字列がうまく表示されません。 例えば、 in the worldと入力しても、inしか格納されていないみたいです。それはなぜでしょうか? また、どうすればそれを格納、表示させることができるのでしょうか?教えてください。よろしくお願いいたします。 #include <stdio.h> #include <string.h> main() { char buf[BUFSIZ]; char moji[31]; int i; printf("Input string: "); fgets(buf, sizeof(buf), stdin); moji[31] = '?0'; sscanf(buf, "%s", moji); i = 0; while (moji[i] != '?0') { printf("%c",moji[i]); i = i + 1; } printf("?n"); printf("%d letters?n", i); } 【実行例】 csx01:~> gcc prog.c csx01:~> a.out Input string: in the world in 2 letters

  • バッファオーバーランの危険性検出について

    下に示すmsg_file.txtの内容を読み込んで表示するプログラムを使ってバッファオーバーランの危険性を検出するプログラムを作りたいのですが、どのように書き換えたら良いでしょうか。 プログラムソース 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define FILEPATH "msg_file.txt" 6 7 int main(); 8 void vuln(const char* line); 9 void stack_dump(void* ptr, int counts); 10 void hello(); 11 12 int main() 13 { 14 char linebuf[1024]; 15 FILE *fp; 16 long mark1 = 0x11111111; 17 memset(linebuf, 0, sizeof(linebuf)); 18 19 fp = fopen(FILEPATH, "r"); 20 fgets(linebuf, sizeof(linebuf)-1, fp); 21 fclose(fp); 22 23 vuln(linebuf); 24 25 printf("------------- end of main() -------------\n"); 26 } 27 28 void vuln(const char* line) 29 { 30 char msg[20]; 31 long mark2 = 0x22222222; 32 memset(msg, 0, sizeof(msg)); 33 34 strcpy(msg, line); 35 36 stack_dump(&mark2, 13); 37 38 printf("INPUT[%s]\n", msg); 39 } 40 41 void stack_dump(void* ptr, int counts) 42 { 43 int i; 44 unsigned long *ulong_ptr = (unsigned long *)ptr; 45 unsigned char uchar_buf[4]; 46 47 printf("-----------------------------------------\n"); 48 printf(" address | long var | +0 +1 +2 +3 | 0123\n"); 49 printf("-----------------------------------------\n"); 50 for(i=0; i<counts; i++) { 51 printf(" %08x| %08x", &ulong_ptr[i], ulong_ptr[i]); 52 memcpy(uchar_buf, &ulong_ptr[i], sizeof(uchar_buf)); 53 printf(" | %02x %02x %02x %02x", 54 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 55 if(uchar_buf[0]<32 || uchar_buf[0]>126) uchar_buf[0] = '.'; 56 if(uchar_buf[1]<32 || uchar_buf[1]>126) uchar_buf[1] = '.'; 57 if(uchar_buf[2]<32 || uchar_buf[2]>126) uchar_buf[2] = '.'; 58 if(uchar_buf[3]<32 || uchar_buf[3]>126) uchar_buf[3] = '.'; 59 printf(" | %c%c%c%c\n", 60 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 61 } 62 printf("-----------------------------------------\n"); 63 } 64 65 void hello() 66 { 67 printf("+----------+\n"); 68 printf("| HELLO! |\n"); 69 printf("+----------+\n"); 70 exit(0); 71 }

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • C言語の文字列の長さを計算し表示する方法について。

    #include <stdio.h> main( void ) { int i; char str[128]; printf("一行の英文を入力してください → "); scanf("%s",str); i = 0; while (str[i] != '\0'){ i++; } printf("あなたの入力した一行の英文は<%s>で、文字数は%dです。\n", str, i); } って方法で文字列の長さを計算しひょうじしてるのですが…。 これだと1単語しか数えられません。 どうしたら1行の長さを表示できるのでしょうか? nullや改行・空白についてがイマイチわかりません。 補足で質問もしようと思いますので付き合ってくれる方がいらっしゃいましたら連絡ください。

  • スキャン集合に関して

    #include <stdio.h> int main() { char str[128]; printf("文字列を入力してください>\n"); scanf("%[^\n]" , str); printf("入力された値 = %s\n" , str); can_kansu(str); return 0; } int can_kansu(char *sp) { char strs[128]; printf("%sとは違う文字を入力して下さい。\n", sp); scanf("%[^\n]" , strs); printf("入力された値 = %s\n" , strs); return (0); } このプログラムでは、mainでは正常に入力表示が可能なのに、can_kansuにいくと勝手に入力、表示され、しかもその文字は文字化けして表示されてしまいます。 <実際の入力例> 文字列を入力してください> kkk 入力された値 = kkk kkkとは違う文字を入力して下さい。 入力された値 = �p "kkkとは違う文字を入力して下さい。"の所で入力出来ずにつぎに勝手に進んでしまい、入力されている文字はこの通りです。 原因は何でしょうか?scanfのスキャン集合に原因があるのでしょうか?