我需要幫助解決這個問題,如果有人有類似的問題,它會幫助我。
任務是:撰寫一個程式,加載一個自然數陣列a,n然后組成一個陣列,b使陣列的元素b等于陣列元素的位數之和a。
Example:
n=5
a[0]=1
a[1]=2
a[2]=3
a[3]=32
a[4]=54
Array b is:
b[0]=1
b[1]=2
b[2]=3
b[3]=5
b[4]=9
我是這樣的:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100
void form(int [], int [], int);
int sum_digit(int);
void print (int [], int);
int main() {
int n;
printf("Enter n:");
scanf("%d", &n);
while (n < 1 || n > MAX) {
int n;
printf("Enter n:");
scanf("%d", &n);
}
int a[MAX], b[MAX];
printf("Enter element of array a:\n");
for (int i = 0; i < n; i ) {
printf("%d. element:",i 1);
scanf("%d", &a[i]);
}
form(a, b, n);
print(b, n);
return 0;
}
void form(int a[MAX], int b[MAX], int n) {
for (int i = 0; i < n; i ) {
while (a[i] > 0) {
int pom = a[i] % 10;
b[i] = sum_digit(pom);
a[i] = a[i] / 10;
}
}
}
int sum_digit(int s) {
int sum = 0;
sum = sum s;
return sum;
}
void print(int b[MAX], int n) {
for (int i = 0; i < n; i ) {
printf("%d ", b[i]);
}
}
多位陣列元素會出現問題。每次sum_digit呼叫該函式時,總和設定為零。因此,例如對于 element 32,我無法獲得 5 因為我無法添加2and 3。如果有人知道如何解決這個問題,我將不勝感激。
uj5u.com熱心網友回復:
您的代碼中有多個問題:
您不測驗回傳值,
scanf()因此任何無效或丟失的輸入都將導致未定義的行為,因為目標變數不會更新。回圈中
n定義了一個新變數while,因此外部作用域中的原始變數永遠不會被 修改scanf()。form并且sum_digit兩者都不正確:您應該sum_digit()使用回圈計算總和并將所有總和存盤在回圈中form。
這是一個修改后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100
void form(int [], int [], int);
int sum_digits(int);
void print (int [], int);
int main() {
int n;
for (;;) {
printf("Enter n:");
if (scanf("%d", &n) != 1)
return 1;
if (n >= 1 && n <= MAX)
break;
printf("Incorrect value: %d\n", n);
}
int a[MAX], b[MAX];
printf("Enter elements of array a:\n");
for (int i = 0; i < n; i ) {
printf("%d. element:", i 1);
if (scanf("%d", &a[i]) != 1)
return 1;
}
form(a, b, n);
print(b, n);
return 0;
}
void form(int a[MAX], int b[MAX], int n) {
for (int i = 0; i < n; i ) {
b[i] = sum_digits(a[i]);
}
}
int sum_digits(int s) {
int sum = 0;
/* this loop handles positive and negative numbers alike */
while (s != 0) {
sum = sum s % 10;
s = s / 10;
}
/* return the positive sum of digits */
return abs(sum);
}
void print(int b[MAX], int n) {
for (int i = 0; i < n; i ) {
printf("%d ", b[i]);
}
printf("\n");
}
uj5u.com熱心網友回復:
首先要注意,因為陣列 a 的元素型別是,int那么這意味著用戶可以在陣列中輸入負數。但數字總和應該是一個非負值。
并且a不應更改陣列。任務只是形成陣列b。
現在你來了。
void form( const int a[], int b[], int n )
{
for ( int i = 0; i < n; i )
{
b[i] = sum_digit( a[i] );
}
}
和
int sum_digit( int num )
{
enum { Base = 10 };
int sum = 0;
do
{
int digit = num % Base;
if ( digit < 0 ) digit = -digit;
sum = digit;
} while ( num /= Base );
return sum;
}
這是一個演示程式。
#include <stdio.h>
int sum_digit( int );
void form( const int a[], int b[], int n )
{
for (int i = 0; i < n; i )
{
b[i] = sum_digit( a[i] );
}
}
int sum_digit( int num )
{
enum { Base = 10 };
int sum = 0;
do
{
int digit = num % Base;
if (digit < 0) digit = -digit;
sum = digit;
} while (num /= Base);
return sum;
}
void print( const int a[], int n )
{
for (int i = 0; i < n; i )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
int main( void )
{
enum { MAX = 5 };
int a[MAX] = { 1, -22, 333, -4444, 55555 };
int b[MAX];
print( a, MAX );
form( a, b, MAX );
print( b, MAX );
}
程式輸出是
1 -22 333 -4444 55555
1 4 9 16 25
uj5u.com熱心網友回復:
sum_digit()應該計算所有數字的總和,而不僅僅是一位數字。因此,您需要將回圈從 移動form()到sum_digit()。
void form(int a[MAX],int b[MAX],int n)
{
for(int i=0;i<n;i )
{
b[i]=sum_digit(a[i]);
}
}
int sum_digit(int s)
{
int sum=0;
while (s > 0) {
sum = s % 10;
s /= 10;
}
return sum;
}
由于賦值表示陣列包含自然數,因此您還可以將所有int宣告更改為unsigned.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393269.html
上一篇:如何回傳不同的結構地址?
下一篇:在特殊檔案上讀寫各種資料型別
