LotosLabo

プログラミング技術とか気になった情報を載せていきます

C言語について2

配列の初期化


int n[] = {}
int n[5] = {}

多次元配列

int  drink  [3][4]  {}

3行  4列という意味

関数

void  message(void)

void message()
{
}
message(); //呼び出す

voidは戻り値型や引数がない


<引数のある関数>

void  eval  (int n)
{
if(n>=50){
}else{
}
}


<実引数>

printf("日付 気温 湿度 >");
scanf_s("%d%lf%lf",  &date,  &a,  &b);
index(date, a, b);

return

int  tax(int a)
{
int   zei = a * 0.05;
return zei;
}

return文の機能

①関数の処理を終了して呼び出し元に戻る
②呼び出し元に受け取ってもらいたい値を指定する

tax関数では戻り値は
zei


① 
例:

割引料金の表示

int  ryokin(int a)
{
if(a<10){
return 1500;
}else{
return 1200;
}
}

int main(void)
{
int w;
printf("人数>");    
scanf_s("%d",  &w);
int  gaku  =  ryokin(w);
printf("割引料金=%d\n", gaku);
return 0;
}



例:

void  date(int a)
{
if(a<0)   return;
printf("今日は%d日です\n", a);
}

int main(void)
{
int n;
printf("日付>");   
scanf_s("%d",  &n);
date(n);
return 0;
}

アドレス

アドレスの配列の0番目は &n[0]と表し、表示させるときは%pで変換する。

ポインタ

・アドレスだけを入れることができる変数間接参照という機能を持つ
・アドレスを使って変数の中身を覗ける
・変数の中身を変えれる
・任意の名前に*を付けて宣言する



<間接参照の基本的な例>

nt a= 25;
int *p;
p = &a;


<他の書き方>

int *p = &a;


int a=25;
int*p;


int a =25, *p

文字列を表示するポインタ

char  *sp = "abc";
puts(sp);


例:

<文字列の長さ>

#include  <stdio.h>
#define    MAXLEN   1000

int   strlen(char *s)
{
int n = 0;
while(*s !=  '\0'){
s++;
n++;
}
return 0;
}
int main(void)
{
char str[MAXLEN];
printf("文字列>");   
gets_s(str);
int length = strlen(str);
printf("長さ=%d\n", length);
return 0;
}

voidの上に宣言

int gn=0;
int a = 10;

記憶クラス指定子

static int n=0;
静的変数

関数が呼び出されても初期化されない
auto int m; 自動変数 autoは省略していい

グローバル変数と静的変数の初期化は、プログラム実行開始前に一度だけ行われる
グローバル変数は定数でしか初期化できない

自動変数や静的変数は宣言されたブロックないだけで使用できる
このような範囲をスコープという。
グローバルより、ローカル変数のほうが優先される。


関数プロトタイプ宣言

#includeの後に宣言する

大切なのは引数の型

#include
int tax(int a);
int main(void)
{
int n = tax(1200);
printf("消費税=%d\n",n);
return 0;
}

記憶変数

externはグローバル変数を共有する

extern int n;
グローバル変数の共有宣言

グローバル変数 int nは他のソースファイルで定義されている

宣言した場所

関数の外  → ソースファイル全体
関数の中  → 宣言した関数の中でのみ

staticは
スコープを同じファイルに限定

構造体

4つのデータなどを連結して、オーダーメイドの型を作ることができるもの

person型という。
struct person型

構造体の名前を メンバという

struct person{
 char name[6];
int year;
};
struct person tom = {"tom", 21};
tom.name
tom.yera


例:

#include  <stdio.h>
struct person{
char name[6];
int  year;
double   height;
double  weight;
};

int main(void)
{
struct person tom = {"tom", 21, 175.5, 60.2};
printf("%s\n", tom.name);
printf("%d\n", tom.year);
printf("%5.1f\n", tom.height);
printf("%5.1f\n",tom.weight);
return 0;
}

アロー演算子

(*p). を p->と書いて良い

p-> name *(p).name
p -> year

列挙型

enum (列挙の意味)
関連のある名前をまとめて新しい型として定義する

enum suit {SPADE, HEART, CLUB, DIAMOND};

typedef struct card{
enum suit s;
int n;
}card;

card mycard = {SPADE, 1};

途中から何書いたか全然わかりませんでした。結構前に書いたメモなので、ほとんどメモ書きが多かったのですがとりあえず載せてみました。

そして最後にテキストファイルから読み込むスクリプトを紹介します。

ファイルオープンスクリプト


ファイルタブ→新規作成 →」ファイル → テキストファイ

テキストファイルを保存し、保存先をプロジェクトファイルの直下に入れる。そしてプロジェクトに追加させる。

テキストファイルには適当に値を入力しておく。

スクリプト手順

fopen 開く
fscanf 読む
fclose 閉じる

#include  <stdio.h>
#include <stdlib.h>
int main(void)
{
	char name[10];
	int year;
	double ht;
	double wt;
	FILE *fp = fopen("data.txt","r");
	fscanf(fp,"%4s%2d%5lf%4lf", name, &year, &ht, &wt);
	printf("%s\n", name);
	printf("%d\n", year);
	printf("%f\n",ht);
	printf("%f\n",wt);
	fclose(fp);
	return 0;

FILE *fp = fopen("data.txt","r");
テキストファイルを開く

fscanf(fp,"%4s%2d%5lf%4lf", name, &year, &ht, &wt);
テキストファイルを読み込む

fclose(fp);
テキストファイルを閉じる