【JavaFX】csvファイルをTableViewに表示するプログラム

■[JavaFX]csvファイルをTableViewに表示するプログラム

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Optional;
import java.util.StringTokenizer;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.util.Callback;
public class CsvView extends Application {
    ObservableList<String> headers = FXCollections.observableArrayList();
    ObservableList<ObservableList> data = FXCollections.observableArrayList();
    FileChooser fileChooser = new FileChooser();
    TableView<ObservableList> table;
    @Override
    public void start(Stage stage) {
        stage.setTitle("Csvファイル表示");
        Group root = new Group();
        Scene scene = new Scene(root,400,250);
        MenuBar menuBar = new MenuBar();
        generateMenu(menuBar, stage);
        table = new TableView();
        BorderPane borderPane = new BorderPane();
        borderPane.prefHeightProperty().bind(scene.heightProperty().subtract(0));
        borderPane.prefWidthProperty().bind(scene.widthProperty());
        borderPane.setTop(menuBar);
        borderPane.setCenter(table);
        ((Group) scene.getRoot()).getChildren().addAll(borderPane);
        stage.setScene(scene);
        stage.show();
    }
    private void generateMenu(MenuBar menuBar, Stage stage) {
        // Menu File
        Menu menuFile = new Menu("ファイル");
        menuBar.getMenus().addAll(menuFile);
        // MenuItem Exit
        MenuItem open = new MenuItem("CSVファイルを開く");
        open.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                fileChooser.setTitle("CSVファイルを開く");
                fileChooser.getExtensionFilters().clear();
                fileChooser.getExtensionFilters().addAll(
                        new FileChooser.ExtensionFilter("CSVファイル", "*.csv"),
                        new FileChooser.ExtensionFilter("全てのファイル", "*.*")
                );
                File file = fileChooser.showOpenDialog(stage);
                if (file != null) {
                    readCSV(file);
                }
            }
        });
        // MenuItem Exit
        MenuItem exit = new MenuItem("Exit");
        exit.setOnAction((ActionEvent t) -> {
            System.exit(0);
        });
        menuFile.getItems().addAll(open, new SeparatorMenuItem(), exit);
    }
    void readCSV(File file) {
        try {
            if (checkBeforeReadfile(file)) {
                FileInputStream in = new FileInputStream(file);
                InputStreamReader sr = new InputStreamReader(in, "sjis");
                BufferedReader br = new BufferedReader(sr);
                String line;
          Alert alrt = new Alert(AlertType.NONE,"",ButtonType.YES,ButtonType.NO);
          alrt.setTitle("ヘッダーの有無指定");
          alrt.setHeaderText(null);
          alrt.setContentText("ヘッダー(1行目)にタイトルを含みますか?");
          Optional<ButtonType> result = alrt.showAndWait();
          boolean colomnhead=false;
          if (result.get() == ButtonType.YES) {
           colomnhead = true;
          }
          data.clear();
          headers.clear();
          table.getColumns().clear();
          String linedata;
          linedata=br.readLine();
          if(linedata == null || linedata.isEmpty()) {
           return;
          }
          StringTokenizer token2 = new StringTokenizer(linedata, ",");
          if(colomnhead) {
                    while (token2.hasMoreTokens()) {
                  headers.add(token2.nextToken());
                    }
          }else {
                    while (token2.hasMoreTokens()) {
                  headers.add(null);
                  token2.nextToken();
                    }
                    StringTokenizer token3 = new StringTokenizer(linedata, ",");
                    ObservableList<String> lineList2 = FXCollections.observableArrayList();
                    while (token3.hasMoreTokens()) {
                        lineList2.add(token3.nextToken());
                    }
           data.add(lineList2);
       }
          while ((line = br.readLine()) != null) {
           StringTokenizer token = new StringTokenizer(line, ",");
           ObservableList<String> lineList = FXCollections.observableArrayList();
                    while (token.hasMoreTokens()) {
                        lineList.add(token.nextToken());
                    }
           data.add(lineList);
          }
            } else {
                System.out.println("No file exists or can't open.");
            }
        } catch (FileNotFoundException e) {
            System.out.println("FileNotFoundException : " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IOException : " + e.getMessage());
        }
        generateTable();
    }
    private void generateTable() {
        int colN = 0;
        TableColumn[] column = new TableColumn[headers.size()];
        for (String colName : headers) {
            final int idx = colN;
            column[colN] = new TableColumn(colName);
            column[colN].setCellValueFactory(
                    new Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
                        @Override
                        public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {
                            return new SimpleStringProperty(param.getValue().get(idx).toString());
                        }
                    });
            colN++;
        }
        table.getColumns().addAll(column);
        table.setItems(data); // finally add data to tableview
    }
    boolean checkBeforeReadfile(File file) {
        if (file.exists()) {
            if (file.isFile() && file.canRead()) {
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        launch(args);
    }
}

【Batch】2次元配列を扱う

Batchプログラムで2次元配列を扱います
科目データを個人・総合・性別ごとの合計・平均を求めています
遅延環境変数が必須なのでsetlocal enabledelayedexpansionを使います

data.txt

性別 名前 科目1 科目2 科目3

1 akiyama 67 89 78 
2 kimura 79 86 92 
1 tanaka 62 85 79
1 inoue 96 86 91
2 satou 69 74 70
2 nomura 89 85 71 
2 mutou 65 58 90
2 harada 78 85 82
1 ueda 93 84 69
1 enomoto 59 88 75 
2 okada 62 85 97
1 yamada 98 75 84 
2 watanabe 89 71 96 
1 chida 87 90 91

Avarage.bat

@echo off

setlocal enabledelayedexpansion
rem ファイルから2次元配列にデータを格納
set n=0
cd %~dp0
for /f "tokens=1,2,3,4,5" %%a in (data.txt) do (
  set name[!n!][0]=%%a
  set name[!n!][1]=%%b
  set name[!n!][2]=%%c
  set name[!n!][3]=%%d
  set name[!n!][4]=%%e
  set /a n=n+1
)
set /a n=n-1
set tmp=0
set avg=0
set total=0
set t1=0
set t2=0
set t3=0
set tm=0
set tm1=0
set tm2=0
set tm3=0
set tmc=0
set tw=0
set tw1=0
set tw2=0
set tw3=0
set twc=0
rem 各個人の成績と合計と平均
echo 名前 性別 科目1 科目2 科目3 合計 平均
echo ==============================================
for /l %%x in (0,1,!n!) do (
  set /a total=total+!name[%%x][2]!+!name[%%x][3]!+!name[%%x][4]!
  set /a t1=t1+!name[%%x][2]!
  set /a t2=t2+!name[%%x][3]!
  set /a t3=t3+!name[%%x][4]!
  if !name[%%x][0]!==1 (
    set /a tm=tm+!name[%%x][2]!+!name[%%x][3]!+!name[%%x][4]!
    set /a tm1=tm1+!name[%%x][2]!
    set /a tm2=tm2+!name[%%x][3]!
    set /a tm3=tm3+!name[%%x][4]!
    set /a tmc=tmc+1
  ) else (
    set /a tw=tw+!name[%%x][2]!+!name[%%x][3]!+!name[%%x][4]!
    set /a tw1=tw1+!name[%%x][2]!
    set /a tw2=tw2+!name[%%x][3]!
    set /a tw3=tw3+!name[%%x][4]!
    set /a twc=twc+1
  )
  set /a tmp=!name[%%x][2]!+!name[%%x][3]!+!name[%%x][4]!
  set /a avg=tmp/3
  echo !name[%%x][1]! !name[%%x][0]! !name[%%x][2]! !name[%%x][3]! !name[%%x][4]! total=!tmp! average=!avg!
)
echo ==============================================
rem 全体の科目ごとの合計と総合計と平均
set /a n=n+1
echo total=!total! 1total=!t1! 2total=!t2! 3total=!t3!
set ave=0
set ave1=0
set ave2=0
set ave3=0
set /a ave=total/!n!
set /a ave1=t1/!n!
set /a ave2=t2/!n!
set /a ave3=t3/!n!
echo allaverage=!ave! all1average=!ave1! all2average=!ave2! all3average=!ave3!

rem 男性の科目ごとの合計と総合計と平均
echo mantotal=!tm! man1total=!tm1! man2total=!tm2! man3total=!tm3!
set manave=0
set man1ave=0
set man2ave=0
set man3ave=0
set /a manave=!tm!/!tmc!
set /a man1ave=!tm1!/!tmc!
set /a man2ave=!tm2!/!tmc!
set /a man3ave=!tm3!/!tmc!
echo manaverage=!manave! man1average=!man1ave! man2average=!man2ave! man3average=!man3ave!

rem 女性の科目ごとの合計と総合計と平均
echo womantotal=!tw! woman1total=!tw1! woman2total=!tw2! woman3total=!tw3!
set womanave=0
set woman1ave=0
set woman2ave=0
set woman3ave=0
set /a womanave=!tw!/!twc!
set /a woman1ave=!tw1!/!twc!
set /a woman2ave=!tw2!/!twc!
set /a woman3ave=!tw3!/!twc!
echo womanaverage=!womanave! woman1average=!woman1ave! woman2average=!woman2ave! woman3average=!woman3ave!

結果

名前 性別 科目1 科目2 科目3 合計 平均
==============================================
akiyama 1 67 89 78 total=234 average=78
kimura 2 79 86 92 total=257 average=85
tanaka 1 62 85 79 total=226 average=75
inoue 1 96 86 91 total=273 average=91
satou 2 69 74 70 total=213 average=71
nomura 2 89 85 71 total=245 average=81
mutou 2 65 58 90 total=213 average=71
harada 2 78 85 82 total=245 average=81
ueda 1 93 84 69 total=246 average=82
enomoto 1 59 88 75 total=222 average=74
okada 2 62 85 97 total=244 average=81
yamada 1 98 75 84 total=257 average=85
watanabe 2 89 71 96 total=256 average=85
chida 1 87 90 91 total=268 average=89
==============================================
total=3399 1total=1093 2total=1141 3total=1165
allaverage=242 all1average=78 all2average=81 all3average=83
mantotal=1726 man1total=562 man2total=597 man3total=567
manaverage=246 man1average=80 man2average=85 man3average=81
womantotal=1673 woman1total=531 woman2total=544 woman3total=598
womanaverage=239 woman1average=75 woman2average=77 woman3average=85

【VB.net】丸いボタン、角の丸いボタンを作る

1.CircleButtonというプロジェクトを作る
2.プロジェクトにクラスファイルを追加する
3.クラスファイルにコードを書く
4.一度コンパイル(ビルド)する
5.ツールボックスから対応したコントロールをフォームに張り付ける
6.RoundButtonはプロパティRoundで丸みを調整できる

※貼り付けたコントロールのFlatAppearaanceのBorderSizeを0、FlatStyleをFlatにして下さい

以下クラスファイルに書くコード

EllipseButton.vb

Imports System.Windows.Forms
Imports System.Drawing.Drawing2D

Public Class EllipseButton
    Inherits Button

    Protected Overrides Sub OnPaint(pevent As PaintEventArgs)
        Dim gp As GraphicsPath = New GraphicsPath
        gp.StartFigure()
        gp.AddEllipse(0, 0, ClientSize.Width, ClientSize.Height)
        gp.CloseFigure()
        Me.Region = New System.Drawing.Region(gp)
        MyBase.OnPaint(pevent)
    End Sub
End Class

RoundButton.vb

Imports System.Windows.Forms
Imports System.Drawing.Drawing2D

Public Class RoundButton
    Inherits Button

    Protected Overrides Sub OnPaint(pevent As PaintEventArgs)
        Dim gp As GraphicsPath = New GraphicsPath
        Dim r As Single = pr
        Dim x As Single = 0.0F
        Dim y As Single = 0.0F
        Dim w As Single = ClientSize.Width
        Dim h As Single = ClientSize.Height
        gp.StartFigure()
        gp.AddArc(x, y, r, r, 180.0F, 90.0F)
        gp.AddArc(w - r, y, r, r, 270.0F, 90.0F)
        gp.AddArc(w - r, h - r, r, r, 0.0F, 90.0F)
        gp.AddArc(x, h - r, r, r, 90.0F, 90.0F)
        gp.CloseFigure()
        Me.Region = New System.Drawing.Region(gp)
        MyBase.OnPaint(pevent)
    End Sub

    Private pr = 50
    Public Property Round() As Single
        Get
            Return pr
        End Get
        Set(value As Single)
            pr = value
        End Set
    End Property

End Class

SideRoundButton.vb

Imports System.Windows.Forms
Imports System.Drawing.Drawing2D

Public Class SideRoundButton
    Inherits Button

    Protected Overrides Sub OnPaint(pevent As PaintEventArgs)
        Dim gp As GraphicsPath = New GraphicsPath
        Dim x As Single = 0.0F
        Dim y As Single = 0.0F
        Dim w As Single = ClientSize.Width
        Dim h As Single = ClientSize.Height
        gp.StartFigure()
        gp.AddArc(x, y, h, h, 90.0F, 180.0F)
        gp.AddArc(w - h, y, h, h, 270.0F, 180.0F)
        gp.CloseFigure()
        Me.Region = New System.Drawing.Region(gp)
        MyBase.OnPaint(pevent)
    End Sub
End Class

【C#】丸いボタン、角の丸いボタンを作る

1.CircleButtonというプロジェクトを作る
2.プロジェクトにクラスファイルを追加する
3.クラスファイルにコードを書く
4.一度コンパイル(ビルド)する
5.ツールボックスから対応したコントロールをフォームに張り付ける
6.RoundButtonはプロパティRoundで丸みを調整できる

※貼り付けたコントロールのFlatAppearaanceのBorderSizeを0、FlatStyleをFlatにして下さい

以下クラスファイルに書くコード

EllipseButton.cs

using System;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CircleButton
{
    class EllipseButton : Button
    {
        protected override void OnPaint(PaintEventArgs pevent)
        {
            GraphicsPath gp = new GraphicsPath();
            gp.AddEllipse(0,0,ClientSize.Width,ClientSize.Height);
            this.Region = new System.Drawing.Region(gp);
            base.OnPaint(pevent);
        }
    }
}

RoundButton.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CircleButton
{
    class RoundButton : Button
    {
        protected override void OnPaint(PaintEventArgs pevent)
        {
            float r = pr;
            float x = 0.0f;
            float y = 0.0f;
            float w = ClientSize.Width;
            float h = ClientSize.Height;
            GraphicsPath gp = new GraphicsPath();
            gp.StartFigure();
            gp.AddArc(x , y ,  r , r , 180.0f , 90.0f);
            gp.AddArc(w - r, y , r , r, 270.0f , 90.0f);
            gp.AddArc(w - r , h - r , r , r, 0.0f , 90.0f);
            gp.AddArc(x , h - r , r , r , 90.0f, 90.0f);
            gp.CloseFigure();
            this.Region = new System.Drawing.Region(gp);
            base.OnPaint(pevent);
        }
        private int pr = 50;
        public int Round
        {
            set
            {
                pr = value;
            }
            get
            {
                return pr;
            }
        }
    }
}

SideRoundButton.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CircleButton
{
    class SideRoundButton : Button
    {
        protected override void OnPaint(PaintEventArgs pevent)
        {
            float x = 0.0f;
            float y = 0.0f;
            float w = ClientSize.Width;
            float h = ClientSize.Height;
            GraphicsPath graphics = new GraphicsPath();
            graphics.StartFigure();
            graphics.AddArc(x, y, h, h, 90.0f, 180.0f);
            graphics.AddArc(w - h, y, h, h, 270.0f, 180.0f);
            graphics.CloseFigure();
            this.Region = new System.Drawing.Region(graphics);
            base.OnPaint(pevent);
        }
    }
}

【Ruby】Tk(ツールキット)のダイアログのサンプルプログラム【Tk】

Tk.getOpenFile
Tk.getSaveFile
Tk.chooseDirectory
Tk.chooseColor
Tk.messageBox

Tk.getOpenFile

require 'tk'
root = TkRoot.new
root.title = "漢字のタイトル"
button_click = Proc.new {
  files=Tk.getOpenFile(
  #files=Tk::getOpenFile( #←これでも良い
    filetypes:"{{Textファイル} {.txt}} {{Rubyファイル} {.rb}} {{全てのファイル} {*}}", #スペースの区切り位置に注意
    title:"テキストファイルを開く", #ダイアログのタイトル
    initialdir:"c:\\users\\owner\\documents", #指定なしまたは不正パスの場合「ピクチャ」フォルダになる(Windows10)
    multiple:"true", #複数ファイル指定可能
    defaultextension:"rb" #拡張子が省略されて入力された場合のデフォルトの拡張子(OpenFileの時は意味ないので使わないほうが良い)
  )
  puts(files)
  safiles=files.split(/ /)  # multipleで複数選択可能の場合、ファイルパスはスペース区切りで得られる(途中ディレクトリ名またはファイル名にスペースが含まれる場合は注意)
  puts(safiles)
}
button = TkButton.new(root) do
   text "button"
   pack("side" => "left",  "padx"=> "50", "pady"=> "50")
end
button.command = button_click
#button.comman = button_click   ←これでもOK
Tk.mainloop

Tk.getSaveFile

require 'tk'
root = TkRoot.new
root.title = "漢字のタイトル"
button_click = Proc.new {
  files=Tk.getSaveFile(
  #files=Tk::getOpenFile( #←これでも良い
    filetypes:"{{Textファイル} {.txt}} {{Rubyファイル} {.rb}} {{全てのファイル} {*}}", #スペースの区切り位置に注意
    title:"テキストファイルを開く", #ダイアログのタイトル
    initialdir:"c:\\users\\owner\\documents\\Visual Studio Code", #指定なしまたは不正パスまたはc:\\users\\owner\\documentsの場合OneDrive(SkyDrive)の「ドキュメント」フォルダになる(Windows10)
    defaultextension:"rb" #拡張子が省略されて入力された場合のデフォルトの拡張子
  )
  puts(files)
  safiles=files.split(/ /)  # multipleで複数選択可能の場合、ファイルパスはスペース区切りで得られる(途中ディレクトリ名またはファイル名にスペースが含まれる場合は注意)
  puts(safiles)
}
button = TkButton.new(root) do
   text "button"
   pack("side" => "left",  "padx"=> "50", "pady"=> "50")
end
button.command = button_click
#button.comman = button_click   ←これでもOK
Tk.mainloop

Tk.chooseDirectory

require 'tk'
root = TkRoot.new
root.title = "漢字のタイトル"
button_click = Proc.new {
  folder=Tk.chooseDirectory(
  #folder=Tk::chooseDirectory( #←これでも良い
    title:"フォルダ指定", #ダイアログのタイトル
    initialdir:"c:\\Users\\owner\\Documents\\Visual Studio Code" #指定なしまたは不正パスの場合「OneDrive(SkyDrive)ドキュメント」フォルダになる(Windows10)
  )
  puts(folder)
}
button = TkButton.new(root) do
   text "button"
   pack("side" => "left",  "padx"=> "50", "pady"=> "50")
end
button.command = button_click
#button.comman = button_click   ←これでもOK
Tk.mainloop

Tk.chooseColor

require 'tk'
root = TkRoot.new
root.title = "漢字のタイトル"
button_click = Proc.new {
  color=Tk.chooseColor(
  #color=Tk::chooseColor( #←これでも良い
    title:"色の選択", #ダイアログのタイトル
    initialcolor:"#ff0000" #デフォルトの色
  )
  puts(color)
}
button = TkButton.new(root) do
   text "button"
   pack("side" => "left",  "padx"=> "50", "pady"=> "50")
end
button.command = button_click
#button.comman = button_click   ←これでもOK
Tk.mainloop

Tk.messageBox

require 'tk'
root = TkRoot.new
root.title = "漢字のタイトル"
button_click = Proc.new {
  ans=Tk.messageBox(
  #color=Tk::messageBox( #←これでも良い
    title:"メッセージ", #ダイアログのタイトル
    type:"yesnocancel", #ok,okcancel,yesno,yesnocancel,retrycancel,abortretryignore
    icon:"error", #info,error,question,warning
    message:"いずれかのボタンを押してください"
  )
  puts(ans)
}
button = TkButton.new(root) do
   text "button"
   pack("side" => "left",  "padx"=> "50", "pady"=> "50")
end
button.command = button_click
#button.comman = button_click   ←これでもOK
Tk.mainloop

VSCodeでC言語(gcc)のデバッグをできるようにする方法

VSCodeC言語(gcc)のデバッグをできるようにする方法

環境
Windows10
VSCode
MinGW(gcc)

デバッグ環境を作る手順は以下の通り

  1. cファイルの作成
  2. c_cpp_properties.jsonの作成
  3. tasks.jsonの作成
  4. launch.jsonの作成
  5. launch.jsonの編集
  6. 実行ファイルの作成
  7. デバッグを実行
  8. 実行状態(結果)の表示
  9. デバッグでバグがありcファイルを編集したとき

1. cファイルの作成

まずフォルダとcファイルを作成します
ここではhelloフォルダとhello.cです
hello.c
※cファイルはShift-Jisで保存してください(UTF-8で保存した場合はtasks.jsonを編集する必要があります)
これは3. tasks.jsonの作成で後述します
hello.c

#include <stdio.h>
int main()
{
  int i;
  for(i=0;i<10;i++)
    printf("ハロー!\n");
  return 0;
}

f:id:Jikoryuu:20200531144006p:plain

2. c_cpp_properties.jsonの作成

c_cpp_properties.jsonファイルを作成するには以下の手順を行います
Ctrl+Shift+Pを押します
コマンドパレットが開くので「c/c++:e」と入力すると以下リストが現れます
f:id:Jikoryuu:20200531144103p:plain
C/C++:構成の編集(UI)」を選択します
f:id:Jikoryuu:20200531144147p:plain
C/C++ Configurasions」のUI(ユーザーインターフェース)が開きます
f:id:Jikoryuu:20200531144225p:plain
コンパイラ パス」の▼を押してリストを表示する
f:id:Jikoryuu:20200531144329p:plain
「C:/MinGW/bin/gcc.exe」を選択します
f:id:Jikoryuu:20200531144418p:plain
「IntelliSenseモード」がエラーになるので▼を押してリストを表示します
f:id:Jikoryuu:20200531144507p:plain
リストから「gcc-x64」(gcc-x86でも可)を選択します
f:id:Jikoryuu:20200531144550p:plain
f:id:Jikoryuu:20200531144617p:plain
暫くすると「c_cpp_properties.json」ファイルが自動的に作成されます
f:id:Jikoryuu:20200531144649p:plain
エクスプローラーの「c_cpp_properties.json」ファイルを確認します
f:id:Jikoryuu:20200531144742p:plain

3. tasks.jsonの作成

再びCtrl+Shift+Pを押します
コマンドパレットが開くので「tasks:c」と入力すると以下リストが現れます
「タスク:タスクの構成」を選択します
f:id:Jikoryuu:20200531144817p:plain
続けて「テンプレートからtasks.jsonを生成」を選択
f:id:Jikoryuu:20200531144844p:plain
「Others 任意の外部コマンドを実行する例」を選択
f:id:Jikoryuu:20200531144927p:plain
再びコマンドパレットに「tasks:c」と入力すると絞り込まれた候補がリストに現れるのでその中から「タスク:タスクの構成」を選択します
f:id:Jikoryuu:20200531145012p:plain
「構成するタスクを選択」のリストから「shell gcc.exe build active file」を選択
f:id:Jikoryuu:20200531145047p:plain
下の画像のような「tasks.json」が作成されます
f:id:Jikoryuu:20200531145122p:plain
もし違う内容のものが作成されたら「tasks.json」を削除して作成し直してください

※cファイルをUTF-8で保存している場合は「tasks.json」を編集する必要があります
具体的にはtasks項目のargsパラメーターに「-fexec-charset=CP932」を追加します

			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],

			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe",
				"-fexec-charset=CP932"
			],

4. launch.jsonの作成

launch.jsonファイルを作成するには以下の手順を行います
Ctrl+Shift+Dを押します
左の実行ボタンがアクティブになり下の画像のようになります
赤丸の「launch.json ファイルを作成します」をクリックします
f:id:Jikoryuu:20200531145151p:plain
「環境の選択」のリストが現れるので「C++ (GDB/LLDB)」を選択します
f:id:Jikoryuu:20200531145219p:plain
下の画像の「launch.json」が作成されます
f:id:Jikoryuu:20200531145321p:plain

5. launch.jsonの編集

launch.jsonを編集するためにlaunch.jsonを選択します
f:id:Jikoryuu:20200531145344p:plain
画像の赤丸の所を編集します
f:id:Jikoryuu:20200531145409p:plain
下記のパラメーターを変更します

"program": "プログラム名を入力してください (例: ${workspaceFolder}/a.exe)",
↓
"program": "${workspaceFolder}/hello.exe",

"miDebuggerPath": "/path/to/gdb",
↓
"miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",

6. 実行ファイルの作成

hello.cファイルをアクティブ(選択・表示)します
Ctrl+Shift+Bを押します
コマンドパレットに「実行するビルド タスクを選択」にリストが現れるので「Shell:gcc.exe build active file」を選択します
f:id:Jikoryuu:20200531145436p:plain
hello.exeが作成されました
f:id:Jikoryuu:20200531145454p:plain

7. デバッグを開始する

hello.cファイルをアクティブ(選択・表示)にして任意の場所にブレークポイントを置いてください
コードペインの行番号の左をクリックするかデバッグしたい行にカーソルを置いて「F9」キーを押すとブレークポイントができます
ブレークポイントが置かれるとコードペインの行番号の左に赤い●が現れます
ブレークポイントは幾つでも置けます

メニューの「実行」→「デバッグの開始」または「F5」キーを押します
するとデバッグが開始されます
f:id:Jikoryuu:20200531145520p:plain
黄色いラインがブレークポイントで止まったらデバッグ環境の構築は成功です
f:id:Jikoryuu:20200531145618p:plain

8. 実行状態(結果)の表示

launch.jsonを編集するためにlaunch.jsonを選択します
(argsに日本語を使用しそれを表示した場合にexternalConsoleを使用すると文字化けするので注意[解決方法:stdlib.hをインクルードしsystem("chcp 65001");をprintfより前に追加することで文字化けが解消する])

下記のパラメーターを変更します

"externalConsole": false,
↓
"externalConsole": true,

f:id:Jikoryuu:20200531145648p:plain
f:id:Jikoryuu:20200531145715p:plain
ターミナル(端末)が別窓で開き実行状態(結果)が表示されます
入力がある時にはここで入力できます
f:id:Jikoryuu:20200531145737p:plain
特にエラーが無ければデバッグ環境の構築成功です
f:id:Jikoryuu:20200531145757p:plain

9. デバッグでバグがありcファイルを編集したとき

6.の実行ファイルの作成「Ctrl+Shift+B」をしてからデバッグ「F5」をして下さい

デバッグができるまでの手順は以上です
お疲れさまでした

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.18362.0",
            "compilerPath": "C:/MinGW/bin/gcc.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

tasks.json

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "shell: gcc.exe build active file",
			"command": "C:/MinGW/bin/gcc.exe",
			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],
			"options": {
				"cwd": "C:/MinGW/bin"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build"
		}
	]
}

launch.json

{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(gdb) 起動",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/hello.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": true,
      "MIMode": "gdb",
      "miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",
      "setupCommands": [
        {
          "description": "gdb の再フォーマットを有効にする",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}

VSCodeでJavaのデバッグをできるようにする方法

VSCodeJavaデバッグをできるようにする方法

VSCodeデバッグでShift-JISのソースコードコンパイルすると文字化けするので必ずUTF-8で作成すること
尚、ターミナルで直接コンパイルする際は既定ではShift-JisなのでUTF-8コンパイルする際は-encording UTF-8を指定すること

aguments.javaの内容

public class arguments {
	public static void main(String[] args) {
		System.out.print(args[0]);
	}
}

注意点
Java Overviewが立ち上がる
※CMakeToolがあると勝手に自動構成される
プロジェクトを構成しています:開いているファイルを保存しています
使用するCMakeジェネレーターを特定できません。優先されるジェネレーターをインストールまたは構成するか、settings.json、キットの構成、またはPATH変数を更新してください。Error: 使用可能なジェネレーターが見つかりません

未指定を選択(指定するとJavaのコードがおかしくなる)

○workspaceを作成

javaファイルと同じ階層にworkspaceファイルを作成する
ファイル→名前を付けてワークスペースを保存
arguments.code-workspaceの内容

{
  "folders": [
    {
      "path": "." //1つ上のフォルダー[arguments]を指定
    }
  ],
  "settings": {
    "debug.allowBreakpointsEverywhere": true,//ブレークポイントを設定できるようにする
    "debug.inlineValues": true  //コード上で変数の値をツールチップで表示できるようにする
  },
  "launch": {}
}

デバッグボタンを押してlaunch.jsonを作成

実行→構成の追加
launch.jsonの内容

{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "java",
      "name": "Debug (Launch)-arguments",
      "request": "launch",
      "mainClass": "arguments",
      "projectName": "arguments_402de46f",
      "console": "externalTerminal", //追加 internalConsole, integratedTerminal, or externalTerminal
      "encoding": "UTF-8",           //追加(ターミナルで使用する文字コード)
      "args": "ハロージャバワールド" //追加(コマンドライン引数がある場合は指定 ない場合はこの行を削除)
    }
  ]
}

○実行(デバッグ)

実行→デバッグの開始
エラーが出なければ成功です