学校の課題で改善すべき点をお聞きしたいです。

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

学校の課題で改善すべき点をお聞きしたいです。

#1

投稿記事 by Y.N » 10年前

遅くなりましたが、あけましておめでとうございます。

以前投稿させていただいた、HN Y.N と申します。
今回も、前回と同じ学校の課題について改善方法をお聞きしたいことがあります。

私のc言語のレベル自体は底辺の底辺だと理解できています。
ある程度学習はできたとは思いますが、勘違いで覚えていたり、よく理解できていない部分もあるかと思われます。

そこでこの掲示板に投稿させていただきました。

今回の課題で出された問題は、
「いわゆる、学生番号を文字列として受け取り、その最初の2文字と最後の4文字を抜き出してつなげ、その後int型の整数値に変換して返す関数を作りなさい」
です。

私の学校の学生番号の型は「○○○-A○○○○」(○:0~9までの数字が入る A:A~Zまでの英字が入る)となっています。
なのでEX「999-Q8888」という学生番号でしたら、関数によって 998888 という値が返されるということです。

ただ、もし学生番号がEX「099-Q8888」と、はじめの3つの数字の先頭が0だった場合、
返される値は 98888 となります。
つまり先頭が0のときは、0はないものとして考えるということになります。

では私の考えた関数id2intを下に置きます。

コード:

#include <stdlib.h>

int id2int(char *p)
{
  int n, i;
  char x[10];
  char y[7];
  
  x[10] = *p;
  
  y[0] = x[0];
  if (y[0] == "0") {
    y[0] = x[1];
  }
  else if (y[0] != "0") {
    y[1] = x[1];
  }
  
  for (i = 0; i < 5; i++) {
    y[i + 2] = x[i + 5];
  }
  
  n = atoi(y);
        
  return n;
}
この関数を説明するとしたら、受け取った学生番号を先頭と後方で分けて、そのあとひとつに結合すると言った趣旨です。

その後、その文字列をint型の整数値に変換する工程を、atoiを用いて行っています。
このatoiはWEBで調べたものなので理解度はまだ低いです。

一応これでコンパイルするとエラーなくできるのですが、実際にこの関数を用いたところ、思うような結果が出ません。

結合する過程でどこか間違えていると考えていたのですが、改善点が見つからなかったのでお聞きしたいと思っています。

この課題の提出期限があと一日ですが、切羽詰っているというわけでもありませんので、
このトピックを見ていただいた方でお時間がありましたら、ご教授のほどよろしくお願いします。

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: 学校の課題で改善すべき点をお聞きしたいです。

#2

投稿記事 by Tatu » 10年前

あけましておめでとうございます。

コード:

x[10]=*p;
についてこれだとx[10]に最初の文字を代入しただけで
x[0]からx[9]まで全て初期化されていないままです。
文字列のコピーにはstrcpyを使うとよいでしょう。
使い方は"strcpy"で検索して調べてください。

コード:

if(y[0]=="0")
について単一引用符'で囲まれた文字は文字コード(数値)を指し、
二重引用符"で囲まれた文字列は文字列リテラルを指すので、
数値と文字列を比較していることになり、環境によっては警告が出されます。

コード:

if(y[0]=='0')
とするのがよいでしょう。
学生番号が099-Q8888と最初が0の場合は無視するとありますが
出力が98888なので098888と考えられます。
よって、今回はこの分岐は必要ないと思います。

Y.N

Re: 学校の課題で改善すべき点をお聞きしたいです。

#3

投稿記事 by Y.N » 10年前

お返事ありがとうございます。

なるほどですね!完全にコピーされていなかったのですか・・・(汗

ではその改善点を踏まえて作り直してみると、下のようになりました!

コード:

int id2int(char *p)
{
  int n, i;
  char x[10];
  char y[7];
  
  strcpy(x, p);
  
  y[0] = x[0];
  y[1] = x[1];
  
  for (i = 0; i < 5; i++) {
    y[i + 2] = x[i + 5];
  }
  
  n = atoi(y);
        
  return n;
}
実際に実行してみたところ、ちゃんとした結果が出ました!!

Tatuさん、ご教授ありがとうございました。
おかげさまで、今日はゆっくりとした睡眠にありつけそうです。

またの機会がありましたら、その時はよろしくお願いします。

かずま

Re: 学校の課題で改善すべき点をお聞きしたいです。

#4

投稿記事 by かずま » 10年前

p から y にコピーすれば、x は要りません。

コード:

int id2int(const char *p)
{
    char y[7];

    y[0] = p[0];
    y[1] = p[1];
    strcpy(y + 2, p + 5);
    return atoi(y);
}

閉鎖

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