fork download
  1.  
  2. #include <stdio.h>
  3.  
  4. void saidai_num(int kosuu, int data[], int *max, int *max_num) {
  5. int current_max = data[0]; // 初期最大値 (GR0)
  6. int count = 1; // 初期の個数 (GR5)
  7. int counter = 0; // ループカウンタ (GR6)
  8.  
  9. while (counter < kosuu) {
  10. data = data + 1; // 配列ポインタを次へ (LAD GR2, 1, GR2)
  11. counter = counter + 1; // カウンタ + 1 (LAD GR6, 1, GR6)
  12.  
  13. if (*data > current_max) {
  14. // これまでより大きい値が見つかった場合
  15. current_max = *data; // 最大値を更新 (LD GR0, GR7)
  16. count = 1; // 個数を 1 にリセット (LAD GR5, 1)
  17. } else if (*data == current_max) {
  18. // 現在の最大値と同値が見つかった場合
  19. count = count + 1; // 個数をインクリメント (LAD GR5, 1, GR5)
  20. }
  21. // *data < current_max の場合は何もせず次の要素へ
  22. }
  23.  
  24. *max = current_max; // 結果を変数へ書き込み (ST GR0, 0, GR3)
  25. *max_num = count; // 個数を変数へ書き込み (ST GR5, 0, GR4)
  26. return;
  27. }
  28.  
  29. int main(void) {
  30. /* 配列1: 要素数 7 (kosuu = 6) - 30が3個存在 */
  31. int array1[] = {10, 15, 30, 15, 30, 30, 7};
  32. int max1, num1;
  33.  
  34. /* 配列2: 要素数 6 (kosuu = 5) - 全て同値 10が6個存在 */
  35. int array2[] = {10, 10, 10, 10, 10, 10};
  36. int max2, num2;
  37.  
  38. /* サブルーチン呼び出し (GR1〜GR4 に引数をセット) */
  39. saidai_num(6, array1, &max1, &num1);
  40. saidai_num(5, array2, &max2, &num2);
  41.  
  42. /* 結果確認(CASL2000メモリーダンプ画面で確認) */
  43. printf("配列1: 最大値 MAX1 = %d, 個数 NUM1 = %d\n", max1, num1); // 30, 3
  44. printf("配列2: 最大値 MAX2 = %d, 個数 NUM2 = %d\n", max2, num2); // 10, 6
  45.  
  46. return 0;
  47. }
  48.  
Success #stdin #stdout 0s 5288KB
stdin
Standard input is empty
stdout
配列1: 最大値 MAX1 = 30, 個数 NUM1 = 3
配列2: 最大値 MAX2 = 10, 個数 NUM2 = 6