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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1433閲覧

c言語で,区切りの数値をファイルから入力して行列に代入したい

sho0423

総合スコア31

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2019/12/04 11:00

編集2019/12/07 03:49

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int main(void) { 6 7 FILE *f_in; 8 FILE *f_out; 9 char in_name[] = "input.txt"; 10 char out_name[] = "output.txt"; 11 char str[1024]; 12 int n; 13 int a,b; 14 char *p; 15 a = 0; 16 17 f_in = fopen(in_name,"r"); 18 f_out = fopen(out_name,"w"); 19 if (f_in == NULL || f_out == NULL){ 20 printf("file open error"); 21 return -1; 22 } 23 24 25 while((fgets(str,256,f_in))!=NULL){ 26 printf("%s",str); 27 p = strtok(str,","); 28 printf("%s\n",str); 29 while(p = strtok(NULL,",")){ 30 printf("%s\n",p); 31 } 32 //printf("%s",&str[2]); 33 a++; 34 } 35 36 printf("%d\n",a); 37 fclose(f_in); 38 return 0; 39} 40

まだ全く進んでいないというか、どうすれば代入できるのか分からなくて困っています。
分からなすぎて何を調べると良いのか分からないです。具体的に行列計算したりするのはできると思うのですが、
ポインタやらメモリの動的確保やらで何から着手して良いのか完全に見失ってるので、ここを調べた方が良いなど、
教えていただきたいです

要件
input.txtが次のような形式で与えられており、上半分で正方行列、下半分で列ベクトルです。
正方行列のサイズは可変です。これを受け取り、b = Ax を計算します。

5,1,2,3 3,4,5,3 6,7,8,5 3,2,1,0 9 0 1 2

どうか回答お願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/12/04 11:44

> 行列のサイズは可変 手が付かないなら、まず、ここを固定サイズで実装してみては? 最初から、全ての条件を満たす事を止めて、ある程度、条件を絞ることから、始める事を勧めます。
episteme

2019/12/06 12:28

条件(仕様)は正確に。 行列のサイズは NxN でN可変? それとも MxNでM,N可変? M,Nはどうやって決定するの?
sho0423

2019/12/07 03:47

N*N の正方行列でNが可変です。 Nを求めることはできたのですが、それらを行列、ベクトルに代入することができなくて困っています
episteme

2019/12/08 03:10

そのNは一行目を読みだしたときの要素数ってことでOK?
sho0423

2019/12/08 07:14

そうです!
guest

回答2

0

ベストアンサー

行列計算はわかりませんがとりあえず代入だけしてみました。

W_ENDはうまく設定してください。

無駄に複雑だったらごめんなさい。

main.c

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5#define W_END 0xffff// 6 7int **generate_matrix(char *fname) 8{ 9 FILE *fp; 10 int x;//横の要素数 11 int y;//縦の要素数 12 char buf[256]; 13 int i,j; 14 int len; 15 int *w;//横 16 int **h;//全体 17 int h_size=16;//縦の初期サイズ 18 if((fp=fopen(fname,"r"))==NULL) 19 return NULL; 20 if((h=(int**)calloc(sizeof(int*),h_size))==NULL) 21 return NULL; 22 y=0; 23 while(fgets(buf,256,fp)>0) 24 { 25 x=1; 26 len=strlen(buf); 27 for(i=0;i<len;i++) 28 if(buf[i]==',') 29 { 30 buf[i]='\0';//分割 31 x++; 32 } 33 w=(int*)malloc(sizeof(int)*(x+2)); 34 j=0; 35 for(i=0;i<x;i++) 36 { 37 w[i]=atoi(&buf[j]);//数値に変換 38 j+=strlen(buf)+1;//次の文字列のオフセット 39 } 40 w[i]=W_END; 41 h[y++]=w; 42 if(y==h_size) 43 { 44 if((h=realloc(h,sizeof(int*)*h_size*2))==NULL) 45 return NULL; 46 else 47 for(i=h_size;i<=h_size*2;i++) 48 h[i]=NULL;//獲得した領域を初期化 49 h_size*=2; 50 } 51 } 52 fclose(fp); 53 return h; 54} 55void free_matrix(int **h) 56{ 57 int i=0; 58 while(h[i]) 59 free(h[i++]); 60 free(h); 61} 62int main() 63{ 64 int **h=generate_matrix("input.txt"); 65 int i,j; 66 for(i=0;h[i];i++) 67 { 68 for(j=0;h[i][j]!=W_END;j++) 69 printf("%d ",h[i][j]); 70 puts(""); 71 } 72 free_matrix(h); 73} 74
$ gcc main.c $ ./a.out 5 1 2 3 3 4 5 3 6 7 8 5 3 2 1 0 9 0 1 2

投稿2019/12/08 03:09

編集2019/12/08 12:07
vectorcc

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sho0423

2019/12/08 07:16

ありがとうございます!見通しが立ちました!
guest

0

配列は固定サイズで用意しておけばよいのでは?

C

1#include <stdio.h> // fopen, fclose, fgets, fscanf, printf, puts 2#include <stdlib.h> // atof 3#include <string.h> // strtok 4 5#define N (20 + 1) 6 7int main(void) 8{ 9 double a[N][N], b[N], x[N]; 10 11 static char in_name[] = "input.txt", out_name[] = "output.txt"; 12 FILE *f_in = fopen(in_name, "r"); 13 if (!f_in) { printf("can't open %s\n", in_name); return 1; } 14 FILE *f_out = fopen(out_name, "w"); 15 if (!f_out) { printf("can't create %s\n", out_name); return 2; } 16 17 char str[1024]; 18 fgets(str, sizeof str, f_in); 19 char *p = strtok(str, ","); 20 int n; 21 for (n = 0; n < N && p; n++) { 22 a[0][n] = atof(p); p = strtok(NULL, ","); 23 } 24 if (n == N) { puts("too many data"); return 3; } 25 for (int i = 1; i < n; i++) 26 for (int j = 0; j < n; j++) fscanf(f_in, "%lf,", &a[i][j]); 27 for (int i = 0; i < n; i++) fscanf(f_in, "%lf,", &x[i]); 28 fclose(f_in); 29 30 for (int i = 0; i < n; i++) { 31 for (int j = 0; j < n; j++) printf("%8g", a[i][j]); 32 printf("%16g\n", x[i]); 33 } 34 fclose(f_out); 35}

どうしても配列を動的に確保する方法を知りたいですか?

投稿2019/12/07 05:07

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問