NaaN日記

やったこと、覚えたことを発信する場

構造体(C)

構造体について。

構造体の作成
struct 構造体タグ名{
//データ
}

普通関数よりも先に宣言する

構造体の型の変数を宣言
struct 構造体タグ名 構造体変数名;

C++ではstructをつけなくても宣言できるらしい。

新しく名前をつける
struct animals_tag {
    char animal[64];
    char name[64];
    int old;
    int weight;
};
typedef struct animals_tag animals;
/* typedef データ型 新しい名前 */
一度に宣言できる
typedef struct animals_tag {
    char animal[64];
    char name[64];
    int old;
    int weight;
} animals;

新しい型が定義できれば構造体タグ名を省略できる?

typedef struct {
    char animal[64];
    char name[64];
    int old;
    int weight;
} animals;

構造体のポインタを構造体要素に持つときは省略できない
(構造体の宣言が終了していないから?)

構造体変数では要素を名前で区別する
#include <stdio.h>
struct animals_tag {
    char animal[64];
    char name[64];
    int old;
    int weight;
};

int main(void){
    struct animals_tag data;
    data.old = 5;
    printf("%d歳", data.old);

    return 0;
}
/*5歳*/
文字列を扱うならstrcpy
#include <stdio.h>
#include <string.h>
struct animals_tag {
    char animal[64];
    char name[64];
    int old;
    int weight;
};

int main(void){
    struct animals_tag data;

    strcpy(data.animal, "ねこ");
    printf("%s", data.animal);

    return 0;
}
/*ねこ*/
表示してみる
#include <stdio.h>
#include <string.h>
typedef struct {
    char animal[64];
    char name[64];
    int old;
    int weight;
} animals;
void animals_print(animals data);
int main(void){
    
    animals data;
    strcpy(data.animal,"ねこ");
    strcpy(data.name, "きなこ");
    data.old = 2;
    data.weight = 5;
    
    animals_print(data);
    
    return 0;
}
void animals_print(animals data){
    printf("種類:%s\n", data.animal);
    printf("名前:%s\n", data.name);
    printf("年齢:%d\n", data.old);
    printf("体重:%dkg\n", data.weight);
    return;
}
/*
種類:ねこ
名前:きなこ
年齢:2歳
体重:5kg
*/
構造体の注意

○構造体変数同士での演算、比較はできない
○配列が含まれているとき、中身がコピーされる

書式を変えてみる(Python)

前回に引き続きformatを使ってみる

オプションを設定!
{引数のインデックス:オプション}
{:オプション}
位置を調節
'{:<10}'.format('左詰め')
#'左詰め       '
'{:>10}'.format('右詰め')
#'       右詰め'
'{:^10}'.format('真ん中')
#'   真ん中    '
特定の文字(※1文字)で調節
'{:☆^15}'.format('Hello')#オプションの前で指定
#'☆☆☆☆☆Hello☆☆☆☆☆'
数値に符号をつける
#'+':正負の符号をつける
#'-':負の値に符号をつける
#' ':正の数のとき空白、負の数のとき符号をつける
'{:+}'.format(1)
#'+1'
'{:+}'.format(-1)
#'-1'
'{:-}'.format(-1)
#'-1'
'{: }'.format(1)
#' 1'
'{: }'.format(-1)
#'-1'
10進数にをn進数に変換
'{:b}'.format(12)#b:2進数
#1100
'{:o}'.format(12)#o:8進数
#'14'
'{:d}'.format(12)#d:10進数
#'12'
'{:x}'.format(12)#x:16進数
#'c'
'{:X}'.format(12)#X:16進数(アルファベット大文字)
#'C'
'{:#x}'.format(18)
#'0x12'
','で数を区切る
'{:,}'.format(1000000)
#'1,000,000'
小数
'{:f}'.format(0.12)
#'0.120000'
小数点以下の桁数を指定
'{:.2f}'.format(0.12345)
#'0.12'
'{:.5f}'.format(0.12345)
#'0.12345'

.。( C言語のprintfと似てる )

パーセントに変換する
'{:.0%}'.format(0.25)
#'25%'
'{:.1%}'.format(0.2546)
#'25.5%' .。(四捨五入される)

文章中に文字列や数を挿入(Python)

今回はformatを使ってみる

こういう感じ
name = 'ねこ'
print('あなたは{}ですか?'.format(name))
#あなたはねこですか?
複数の引数を用いる
print('今日は{0}か{1}か{2}が食べたい'.format('カレー','うどん','野菜炒め'))
print('今日は{m1}か{m2}か{m3}が食べたい'.format(m1='カレー',m2='うどん',m3='野菜炒め'))
#今日はカレーかうどんか野菜炒めが食べたい
順番通りだと省略できる
print('今日は{}か{}か{}が食べたい'.format('カレー','うどん','野菜炒め'))
#今日はカレーかうどんか野菜炒めが食べたい
リスト
lst = ['じゃがいも', 'かぼちゃ', 'トマト', 'にんじん', 'たまねぎ']
print('夕食の材料は{0[0]}と{0[3]}と{0[4]}です'.format(lst))
#夕食の材料はじゃがいもとにんじんとたまねぎです
辞書
dic = {'name': 'ねこ', 'color': 'white', 'age': '3'}
print('名前は{0[name]}、色は{0[color]}、歳は{0[age]}歳'.format(dic))
#名前はねこ、色はwhite、歳は3歳

次回は書式

関数を作る(Python)

今回は関数を作ることについて。理解していないことの多さを痛感。

関数の定義
def 関数名():
    処理
return
def name(na):
    return na

def hello():
    print(name('ねこ') + "さん、こんにちは!!")

#ねこさん、こんにちは!!

printで'+'をつけることを忘れそうになる

複数return

','で区切ることで複数の要素をreturnできる
○タプル
下のようにreturnすると、型はタプル

def test():
    return 'zero', 0

print(type(test()))
<class 'tuple'>

○リスト
'[]'で囲むことで型がリストになる

def test():
    return ['zero', 0]

print(type(test()))
#<class 'list'>
デフォルト引数
def 関数名(引数=デフォルト値,引数=デフォルト値):
    関数のブロック
#引数を指定せず関数を実行すると、デフォルト引数が入る
def name(na = '名無し'):
    return na

print(name() + "さん!")
#名無しさん!

print(name('ねこ') + "さん!")
#ねこさん!
デフォルト引数の注意点

デフォルト値は最初に一度だけしか評価されないので、
リストや辞書といった変更可能なオブジェクトを使う際、注意が必要

def list_beta(lst = []):
    lst.append('Hello')
    print(lst)
list_beta()
list_beta()
list_beta()
list_beta(['Good','Morning'])

#['Hello']
#['Hello', 'Hello']
#['Hello', 'Hello', 'Hello']
#['Good', 'Morning', 'Hello']

デフォルト引数は不変のものを設定する方が良い

def list_beta(lst = None):
    if lst is None:
        lst = []
    lst.append('Hello')
    print(lst)
    
list_beta()
list_beta()
list_beta(['Good','Morning'])

#['Hello']
#['Hello']
#['Good', 'Morning', 'Hello']

リスト(Python)

こんばんは、内容の順番がバラバラだなと思っています。
今回はリストについてです。
これからは内容だけでなく言語もバラバラになる予感がしています。
お気づきかもしれませんが、日によって常体敬体すらバラバラです。
今日は敬体の日です。

リストの定義
a = ["あ","い","う","え","お"]
#a = [要素1, 要素2, 要素3,......]
指定
a[0] #1番目の要素('あ')
a[-1] #最後の要素('お')
要素の書き換え
b = ["ka","き","く","け","こ"]
b[0] = "か"
#['か', 'き', 'く', 'け', 'こ']
要素の消去
#a = ['あ', 'い', 'う', 'え', 'お']
del a[-1]
#['あ', 'い', 'う', 'え']
スライスも使える
#a = ['あ', 'い', 'う', 'え']
del a[:3]
#['え']
要素を末尾に追加
#a = ['え']
a.append("お")
#['え', 'お']
要素を指定する場所に追加
#a = ['え', 'お']
a.insert(0,"あ")
#['あ', 'え', 'お']
スライスを使って追加
#a = ['あ', 'え', 'お']
a[1:1] = ["い","う","お"]
#['あ', 'い', 'う', 'お', 'え', 'お']
スライスを使って置換
#a = ['あ', 'い', 'う', 'お', 'え', 'お']
a[2:4] = ["う"] 
#['あ', 'い', 'う', 'え', 'お']
リストの足し算
a + b
#['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ']
リストの結合
a.extend(b) #aのリストの最後にbのリストを結合
#a = ['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ']

スライス(Python)

今回はスライスについて。
スライスを使うと、リストやタプルの要素、文字列の範囲を指定して、
必要な部分だけを取り出すことができる。

[start:stop]
num = {1,2,3,4,5,6,7,8,9}
print(num[2:5]) #num[2]からnum[4]まで
#[3, 4, 5]

また、

print(num[-1])
#9

であり、スライスでも負の値で場所を指定できる。

print(num[1:-1]) #num[1]からnum[-2]まで
#[2, 3, 4, 5, 6, 7, 8]
[start:stop:step]

増加量の指定も可能

print(num[1:5:2]) #num[1]からnum[4]まで2ずつ
#[2, 4]


増加量には負の値も指定できる

print(num[5:1:-1]) #num[5]からnum[2]まで1ずつ減少
#[6, 5, 4, 3]
省略

また、全ての範囲で実行したい場合、一つ目のコロンの両端の値を省略できる

print(num[::2])
#[1, 3, 5, 7, 9]

増加量も省略すると、num[0]からnum[-1]まで全ての範囲が表示される

print(num[::]) # ==print(num[:])==print(num)
#[1, 2, 3, 4, 5, 6, 7, 8, 9]

最初の位置を省略

print(num[:0:-1]) #num[-1]からnum[1]まで1ずつ減少
#[9, 8, 7, 6, 5, 4, 3, 2]

最後の位置を省略

print(num[-1::-1]) #num[-1]からnum[0]まで1ずつ減少
#[9, 8, 7, 6, 5, 4, 3, 2, 1]

つまり、最初と最後の位置を省略すると

print(num[::-1]) #num[-1]からnum[0]まで1ずつ減少
#[9, 8, 7, 6, 5, 4, 3, 2, 1]

つまり、[::-1]をつかうと逆順に並べ替えることができる
(いまいち活用法が思い浮かびませんが)

使ってみる

例えば、a,b,cと入力してc,b,aと出力したいとき、
スライスを使わずにやってみようとしたらこんなことに

char = input()
moji = list(char)
length = len(moji)
while 0 <= length-1:
    print(moji[length-1], end = '')
    length -= 1

長い!!そして美しくないと怒られそう

スライスを使うととてもコンパクトになる

char = input()
rahc= char[::-1] 
print(rahc)

for文その2(Python)

その2です。


fileを行単位で表示する

for file in open("memo.txt"):
    print(file)
#ファイルの中身が表示される

各要素のキーを表示させたい

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for k in dic:
    print(k)
#keya
#keyb
#keyc

keys()でもいける

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for k in dic.keys():
    print(k)
#keya
#keyb
#keyc

値を表示させたい
values()

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for v in dic.values():
    print(v)
#1
#2
#3

キーと値両方を表示させたい
items()

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for k, v in dic.items():
    print(k, v)
#keya 1
#keyb 2
#keyc 3

番号と値を表示させたい
enumerate()

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for num, value in enumerate(dic):
    print(num,dic[value])
#0 1
#1 2
#2 3

enumerate(dic,1)のように第二引数を指定すると、途中からカウントを始められる。

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for num, value in enumerate(dic,1):
    print(num, dic[value])
#1 1
#2 2
#3 3


二つ以上のイテラブルオブジェクトをまとめて表示させたい
zip()

a = ["あ","か","さ","た","な"]
b = ["い","き","し","ち","に"]
c = ["う","く","す","つ","ぬ"]
d = ["え","け","せ","て","ね"]
e = ["お","こ","そ","と","の"]
for a,b,c,d,e in zip(a,b,c,d,e):
    print(a,b,c,d,e)
#あ い う え お
#か き く け こ
#さ し す せ そ
#た ち つ て と
#な に ぬ ね の

素数が異なる場合、多い要素は切り捨てられる。