質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

2637閲覧

昇順検査 c言語 コマンドライン

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/11/24 01:47

編集2020/02/04 05:29

■やりたい事
コマンド行に整数値の列を収めたファイル名が与えられたとき、そのファイル名のファイルが昇順列を収めたものになっているかどうかを判定する。ここで、整数値の列が昇順列であるとは、並んでいる順にだんだんと値が大きくなる(その列の中で隣り合う2つの整数値 x, y が必ず x < y となっている)ことをいう。
与えられたファイル名のファイルの中身が昇順列であるかどうかを調べ、その結果を書き出すプログラムを作れ。書出しは、ファイル名に続けて「: 」を書き出し、その後に続けて、昇順列であれば「increasing」、そうでなければ「not increasing」と書き出して、最後に改行すること。
なお、空の列は昇順列。

C

1#include <stdio.h> 2#include <stdlib.h> 3int main(int argc, char *argv[]){ 4 5 FILE *f; 6 f= fopen(argv[1],"r"); 7 if( f==NULL ){ 8 printf("%s: can't open.\n",argv[1]); exit(-1); 9 } 10 printf("%s: "); 11 12 ・・・ファイル変数fに対応するファイルの中身を調べて 13 ・・・昇順列なら"increasing"14 ・・・そうでないなら"not increasing"と書き出す 15 16 fclose(f); 17 18 return 0; 19}

やりたい事に則した...の部分を教えて頂きたく。
■追記

C

1#include <stdio.h> 2#include <stdlib.h> 3int main(int argc, char *argv[]){ 4 5 FILE *f; 6 f= fopen(argv[1],"r"); 7 8 if( f==NULL ){ 9 printf("%s: can't open.\n",argv[1]); exit(-1); 10 } 11 printf("%s: "); 12{ 13 int increasing = 1; 14 int first = 1; 15 int max; 16 char buffer[30001]; 17 char * t = NULL; 18 19 if(NULL == fgets(buffer, sizeof(buffer) - 1, f)){ 20 printf("%s: can't reed.\n",argv[1]); exit(-1); 21 } 22 buffer[sizeof(buffer) -1] = '¥0'; 23 24 t = strtok(buffer, " "); 25 while(t != NULL) { 26 int i = atoi(t); 27 if(first == 1){ 28 max = i; 29 first = 0; 30 }else if(i < max){ 31 increasing = 0; 32 break; 33 } 34 ptr = strtok(NULL, " "); 35 } 36 37 if(increasing == 1){ 38 printf("increasing\n"); 39 }else{ 40 puts("not increasing\n"); 41 } 42} 43 44 fclose(f); 45 46 return 0; 47}

上記のように追記しましたがコンパイルエラーがでてしまいました。↓

p8-3.c: In function 'main': p8-3.c:11:5: warning: format '%s' expects a matching 'char *' argument [-Wformat=] printf("%s: "); ^ p8-3.c:23:37: warning: multi-character character constant [-Wmultichar] buffer[sizeof(buffer) -1] = '¥0'; ^ p8-3.c:23:9: warning: overflow in implicit constant conversion [-Woverflow] buffer[sizeof(buffer) -1] = '¥0'; ^ p8-3.c:25:5: warning: implicit declaration of function 'strtok' [-Wimplicit-function-declaration] t = strtok(buffer, " "); ^ p8-3.c:25:7: warning: assignment makes pointer from integer without a cast [enabled by default] t = strtok(buffer, " "); ^ p8-3.c:35:9: error: 'ptr' undeclared (first use in this function) ptr = strtok(NULL, " "); ^ p8-3.c:35:9: note: each undeclared identifier is reported only once for each function it appears in

■成功例として
コマンドライン入力
data1.txt
標準出力
data1.txt: increasing
コマンドライン入力
data2.txt
標準出力
data2.txt: not increasing
コマンドライン入力
data3.txt
標準出力
data3.txt: increasing
再度教えて頂きたく。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mariuskoiwa

2019/11/24 01:54

ァイルの中で列はどう区切られる前提なのかを教えて下さい
guest

回答4

0

ベストアンサー

つまりこうですかね
ずいぶんすっきりしました
仕事で書くプログラムでscanfは滅多に使わないと思いますが、ロジックの勉強の為なら良いかもしれません

/* 回答*/ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ FILE *f; f= fopen(argv[1],"r"); if( f==NULL ){ printf("%s: can't open.\n",argv[1]); exit(-1); } printf("%s: ", argv[1]); { int increasing = 1; int first = 1; int max; int i; while(fscanf(f, "%d", &i) != EOF) { if(first == 1){ first = 0; }else if(i < max){ increasing = 0; break; } max = i; } if(increasing == 1){ printf("increasing\n"); }else{ printf("not increasing\n"); } } fclose(f); return 0; }

投稿2019/11/24 03:45

編集2019/11/24 03:47
mariuskoiwa

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/24 03:55

ご回答有難うございました(*‘∀‘) 思った通りの結果が出力されました!
guest

0

私の間違いもまだいくつかありました

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ FILE *f; f= fopen(argv[1],"r"); if( f==NULL ){ printf("%s: can't open.\n",argv[1]); exit(-1); } printf("%s: "); ← argv[1]が必要 { int increasing = 1; int first = 1; int max; char buffer[30001]; char * t = NULL; if(NULL == fgets(buffer, sizeof(buffer) - 1, f)){ printf("%s: can't reed.\n",argv[1]); exit(-1); } buffer[sizeof(buffer) -1] = '¥0'; ← ¥を\に替えて下さい。私のミスです t = strtok(buffer, " "); ← ソース冒頭に#include <string.h>を追加してください。 while(t != NULL) { int i = atoi(t); if(first == 1){ max = i; first = 0; }else if(i < max){ increasing = 0; break; } ptr = strtok(NULL, " "); ← ptrを tに替えて下さい } if(increasing == 1){ printf("increasing\n"); }else{ puts("not increasing\n"); } } ← 括弧が余分です fclose(f); return 0; }

"#include <string.h>"が出来ないとすると sscanf()を使う事になるのでしょうか。
出題者としてはfgetsしないで最初からはscanfでという意図かもしれませんね。
この宿題が出された授業の内容次第になります。

投稿2019/11/24 03:27

mariuskoiwa

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2019/11/24 07:05

基本的には、回答欄は一つだけ使うようにした方が良いと思います。
mariuskoiwa

2019/11/24 07:10

どうもありがとうございます
guest

0

こんな感じでどうでしょうか

{ int increasing = 1; int first = 1; int max; char buffer[30001]; /* 30000文字以上のファイルが無い前提で書いてます */ char * t = NULL; if(NULL == fgets(buffer, sizeof(buffer) - 1, f)){ printf("%s: can't reed.\n",argv[1]); exit(-1); } buffer[sizeof(buffer) -1] = '¥0'; t = strtok(buffer, " "); while(t != NULL) { int i = atoi(t); if(first == 1){ first = 0; }else if(i < max){ increasing = 0; break; } max = i; ptr = strtok(NULL, " "); } if(increasing == 1){ printf("%s: increasing\n", argv[1]); }else{ printf("%s: not increasing\n", argv[1]); } }

投稿2019/11/24 02:32

編集2019/11/24 03:10
mariuskoiwa

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/11/24 02:40

while文のブロック最下行、t = strtok(NULL, ","); の区切り文字指定部分は","でよろしいのでしょうか。
mariuskoiwa

2019/11/24 02:41

スペースに治して下さい(^^;
mariuskoiwa

2019/11/24 02:44

dodo86さんご指摘ありがとうございます
mariuskoiwa

2019/11/24 02:48

もう1カ所肝心なところを書き忘れていたので足しました。 C++じゃないCは15年ぶり位で書きましたw
guest

0

ファイルの中で列はどう区切られる前提なのかを教えて下さい

投稿2019/11/24 01:54

mariuskoiwa

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/24 02:00

ご回答有難うございます! data1.txt 1 3 7 10 19 data2.txt 1 2 1 4 5 data3.txt となります。 宜しくお願い致します。
pepperleaf

2019/11/24 02:01

質問文の更新をお願いします。
mariuskoiwa

2019/11/24 02:01

スペースで良いのでしょうか
退会済みユーザー

退会済みユーザー

2019/11/24 02:05

data3.txtはスペースとなります。
mariuskoiwa

2019/11/24 02:07

聞きたかったのは、data1.txtとdata2.txtの1と3、3と7・・・の間には1個のスペース文字がある前提でよろしいでしょうかという事です
退会済みユーザー

退会済みユーザー

2019/11/24 02:11

おっしゃる通りです。 宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問