• 締切済み

c言語

スーパーのレジがあるとします。 そこに客が並びます。その客の会計が終わったら列から抜けて次に並んでいる客の処理をします。 レジは途中で開き、閉まることがあります。 input --------- 2 Akira 3 9 Yoko 4 12 Takumi 6 20 Kouta 9 18 # 11 1 Miku 18 22 @ 22 1 Daiki 23 10 ---------------- これはファイルinput.txtの内容で、読み込みます。 最初にレジの台数を入力します。 名前の後空白で区切ってレジに到着した時間その後にまた空白で区切って処理の終了時間 # 11 1 はレジが閉まる時間でこの場合は0番目、1番目のレジがある中で11の時間に1番目のレジが閉まるということです。 @ 22 1 は22の時間に1番目のレジが開くということです。 2人以上がレジに並んでいる時にレジが閉まったら処理中の客以外は開いているレジに並びます。 客はレジに並んでいる人数が少ない列に優先的に並びます。もし同じ人数が並んでいたら数字が若いレジが優先です(0番目から) --------------------- output Akira 12 0 Yoko 16 1 Takumi 32 0 Daiki 33 1 Kouta 50 0 Miku 72 0 ------------------ outputもファイルで行います。 処理の終了した順に名前と処理時間、処理したレジの番号を出力します。 このコードを教えてもらえないでしょうか。 #define MAX_QUEUE_SIZE 10 int global_clock; typedef struct Customer { char id[20]; // 客 id int arr_time; // 客が銀行に着く時間 int ser_time; // 客の処理にかかる時間 }Customer; typedef struct TellerQueue { int status; // status, 0: close, 1:お客様が一人しか残っていない状態、つまりCLOSE, 2:open int front; // front pointer,最初の要素elementへのインデックスindex int rear; // rear pointer,最後の要素elementの次のインデックスindexを指す int count; // queue 待ち行列の人数 int current_served_time; // 現在、お客様との取引に費やしている時間 Customer queue[MAX_QUEUE_SIZE]; // 配列形式の円形待ち行列のシミュレーション。 }TellerQueue; これらの構造体が最初に与えられています。

みんなの回答

回答No.2

まず、 >window[0].id >window[1].id >の2つでいいと思いますが、それが3個以上あるとしたらどう切り換えればいいでしょうか? ここは、切り替える必要はないです。 例えば、レジの数がMAX台なら、 int i; for (i=0;i<max;i++) { window[i].~~~ } と全体を回すように動かせばいいだけだと思います。 また、例えば1台目のレジに何人いるかは、 その他のレジには全く関与しないわけなので、 レジ間の比較は不要と思います。 ただ、まだ全体的に何がしたいのかが、はっきりしない部分は ありますね。 typedef struct Customer { char id[20]; // 客 id int arr_time; // 客が銀行に着く時間 int ser_time; // 客の処理にかかる時間 }Customer; タグ名と構造体名が、どちらもCustomerなので、タグ名は いらないんじゃないかと。 次にid も、idなのに、char []形式なのが、違和感はあります。 int arr_time; // 客が銀行に着く時間 時間なのにintなのも、違和感があり。 int status; // status, 0: close, 1:お客様が一人しか残っていない状態、つまりCLOSE, 2:open ここも、 1=つまりCLOSEなら、0のCLOSEとの違いが不明 int front; // front pointer,最初の要素elementへのインデックスindex ポインターって書いているのに値がインデックスになってたり int rear; // rear pointer,最後の要素elementの次のインデックスindexを指す 最後の要素の次は、「ありません」から次はないと思います。 なおC言語では、時間を表す型は time_tというものになります。 などが、今回の捕捉での回答と気になった場所になります。 ひとまず、 whileとfor命令を使いこなせれば解決する要件に感じます。

回答No.1

>このコードを教えてもらえないでしょうか。 いいですよ。 ただコード書いてみてもらえますか? できればその中で、どこがわからないなども、 書いてもらえれば、他の人でもCがわかる人が 回答すると思います。 今回コードがなかったので、回答できずにいます。

idontlikeclang
質問者

補足

typedef struct Customer { char id[20]; // 客 id int arr_time; int ser_time; int nop; }Customer; main(){ Customer window[100]; } 最初に2というレジの台数があると思いますが、2代だと最初から決まっているなら window[0].id window[1].id の2つでいいと思いますが、それが3個以上あるとしたらどう切り換えればいいでしょうか? データ構造内の int nop; は並んでいる人数を数えるためのものですが、たとえばレジが10台あるとして1番目のレジに並んだら window[0].nop++ 処理を完了したら window[0].nop-- のようにしたらいいとは思うんですが10台をどう比較すればいいのかがわかりません。 今は10台だと仮定して話していますが10台は固定じゃないので...

関連するQ&A

  • c言語

    スーパーのレジがあるとします。 そこに客が並びます。その客の会計が終わったら列から抜けて次に並んでいる客の処理をします。 レジは途中で開き、閉まることがあります。 input --------- 2 Akira 3 9 Yoko 4 12 Takumi 6 20 Kouta 9 18 # 11 1 Miku 18 22 @ 22 1 Daiki 23 10 ---------------- これはファイルinput.txtの内容で、読み込みます。 最初にレジの台数を入力します。 名前の後空白で区切ってレジに到着した時間その後にまた空白で区切って処理の終了時間 # 11 1 はレジが閉まる時間でこの場合は0番目、1番目のレジがある中で11の時間に1番目のレジが閉まるということです。 @ 22 1 は22の時間に1番目のレジが開くということです。 2人以上がレジに並んでいる時にレジが閉まったら処理中の客以外は開いているレジに並びます。 客はレジに並んでいる人数が少ない列に優先的に並びます。もし同じ人数が並んでいたら数字が若いレジが優先です(0番目から) --------------------- output Akira 12 0 Yoko 16 1 Takumi 32 0 Daiki 33 1 Kouta 50 0 Miku 72 0 ------------------ outputもファイルで行います。 処理の終了した順に名前と処理時間、処理したレジの番号を出力します。 並んでいる時にレジが閉まったら他の列に並びなすコードがわからないです。 あと、他におかしいところがあったら指摘お願いします。 コードが長いのでこちらから見ていただければ幸いです ```c https://hackmd.io/@I85z6XPYS4e-Pjfg9AoVKQ/SkLL8Ip4j ```

  • C言語 エンキューの問題について

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_QUEUE_LENGTH 11 // キューに用いる配列の⻑さ #define N 50 //乱数の範囲 typedef struct queue { int array[MAX_QUEUE_LENGTH]; int front; int rear; } Queue; Queue *init_queue() { printf("initialize queue\n"); Queue *queue = malloc(sizeof(Queue)); queue->front = 0; queue->rear = 0; return queue; } void print_test(char *line) { printf("-------------\n"); printf("test: %s\n", line); } void print_front_and_rear_index(Queue *queue) { // キューの front と rear を表示する関数 printf("front:%2d, rear:%2d\n", queue->front, queue->rear); } void print_queue(Queue *queue) { // キューの要素を front から rear まで表示する関数 } void enqueue(Queue *queue, int value) { // エンキューする関数 } void enqueue_test_items(Queue *queue, int n) { for (int i = 0; i < n; i++) { int score = rand() % N; enqueue(queue, score); } } void test_enqueue(Queue *queue) { print_test("print empty queue"); print_queue(queue); print_test("enqueue 10 items"); enqueue_test_items(queue, 10); print_test("print queue"); print_queue(queue); print_test("enqueue a item to full queue"); enqueue(queue, -1); } int main(void) { srand((unsigned)time(NULL)); // 乱数の初期化 Queue *queue = init_queue(); // キューの初期化 test_enqueue(queue); } 以下の雛形に従い,リングバッファによるキューに対して,エンキューする関数 enqueue を実装せよ. 関数 print_front_and_rear_index は,キューの front と rear を表示するための関数である. 問題に対する解答には不要であるがデバッグのために用意した. という問題なのですが上手くいかずに添付されている写真の実行結果通りになりません。なのでよければ解答をお願いします

  • C言語 エンキューの問題について

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_QUEUE_LENGTH 11 // キューに用いる配列の⻑さ #define N 50 //乱数の範囲 typedef struct queue { int array[MAX_QUEUE_LENGTH]; int front; int rear; } Queue; Queue *init_queue() { printf("initialize queue\n"); Queue *queue = malloc(sizeof(Queue)); queue->front = 0; queue->rear = 0; return queue; } void print_test(char *line) { printf("-------------\n"); printf("test: %s\n", line); } void print_front_and_rear_index(Queue *queue) { // キューの front と rear を表示する関数 printf("front:%2d, rear:%2d\n", queue->front, queue->rear); } void print_queue(Queue *queue) { // キューの要素を front から rear まで表示する関数 } void enqueue(Queue *queue, int value) { // エンキューする関数 } void enqueue_test_items(Queue *queue, int n) { for (int i = 0; i < n; i++) { int score = rand() % N; enqueue(queue, score); } } void test_enqueue(Queue *queue) { print_test("print empty queue"); print_queue(queue); print_test("enqueue 10 items"); enqueue_test_items(queue, 10); print_test("print queue"); print_queue(queue); print_test("enqueue a item to full queue"); enqueue(queue, -1); } int main(void) { srand((unsigned)time(NULL)); // 乱数の初期化 Queue *queue = init_queue(); // キューの初期化 test_enqueue(queue); } 以下の雛形に従い,リングバッファによるキューに対して,エンキューする関数 enqueue を実装せよ. 関数 print_front_and_rear_index は,キューの front と rear を表示するための関数である. 問題に対する解答には不要であるがデバッグのために用意した. という問題なのですが関数print_queueは出来ましたが関数queueの中身がわかりませんので良ければ解答をお願いします。 自分が書いた関数print_queueは下に置いておきます 実行結果は数字以外は画像の通りになります。 void print_queue(Queue *queue) { if (queue->front == queue->rear) { printf("queue is empty\n"); } else { for (int i = queue->front; i % MAX_QUEUE_LENGTH != queue->rear; i++) { printf("queue[%2d]: %2d\n", i % MAX_QUEUE_LENGTH, } } }

  • 学校で、C言語でのプログラミングをせよ。

    学校で、C言語でのプログラミングをせよ。 との課題が出たのですが、プログラミングが全くわからなくて困っています!! 誰か助けて下さい!! 待ち行列 ・レジ到着は一時間あたり平均20人。 ・客は一番待ち人数の少ないレジに並ぶ。 ・待ち人数の同じレジが二つ以上ある場合は等確率でその内の一つをランダムに選択。 ・客一人あたりの勘定時間は平均値10分の指数分布 ・一つの勘定台には最長平均5分までしか客を待たせられない レジの必要数の推定と客の平均待ち時間およびレジの平均空き時間を推定せよ。 ともありますが、さっぱりです…。

    • ベストアンサー
    • Java
  • C言語での構造体

    C言語で、 キュー構造を作りたいのですが、うまくできません。 途中まで作ったのですが、うまく動きませんでした。 EnqueueやDequeueでデータの出し入れをするのですが、そのままではデータを取り出したときにデータが先頭に来ないので、refreshで先頭に持ってくるようにプログラムを組みました。 ----------------------------------------------------- #include<stdio.h> #define MAXQUEUE 10 typedef struct queue{ int head, tail; char entry[MAXQUEUE]; } Queue; //キュー構造にデータを入れる。 void Enqueue(char item,Queue *q){ q->entry[q->tail]=item; q->tail++; } //キュー構造からデータを取り出す。 void Dequeue(char *item,Queue *q){ *item=q->entry[q->head]; q->head++; } //キュー構造内のデータを先頭にずらす。 void refresh(Queue *q){ while(q->head==0){ q->entry[q->head-1]=q->entry[q->head]; q->head--; q->tail--; } } void main(){ Queue qu; Enqueue('w1',&qu); Enqueue('w2',&qu); Enqueue('w3',&qu); Enqueue('w4',&qu); Dequeue(&qu,&qu); Dequeue(&qu,&qu); refresh(&qu); } ---------------------------------------------------------------- mainからEnqueueやDequeueを呼び出すときに、引数として何を渡せばいいのでしょうか?構造体をそのまま渡してみたのですが、「error C2664: 'Dequeue' : 1 番目の引数を 'Queue *' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。」というエラーを吐いてしまいます。 分かりづらい説明で申し訳御座いませんが、ご回答宜しくお願いいたします。

  • c言語 片方向連結リスト

    c言語の片方向連結リストのプログラムについて質問があります. 下記のプログラムの関数int get_index(ListPtr l, int value)に以下のようなコードを書く.リストl において値value を持つセルの位置を返す.返り値は,最初のセルが値value を持っていれば0,次のセルが値value を持っていれば1,...,値value を持っているセルが存在しなければ–1とする. また,関数void add(ListPtr l, int index, int value)に以下のようなコードを書く.リストl の位置index に値value を持つセルを挿入.挿入前のリストに対して:index が0 のときは先頭に挿入,index が1 のときは(0から数えて)1番目のセルの前に挿入,index が2 のときは(0から数えて)2番目のセルの前に挿入,...,index がリストのサイズと等しいときはリストの末尾に挿入,それ以外の場合は何もしなくてよい. これらのコードはどのように書けばよいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <assert.h> /* 連結リスト中のノードの構造体 */ struct node { int val; /* 値 */ struct node *next; /* 次ノード */ }; /* セルとそのポインタの型 */ typedef struct node Node; typedef Node *NodePtr; /* セルを一つ生成 */ NodePtr create_node(int v) { NodePtr n = NULL; n = malloc(sizeof(Node)); n->val = v; n->next = NULL; return n; } /* セルを表示 */ void print_node(NodePtr n) { if (n != NULL) { printf("<%d>", n->val); } else { printf("(null)"); } } /* 連結リストの構造体 */ struct list { /* 先頭セルへのポインタ */ NodePtr head; }; /* 連結リストとそのポインタの型 */ typedef struct list List; typedef List *ListPtr; /* 空の連結リストを生成 */ ListPtr create_list(void) { ListPtr l = NULL; l = malloc(sizeof(List)); l->head = NULL; return l; } /* 連結リスト l が空かどうか判定 */ int is_empty(ListPtr l) { return (l->head == NULL); } /* リスト l の内容を表示 */ void print_list(ListPtr l) { NodePtr n = NULL; if (is_empty(l)) { printf("(empty)\n"); return; } n = l->head; while (n != NULL) { print_node(n); n = n->next; } printf("\n"); } /* リスト l の先頭にセルを挿入 */ void add_first(ListPtr l, int val) { NodePtr n = NULL; n = create_node(val); n->next = l->head; l->head = n; } /* リスト l の先頭セルを削除 */ int delete_first(ListPtr l) { NodePtr n = NULL; int v; /* リストが空なら -1 を返す(負の値はリストに含まれないと仮定)*/ if (is_empty(l)) return -1; v = l->head->val; n = l->head; l->head = l->head->next; free(n); n = NULL; return v; } /* 連結リスト l のサイズを取得 */ int get_list_size(ListPtr l) { NodePtr n = NULL; int size; size = 0; n = l->head; while (n != NULL) { size++; n = n->next; } return size; } /* * 連結リスト l における index 番目のセルの値を取得 * (そのようなセルが存在しなければ -1 を返す) */ int get_value(ListPtr l, int index) { NodePtr n = NULL; if (index < 0) return -1; n = l->head; while (index > 0 && n != NULL) { n = n->next; index--; } return (n == NULL) ? -1 : n->val; } /* リスト l 中の全セルを削除(ループ版)*/ void delete_all(ListPtr l) { NodePtr n = NULL, m = NULL; n = l->head; while (n != NULL) { m = n; n = n->next; free(m); } l->head = NULL; } /* セル n 以降を全て削除(内部処理用の再帰関数)*/ void delete_rest(NodePtr n) { if (n->next != NULL) delete_rest(n->next); free(n); } /* リスト l 中の全セルを削除(再帰版)*/ void delete_all_recursively(ListPtr l) { if (l->head == NULL) return; delete_rest(l->head); l->head = NULL; } /* リスト l 全体を削除 */ #define delete_list(l) (delete_list0(l),l=NULL) void delete_list0(ListPtr l) { delete_all(l); free(l); } /* リスト l において値 val を持つセルの位置を返す */ int get_index(ListPtr l, int value) { return -1; } /* リスト l の位置 index に値 val を持つセルを挿入 */ void add(ListPtr l, int index, int value) { } /* 連結リストの使用例 */ int main(void) { FILE *fp = NULL; char buf[10]; int age; ListPtr l = NULL; l = create_list(); add_first(l, 28); add_first(l, 40); add_first(l, 33); add_first(l, 15); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); return 0; }

  • c言語の問題

    それぞれの重量と価格が分かっているN個の商品から、総重量が定められた上限値limit以下となるように任意個選択したときの合計価格のうちで、最大値を計算したい。構造体itemは商品を表し、そのメンバw, pはそれぞれ重量と価格を表す。N個の商品は配列itemsに格納されている。maxtotal(num, start)を呼び出すことにより、総重量にstartを加えた数がlimit以内であるという条件の元で、インデックスがnum以降の商品から任意個選択したときの合計価格の最大値が得られる。 上記の内容のプログラムについて、●●●に入る操作を書けという問題の解答をお願いします。長時間考えたのですがプログラムの動きが理解できません。再帰を用いたプログラムの流れを上手く理解するコツがあれば教えて欲しいです… #include <stdio.h> #define N 4 typedef struct _item{ int w; int p; } item; int limit; item items[N] = { {1, 100}, {1, 50}, {2, 150}, {2, 100} }; int maxtotal(int num, int start){ int x, y, rval; if(num == N){ return 0; } if(●●● > limit){ rval = maxtotal(●●●, ●●●); } else { x = maxtotal(num + 1, ●●●) + items[num].p; y = maxtotal(num + 1, ●●●); rval = x > y ? x : y; } return rval; } int main(void){ printf("Weight limit?:"); scanf("%d", &limit); printf("Maximum total price is %d\n", maxtotal(0, 0)); return 0; }

  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • c言語 ハッシュ表

    下のハッシュ表のプログラムについて質問です.関数enterを二回呼び出して,valueの値を変更して表示させても値が更新されません.値が更新せれるにはどうすればよいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASH_SIZE 997 /* ハッシュ表の内部配列のサイズ */ #define HASH_RADIX 97 /* ハッシュ関数用の基数 */ /* ハッシュ表内の連結リストに含まれるノードの構造体 */ struct hash_node { /* ハッシュ表内の連結リストのノード */ char *key; /* キー */ int value; /* キーに対応する値 */ int id; /* キーに付与された通し番号 */ struct hash_node *next; /* 次のノードへのポインタ */ }; typedef struct hash_node HashNode; typedef HashNode *HashNodePtr; /* ハッシュ表の構造体 */ struct hashtable { HashNodePtr *heads; /* 内部配列 */ int serial_id; /* 通し番号管理用の変数 */ int size; /* 内部配列のサイズ */ }; typedef struct hashtable HashTable; typedef HashTable *HashTablePtr; /* 文字列 s のハッシュ値を計算する */ unsigned int hash(char *s) { unsigned int v; v = 0; while (*s != '\0') { v = v * HASH_RADIX + *s; s++; } return v; } /* ハッシュ表を一つ生成し,そのポインタを返す */ HashTablePtr create_hashtable() { HashTablePtr t = NULL; int i; t = malloc(sizeof(HashTable)); t->serial_id = 0; t->size = HASH_SIZE; t->heads = malloc(sizeof(HashNodePtr) * t->size); /* 各連結リストの先頭要素へのポインタは必ず NULL に初期化する */ for (i = 0; i < t->size; i++) { t->heads[i] = NULL; } return t; } /* 指定したポインタ変数に NULL を代入して終わるためのマクロ */ #define delete_hashtable(t) \ (delete_hashtable0(t),t=NULL) /* 実質的な削除作業を行う関数(free 後の NULL 代入は省略)*/ void delete_hashtable0(HashTablePtr t) { HashNodePtr n = NULL, m = NULL; int i; /* 各連結リストの領域を解放 */ for (i = 0; i < t->size; i++) { n = t->heads[i]; while (n != NULL) { m = n; n = n->next; free(m); } } /* 最後に連結リストの先頭ポインタの領域を解放 */ free(t->heads); free(t); } /* ハッシュ表 t に登録されているキーと値のペアの数を返す */ int get_cardinality(HashTablePtr t) { return t->serial_id; } /* ハッシュ表 t にてキー key に対応する値を調べる */ int lookup(HashTablePtr t, char *key) { HashNodePtr n = NULL; int index; /* ハッシュ表の内部配列の添え字を計算 */ index = hash(key) % t->size; /* index 番目の連結リストを先頭から順に走査 */ n = t->heads[index]; while (n != NULL) { /* 引数で指定された key とハッシュ表内のキーが一致したら 直ちに対応する値を返す */ if (strcmp(key, n->key) == 0) return n->value; /* 走査を次に進める */ n = n->next; } /* ここではキーに対応する値は非負であると仮定し, 見つからなかったら -1 を返す */ return -1; } /* キー key と値 value のペアをハッシュ表 t に登録し,その通し番号を返す */ int enter(HashTablePtr t, char *key, int value) { HashNodePtr n = NULL, m = NULL; int index; index = hash(key) % t->size; /* 内部配列の添え字を計算 */ /* キーが既に存在しているかどうかチェック(lookup() と同じ処理)*/ n = t->heads[index]; while (n != NULL) { if (strcmp(key, n->key) == 0) return n->id; /* 通し番号を返す */ n = n->next; } /* 新しいノードを生成 */ m = malloc(sizeof(HashNode)); m->key = _strdup(key); m->id = t->serial_id; m->value = value; /* 連結リストの add_first() と同様にして連結リストに追加 */ m->next = t->heads[index]; t->heads[index] = m; t->serial_id++; /* 次の通し番号に更新 */ return m->id; /* 登録したキーと値のペアに付与された通し番号を返す */ } /* * ハッシュ表 t に登録されるキーの配列を返す *(この配列のサイズは get_cardinality() で取得可能) */ char **get_keys(HashTablePtr t) { char **keys = NULL; HashNodePtr n = NULL; int i; keys = malloc(sizeof(char *) * t->serial_id); /* 各連結リストを走査し,配列に詰め込む */ for (i = 0; i < t->size; i++) { n = t->heads[i]; while (n != NULL) { keys[n->id] = n->key; /* 通し番号を配列添え字に */ n = n->next; } } return keys; /* 後で free() する必要あり */ } void print_hashtable(HashTablePtr t) { printf("Taro => %d\n", lookup(t, "Taro")); } /* ハッシュ表の使用例 */ int main(void) { HashTablePtr t = NULL; t = create_hashtable(); enter(t, "Taro", 25); print_hashtable(t); enter(t, "Taro", 35); print_hashtable(t); delete_hashtable(t); }

  • a[i]とa[i+1]を入れ替えるような関数を作成するC言語の問題

    以下のように配列aとそのサイズsとインデックスiを引数 にとり、a[i]とa[i+1]を入れ替えるような関数を作成する問題。 但し、この関数内で配列の外側をアクセスしないようにエラー チェックをすること。正常に処理が終了した場合は0を返し、 そうでない場合は-1を返すようにする。 main関数では、10個分の整数を入れる配列を宣言し、 データをユーザに入力させる。 次に、ユーザに1個整数を入力させ、0からその番号まで順に iをずらしてswap_array関数を読んだ後、配列に入っているデータを 表示させる。 ・配列にデータを入力でき、交換が正しくできている ・ユーザが配列の外側を指定した場合は、エラーである旨を 表示して終了する。 取りあえずこうゆうかんじになるのですが、//の前などをどうにすればいいか分かりません。分かる方は知恵を貸してください。 int swap_array(int a[], int s, int i) { //a[i]番目とa[i+1]番目を入れ替え処理をする //正しく交換できた場合はreturn(0); //エラーが発生した場合はreturn(-1); } int main() { //サイズ10の配列の宣言 int a[10]; //ユーザに10個のデータの入力をさせる int i; for(i=0;i<10;i++){ scanf("%d",&a[i]); } //0番目から何番目まで入れ替えるかユーザに聞く: (ユーザがnと入力) int n; ...... //繰り返し構造を使って、0番目からn番目まで隣同士を交換 for(i=0;i<=n;i++){ int v; // swap_arrayを繰り返し呼び出すが、毎回戻り値が0であることを         //チェックしてエラーが発生していないことを確かめる v=swap_array(a,10,i); // エラーが発生していたら エラーが発生したことを表示して //break;文で繰り返し構造から外にでる。 if(v==-1) break; } //エラーが発生しなかった場合に、入れ替えられた配列の内容を表示 if(v!=-1){ ..... 配列の内容を表示 } return(0);

専門家に質問してみよう