配列の各要素の足し算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
t_n_y_09
記事: 8
登録日時: 7年前

配列の各要素の足し算

#1

投稿記事 by t_n_y_09 » 6年前

大学の課題で、
①配列を表示せよ
②配列を昇順、降順に並び替え、各要素で足し算をして、その結果を出力せよ
というものが出ていて、各要素の足し算の方法がわかりません。

問題形式としては、

コード:

int main(){
int num[MAX]={1,9,3,8,5,7,6,4,2,0};
/*穴埋め(関数呼び出し)*/
return 0;

void num_disp(int /*穴埋め*/){
/*穴埋め*/
}

void num_sort_1(int /*穴埋め*/){
/*穴埋め*/
}

void num_sort_2(int /*穴埋め*/){
/*穴埋め*/
}

void wa(int /*穴埋め*/){
/*穴埋め*/
}

というような感じです。
以下、途中まで作れたコードです。

コード:

#include<stdio.h>
#include <string.h>
#define MAX 10

void num_disp(int *, int);
void num_sort_1(int *, int);
void num_sort_2(int *, int);

int i, j;
int main(void)
{
	int num[MAX] = { 1,9,3,8,5,7,6,4,2,0 };

	printf("元の配列:");
	num_disp(num, MAX);
	num_sort_1(num, MAX);
	num_sort_2(num, MAX);
	num_wa(num, MAX);
        printf("元の配列:");
	return 0;
}

void num_disp(int *num, int n)
{
	for (i = 0; i < n; i++) {
		printf("%d", num[i]);
	}
	printf("\n");
}

void num_sort_1(int *num, int n)//昇順
{
	for (i = 0; i < n-1 ; i++) {
		for (j = i + 1; j < n; ++j) {
			if (num[i] > num[j]) {
				int t;
				t = num[i], num[i] = num[j], num[j] = t;
			}
		}
	}
}


void num_sort_2(int *num, int n)//昇順
{
	for (i = 0; i < n - 1; i++) {
		for (j = i + 1; j < n; ++j) {
			if (num[i] > num[j]) {
				int t;
				t = num[i], num[i] = num[j], num[j] = t;
			}
		}

	}
}

void num_wa(int *num, int n)//各要素の和
{
/*ここがわかりません*/
}

お力添え、よろしくお願いいたします。

かずま

Re: 配列の各要素の足し算

#2

投稿記事 by かずま » 6年前

t_n_y_09 さんが書きました: ①配列を表示せよ
②配列を昇順、降順に並び替え、各要素で足し算をして、その結果を出力せよ
プログラムを作る前に、期待される結果は簡単にわかるはずなので、
それを書いてください。

t_n_y_09
記事: 8
登録日時: 7年前

Re: 配列の各要素の足し算

#3

投稿記事 by t_n_y_09 » 6年前

質問者です。
それを書いてください、というのは、ここにということでしょうか?
期待される結果は
num3={10,10,10,10,10,10,10,10,10,10}
というものです。

以下、今日考えたコードです。

コード:

#include<stdio.h>
#include<string.h>
#define MAX 10

void num_disp(int *num, int n);//void関数の宣言
void num_sort_1(int *num1, int n);//配列の先頭アドレスnum1と配列サイズnを受け取る
void num_sort_2(int *num2, int n);
void wa(int *num1,int *num2,int *num3,int n);

		int num1[MAX] = { 0,0,0,0,0,0,0,0,0,0 };
	int num2[MAX] = { 0,0,0,0,0,0,0,0,0,0 };
	int num3[MAX] = { 0,0,0,0,0,0,0,0,0,0 };
int i, j,t;
int main(int *num1, int *num2, int *num3, int n)
{

	int num[MAX] = { 1,9,3,8,5,7,6,4,2,0 };
	printf("元の配列:");
	num_disp(num, MAX);
	printf("sort1でのnum1[i]:");
	num_sort_1(num, MAX);
	printf("sort2でのnum2[i]:");
	num_sort_2(num, MAX);
	printf("wa:");
	wa(num,num,num,MAX);
	return 0;
}

void num_disp(int *num, int n)
{
	int i;
	for (i = 0; i < n; i++) {
		printf("%d", num[i]);
	}
	printf("\n");
}

void num_sort_1(int *num1,int n)//昇順 要素数n個、配列先の先頭のアドレスnum1を引数とする関数
{
	for (i = 0; i < n - 1; i++) {
		for (j = i + 1; j < n; ++j) {
			if (num1[i] > num1[j]) {
					t = num1[i], num1[i] = num1[j], num1[j] = t;

				}
			}
		}for (i = 0; i < n; i++) {
			printf("%d", num1[i]);
		}
		printf("\n");
		num1 = &num1[i];//ポインタnum1にnum1[i]のアドレスを格納

	}
	


void num_sort_2(int *num2, int n)//降順 要素数n個、配列先の先頭のアドレスnum2を引数とする関数
{
	
	for (i = 0; i < n-1; ++i) {
		for (j = i + 1; j < n-1; j++) {
			if (num2[i] < num2[j]) {
				int t;
				t = num2[i],num2[i] = num2[j], num2[j] = t;
			}
		}

	}
	for (i = 0; i < n; i++) {
		printf("%d", num2[i]);
	}
	printf("\n");
	num2 = &num2[i];
}

void wa(int *num1, int *num2, int *num3,int n)//各要素の和
	{{
			printf("num1[i]:%d", num1[i]);
			printf("\n");

			printf("num2[i]:%d", num2[i]);
			printf("\n");

	for (i = 0; i < n - 1;++i) {
		num3[i] = num1[i] + num2[i];
	}
	printf("各要素の和:%d", num3[i]);
	for (i = 0; i < n - 1;++i)
			printf("%d", num3[i]);
		}
printf("\n");

}	
このようにやってみたのですが、

////////////////////以下出力結果////////////////////
元の配列:1938576420
sort1でのnum1:0123456789
sort2でのnum2:9876543210
wa:num1:-858993460
num2:-858993460
各要素の和:91614121086420
///////////////////////////////////////////////////

となってしまいました。

かずま

Re: 配列の各要素の足し算

#4

投稿記事 by かずま » 6年前

t_n_y_09 さんが書きました: 期待される結果は
num3={10,10,10,10,10,10,10,10,10,10}
というものです。
先頭の 10 は、何と何を足したものですか?

t_n_y_09
記事: 8
登録日時: 7年前

Re: 配列の各要素の足し算

#5

投稿記事 by t_n_y_09 » 6年前

すみません
num3={9,9,9,9,9,9,9,9,9,9}
でした

box
記事: 2002
登録日時: 13年前

Re: 配列の各要素の足し算

#6

投稿記事 by box » 6年前

t_n_y_09 さんが書きました: num3={9,9,9,9,9,9,9,9,9,9}
何と何を足したらこんな結果になるんですか?
全然わかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Math

Re: 配列の各要素の足し算

#7

投稿記事 by Math » 6年前

下記を参考に作ればいいと思います。
c1.c

コード:

#define _CRT_SECURE_NO_WARNINGS //セキュリティ警告抑制
 

#include <stdio.h>
#include <string.h>
#define MAX 10
 
void num_disp(int *, int);
void num_sort_1(int *, int);
void num_sort_2(int *, int);
 
int i, j;
int main(void)
{
    int num[MAX] = { 1,9,3,8,5,7,6,4,2,0 }; int i = MAX - 1;
 
    printf("元の配列:");
    num_disp(num, MAX);

    printf("A:\n");num_sort_1(num, MAX); num_disp(num, MAX);

    printf("B:\n");num_sort_2(num, MAX); num_disp(num, MAX);

    // num_wa(num, MAX);


    printf("\n\nC:*** 逆順表示 ***\n");
    for (i = MAX - 1; i > -1; i--) {
        printf("%d", num[i]);
    }
    printf("\n");

    printf("\n\nC:*** 和 ***\n");
    for (i = 0; i < MAX; i++) {
        printf("%d", num[i] + num[MAX - i - 1]);
    }
    printf("\n");

    return 0;
}
 
void num_disp(int *num, int n)
{
    for (i = 0; i < n; i++) {
        printf("%d", num[i]);
    }
    printf("\n");
}
 
void num_sort_1(int *num, int n)//昇順
{
    for (i = 0; i < n-1 ; i++) {
        for (j = i + 1; j < n; ++j) {
            if (num[i] > num[j]) {
                int t;
                t = num[i], num[i] = num[j], num[j] = t;
            }
        }
    }
}
 
 
void num_sort_2(int *num, int n)//昇順
{
    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; ++j) {
            if (num[i] > num[j]) {
                int t;
                t = num[i], num[i] = num[j], num[j] = t;
            }
        }
 
    }
}
/* 
void num_wa(int *num, int n)//各要素の和
{

}
*/
c.bat

コード:

rem コンパイル後リンク
cl /TC c1.c
rem 実行結果
c1.exe
実行結果

コード:

G:\z18c\0126>c

G:\z18c\0126>rem コンパイル後リンク

G:\z18c\0126>cl /TC c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.11.25508.2 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
Microsoft (R) Incremental Linker Version 14.11.25508.2
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

G:\z18c\0126>rem 実行結果

G:\z18c\0126>c1.exe
元の配列:1938576420
A:
0123456789
B:
0123456789


C:*** 逆順表示 ***
9876543210


C:*** 和 ***
9999999999

G:\z18c\0126>

かずま

Re: 配列の各要素の足し算

#8

投稿記事 by かずま » 6年前

グローバル変数とローカル変数と引数の関係を理解していないようですね。
また、ソートなどの処理の中で表示を行うのではなく、
表示は別の関数で行いましょう。

次のプログラムを参考にして、元の問題のコードが書けませんか?

コード:

#include <stdio.h>

#define N 5

void disp(int *v, int n);
void rev(int *v, int n);
void sub(int *u, int *v, int *w, int n);

int main(void)
{
    int a[N] = { 31, 4, 15, 92, 65 };
    int b[N], c[N], d[N];
    int i;

    for (i = 0; i < N; i++)
        b[i] = c[i] = a[i];

    printf("配列:");
    disp(b, N);

    rev(c, N);
    printf("逆順:");
    disp(c, N);

    sub(b, c, d, N);
    printf(" 差:");
    disp(d, N);

    return 0;
}

void disp(int *v, int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf(" %d", v[i]);
    printf("\n");
}

void rev(int *v, int n)
{
    int i, t;
    for (i = 0; i < --n; i++)
        t = v[i], v[i] = v[n], v[n] = t;
}

void sub(int *u, int *v, int *w, int n)
{
    int i;
    for (i = 0; i < n; i++)
        w[i] = v[i] - u[i];
}
実行結果

コード:

配列: 31 4 15 92 65
逆順: 65 92 15 4 31
 差: 34 88 0 -88 -34

返信

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