#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> /*データ*/ typedef struct { int num; //学籍番号下三桁 char name[16]; //氏名 }data_t; /*ノード*/ typedef struct node { data_t data; //データ struct node* nextnode; //後ろのノードへのポインタ }node_t; /*関数プロトタイプ宣言*/ node_t* make_node(data_t, node_t*); node_t* add_data(node_t*); node_t* remove_data(node_t*); void search_data(node_t*); void show_data(node_t*); void release(node_t*); int main(void) { int menu; node_t* node = NULL; do { puts(""); puts("***メニューの選択***"); puts(" 1.データの表示"); puts(" 2.データの追加"); puts(" 3.データの検索"); puts(" 4.データの削除"); puts(" 5.終了"); printf("メニューの選択:"); scanf("%d", &menu); puts(""); switch (menu) { case 1:show_data(node); break; case 2: node = add_data(node); break; case 3: search_data(node); break; case 4:node = remove_data(node); break; case 5: puts("プログラムを終了"); break; default:puts("番号を再入力"); break; } } while (menu != 5); release(node); // system("pause"); コメント return 0; } /*新規ノードの作成*/ node_t* make_node(data_t data, node_t* nextnode) { node_t* p; p = malloc(sizeof(node_t)); if (p == NULL) { puts("領域確保に失敗"); return NULL; } else { p->data = data; p->nextnode = nextnode; } return p; } /*データの追加*/ node_t* add_data(node_t* node) { data_t data; node_t* p = node; puts("***追加するデータの入力***"); printf("学籍番号の下二桁の番号:"); scanf("%d", &data.num); printf("氏名:"); scanf("%s", data.name); while (node != NULL && p->nextnode != NULL) { p = p->nextnode; } if (node == NULL) { node = make_node(data, NULL); } else { p->nextnode = make_node(data, NULL); } return node; } /*データの表示*/ void show_data(node_t* node) { node_t* p = node; if (p == NULL) { puts("データがありません。データを追加してください。"); return; } while (p != NULL) { printf("番号%*s氏名\n", 6, ""); printf("%2d %10s\n", (p->data).num, (p->data).name); p = p->nextnode; } } /*データの削除*/ node_t* remove_data(node_t* node) { int num; node_t* head = node; node_t* pre = NULL; if (node == NULL) { puts("データは見つかりませんでした。"); return NULL; } puts("***データの削除***"); printf("番号の入力:"); scanf("%d", &num); while (node->nextnode != NULL) { if ((node->data).num == num) { if (pre == NULL) { return node->nextnode; } else { pre->nextnode = node->nextnode; free(node); return head; } } pre = node; node = node->nextnode; } puts("データは見つかりませんでした。"); return head; } /*データの検索*/ void search_data(node_t* node) { int num; node_t* p = node; puts("***データの検索***"); printf("番号の入力:"); scanf("%d", &num); if (node == NULL) { puts("データは見つかりませんでした"); return; } while (p->nextnode != NULL) { if ((p->data).num == num) { puts("---データを発見---"); printf("氏名:%s\n", (p->data).name); return; } p = p->nextnode; } puts("データは見つかりませんでした"); } /*データの後処理*/ void release(node_t* node) { node_t* p; if (node == NULL) return; p = node; release(p->nextnode); free(p); } ```出席簿 1. 出席管理のファイル(csv ファイルなど)があればそれを読み込み,なければ新規作成する. 2.メニューを表示し, a. 出席状況の表示 b. 出席状況の入力 c. 出席状況の集計 d. 出席状況の保存 e. 終了 のいずれかを選択させる. a. 出席状況の表示では, 全学生の一週間の出席状況の一覧(出席簿)を表示する. 例 0401 0402 0403 01 青島 昭 欠席 02 神田 洋二 遅刻 遅刻 b.出席状況の入力では, 出席番号と日付(例:0613 などの文字列)を入力させたのち, 遅刻か早退か欠席かを入力させ,該当する学生および日付の出席状況を変更する. c. 出席状況の集計では, 出席番号を入力させ,該当する学生の遅刻,早退,欠席の合計日数をそれぞれ表示する. d. 出席状況の保存では, 全生徒の出席状況を出席管理のファイルに出力する. e. プログラムを終了する. ※ 少なくとも,1 週間分の出席状況が管理できるようにせよ.
学校の課題とかだったら自分でどうぞ。
ここは課題等の作業代行をしてくれるサイトではありませんので。
しつもんはなんですか?
出席情報の入力の右方向に追加していく方法がわかりません
"右方向"てなんですか? (できそこないでいいから)コードみせて。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*データ*/
typedef struct {
int num; //学籍番号下三桁
char name[16]; //氏名
}data_t;
/*ノード*/
typedef struct node {
data_t data; //データ
struct node* nextnode; //後ろのノードへのポインタ
}node_t;
/*関数プロトタイプ宣言*/
node_t* make_node(data_t, node_t*);
node_t* add_data(node_t*);
node_t* remove_data(node_t*);
void search_data(node_t*);
void show_data(node_t*);
void release(node_t*);
int main(void)
{
int menu;
node_t* node = NULL;
do {
puts("");
puts("***メニューの選択***");
puts(" 1.データの表示");
puts(" 2.データの追加");
puts(" 3.データの検索");
puts(" 4.データの削除");
puts(" 5.終了");
printf("メニューの選択:");
scanf("%d", &menu);
puts("");
switch (menu)
{
case 1:show_data(node); break;
case 2: node = add_data(node); break;
case 3: search_data(node); break;
case 4:node = remove_data(node); break;
case 5: puts("プログラムを終了"); break;
default:puts("番号を再入力"); break;
}
} while (menu != 5);
release(node);
// system("pause"); コメント
return 0;
}
/*新規ノードの作成*/
node_t* make_node(data_t data, node_t* nextnode)
{
node_t* p;
p = malloc(sizeof(node_t));
if (p == NULL) {
puts("領域確保に失敗");
return NULL;
}
else {
p->data = data;
p->nextnode = nextnode;
}
return p;
}
/*データの追加*/
node_t* add_data(node_t* node)
{
data_t data;
node_t* p = node;
puts("***追加するデータの入力***");
printf("学籍番号の下二桁の番号:");
scanf("%d", &data.num);
printf("氏名:");
scanf("%s", data.name);
while (node != NULL && p->nextnode != NULL) {
p = p->nextnode;
}
if (node == NULL) {
node = make_node(data, NULL);
}
else {
p->nextnode = make_node(data, NULL);
}
return node;
}
/*データの表示*/
void show_data(node_t* node)
{
node_t* p = node;
if (p == NULL) {
puts("データがありません。データを追加してください。");
return;
}
while (p != NULL) {
printf("番号%*s氏名\n", 6, "");
printf("%2d %10s\n", (p->data).num, (p->data).name);
p = p->nextnode;
}
}
/*データの削除*/
node_t* remove_data(node_t* node)
{
int num;
node_t* head = node;
node_t* pre = NULL;
if (node == NULL) {
puts("データは見つかりませんでした。");
return NULL;
}
puts("***データの削除***");
printf("番号の入力:");
scanf("%d", &num);
while (node->nextnode != NULL) {
if ((node->data).num == num) {
if (pre == NULL) {
return node->nextnode;
}
else {
pre->nextnode = node->nextnode;
free(node);
return head;
}
}
pre = node;
node = node->nextnode;
}
puts("データは見つかりませんでした。");
return head;
}
/*データの検索*/
void search_data(node_t* node)
{
int num;
node_t* p = node;
puts("***データの検索***");
printf("番号の入力:");
scanf("%d", &num);
if (node == NULL) {
puts("データは見つかりませんでした");
return;
}
while (p->nextnode != NULL) {
if ((p->data).num == num) {
puts("---データを発見---");
printf("氏名:%s\n", (p->data).name);
return;
}
p = p->nextnode;
}
puts("データは見つかりませんでした");
}
/*データの後処理*/
void release(node_t* node)
{
node_t* p;
if (node == NULL) return;
p = node;
release(p->nextnode);
free(p);
}
質問は編集できます。上記コードを質問に追加してください。
# それにこのコード、C++じゃないよね。Cだよね。
そうなんですね。
変更いたしましたありがとうございます。
で、"右方向"てなんですか?
日付を追加していく方法です
日本語でお願いします。
"右方向に追加していく方法"の"右方向"とはなんですか?
出席簿管理のキモである(と思われる)
- いつ
- だれが
- 遅刻/早退/欠席 したか
を表現するデータがコードのどこにも見当たりません。
できそこないにも程がある、これでは"丸投げ"と判断されます。
0401 0402 0403 ...⇒
01 欠席 早退
02 欠席
と右の方向に日付を追加していく方法です。
出力に関する質問ですか?
printf("%s ", 日付); を繰り返せば右方向に日付がプリントされますけど。
...なにがわからないかを説明できていません。
あなたの回答
tips
プレビュー