宿題です(汗)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
羽流布

宿題です(汗)

#1

投稿記事 by 羽流布 » 18年前

補講で期限が明日になってしまいまして、焦ってます○TZ

内容は、ポインタを使ったプログラムに書き換えるというものなのですが、うまくいきません……。
下記のプログラムになります。
// 左1文字シフト関数
void slshift(char str[/url]) {
	char t;
	int len, i;
	
	t = str[0];
	len = strlen(str);
	for (i = 0; i < len - 1; i++) {
		str = str[i + 1];
	}
	str = t;
}

// 右1文字シフト関数
void srshift(char str[/url]) {
	char t;
	int len, i;
	
	len = strlen(str);
	t = str[len - 1];
	for (i = len - 1; i > 0; i--) {
		str = str;
	}
	str[0] = t;
}

// 文字列のn文字シフト関数
void strshift(char str[/url], int n) {
	int an, j, len;
	
	if (n < 0) {
		an = -n;
	}
	else {
		an = n;
	}
	len = strlen(str);
	if (len != 0) {
		an %= len;
	}
	for (j = 0; j < an; j++) {
		if (n < 0) {
			slshift(str);
		}
		else {
			srshift(str);
		}
	}
}

もう一つの課題は、
整数配列xとxの先頭から格納されているデータの個数nを受け取り,xの平均値と標準偏差を計算してavrとstdに返す関数を作れ.関数内では配列要素を全てポインタで表現せよ.
void stats(int *x, int n, double *avr, double *std);

ネットでポインタについて調べてみましたが、どうも上手くいきません……
今の状況は、こんな感じです
void slshift(char *str) {
	char *t;
	
	t = str;
	
	while (*str++ != '\0') {
		str = str + 1;
	}
	str = t;
}

解答まではいかなくていいですので、助言をお願いしますm(_ _)m

管理人

Re:宿題です(汗)

#2

投稿記事 by 管理人 » 18年前

左に一文字シフトするのはこういう感じでしょうか。
#include <stdio.h>

void slshift(char *str) {
	char t;
	t = *str;
	while(*(str+1) != '\0'){
		*str = *(str+1);
		str++;
	}
	*str=t;
}


int main(){
	char str[6]="abcde";
	slshift(str);
	printf("%s",str);
	return 0;
}

実行結果
bcdea
 
 
上記プログラムではあまり1行に沢山処理を書かないでわけて書きました。
まず、先頭にある文字は消されてしまうので、とっておかないといけないのはおわかりのようですね。
1文字保存しておくにはまず文字型で1文字分変数を用意します。
	char t;
これです。
で、先頭のアドレスの中身を参照するには*をつけるので、先頭の1文字目は
	t = *str;
これでコピーできますね。
後は1文字先の文字を現在の文字にコピーしていきます。
	while(*(str+1) != '\0'){
1文字先の文字が終端記号ならコピーしませんから、このように書きます。
		*str = *(str+1);
1つ先のアドレスの中身を、現在のアドレスのデータ先に格納します。
		str++;
アドレスを一つ進めます。
	}
	*str=t;
文字列の最後を示しているアドレス先に最初とっておいた文字を入れます。

こういう感じの流れです。
右も、n文字も同じ要領でOKだと思います。
 

羽流布

Re:宿題です(汗)

#3

投稿記事 by 羽流布 » 18年前

slshift(str)とsrshift(str)に値を渡すにはどうしたらいいんでしょうか?
void strshift(char *str, int n) {
	int an, j, len;
	
	while (*(str + 1) != '\0') {
		len++;
		str++;
	}
	if (n < 0) {
		an = -n;
	}
	else {
		an = n;
	}
	if (len != 0) {
		an %= len;
	}
	for (j = 0; j < an; j++) {
		if (n < 0) {
			slshift(str);
		}
		else {
			srshift(str);
		}
	}
}

管理人

Re:宿題です(汗)

#4

投稿記事 by 管理人 » 18年前

私の書いたサンプルを見たらわかるはずです。
というかすでに答えを自分で書いていらっしゃいますが・・。

羽流布

Re:宿題です(汗)

#5

投稿記事 by 羽流布 » 18年前

void strshift(char *str, int n) {
	int an, j, len;
	
	if (n < 0) {
		an = -n;
	}
	else {
		an = n;
	}
	len = strlen(&str);
	if (len != 0) {
		an %= len;
	}
	for (j = 0; j < an; j++) {
		if (n < 0) {
			slshift(&str);
		}
		else {
			srshift(&str);
		}
	}
}
こんな感じになったのですが、うまくいきません……
どうしてでしょうか?

box

Re:宿題です(汗)

#6

投稿記事 by box » 18年前

> void strshift(char *str, int n) {

strはchar *型ですので、

> 	len = strlen(&str);
> 			slshift(&str);
> 			srshift(&str);

この3行が正しくありません。
今は、&を付けているために、strlen, slshift, srshiftに
char **型を渡してしまっています。

羽流布

Re:宿題です(汗)

#7

投稿記事 by 羽流布 » 18年前

boxさん、ありがとうございますm(_ _)m

&が、いらなかったのですね……

これでとりあえず、一つ目は終わりました。

あとは下記のプログラムを完成させるだけです。
#include <stdio.h>
#include <math.h>
#define MAXN	100		// データの最大個数

void stats(int *x, int n, double *avr, double *std);

int main(void) {
	int x[MAXN], n, j;
	double aver, stdev;
	
	printf("入力データの個数n (n <= %d) ? ", MAXN);
	scanf("%d", &n);
	printf("整数データを %d 個分入力せよ.適当に改行を入れてよい.\n", n);
	for (j = 0; j < n; j++) {
		scanf("%d", &x);
	}
	stats(x, n, &aver, &stdev);
	printf(" 平均値 = %.2f\n", aver);
	printf("標準偏差 = %.3f\n", stdev);
	return (0);
}

void stats(int *x, int n, double *avr, double *std) {
	
}

管理人

Re:宿題です(汗)

#8

投稿記事 by 管理人 » 18年前

計算式さえわかっていれば簡単だと思いますが、標準偏差などの計算方法はOKですか?

管理人

Re:宿題です(汗)

#9

投稿記事 by 管理人 » 18年前

たとえば標準偏差と平均だけならネット上にたくさんサンプルがありますよ。
http://www.google.co.jp/search?hl=ja&q= ... %AA%9E&lr=

羽流布

Re:宿題です(汗)

#10

投稿記事 by 羽流布 » 18年前

できました!
一応、実行結果が合っていますので、大丈夫かと……
#include <stdio.h>
#include <math.h>
#define MAXN	100		// データの最大個数

void stats(int *x, int n, double *avr, double *std);

int main(void) {
	int x[MAXN], n, j;
	double aver, stdev;
	
	printf("入力データの個数n (n <= %d) ? ", MAXN);
	scanf("%d", &n);
	printf("整数データを %d 個分入力せよ.適当に改行を入れてよい.\n", n);
	for (j = 0; j < n; j++) {
		scanf("%d", &x[j]);
	}
	stats(x, n, &aver, &stdev);
	printf(" 平均値 = %.2f\n", aver);
	printf("標準偏差 = %.3f\n", stdev);
	return (0);
}

void stats(int *x, int n, double *avr, double *std) {
	int i;
	double sum = 0, sumsq = 0;
	
	for (i = 0; i < n; i++) {
		sum = sum + *x;
		sumsq = sumsq + *x * *x;
		x++;
	}
	*avr = sum / n;
	*std = sqrt( fabs( sumsq / n - *avr * *avr ) );
}
/*
入力データの個数n (n <= 100) ? 10
整数データを 10 個分入力せよ.適当に改行を入れてよい.
80 70 85 60 95 40 90 60 50 75
 平均値 = 70.50
標準偏差 = 16.948
*/
的確な助言をありがとうございましたm(_ _)m

管理人

Re:宿題です(汗)

#11

投稿記事 by 管理人 » 18年前

間に合ってよかったですね^^

閉鎖

“C言語何でも質問掲示板” へ戻る