ページ 1 / 1
コマンドプロンクト
Posted: 2009年11月26日(木) 17:35
by 天和
コマンドプロンクトをつかって
-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
""の間の言葉を
-nの分だけ繰り返すプログラムを作りなさい
上記の場合はhello hello helloと出てきたら成功です
とのことですがさっぱりわかりませんそもそも""のあいだ文章だけをいう認識をどうやってプログラムすればいいか・・・
一応ヒントでは
#include<stdio.h>
int main(int argc char **argv
{
while(argc--)printf("%s\n", *argv++);
return 0;
}
とのことですが・・・
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 17:40
by たかぎ
一応、尋ねます。
> コマンドプロンクトをつかって
コマンドプロンクトとは?
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 17:46
by softya
まず、ヒントのプログラムに-n 3 -s "hello" と入力して実行するとどうなりますか?
結果を書いてください。
それとポインタと文字列の比較は学習済みですか?
学習済みなら文字列の比較の関数名の例をあげてください。
規約にも有りますが、天和さんのC言語技術レベルがさっぱり伝わって来ないので何から説明してよいのか分からない状況です。必ず出来ること出来ない事を詳細に書いてください。
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 19:11
by 天和
>>たかぎさん
失礼しましたコマンドプロンプトです
>>softya 一応習うには習ったんですがさっぱりわからなくて・・・
技術レベルは大体
ポインタで躓いてるところでしょうか・・・・
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 19:35
by 天和
追記さらに詳しく
たとえば
void sum_diff(int n1, int n2, int sum, int diff)
{sum = n1 + n2;
diff = (n1 > n2)
}
int main
{
int na, nb;
int wa = 0, sa = 0;
puts("二つの整数を入力してください") ;
printf("整数A");scanf("%d"&na);
printf("整数B");scanf("%d"&nb);
sum_diff(na, nb,wa,sa)
printf("和は%dです。\nさは%dです。\n", wa, sa);
return 0;
}
とプログラミングしてもな正常に動かないのかわかりません
ちなみに参考にしている書籍は明解C言語です。
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 19:37
by non
>-n 3 -s "hello"
>-s"hello" -n 3
"hello"の前には必ず-sがあるのでしょうか?
-sの後にはスペースがある場合とない場合があるのでしょうか?
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 19:37
by softya
質問のしかたに問題ある方は、こちらのたずねた事に全て答えてくれない場合が多いで注意してくださいね。そのため、2度手間、3度手間になる上にこちらの回答が的外れな回答になる場合があります。必要だから聞いていますので、お願いします。
再度お尋ねします。
>まず、ヒントのプログラムに-n 3 -s "hello" と入力して実行するとどうなりますか?
>結果を書いてください。
>文字列の比較は学習済みですか? 学習済みなら文字列の比較の関数名の例をあげてください。
新しい質問
>ポインタで躓いてるところでしょうか・・・・
ポインタの分かっている事と、分かっている事でサンプルを書いてください。
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 19:40
by non
添付されているプログラムはエラーがあるから、動かないですよね。
ポインタで躓いている以前の問題のような・・・
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 19:54
by softya
規約に有ると思うのですが、
を使ってくださいね。
これ、ポインタ使ってませんよね。
void sum_diff(int n1, int n2, int sum, int diff)
{sum = n1 + n2;
diff = (n1 > n2)
}
int main
{
int na, nb;
int wa = 0, sa = 0;
puts("二つの整数を入力してください") ;
printf("整数A");scanf("%d"&na);
printf("整数B");scanf("%d"&nb);
sum_diff(na, nb,wa,sa)
printf("和は%dです。\nさは%dです。\n", wa, sa);
return 0;
}
明解C言語を持っていませんが、ポインタの練習問題でしょうか?
diff = (n1 > n2)
って、この式そもそも差じゃないですよ。
関係演算子って演算結果が何になるかご存知ですか?
そこも危うい気がしますね。
これ見る限りポインタを使う前提な-s "hello" -n 3の問題は早すぎます。
まず、この問題を解けるようにならないと。
って事で、この問題からやり直ししませんか?
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 19:55
by softya
>-sの後にはスペースがある場合とない場合があるのでしょうか?
あるのが正しいです。
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 20:46
by 天和
>>softyaさん
まずヒントのプログラムは<pre>
#include<stdio.h>
int main(int argc char **argv
{
while(argc--)printf("%s\n", *argv++);
return 0;
} </pre>
これを応用して(別に使わなくてもいいですが)作ったプログラムで
-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
hello hello helloとででてくれば正解です
もちろんhelloに限らず
-n 5 -s "good" と入力するか-s "good" -n 5と入力したら
good good good good good
と出力されます
>文字列の比較は学習済みですか? 学習済みなら文字列の比較の関数名の例をあげてください。
すいません習ってはいるんですがさっぱりわかってないので学習済みでないということにしておいてください
>ポインタの分かっている事と、分かっている事でサンプルを書いてください。
最初から躓いてます
<pre>void sum_diff(int n1, int n2, int sum, int diff)
{sum = n1 + n2;
diff = (n1 > n2) ? n1 - n2 : n2 - n1;
}
int main
{
int na, nb;
int wa = 0, sa = 0;
puts("二つの整数を入力してください") ;
printf("整数A");scanf("%d"&na);
printf("整数B");scanf("%d"&nb);
sum_diff(na, nb,wa,sa)
printf("和は%dです。\nさは%dです。\n", wa, sa);
return 0;
}
</pre>
(すいません写し間違えてました)
ですがこれは本ではこれを実行すると0となって正しい回答が出てこないのでこれを解決するには
ポインタが必要ですと冒頭の部分ですので・・・・。
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 21:05
by softya
>これを応用して(別に使わなくてもいいですが)作ったプログラムで
>-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
>hello hello helloとででてくれば正解です
>もちろんhelloに限らず
>-n 5 -s "good" と入力するか-s "good" -n 5と入力したら
>good good good good good
>と出力されます
応用する前に、ヒントのまま試してくださいって事です。
ヒントのプログラムに天和さんが思っている以上の意味があります。
>ですがこれは本ではこれを実行すると0となって正しい回答が出てこないのでこれを解決するには
ポインタが必要ですと冒頭の部分ですので・・・・。
明快C言語では、ポインタの学習はこの順番なんでしょうか?
1.冒頭の問題「helloなど任意も文字列を指定した数だけだす」
2.次に提示された問題「和と差を出す問題」
1が出来たら2って事ですか?
どう考えても1の方が難しいですけど。
もっと簡単なポインタの問題は無いんでしょうか?
簡単なのから始めないと1も2も解く事は無理だと思います。
無いなら作りますよ。
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 21:17
by たかぎ
とりあえず作ってみました。
いつものようにコメントは一切付けていませんので、自分で解析してください。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <stdbool.h>
bool str_to_ui(const char *s, unsigned int *pi)
{
while (isspace((unsigned char)*s))
++s;
if (!isdigit((unsigned char)*s))
return false;
char *endptr;
errno = 0;
unsigned long t = strtoul(s, &endptr, 10);
if (errno != 0 || t > UINT_MAX || *endptr != '\0')
return false;
*pi = (unsigned int)t;
return true;
}
int main(int argc, char *argv[/url])
{
unsigned int n = 0;
const char *s = "";
for (int i = 1; i < argc; i++)
{
const char *arg = argv;
if (arg[0] == '-')
{
switch (arg[1])
{
case 'n':
if (arg[2] != '\0')
{
if (!str_to_ui(&arg[2], &n))
return EXIT_FAILURE;
}
else if (++i >= argc || !str_to_ui(argv, &n))
{
return EXIT_FAILURE;
}
break;
case 's':
if (arg[2] != '\0')
{
s = &arg[2];
}
else if (++i >= argc)
{
return EXIT_FAILURE;
}
else
{
s = argv;
}
break;
default:
return EXIT_FAILURE;
}
}
else
{
return EXIT_FAILURE;
}
}
for (int i = 0; i < n; i++)
{
fputs(s, stdout);
fputc(i < n - 1 ? ' ' : '\n', stdout);
}
return EXIT_SUCCESS;
}
-nや-sを複数回指定した場合は、後勝ちにしています。
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 22:10
by 天和
>softyaさん
文章下手で申し訳ありません
さっきsoftyaさんが自分は今技術はどのくらいのレベルなのかと聞いたので
ポインタの冒頭部分つまり最初から躓いているんです。そして下のコードは
<pre>void sum_diff(int n1, int n2, int sum, int diff)
{sum = n1 + n2;
diff = (n1 > n2) ? n1 - n2 : n2 - n1;
}
int main
{
int na, nb;
int wa = 0, sa = 0;
puts("二つの整数を入力してください") ;
printf("整数A");scanf("%d"&na);
printf("整数B");scanf("%d"&nb);
sum_diff(na, nb,wa,sa)
printf("和は%dです。\nさは%dです。\n", wa, sa);
return 0;
}
</pre>
は自分の持っている本のポインタの冒頭の部分なんです(つまりこれを解決するにはポイントが必要つまり
これからポインタを習っていきましょうという感じです)
そしてしばらく授業が進んで出た課題が
コマンドプロンクトをつかって
-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
""の間の言葉を
-nの分だけ繰り返すプログラムを作りなさい
ということなんです。だからまずポインタとはどういうものなのか自体わかってないんです
>>たかぎさん
ご親切にありがとうございますがんばって解析したいと思います
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 22:19
by softya
えーと、つまり「和と差を出す問題」が先なんですよね?
まだ「和と差を出す問題」が解けない状態では、「helloなど任意の文字列を指定した数だけだす」のたかぎさんの回答は理解できないと思いますよ。
Re:コマンドプロンクト
Posted: 2009年11月26日(木) 22:22
by 天和
>>softyaさん
時間はあるので順番にといていきます
Re:コマンドプロンクト
Posted: 2009年11月27日(金) 09:03
by toyo
getopt( )が使えると楽なんですけどね
課題なら自作しろって事でしょうが