逆順表示の関数の作成方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ganbaregenki

逆順表示の関数の作成方法

#1

投稿記事 by ganbaregenki » 7年前

C言語で下記のプロトタイプ宣言を参考にして関数を作りたいんですけど全く分かりません。

コード:

#include <stdio.h> 
#include <string.h> 

void gyaku(char s[]); 

int main(void) 
{ 
  char str[20]; 

  scanf("%s", str); 
  gyaku(str); 

  return 0; 
} 
例えば、abcdefと入力すると
fedcbaと出力されるようにしたいのです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 逆順表示の関数の作成方法

#2

投稿記事 by みけCAT » 7年前

ganbaregenki さんが書きました:C言語で下記のプロトタイプ宣言を参考にして関数を作りたいんですけど全く分かりません。
質問は何ですか?
前のトピックみたいに、関数の作り方はわからなくていいから動くコードが欲しいのですか?
それとも、関数の作り方がわかるようになりたいですか?
ganbaregenki さんが書きました: 例えば、abcdefと入力すると
fedcbaと出力されるようにしたいのです。
テスト駆動開発では、まずテストケースを書き、それを通るようなコードを書きます。その後リファクタリングしていきます。

コード:

void gyaku(char s[]) {
  puts("fedcba");
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ganbaregenki

Re: 逆順表示の関数の作成方法

#3

投稿記事 by ganbaregenki » 7年前

関数の作り方が分かるようになりたいのですが
学校の課題で前述のプロトタイプ宣言を参考するように言われています。

Math

Re: 逆順表示の関数の作成方法

#4

投稿記事 by Math » 7年前

スタック構造用の関数と言われませんでした?(スタック は、「後入れ先出し」のデータ構造です)

box
記事: 2002
登録日時: 13年前

Re: 逆順表示の関数の作成方法

#5

投稿記事 by box » 7年前

ほんの一例です。

コード:

#include <stdio.h>
#include <string.h>

void gyaku(char s[]);

int main(void)
{
    char str[20];

    scanf("%19s", str);
    gyaku(str);
    return 0;
}

void gyaku(char s[])
{
    int len = strlen(s), i;

    for (i = len - 1; i >= 0; i--) {
        putchar(s[i]);
    }
    putchar('\n');
}
ちなみに、別の言語だったら1行で。逆順にしたい文字列の字数に制限なしで、楽勝。

コード:

puts gets.chomp.reverse
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 逆順表示の関数の作成方法

#6

投稿記事 by みけCAT » 7年前

では、スタック(再帰による暗黙のスタック)を利用した方法を。

コード:

#include <stdio.h>
#include <string.h>

void gyaku(char s[]);

int main(void)
{
    char str[20];

    if (scanf("%19s", str) != 1) {
        fputs("input read error\n", stderr);
        return 1;
    }
    gyaku(str);
    putchar('\n');
    return 0;
}

void gyaku(char s[])
{
    if (*s != '\0') {
        gyaku(s + 1);
        putchar(*s);
    }
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Math

Re: 逆順表示の関数の作成方法

#7

投稿記事 by Math » 7年前

[参考]スタックをとりあえず簡単に構築する方法。Windows10,VC++2015Community:コマンドライン・コンパイル。
(typedef char data_t; // スタックに貯えるデータの型:文字型にする
pop--- gyaku に対応(そのあとstackPrintも) )
[c.bat]

コード:

cl /EHsc c1.cpp
rem -------------------------------- c1.exe
c1.exe
[c1.cpp]

コード:

/*
#include <stdio.h> 
#include <string.h> 
 
void gyaku(char s[]); 
 
int main(void) 
{ 
  char str[20]; 
 
  scanf("%s", str); 
  gyaku(str); 
 
  return 0; 
}
*/ 
//------------------------------------------------------------------------------
#include <stdio.h>

#define STACK_SIZE  100     // スタックに積むことのできるデータの最大個数
#define SUCCESS     1      // 成功 
#define FAILURE     0     // 失敗 

typedef int data_t;             // スタックに貯えるデータの型:
                               //[要素の型を変更するときに非常に都合が良いから]
data_t stack_data[STACK_SIZE];// スタック本体
int stack_num;               // スッタク内のデータ数 */


int push(data_t push_data)                    //[push]機械語のpush命令を模したもの
{                                            //機械語では重要で多用される
    if (stack_num < STACK_SIZE) {           //Stackとは干草やお皿などが整然と積み重なったもののこと
        stack_data[stack_num] = push_data; //stack_data[]<<---にpush_data
        stack_num ++;                     //stack_numをインクリメント
        return SUCCESS;                  //--成功
    } else {                            //
        return FAILURE;                //--失敗
    }
}


int pop(data_t *pop_data)                     //[pop]機械語のpush命令を模したもの
{                                            //	pushとペアーで用いる
    if (stack_num > 0) {                    //stack_numは0より大
        stack_num --;                      //stack_numをデクリメント
        *pop_data = stack_data[stack_num];//*pop_data<<---stack_data[]
        return SUCCESS;                  //--成功
    } else {                            //
        return FAILURE;                //--失敗
    }
}


void stackPrint()                  //スッタク内のデータを表示する関数
{
    int i;

    printf("stack [");
    for (i = 0; i < stack_num; i++) {
        printf("%3d", stack_data[i]);
    }
    printf("]\n");
}


int main(void)
{
int i, p;

    stack_num = 0; //スタックのデータ数を 0 に初期化
    for (i = 1; i<=5 ; i++) {     
        push(i);                  // 1 から 5 までの数値を push 
        printf("push %2d :", i);
        stackPrint();
    } 
    for (i = 1; i <= 3; i++) {
        pop(&p);                // 3 回だけ pop
        printf("pop  %2d :", p);
        stackPrint();
    }
    for (i = 6; i <= 9; i++) {
        push(i);                  // 6 から 9 までの数値を push 
        printf("push %2d :", i);
        stackPrint();
    }
    while (stack_num > 0) {
        pop(&p);                // スタックに残っているデータを全て pop 
        printf("pop  %2d :", p);
        stackPrint();
    } 
}
[実行結果]

コード:

D:\h\z10\01\20\02>cl /EHsc c1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.cpp
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

D:\h\z10\01\20\02>rem -------------------------------- c1.exe

D:\h\z10\01\20\02>c1.exe
push  1 :stack [  1]
push  2 :stack [  1  2]
push  3 :stack [  1  2  3]
push  4 :stack [  1  2  3  4]
push  5 :stack [  1  2  3  4  5]
pop   5 :stack [  1  2  3  4]
pop   4 :stack [  1  2  3]
pop   3 :stack [  1  2]
push  6 :stack [  1  2  6]
push  7 :stack [  1  2  6  7]
push  8 :stack [  1  2  6  7  8]
push  9 :stack [  1  2  6  7  8  9]
pop   9 :stack [  1  2  6  7  8]
pop   8 :stack [  1  2  6  7]
pop   7 :stack [  1  2  6]
pop   6 :stack [  1  2]
pop   2 :stack [  1]
pop   1 :stack []

D:\h\z10\01\20\02>c

アバター
usao
記事: 1889
登録日時: 11年前

Re: 逆順表示の関数の作成方法

#8

投稿記事 by usao » 7年前

オフトピック
>スタック構造用の関数と言われませんでした?(スタック は、「後入れ先出し」のデータ構造です)

という問いかけをしたならば,
一旦,それに対する返答を待ってあげてはいかがでしょうか.

直面している問題と直接関係しない話やコードなどでレスが進んでいると
質問者側としては,どう対応すればよいのか困ってしまうのではないでしょうか.

Math

Re: 逆順表示の関数の作成方法

#9

投稿記事 by Math » 7年前

>[参考]スタックをとりあえず簡単に構築する方法。Windows10,VC++2015Community:コマンドライン・コンパイル。
>(typedef char data_t; // スタックに貯えるデータの型:文字型にする
>pop--- gyaku に対応(そのあとstackPrintも) )
あくまで[参考]にすればすぐできるのではないか...  (一寸難しいかな... けど原理はいずれ知らないと。そこは質問された方の取捨選択です。)

ganbaregenki

Re: 逆順表示の関数の作成方法

#10

投稿記事 by ganbaregenki » 7年前

皆さんありがとうございました!
無事作成できました

閉鎖

“C言語何でも質問掲示板” へ戻る