🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

3回答

1796閲覧

ソート、数字二桁からの処理がうまくいきません...

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/11/15 07:01

前提・実現したいこと

要素数が n(n<=100)である int 型の配列 vc の並びを逆順にする関数
void rev_intarray( int *vc, int n )
を作成し,main関数からキーボードから入力した要素数 nとn個の整数からなる整数型配列を引数として渡すことで呼び出して,結果を表示せよ.

という課題が出たのですが、うまく行かず手を貸していただきたいです。

発生している問題・エラーメッセージ

二桁に入ってからの処理がうまくいきません

該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3 4void rev_intarray( char *vc, int n ){ 5 int first=0, last, temp; 6 last = n; 7 for(first=0;first<n/2;first++){ 8 temp = *(vc+first); 9 *(vc+first) = *(vc+last); 10 *(vc+last) = temp; 11 12 last--; 13 } 14} 15 16int main(){ 17 int n=0, i=0; 18 char vs[100]; 19 20 fgets(vs,100,stdin); 21 n = atoi(vs); 22 23 rev_intarray(&vs[2], 2*n-2); 24 for(i=2;i<=2*n;i++){ 25 printf("%c", vs[i]); 26 } 27 return 0; 28}

試したこと

一桁の数字の場合はうまくいくのですが、二桁になるとうまくいきません...

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

azuapricot

2019/11/15 07:11

(課題がわからないなら先生に聞きましょうと何度teratailで書いたことか) (課題ってわざわざ言わなきゃいいのに) (自分の分からないところがわかってるんだったらそこだけ抜き取って質問すればいいのに)
cateye

2019/11/15 07:21 編集

>入力した要素数 nとn個の整数からなる整数型配列を引数として〜 void rev_intarray( char *vc, int n )・・・これって、おかしくないですか? 『整数型配列』は何処に? ・・・rev_intarray(&vs[2], 2*n-2);←なぜ、「要素数 n」が「2*n-2」に成るのでしょう?
dodox86

2019/11/15 07:34

題名中の"ソート"を読み、更に質問内容を読んで「を?」と思ったのですが、SORTと聞くと一般的には昇順、降順に並び替えることを指すことがほとんどだと思いますが、「一定の基準で並び替える」をSORTの定義とするならば、末端から先頭に並び替えるのもSORTと言っていいのかな?
dice142

2019/11/15 08:05

退会しとりますがな。。。
guest

回答3

0

要素数が n(n<=100)である int 型の配列 vc の並びを逆順にする関数
void rev_intarray( int *vc, int n )
を作成し,main関数からキーボードから入力した要素数 nとn個の整数からなる整数型配列を引数として渡すことで呼び出して,結果を表示せよ.

という課題とのことですが、

void rev_intarray( char *vc, int n ){

と書いていて、そもそも関数の仕様が合っていないです。

要は整数配列の並び替えなのに、文字列を受け取っているために実装が大きくズレています。

問題文を読み直して、仕様を正しく把握しましょう。

投稿2019/11/15 07:16

dice142

総合スコア5158

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

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

0

問題文に対する理解が足りません。
よく読んで下さい。
ヒント↓
・100個のintの配列を作る・・・vc[100];
・要素数を読み込む・・・scanf();→n
・入れ替え前の表示
・呼び出し(rev_intarray(vc, n);)
・反転・・・rev_intarray(int *vc, int n)
・入れ替え後の表示
「追記」

c

1#include <stdio.h> 2#include <stdlib.h> 3 4static void rev_intarray(int *vc, int n) 5{ 6 int *pos = vc + n - 1; 7 while (vc < pos) { 8 int tmp = *vc; 9 *vc++ = *pos; 10 *pos-- = tmp; 11 } 12} 13 14int main(void) 15{ 16 int vc[100]; 17 for (int i = 0; i < 100; i++) { 18 vc[i] = i + 1; 19 } 20 char str[8]; 21 fputs("要素数 ?", stdout); 22 fgets(str, sizeof str, stdin); 23 int n = (int)strtol(str, NULL, 10); 24 // 25 rev_intarray(vc, n); 26 // 27 for (int i = 0; i < n; i++) { 28 printf("%3d", vc[i]); 29 } 30 putchar('\n'); 31 32 return 0; 33}
usr ~/Project/test % ./a.out 要素数 ?20 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

投稿2019/11/15 07:56

編集2019/11/15 08:47
cateye

総合スコア6851

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

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

dice142

2019/11/15 08:01 編集

乱数で初期化って質問文の何処に書いてますか?
cateye

2019/11/15 08:08 編集

いらないと思いますが、ゴミが入るので確認しにくいかと・・・削除します。 簡単なのは1〜100で埋めることでしょうか?
dice142

2019/11/15 08:05 編集

ああなるほど、確認用にですね。 私は課題で入力値が与えられてるけど、それも抜けてると判断していました。
cateye

2019/11/15 08:13 編集

あぁ・・・なるほど・・・了解です。 1〜100で埋めておけば、入れ替え前の表示もいらないですね?
dice142

2019/11/15 08:18

1~100入れとくだけで結果見ればわかるので確認用にいいですね。 (質問者さん退会してしまいましたが。。。)
cateye

2019/11/15 08:48

文章問題に弱い日本人・・・(´;ω;`) せっかく、作ったのに・・・
guest

0

そもそも、文字のソートしてるだけなので、要素は1文字分だけですよ

投稿2019/11/15 07:10

y_waiwai

総合スコア88040

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問