2018-05-04 23:51:14 (6 years ago)
ついにC言語最後の単元。本当にC言語でゴールデンウィーク終わっちゃいそうです。行楽ゼロ。お絵かきゼロ。いや~『きびしいC』だったよ、マナちゃん。(馴れ馴れしい)
参考文献:高橋麻奈著『やさしいC第5版』
gets文
ダンディ。いままでのscanfでは間に空白が入った文字列は入力できなかったが、ゲッツ(本当はゲット・エスという読み方らしい)を使うと改行までの文章がまるまる入力できるようになる。
puts文
ゲッツが読み込んだ文字列を、そのまんま出力するための文。
\nをつけなくても、文字列の最後にはちゃんと改行してくれる。
しかし、今までお世話になったprintfが使えず、変換仕様による書式をつけられない。
EOF
エンド・オブ・ファイルの略。stdio.hに定義されているマクロやファイルの終端を表す。
文字を続けて入力し、それを出力するコード
文字列ではなく、一文字ずつ入出力したい場合はgetcharとputcharを用いる。
int ch;
printf("文字を続けて入力してください。\n")
while((ch = getchar()) != EOF)
{
putchar(ch);
}
バッファリング
ハードディスクなどにデータの入出力を行う際、時間を短縮するため一文字一文字ではなく、まとめておこなうこと。
gets関数とputs関数を使って、アルファベットの小文字を大文字にするコード
ちなみにgets関数は、バッファ・オーバーフロー(コンピュータのキャパシティを超えた膨大なデータの書き込み)を起こしやすく、現在のバージョンでは禁止されているらしい。禁じられし古の呪文。
逆に言えば、システムを破壊したいクラッカーなどが悪用していたりする。
#include
int main(void)
{
int i;
char test[100];
printf("一行の英文を入力してください。\n");
gets(test);
//testを文字の配列とする。
for(i=0; test[i]!='\0'; i++)
if(97 <= test[i] && test[i] <= 122)
test[i] -= 32; //前にもやったように小文字の文字コードから32を引くと大文字となる。
puts(test);
return 0;
}
getchar関数とputchar関数を使って、アルファベットの小文字を大文字にするコード
1行まとめてではなく、一文字一文字小文字を大文字に変換させたい場合。コンパイル結果はさっきのコードと同じ。
#include
int main(void)
{
int ch;
printf("文字を続けて入力してください。\n");
while((ch=getchar())!=EOF){
if(ch>=97&&ch<=122)ch-=32;
putchar(ch);
}
return 0;
}
ファイルの入出力
ファイルを扱う際には、①ファイルを開く(fopen)、②ファイルを編集する、③ファイルを閉じる(fclose)の3つの手順を踏む。
fopen(ファイルを開く)
ファイル名とオープンモードを指定して実行し、実行結果をファイルポインタに受け取る。
構文 FILE *ファイルポインタ = fopen("ファイル名","オープンモード");
例 FILE *fp = fopen("test.txt","w");
ファイルポインタ(ストリームポインタ)
ポインタを授業では割愛していて、いきなり言われても意味不明なのだが、変数のデータをメモリに記憶させる際、どの領域に格納されたかの所在地をアドレスといい、このアドレスを記憶する変数をポインタというらしい。
メモリの中のデータを編集する際に使用する。
何らかの理由でファイルがオープンできなかった場合(ハードディスクの容量が足りなくなったなど)は、ファイルポインタにはNULLポインタというポインタが返ってくる(NULL文字とは別物なので注意!)。
オープンモード
ファイルをオープンする際の設定のようなもの。
"w" ライト。書き込み用にテキストファイルを白紙で開く。
"r" リード。読み込み用にテキストファイルを開く。
"a" アペンド。追記用にテキストファイルを開く。
"w+" 更新用にテキストファイルを開く(新規作成)。
"r+" 更新用にテキストファイルを開く。
"a+" 更新のため追記用のテキストファイルを開く。
"wb" 書き込み用にバイナリファイル(テキストファイル以外のファイル)を開く。
"rb" 読み込み用にバイナリファイルを開く。
"ab" 追記用にバイナリファイルを開く。
fclose(ファイルを閉じる)
ファイルを閉じる構文は割とシンプルで助かる。
構文 fclose(ファイルポインタ);
例 fclose( fp );
fputs(ファイルへの出力)
1行の文字列をファイルに書き込む。
ややこしいのは、putsのときのように、自動的に改行をしてくれないので\nをつけなければならない。だったら全部\nアリで統一してくれ!
構文 fputs( 文字列, ファイルポインタ );
例 fputs("Hello!", fp);
fgets(ファイルからの入力)
1行の文字列をファイルから読み取る。
構文 fgets( 変数, 読み込む最大文字数, ファイルポインタ );
例 fgets(str, 256, fp);
test1.txtの内容をそのままtest2.txtにコピーするコード
2つのテキストファイルがあり、1つは読み込み用として、もう一つは書き込み用として開く必要がある。
ファイルには10行のテキストが入っているという設定なので、マクロのNUMは10にする。
#include
#define NUM 10
int main(void)
{
int i;
FILE *fp1, *fp2;
char test[NUM];
//ファイル1は読み込み用として開く
fp1 = fopen("test1.txt","r");
//ファイル2は書き込み用として開く
fp2 = fopen("test2.txt","w");
if(fp1==NULL || fp2==NULL)
{
printf("ファイルを開けませんでした。\n");
return 1;
}
for(i=0; i<10; i++) //for文を使ってコピーを10行分繰り返す。
{
fgets(test, NUM-1, fp1);
fputs(test, fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
受験者数と人数分の点数が保存されているファイル1から最高点数、最低点数、点数の合計、平均をファイル2に出力するプログラム
出力するデータに変換仕様(%dなど)が必要なので、そもまま文字列を出力しちゃうfputsではなく、fprintfを用いる。
#include
int main(void)
{
int i,num,tmp,max,min,sum;
FILE *fp1, *fp2;
fp1 = fopen("file1.txt","r");
fp2 = fopen("file2.txt","w");
if(fp1==NULL || fp2==NULL)
{
printf("ファイルを開けませんでした。\n");
return 1;
}
fscanf(fp1,"%d",&num);
max = -1000000;
min = 1000000;
sum = 0;
for(i=0; i
{
fscanf(fp1,"%d",&tmp);
if(max < tmp)
max = tmp;
if(min > tmp)
min = tmp;
sum = sum + tmp;
}
fprintf(fp2,"最高点数:%d\n",max);
fprintf(fp2,"最低点数:%d\n",min);
fprintf(fp2,"最高合計:%d\n",sum);
fprintf(fp2,"平均点数:%.1f\n",(double)sum/(double)num);
fclose(fp1);
fclose(fp2);
return 0;
}
個人情報が保存されたtext.txtというテキストファイルのデータを出力するコード
最後の課題。コンパイル数が恐ろしいことになった。
#include < stdio.h >
#include < stdlib.h >
int main(void){
FILE *fp;
char name[256];
int age;
double weight;
char e_mail[256];
//ファイルのデータの読み込み
fp = fopen("text.txt", "r");
if(fp == NULL)
{
printf( "ファイルが開けませんでした.\n");
}
fscanf(fp, "name: %255[^\n]\n" , name);
fscanf(fp, "age: %d\n" , &age);
fscanf(fp, "weight: %lf\n" , &weight);
fscanf(fp, "e-mail: %255[^\n]\n" , e_mail);
fclose(fp);
//ファイルのデータの出力
printf("氏名: %s\n", name);
printf("年齢: %d\n", age);
printf("体重: %.1f\n", weight);
printf("Eメール: %s\n", e_mail);
return 0;
}
理系分補充ということで、コンピュータやったわけだけど、いざやってみたら、勉強してる印象は英語に近かった…(´;ω;`)
2018-05-04 23:29:30 (6 years ago)
参考文献:高橋麻奈著『やさしいC第5版』
共用体型(union構文)
複数の変数でひとつのメモリ領域を共有するもの。
共用体のメンバーはメモリをシェアしているため一つの値しか記憶させることができない。
宣言は構造体に似ているが、機能はかなり違う。
共用体型は次のような構文を書いて宣言する。
union 共用体名
{
型名 識別子;
型名 識別子;
・・・・・・
}
構造体Carと構造体Busを含むVehicle共用体
とりあえずストラクト・カーもストラクト・バスもユニオン・ビークルもtypedef構文であだ名をつけている。
乗用車にはナンバーと排気量のデータが、バスにはナンバーと乗車定員のデータが入っており、これらを収める共用体のデータのサイズは、収められたメンバーの中で最もサイズが大きい値と一致する。
#include
typedef struct Car {
int num; //ナンバー
double gas; //ガソリン
} Car; //乗用車構造体
typedef struct Bus {
int num; //ナンバー
int capacity; //乗車定員
} Bus; //バス構造体
//------------------------------
//ここにVehicle共用体を宣言
typedef union Vehicle{
Car car;
Bus bus;
} Vehicle;
//------------------------------
int main(void)
{
Car c = {1234, 25.5};
Bus b = {4567, 50};
Vehicle v;
v.car = c;
printf("v.car.num=%d, v.car.gas=%.1f\n", v.car.num, v.car.gas);
v.bus = b;
printf("v.bus.num=%d, v.bus.capacity=%d\n", v.bus.num, v.bus.capacity);
return 0;
}
列挙型(enum構文)
列挙型は識別子の値を格納できる型。
識別子の値(一般的に全て大文字で記述する)は、普通に文章で記述できるので、ソースコードが分かりやすいという利点もある。
列挙型は次のような構文を書いて宣言する。
enum 列挙型名 {識別子1, 識別子2, 識別子3 ・・・};
ちなみに{ }の中にない識別子は除外するという機能もある。
列挙型Week
enum Week{SUN,MON,TUE,WED,THU,FRI,SAT};
また、これらの識別子は、C言語のプログラムにおいては自動的に0からの数字に置き換えられて処理される。
enum Week{SUN,MON,TUE,WED,THU,FRI,SAT};
SUN・・・0
MON・・・1
TUE・・・2
WED・・・3
THU・・・4
FRI・・・5
SAT・・・6
さらに、識別子の数字を自分で指定することもできる。
enum Week{SUN,MON=0,TUE=5,WED,THU,FRI,SAT};
この場合は
SUN・・・0
MON・・・0
TUE・・・5
WED・・・6
THU・・・7
FRI・・・8
SAT・・・9
と、数字を重複させたり、スキップさせることができる。
列挙の識別子をswitch文のcaseにしたコード
今まではcaseは数字だったが、case CARなどと文章(=識別子名)で行けるので、人間の文章としてかなり読みやすい。
#include
//------------------------------
//ここにVType列挙を宣言
typedef enum VType{CAR, BUS} VType;
//------------------------------
int main(void)
{
int i;
VType vehicles[] = {BUS, CAR, BUS, BUS, CAR};
for (i=0;i<5;i++) {
switch (vehicles[i]) {
case CAR: printf("%d番目は乗用車です.\n",i); break;
case BUS: printf("%d番目はバスです.\n",i); break;
}
}
return 0;
}
花の列挙型Flower
ここでは、アイリス、チューリップ、ユリ、タンポポの4つの種類の識別子を格納している。
#include
typedef enum Flower_t {
IRIS,
TULIP,
LILY,
DANDELION
} Flower;
int main(void)
{
int i;
Flower flowers[] = {2, 3, 0, 1};
for (i=0;i<4;i++) {
switch(flowers[i]) {
case IRIS:
printf("アヤメ\n");
break;
case TULIP:
printf("チューリップ\n");
break;
case LILY:
printf("ユリ\n");
break;
case DANDELION:
printf("タンポポ\n");
break;
}
}
return 0;
}
構造体の中に共用体と列挙を含んだコード
全部乗せみたいなコード。
#include
typedef struct Car {
int num; //ナンバー
double gas; //ガソリン
} Car; //乗用車構造体
typedef struct Bus {
int num; //ナンバー
int capacity; //乗車定員
} Bus; //バス構造体
typedef enum VType {CAR,BUS} VType; //VType列挙
//------------------------------
//ここにVehicle構造体を宣言
typedef struct Vehicle{
VType type;
union{Car car;Bus bus;}data;
} Vehicle;
//Vehicle構造体の中にVType列挙とdata共用体が入っている!
※dataは構造体でもいいが、一回の処理でCarかBusのどちらか一方しか扱わないので、データのサイズを落とすために共用体がよい。
//------------------------------
int main(void)
{
int t;
Vehicle v;
printf("乗用車(0)ですか?バス(1)ですか?: ");
scanf("%d", &t);
if (t==CAR) {
v.type=CAR;
printf("ナンバーは?: ");
scanf("%d",&v.data.car.num);
printf("ガソリンは?: ");
scanf("%lf",&v.data.car.gas);
} else if (t==BUS) {
v.type=BUS;
printf("ナンバーは?: ");
scanf("%d",&v.data.bus.num);
printf("乗車定員は?: ");
scanf("%d",&v.data.bus.capacity);
}
switch(v.type) {
case CAR:
printf("乗用車:num=%d, gas=%.1f\n",
v.data.car.num,v.data.car.gas);
break;
case BUS:
printf("バス:num=%d, capacity=%d\n",
v.data.bus.num,v.data.bus.capacity);
break;
}
return 0;
}
配列の全てのデータを表示するコード
先ほどのVehicle構造体のコードを改造したもの。
#include
typedef struct Car {
int num; //ナンバー
double gas; //ガソリン
} Car; //乗用車構造体
typedef struct Bus {
int num; //ナンバー
int capacity; //乗車定員
} Bus; //バス構造体
typedef enum VType {CAR,BUS} VType;
//--------------------------------------------------
//ここにVehicle構造体を宣言
typedef struct Vehicle{
VType type;
union{Car car;Bus bus;}data;
} Vehicle;
//--------------------------------------------------
int main(void)
{
int i;
Car c1 = {1234,25.5};
Car c2 = {4567,52.2};
Bus b1 = {6789,50};
Vehicle vs[3];
vs[0].type = CAR;
vs[0].data.car = c1;
vs[1].type = CAR;
vs[1].data.car = c2;
vs[2].type = BUS;
vs[2].data.bus = b1;
//----------------------------------------
//ここに配列内の全ての要素を表示する処理
表示させたいデータの変数が(vs[i].data.車種.ナンバーなど,)と、非常に長くなるのに注意。
for(i=0; i<3; i++){
switch(vs[i].type){
case CAR:
printf("乗用車:num=%d, gas=%.1f\n",
vs[i].data.car.num, vs[i].data.car.gas);
break;
case BUS:
printf("バス:num=%d, capacity=%d\n",
vs[i].data.bus.num, vs[i].data.bus.capacity);
break;
}
}
//----------------------------------------
return 0;
}
2018-05-04 21:40:20 (6 years ago)
リポDで頑張っているけど、本当に辛い。なんかレヴィ=ストロースみたいなやつ出てきた(´;ω;`)
参考文献:高橋麻奈著『やさしいC第5版』
構造体(struct構文)
文字型や数値型などの異なるデータ型の変数を、まとめてひとつの型として定義したもの。
これを使うと、車という構造体に、セダンやカローラのデータを入れたりと、図鑑的なデータベースが作れる。
メンバー
構造体の中に定義した変数はメンバーと呼ばれる。
構造体名 .(ドット) メンバー=そのメンバーに格納したい値 ;
でメンバーのデータを操作することができる。
名前、年齢、性別の3つのメンバーを持つ構造体Person
ただし性別は、男性=M、女性=Fと一文字に置き換える。
#include
struct Person //構造体personと3つのメンバーの宣言
{
char name[100];
int age;
char gender;
};
int main(void)
{
struct Person p1;
printf("名前を入力:");
scanf("%s", p1.name); //文字列では&はいらない!
printf("年齢を入力:");
scanf("%d", &p1.age);
printf("性別を入力:");
scanf("\n%c",&p1.gender); //一文字だけの場合は%c
printf
("{name=%s, age=%d, gender=%c}\n",p1.name,p1.age,p1.gender);
return 0;
}
書名、価格、ページ数の3つのメンバーを持つ構造体Book
聖書のデータを入れているんだけど、聖書って定価は1365円もするんだな・・・だいたい教会の人が「クイアラタメヨ!」ってタダでくれるからな(^_^;)
#include
typedef struct book
{
char title[ 20 ];
int value, pages;
} Book;
int main(void) {
Book book1 = { "Bible", 1365, 687 };
printf( "{title=%s,Value=%d,pages=%d}", book1.title, book1.value, book1.pages );
return 0;
}
3冊の書籍のデータを格納する構造体Book
さらにさっきの構造体のコードを改造して、3冊の本のデータを入力し、構造体の配列に格納できるようにしたもの。
typedef struct Book {
char title[100];
int value;
int pages;
} Book;
#include
int main(void){
Book p1[3];
int i;
for(i=0;i<3;i++){
printf("%d冊目タイトル\n",i+1);
scanf( "%s", p1[i].title );
printf("%d冊目ページ数\n",i+1);
scanf( "%d", &p1[i].pages );
printf("%d冊目価格\n",i+1);
scanf( "%d", &p1[i].value );
}
for(i=0;i<3;i++){
printf("{title=%s,value=%d,pages=%d}\n",
p1[i].title,p1[i].pages,p1[i].value);
}
return 0;
}
typedef構文
構造体の型名を短縮するために用いるキーワード。簡単に説明すると、構造体名にあだ名をつける感じ。
typedef 型名 識別子; の順で記述する。
typedef struct Car{
int num;
double gus;
}Car;
と書くと、struct Carという長い構造体名が、以降はCarだけで済むようになる。
構造体Personをさらにまとめる構造体Couple
構造体のネスト文を作る。
#include
//構造体struct Personをtypedef構文で構造体名をPersonに短縮。
typedef struct Person
{
char name[100];
int age;
char gender;
}Person;
//構造体struct Coupleをtypedef構文で構造体名をCoupleに短縮。さらに構造体personを構造体Coupleの中に取り込み。
typedef struct Couple
{
Person boy;
Person girl;
}Couple;
int main(void)
{
Person Ichiro = {"Ichiro",20,'M'};
Person hanako = {"Hanako",19,'F'};
Couple c1;
c1.boy = Ichiro;
c1.girl = hanako;
printf("Couple:\n");
printf(" boy:{name=%s, age=%d, gender=%c}\n",
c1.boy.name, c1.boy.age, c1.boy.gender);
printf(" girl:{name=%s, age=%d, gender=%c}\n",
c1.girl.name, c1.girl.age, c1.girl.gender);
return 0;
}
sizeof構文
データの大きさ(サイズ)を何バイトか計算する構文。
構造体のサイズは各メンバーのサイズの合計値か、それ以上となる(無駄なメモリの隙間パディングができることが多いため)。
#include
#define NUM 100 //☚マクロのこの数字(配列の要素数)を変えることでサイズも変わっていく。
typedef struct Person {
char name[NUM];
int age;
char gender;
} Person;
int main(void)
{
printf("%d, %d\n",NUM,sizeof(Person)); //Person構造体のサイズを計算したものを表示。
return 0;
}
構造体の配列のソート
任意のメンバー(ここでは年齢)でソートする。
#include
typedef struct Person {
char name[100];
int age;
char gender;
} Person;
int main(void)
{
int i,j;
Person tmp;
Person test[3] = { {"Ichiro",20,'M'},
{"Jiro",21,'M'},
{"Hanako",19,'F'} };
for(i=0; i<2; i++)
{
for(j=i+1; j<3; j++)
{if(test[i].age > test[j].age)
{
tmp = test[i];
test[i] = test[j]; //この3行が君の名は。
test[j] = tmp;
}
}
}
for(i=0; i<3; i++)
{
printf("{name=%s, age=%d, gender=%c}\n",
test[i].name, test[i].age, test[i].gender );
}
return 0;
}
2018-05-04 14:11:03 (6 years ago)
参考文献:高橋麻奈著『やさしいC第5版』
多次元配列
複数の次元のある配列。例えばエクセルのような表は縦と横の二次元に広がる二次元配列。
作り方は、要素数の[ ]をもうひとつ作ればOK。
○×ゲームの模様を描く二次元配列
先生の専門がセルオートマトンだからか、ソースコードでお絵かきをする課題が多い。そして辛い。
これを描く。
+-+-+-+-+
|x| |o| |
+-+-+-+-+
| |o| |x|
+-+-+-+-+
| | |o| |
+-+-+-+-+
|o|x|o|x|
+-+-+-+-+
#include
int main(void)
{
int ar[4][4] = { { -1, 0, 1, 0 },
{ 0, 1, 0, -1 },
{ 0, 0, 1, 0 },
{ 1, -1, 1, -1 }
};
int i,j;
printf("+-+-+-+-+\n");
for(i=0; i < 4; i++){
printf("|");
for(j=0; j < 4; j++){
printf(ar[i][j]==1?"o":ar[i][j]==-1?"x":" ");
//○か×か半角スペースかの場合分け(配列の要素が1のところは「o」、-1のところは「x」、0のところは「半角空白」)。
printf("|");
}
printf("\n+-+-+-+-+\n");
}
return 0;
}
九九を表示する二次元配列
二次元配列a[ ][ ]と、かける数とかけられる数を表す変数nとmを宣言する。
表示例
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 ...以下略
#include
int main(void) {
int n,m,a[9][9];
for(n=0;n<9;n++)
{for(m=0;m<9;m++){a[n][m]=(n+1)*(m+1);}}
for(n=0;n<9;n++)
{for(m=0;m<9;m++)printf("%3d",a[n][m]);
printf("\n");
}
return 0;
}
NULL文字
無効、価値がないという意味。
'\0'というエスケープシーケンスで記述する。
文字列を扱う配列をつくる場合は、要素数は最低でも文字数+1にして、最後の箱に文字列の最後を認識するためのNULL文字を格納しなければならない。
char str[6];
str[0] ='H';
str[1] ='e';
str[2] ='l';
str[3] ='l';
str[4] ='o';
str[5] ='\0'; ☚NULL文字。
文字列を扱う2つの配列を連結するコード
手順は以下の3つ。
①配列str1を、' \0 ' になる前まで 配列str3の先頭から格納する。
②配列str2を、' \0 ' になる前まで 配列str3の続きから格納する。
③配列str3の最後に ' \0 ' を入れる。
#include
int main(void)
{
char str1[15] = "Hello ";
char str2[15] = "World!";
char str3[30];
int i,j;
//手順①
NULL文字になるまで一文字ずつstr3に格納しろという意味。
for(i=0; str1[i]!='\0'; i++)
{str3[i] = str1[i];}
//手順②
NULL文字になるまで一文字ずつstr3の続き(str3[i+j])に格納しろという意味。
for(j=0; str2[j]!='\0'; j++)
{str3[i+j] = str2[j];}
//手順③
str3の最後のi+j番目の箱はNULL文字'\0'が入っているよという意味。
str3[i+j] = '\0';
printf("%s\n",str3);
return 0;
}
文字列の入力
お馴染みのscanfを使うのだが、文字列の場合は変数名(str)の前になぜか&をつけない。
char str[100];
printf("文字列を入力してください。\n");
scanf("%s",str); //&がないのに注意!
printf("入力した文字列は%sです。\n",str)
入力された文字列中の英小文字を英大文字に変換するコード
文字にはそれぞれ文字コードが割り振られており、英語の小文字は文字コードで97から122までで、これらの文字コードから32を引くと対応する大文字の文字コードになるらしい。
#include
int main(void)
{
int i;
char str[256];
printf("文字列を入力してください。\n");
scanf("%s",str);
for(i=0; str[i]!='\0'; i++)
{
if(97<=str[i] && str[i]<=122){printf("%c",str[i]-32);} //文字コード97~122なら32を引いて大文字にする。
else{printf("%c",str[i]);} //文字コード97~122以外ならそのまま。
}
printf("\n");
return 0;
}
文字列の長さを求めて表示するコード
繰り返し文forを使って、文字配列の先頭から1文字ずつ数えていき、NULL文字 '\0' まで行ったら繰り返しを終了するように記述する。
#include
int main(void) {
char str[15] = "Hello";
int i,count=0;
for(i=0;str[i]!='\0';i++){count++;}
printf("文字列の長さは%dです\n",count);
return 0;
}
2018-05-04 10:56:37 (6 years ago)
参考文献:高橋麻奈著『やさしいC第5版』
マクロ
プログラムのコンパイル前に置き換えを行う機能のこと。
配列の要素の数や繰り返し回数が変更された場合、一括で変更することができる。
#define マクロ名 置換する文字列
といったようにプリプロセッサ命令から記述する。
例えば、
#define NUM 5
と、マクロを書くと、そのコードにあるNUMはすべて数字の5に置き換わる。
つまり、コード冒頭にマクロを記述すると、ある文字列を他の文字列に置き換えたくなったとき、コードにある対象の文字列を自分ですべて探し出すこともなく、自動的に置き換えることができる。
特定回数入力された整数の中での最大値を出力するコード
マクロを冒頭に宣言しているので、このNUMの値(入力回数)を好きに変えることができる(課題では入力回数は3に設定)。
マクロのNUMと、入力回数iと、入力された整数の値test[i]がこんがらがってくるけど、ちゃんとコンパイルできるっぽい。
#include
#define NUM 3
int main(void)
{
int i,max=-100000;
int test[NUM];
printf("%d個の整数を入力して下さい。\n",NUM);
for(i=0; i < NUM; i++)
//NUMは配列の要素数として設定されているので、入力回数iはi<=numにしなくてもよい(要素数は0からカウントされるので1少なくずれる!)。
{
printf("整数:");
scanf("%d", &test[i]);
}
for(i=0; i < NUM; i++)
{
if(max < test[i])
max = test[i];
}
printf("%d個の整数の最大値は%dです。\n",NUM,max);
return 0;
}
特定回数入力された整数の中での合計値と平均値を出力するコード
合計値を求める計算式がどうしてもできなかったので、∑的なやつ諦めて、すげえ単純なコードにしてしまった。
#include
#define NUM 3
int main(void)
{
int i,All;
int test[NUM];
printf("%d個の整数を入力して下さい。\n",NUM);
for(i=0; i < NUM; i++)
{
printf("整数:");
scanf("%d", &test[i]);
All = test[0]+test[1]+test[2]; //☚ギブアップした部分。※All=All+test[i];でも行けた。
}
printf("合計:%d\n",All);
printf("平均:%.2lf\n",(double)All/3);
return 0;
}
ソート
複数のデータをある規則に従って順番に並び替えること。
昇順(アセンディングソート)は小さい順もしくは古い順。降順(ディセンディングソート)は大きい順もしくは新しい順。
入力された整数を昇順に並び変えて出力するコード
①入力、②ソート、③出力という三部構成になっている。
#include
#define NUM 10
int main(void) {
int i,j,num,count=0;
int test[NUM];
//①入力編
while(1){
printf("整数を入力(負の数を入力すると終了):");
scanf("%d", &num);
if(num < 0)
break;
test[count] = num;
//入力された値NUMを[ ]の中に代入。
count++;
//さらに入力された値の回数をカウント。
}
//②ソート編
入力された複数の整数のうち、2つ(iとj)を取り出して比べっこするようになっている。
iは、最初から最後の一個手前までの数。
jは、2番目から最後までの数。
この2つの変数を順に比べていき、jよりもiの整数の方が大きかった場合は、iとjの整数を前前前世的に入れ替えさせる。
for(i=0; i < count-1; i++)
{
for(j=i+1; j < count; j++)
{
if(test[j] < test[i])
{
num = test[j];
test[j] = test[i]; //この3行が君の名は。
test[i] = num;
}
}
}
//③出力編
for(i=0; i < count; i++)
{printf("%d ",test[i]);} //スペースを入れないと、すべての数字がくっつく!
printf("\n");
return 0;
}