質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • Swift

    6295questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3628questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3573questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

[swift]計算した回数のカウントとリセット

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 167

SKMT

score 30

前提・実現したいこと

cntを正しく動作させたい

発生している問題・エラーメッセージ

cntでカウントしてそれに準じて処理を行なっているのですが
なぜか動作がおかしく、cntを表示させると値がおかしくて困っています

該当のソースコード

 import UIKit
import CoreMotion
import AudioToolbox
import AVFoundation

class ViewController: UIViewController {
    let motionManager = CMMotionManager()
    var dataX:[Double] = []
    var dataY:[Double] = []
    var dataZ:[Double] = []
    var deviY = [Double](repeating: 0.0, count: 15000)
    var dispY = [Double](repeating: 0.0, count: 15000)
    var btn = false
    weak var timer: Timer!
    var startTime = Date()
    var totalTime = 0.0
    var cnt:Int = 0
    var alertY = true

    @IBOutlet weak var timeL: UILabel!
    @IBOutlet weak var accelX: UILabel!
    @IBOutlet weak var accelY: UILabel!
    @IBOutlet weak var accelZ: UILabel!

    @IBOutlet weak var kakuninL: UILabel!

//    計測開始・停止ボタン
    @IBAction func startB(_ sender: Any) {
        let button = sender as! UIButton

        if (btn == true) {
            btn = false
            cnt = 0
            deviY = [Double](repeating: 0.0, count: 15000)
            dispY = [Double](repeating: 0.0, count: 15000)
            button.setTitle("計測開始", for: .normal)
            stopTimer()
        }
        else {
            btn = true
            button.setTitle("計測停止", for: .normal)
            startTimer()
            cnt = 0
        }
    }

    @IBAction func resetB(_ sender: Any) {
        cnt = 0
        deviY = [Double](repeating: 0.0, count: 15000)
        dispY = [Double](repeating: 0.0, count: 15000)
        resetTimer()
        stopTimer()
    }


//    データの格納
    func outputAccelData(acceleration: CMAcceleration){
        if (btn) {
            dataX.append(acceleration.x)
            dataY.append(acceleration.y)
            dataZ.append(acceleration.z)

            accelX.text = String(format: "x = %.3f", acceleration.x)
            accelY.text = String(format: "y = %.3f", acceleration.y)
            accelZ.text = String(format: "z = %.3f", acceleration.z)
            culculator()
        }
    }

//    データの計算
    func culculator() {
        var tmpy:Double = 0.0

        if(dataY.count > 10) {
            for i in 0 ..< (dataY.count - 11) {
                for j in i ..< (i + 10) {
                    tmpy =  tmpy + dataY[j]
                }
                tmpy = tmpy / 10.0

                for k in i ..< (i + 10) {
                    dispY[i] = dispY[i] + pow(dataY[k]-tmpy,2.0)
                }
                dispY[i] = dispY[i] / 10.0
                deviY[i] = sqrt(dispY[i])

                if(judgecount(deviY[i])){
                    cnt = cnt + 1
                }
            }

        }
    }

//    動作の判定
    func judgecount(_ devi:Double) -> Bool {
        var soundIdRing:SystemSoundID = 1005
        kakuninL.text = String(format: "%d", cnt)

        if((devi > 0.20)&&(cnt > 50)) {
            cnt = 0
            return false

        }
        else if((cnt == 100)&&(alertY)) {
            alertY = false
            let alert1 = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
            alert1.title = "警告!"
            alert1.message = "1の方"
            alert1.addAction(
                UIAlertAction(
                    title: "OK",
                    style: .default,
                    handler: {(action) -> Void in
                        self.alertY = true
                }))
            self.present( alert1, animated: true, completion:nil)

            if let soundUrl = CFBundleCopyResourceURL(CFBundleGetMainBundle(), nil, nil, nil){
                AudioServicesCreateSystemSoundID(soundUrl, &soundIdRing)
                AudioServicesPlaySystemSound(soundIdRing)
            }

            return true

        }
        else if((cnt > 200)&&(alertY)) {
            alertY = false
            let alert2 = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
            alert2.title = "警告!"
            alert2.message = "2の方"
            alert2.addAction(
                UIAlertAction(
                    title: "OK",
                    style: .default,
                    handler: {(action) -> Void in
                        self.cnt = 0
                        self.alertY = true
                }))
            self.present( alert2, animated: true, completion:nil)
            return false
        }
        else {
            return true

        }

    }

    //    アラートの表示
    func displayalert(_ message:String) {
        let alert = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
        alert.title = "警告!"
        alert.message = message
        alert.addAction(
            UIAlertAction(
                title: "OK",
                style: .default,
                handler: {(action) -> Void in
                    self.startTimer()
                    self.alertY = true
        }))
        self.present( alert, animated: true, completion:nil)
    }

//    時間の表示
    func displayTime(_ time: TimeInterval) {
        let minute = (Int)(fmod((time/60), 60))
        let second = (Int)(fmod(time, 60))
        let msec = (Int)((time - floor(time))*100)

        timeL.text = String(format: "%02d : %02d : %02d", minute, second, msec)
    }

//    時間の計測
    @objc func timerCounter() {
        let currentTime = totalTime + Date().timeIntervalSince(startTime)

        displayTime(currentTime)
    }

//    タイマーのスタート
    func startTimer() {
        if timer != nil {
            timer.invalidate()
        }
        else {
            startTime = Date();
        }
        timer = Timer.scheduledTimer(
            timeInterval: 0.01,
            target: self,
            selector: #selector(self.timerCounter),
            userInfo: nil,
            repeats: true)
    }

//    タイマーの一時停止
    func stopTimer() {
        if timer != nil {
            totalTime = totalTime + Date().timeIntervalSince(startTime)
            timer.invalidate()
            timer = nil
        }
        displayTime(totalTime)
    }

//    タイマーのリセット
    func resetTimer() {
        startTime = Date();
        totalTime = 0.0
        displayTime(totalTime)
        startTimer()
    }

//    加速度取得停止
    func stopAccelerometer(){
        if (motionManager.isAccelerometerActive) {
            motionManager.stopAccelerometerUpdates()
        }
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        if motionManager.isAccelerometerAvailable {
            motionManager.accelerometerUpdateInterval = 0.5
            motionManager.startAccelerometerUpdates(
                to: OperationQueue.current!,
                withHandler: {(accelData: CMAccelerometerData?, errorOC: Error?) in
                    self.outputAccelData(acceleration: accelData!.acceleration)
            })
        }
        UIApplication.shared.isIdleTimerDisabled = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • nakasho_dev

    2017/12/30 11:52

    「なぜか動作がおかしく」を具体的に書きましょう。想定している振る舞いを説明して、その振る舞いのどの処理がうまくいっていないのか、それに対する自分の現在の考えなどを書いていただけると回答が得られやすいのではないでしょうか。どのようなプログラムなのかソースを全部読まなくてはいけないという負担を感じると回答者も回答への意欲が薄れます。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6295questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3628questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3573questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。