ページ 1 / 1
宿題です(汗)
Posted: 2007年6月22日(金) 18:40
by 羽流布
補講で期限が明日になってしまいまして、焦ってます○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:宿題です(汗)
Posted: 2007年6月22日(金) 19:15
by 管理人
左に一文字シフトするのはこういう感じでしょうか。
#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:宿題です(汗)
Posted: 2007年6月22日(金) 22:27
by 羽流布
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:宿題です(汗)
Posted: 2007年6月22日(金) 22:35
by 管理人
私の書いたサンプルを見たらわかるはずです。
というかすでに答えを自分で書いていらっしゃいますが・・。
Re:宿題です(汗)
Posted: 2007年6月22日(金) 22:59
by 羽流布
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);
}
}
}
こんな感じになったのですが、うまくいきません……
どうしてでしょうか?
Re:宿題です(汗)
Posted: 2007年6月22日(金) 23:25
by box
> void strshift(char *str, int n) {
strはchar *型ですので、
> len = strlen(&str);
> slshift(&str);
> srshift(&str);
この3行が正しくありません。
今は、&を付けているために、strlen, slshift, srshiftに
char **型を渡してしまっています。
Re:宿題です(汗)
Posted: 2007年6月22日(金) 23:39
by 羽流布
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:宿題です(汗)
Posted: 2007年6月22日(金) 23:56
by 管理人
計算式さえわかっていれば簡単だと思いますが、標準偏差などの計算方法はOKですか?
Re:宿題です(汗)
Posted: 2007年6月23日(土) 00:08
by 管理人
Re:宿題です(汗)
Posted: 2007年6月23日(土) 00:34
by 羽流布
できました!
一応、実行結果が合っていますので、大丈夫かと……
#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:宿題です(汗)
Posted: 2007年6月23日(土) 10:53
by 管理人
間に合ってよかったですね^^