ページ 1 / 1
構造体
Posted: 2017年6月06日(火) 21:16
by takekkumaaan
☆構造体¥
Re: 上司からの問題が難しくて教えて欲しいです。構造体
Posted: 2017年6月07日(水) 07:12
by かずま
次のプログラムは参考になりますか?
何が分かっって、何が分からないか返事を下さい。
コード:
#include <stdio.h> // printf, fopen, fclose, fscanf, fprintf
#include <stdlib.h> // malloc, srand, rand
#include <time.h> // time
#define SAVEFILE "save.txt"
struct LIST {
struct LIST *next;
int value;
};
struct LIST *plist = NULL;
int main(void)
{
FILE *fp = fopen(SAVEFILE, "r");
srand((unsigned)time(NULL));
while (1) {
int random = 0;
if (fp && fscanf(fp, "%d", &random) != 1) {
fclose(fp);
fp = NULL;
}
if (!fp) {
int q = getchar();
if (q == 'q') break;
if (q != '\n') continue;
random = rand() % 1000;
if (random < 100) random += 100;
}
struct LIST *p = (struct LIST *) malloc(sizeof(struct LIST));
p->value = random;
p->next = NULL;
if (plist == NULL)
plist = p;
else {
struct LIST *prev = plist;
while (prev->next != NULL) prev = prev->next;
prev->next = p;
}
if (!fp) printf(" %d\n", p->value);
}
fp = fopen(SAVEFILE, "w");
struct LIST *p = plist;
while (p != NULL) {
if (fp) fprintf(fp, "%d\n", p->value);
printf("\n%d", p->value);
p = p->next;
}
if (fp) fclose(fp);
getchar();
getchar();
return 0;
}
このプログラムをどこから起動してもよいようにするためには
SAVEFILE をフルパスにするとか、ユーザごとに異なったファイルにする
などの修正が必要でしょう。
質問するときは、フォーラムルールをよく読んで、
プログラムを添付するときは、codeタグを使うようにしてください。
Re: 上司からの問題が難しくて教えて欲しいです。構造体
Posted: 2017年6月07日(水) 09:19
by asd
同じような質問がありましたので参考までにどうぞ。
https://detail.chiebukuro.yahoo.co.jp/q ... 3175061523
オフトピック
上司からの問題ということはお仕事でされているのでしょうか?
だとすると今後仕事でのプログラムもここで作成代行者を募るおつもりでしょうか?
Re: 上司からの問題が難しくて教えて欲しいです。構造体
Posted: 2017年6月07日(水) 10:15
by takekkumaaan
To. かずまさん
ありがとうございます!!
私がわからなかったのは、一度プログラムを終了して次のプログラムを実行した際に
どうすれば前回のデータを再表示することが出来るのだろう、と悩んでおりました。
C言語を始めて1ヵ月程度で自分でも何が分かっていないのか把握出来ていない部分があります。
これからはまずは何がわからないのかを書いて皆様に助けてもらおうと思います。
本当にありがとうございます!!
ソースコードの書き方などのルールも今後気をつけます。
Re: 上司からの問題が難しくて教えて欲しいです。構造体
Posted: 2017年6月07日(水) 10:19
by takekkumaaan
To. asd さん
その投稿は私がしたものでした。
また、私は仕事でこれからプログラミングを使います。
が、現在研修期間として色々と自習をしています。
今回問題は、上司がこんなのをやってみたら面白いのでは?
と適当に考えた問題で、その上司が暫く会えずにいましたので答えがわからず
ずっと悩んでおりました。
今後とも精進しますが、分からないことはお聞き致しますので、
どうかよろしくお願い致します。
Re: 構造体
Posted: 2017年6月07日(水) 13:17
by かずま
プログラムはまだ完成していませんよ。
考えないといけないことがいくつかあります。
random をリストに追加するとき、いつも先頭からたどって
末尾を探していますが、それは無駄だとは思いませんか?
末尾へのポインタを持っていれば探す必要がありませんよね。
random を求めるとき、0~999 の 1000個のうち、
0~99 の 100個を 100~199 に補正していますが、
こんなことをすると、100~199 が 200~999 の倍の
確率で出やすくなってしまいます。
random = rand() % 900 + 100; とするほうが良いと思いませんか?
plist はグローバル変数にする必要があるでしょうか?
SAVEFILE をどうするかもあります。このプログラムを動かすのが
Linux上なのか、Windows上なのか、その他なのかにも依存します。
Re: 構造体
Posted: 2017年6月07日(水) 13:21
by かずま
質問を削除しないでください。
もう一度、投稿してください。
そうでないと、あとからこの議論を読んだ人が理解できません。
Re: 構造体
Posted: 2017年6月07日(水) 18:31
by naohiro19
質問者はフォーラムルールの禁止されている事項
「自分勝手な都合で記事を削除する行為」
に違反しているため、No.1の記事を通報しました。
Re: 上司からの問題が難しくて教えて欲しいです。構造体
Posted: 2017年6月08日(木) 12:03
by asd
takekkumaaan さんが書きました:To. asd さん
その投稿は私がしたものでした。
また、私は仕事でこれからプログラミングを使います。
が、現在研修期間として色々と自習をしています。
今回問題は、上司がこんなのをやってみたら面白いのでは?
と適当に考えた問題で、その上司が暫く会えずにいましたので答えがわからず
ずっと悩んでおりました。
今後とも精進しますが、分からないことはお聞き致しますので、
どうかよろしくお願い致します。
そうであれば「元質問を削除し、かずまさんの質問に答えようとしない」のは矛盾した行動ではないでしょうか?
プログラム本体に対しての踏み込んだ質問がないままですし。
分からない部分があれば具体的に質問いただければまだしもそれさえされないのはなぜでしょうね。
また質問をなされる場合はフォーラムルールをよく読み、マルチポストに対する対応やいただいた回答に真摯に対応されるようお願いします。
少なくともマルチポスト先にあるような「誰かに作ってもらったプログラムを丸ごとコピーする姿勢」は研修として意味をなさないことになると指摘しておきます。
後から閲覧された方のために元質問を張り付けておきます(原文ママ)
---
► スポイラーを表示
C言語の勉強中で、ある課題があるため取り組んでいるのですが、全然わからないため皆様の力をお貸しください。
・3桁の数字をランダムに表示
・’q'を押すとプログラムが終了してそれまでに出力された3桁の数字をすべて表示
以上ここまではできているので書きに示します。
ここからさらに追加注文として、
・履歴機能を入れたい→’q'を押して出力されたすべての数字を記憶
・2回目に実行して'q'を押した場合、前回出力されたすべての数字の後に表示
・以下、回数を増やした場合でも前回の数字の続きに表示
少しわかりづらい文章となってしまいまして申し訳ございません。
できる方いらっしゃいましたら、ぜひお願いいたします。
下記のコードをベースに改良していただけると助かります。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
struct LIST{
struct LIST *next;
int value;
};
struct LIST *plist=NULL;
void main(void){
char q = 'a';
struct LIST *next=NULL;
srand((unsigned)time(NULL));
while(1)
{
int random = 0;
q = getchar();
if(q == 'q'){
break;
}
else if(q != '\n'){
continue;
}
random = rand()%1000;
if(random < 100){random += 100;};
struct LIST *p;
struct LIST *prev;
p=(struct LIST*)malloc(sizeof(struct LIST));
p->value=random;
p->next=NULL;
if(plist == NULL){
plist = p;
}
else{
next =
prev = plist;
while(prev->next != NULL){
prev = prev->next;
}
prev->next=p;
}
printf(" %d\n", p->value);
}
struct LIST *p ;
p =plist;
while(p!=NULL){
printf("\n%d",p->value);
p =p->next;
}
getchar();
getchar();
}