2010-06-27 57 views
9

Xin chào mọi người, về cơ bản tôi mới lập trình. Tôi đã quyết định thử và bắt đầu với C (không C++ hoặc C#) và cho đến nay tôi đã làm khá tốt. Tôi đã xoay xở để tiến xa tới mảng hai chiều trước khi tôi bắt đầu ngập ngừng. Trong khi tôi nghĩ rằng tôi hiểu rộng rãi các mảng số nguyên 2D, tôi chắc chắn không hiểu mảng chuỗi 3D.Mới để lập trình, không nhận các mảng 2D/3D

Tôi đang học bằng cách sử dụng các kỹ thuật và áp dụng chúng trong chương trình thực tế mà tôi đã tạo, tỷ giá hối đoái "cơ bản" yêu cầu người dùng chọn đơn vị tiền tệ cơ bản rồi in giá trị bằng USD. Không có toán học liên quan, tôi chỉ đơn giản là googled công cụ như EUR/USD và thiết lập các giá trị bằng tay trong mảng mà tôi thảo luận dưới đây.

Nhưng đây là nơi tôi bị kẹt. Tôi tìm ra cách tốt nhất để học mảng đa chiều là áp dụng lý thuyết thực tế, vì vậy đây là những gì tôi đã gõ cho đến nay (tôi đã bỏ qua các chức năng khác của chương trình của tôi (bao gồm cả mã gọi hàm này) cho ngắn gọn) :

char currencies[5][3][4] = { 
    {'1','2','3','4','5'}, 
    {'GBP','EUR','JPY','CAD','AUD'}, 
    {'1.5','1.23','0.11','0.96','0.87'} 
}; 

int point, symbol, value; 

displayarraycontents() 
{ 
    for(point=1;point<5;point++){ 
     for(symbol=1;symbol<5;symbol++){ 
      for(value=1;symbol<5;symbol++) 
       printf("%s ", currencies[point][symbol][value]); 
      printf("\n"); 
     }} 

} 

Vì C không có loại dữ liệu chuỗi, việc tạo mảng chuỗi hoàn toàn lộn xộn với đầu của tôi.

Lý do tiền tệ [5] [3] [4]? Bởi vì tôi đang lưu trữ tổng cộng 5 loại tiền tệ, mỗi loại được đánh dấu bằng ký hiệu 3 chữ cái (ví dụ: EUR, CAD), có giá trị tối đa 4 chữ số, bao gồm dấu thập phân.

Tôi đang cố gắng để hiển thị danh sách này:

1 GBP 1,5
2 1,23 EUR
3 JPY 0.11
4 CAD 0,96
5 AUD 0,87

Khi tôi bấm vào xây dựng, các dòng mà tôi chỉ định các giá trị trong mảng được đánh dấu bằng một số trường hợp cảnh báo này:

cảnh báo: tràn trong imp hợp pháp chuyển đổi liên tục

... và dòng mà tôi in nội dung của mảng được đánh dấu với cảnh báo này:

cảnh báo: định dạng '% s' hy vọng gõ 'char *', nhưng lập luận 2 có loại 'int'

Khi chạy mã, phần còn lại của chương trình hoạt động tốt ngoại trừ chức năng này, tạo ra "lỗi phân đoạn" hoặc somesuch.

Ai đó có thể cho tôi một bàn tay ở đây? Bất kỳ trợ giúp nào cũng sẽ được đánh giá rất cao, cũng như bất kỳ liên kết nào đến các hướng dẫn khởi tạo mảng chuỗi C 2D/3D đơn giản! (hai cuốn sách của tôi, K & R và Tự dạy C chỉ cung cấp các ví dụ mơ hồ không liên quan)

Cảm ơn bạn trước!
-Ryan

EDIT: cập nhật mã sử dụng struct:

struct currency { 
    char symbol[4]; 
    float value[5]; 
}; 


void displayarraycontents(){ 

     int index; 

     struct currency currencies[] { 
      {"GBP", 1.50}, 
      {"EUR", 1.23}, 
      {"JPY", 0.11}, 
      {"CAD", 0.96}, 
      {"AUD", 0.87},}; 

} 

tôi nhận được các lỗi sau đây: chính.c: 99: error: chức năng lồng nhau bị vô hiệu hóa, sử dụng các hàm -fnested để kích hoạt lại
main.c: 99: error: expected '=', ',', ';', 'asm' hoặc 'thuộc tính 'before' {'token
main.c: 100: error: expected'; ' trước mã '}'
main.c: 100: lỗi: biểu thức mong đợi trước ',' mã thông báo

Trong cửa sổ mã thực tế, mọi biểu tượng đều được gắn cờ là "mã thông báo không mong muốn".

Trả lời

9

Trong trường hợp này, bạn thực sự không muốn một mảng 3D. Thực tế, vì bạn có một bảng , tất cả những gì bạn cần là một mảng 1D.

Phần khó khăn là mỗi phần tử của mảng cần lưu trữ hai điều: biểu tượng tiền tệ và tỷ giá hối đoái liên kết. C có cách xây dựng một loại lưu trữ hai thứ - đó là cơ chế struct. Chúng ta có thể định nghĩa một struct để giữ một đồng tiền duy nhất:.

struct currency { 
    char symbol[4]; 
    char value[5]; 
}; 

(Lưu ý rằng điều này không tạo ra một biến; nó tạo ra một loạistruct currency là analagous để char, ngoại trừ việc chúng tôi định nghĩa ý nghĩa của chính chúng ta trước đây).

... và bây giờ chúng ta có thể tạo ra một mảng của 5 trong số này:

struct currency currencies[5] = { 
    {"GBP", "1.5" }, 
    {"EUR", "1.23" }, 
    {"JPY", "0.11" }, 
    {"CAD", "0.96" }, 
    {"AUD", "0.87" } }; 

Để lặp qua chúng và in chúng ra, các mã sẽ trông như thế:

void displayarraycontents(void) 
{ 
    int point; 

    for(point = 0; point < 5; point++) 
    { 
     printf("%d %s %s\n", point + 1, currencies[point].symbol, currencies[point].value); 
    } 
} 
+0

Chà, mã này không chỉ hoạt động mà bạn vừa mới giải thích một cách hoàn hảo một khái niệm hoàn toàn mới với tôi theo cách mà tâm trí của người mới bắt đầu có thể hiểu được. Massive ngón tay cái lên, người đàn ông! Cảm ơn. :) – Ryan

+0

@Ryan: Bạn có chắc là bạn chưa thêm một '{' ở đâu đó? – caf

+0

Vâng, tôi khá chắc chắn. Kiểm tra phần dưới cùng của bài đăng cập nhật của tôi cho mã tôi đang sử dụng. – Ryan

1

Nó phải là

char currencies[3][5][5] = { 

vì nó chứa 3 danh sách có chứa 5 chuỗi mỗi.

Mỗi chuỗi có tối đa 4 ký tự, nhưng bạn cần ký tự NUL bổ sung, vì vậy 5 ở cuối.

- EDIT

Bạn có quyền truy cập mảng bị nhầm lẫn. Sử dụng định nghĩa mảng của bạn (cố định như trên), nó sẽ là tiền tệ [data_type] [index] để lấy một chuỗi.

  • data_type = 0 -> chỉ số
  • data_type = 1 -> biểu tượng
  • data_type = 2 -> giá trị

dòng đầu tiên

{'1','2','3','4','5'}, 

là dư thừa.

Sửa code:

char currencies[2][5][5] = { 
    {"GBP","EUR","JPY","CAD","AUD"}, 
    {"1.5","1.23","0.11","0.96","0.87"} 
}; 

void displayarraycontents() 
{ 
    int index; 
    for(index = 0;index < 5;index++) { 
     printf("%i %s %s\n", index, currencies[0][index], currencies[1][index]); 
    } 
} 
+0

Nhìn vào bình luận tiếp theo -.. Bạn cũng cần phải thay đổi 's để "s để làm cho họ hằng kí tự –

+0

tôi chỉnh sửa mã và thử nghiệm nó, nó hoạt động tại –

+0

Cảm ơn một người đàn ông bó, nó Một câu hỏi nhanh chóng mặc dù: 1. Tôi nhận thấy bạn đã đặt "void" trước tên chức năng của tôi. Tôi thấy "int" ở phía trước của chính là tốt; Tôi cho rằng điều này có liên quan đến Tôi có thể đặt "void" trước tất cả các chức năng của tôi không trả về giá trị? 2. Tôi không thể thực hiện theo "tiền tệ [0] [chỉ mục], tiền tệ [1] [chỉ mục "bit. Bạn có thể giải thích những gì đang diễn ra ở đó không? Tôi thấy chỉ số đó tăng lên nhưng có e là ba chiều cho mảng của tôi [2] [5] [5] và bạn chỉ tham chiếu hai. – Ryan

3

Bạn cần một để sửa kích thước mảng của bạn, và bạn cũng cần phải khai báo chuỗi của bạn như dây đàn, không phải là hằng số ký tự multibyte:

char currencies[3][5][5] = { 
    {"1","2","3","4","5"}, 
    {"GBP","EUR","JPY","CAD","AUD"}, 
    {"1.5","1.23","0.11","0.96","0.87"} 
}; 

Logic của bạn cho kích thước mảng là sai - những gì bạn muốn là 3 cột, mỗi cột có 5 mục, mỗi cột là một chuỗi dài 5 byte.

for vòng lặp của bạn nên chỉ số từ 0, không phải từ 1.

2

Ngoài ra còn có một oops in cho báo cáo:

for(point=1;point<5;point++) 

mục đầu tiên trong một mảng là 0 vị trí, vì vậy cho nên báo cáo như thế này:

for(point=0;point<5;point++) 
0

Trong C/C++, bạn thường đọc bộ trích dẫn mảng từ phải sang trái để có ý tưởng tốt về cách trình biên dịch sẽ nhìn thấy nó. Trong trường hợp này, bạn cần lưu trữ các chuỗi gồm 4 ký tự, mỗi ký tự cần lưu trữ 5 ký tự (để bao gồm dấu \ 0) do đó [5] sẽ là kích thước mảng. Tiếp theo bạn đang lưu trữ các nhóm 5 mục, do đó giá trị trung bình sẽ là [5] và cuối cùng, bạn đang lưu trữ tổng cộng 3 nhóm các mục này, do đó [3]. Kết quả cuối cùng của tất cả điều này là các loại tiền tệ [3] [5] [5] =. . .;

Tất nhiên, như được trả lời ở nơi khác, bạn cần phải sử dụng dấu ngoặc kép cho giá trị chuỗi.

0

Bạn không cần lưu trữ chỉ mục (1-5) vì bạn có thể truy cập mảng (0-4) và do đó biết chỉ mục. Bạn có thể đóng gói các giá trị khác trong một cấu trúc hoặc hai mảng riêng biệt để mảng của bạn xuống tới một chiều vì nó phải là ... Theo cách đó các mục có loại thích hợp và bạn không lạm dụng hai mảng hai chiều.

Không được lấp đầy khu vực 2D hoặc 3D với các mục phải thuộc loại khác, cần thiết khi bạn có các mục cùng loại và có cấu trúc 2D hoặc 3D logic. Các pixel trên màn hình của bạn là một ví dụ điển hình về thứ gì đó cần cấu trúc 2D, tọa độ trong biểu đồ 3D là một ví dụ điển hình về thứ gì đó cần cấu trúc 3D.

+0

Câu hỏi được * cụ thể là * về C, ** không ** C++; không công bằng với anh ta với STL và các nhà xây dựng. Anh ta sẽ chỉ tự hỏi tại sao nó sẽ không biên dịch. – Amadan

+0

Tôi không lưu ý chi tiết, điều chỉnh! Rất tiếc, tôi dành chút thời gian để loại ra điều đó ... –

0

Nếu bạn muốn giải quyết điều này với mảng đa chiều, như @Forrest nói, bạn cần [3][5][5]. Nhìn vào nó theo cách này: trong bộ khởi tạo, tìm các dấu ngoặc ngoài cùng: bên trong đó, ở cấp cao nhất, có bao nhiêu phần tử? 3. Bây giờ, mỗi phần tử trong số này (một cấp trong), có bao nhiêu phần tử? 5. Khoan sâu hơn, bên trong mỗi cái, bạn có một chuỗi gồm 4 phần tử, cộng với một phần tử cho terminator, một lần nữa 5.

Lỗi thứ hai: bạn chỉ có thể có một ký tự trong dấu nháy đơn, như 'a'; đó là loại char và tương đương với mã ASCII (97 trong trường hợp này). Đối với chuỗi, bạn phải sử dụng dấu ngoặc kép ("abc", tương đương với {97, 98, 99, 0}).

Lỗi thứ ba: vòng lặp. Bạn không thực sự lặp qua cả ba vòng trong khi in một chuỗi tại một thời điểm (vì printf sẽ thực sự thực hiện một trong các vòng cho bạn) - vì vậy bạn chỉ nên có 2 vòng (hoặc, kém hiệu quả hơn, bạn có thể giữ tất cả ba vòng, nhưng sau đó chỉ in một ký tự tại một thời điểm). Ngoài ra, bạn cần phải nhận thức được các giới hạn vòng lặp; bạn đang đi lên đến 5 trong mỗi trường hợp, nhưng điều này sẽ cung cấp cho bạn thời gian chạy rác (trong trường hợp tốt nhất) hoặc thời gian chạy vụ tai nạn (trong trường hợp xấu nhất) khi bạn đi ra khỏi kích thước [3] của bạn. Vì vậy, một cái gì đó như thế này:

Sau đó, một lần nữa, vòng lặp trong cùng của bạn không nhất quán trong việc sử dụng biến của bạn (lỗi sao chép-dán).

Tuy nhiên, gần như không bao giờ cần viết mã như thế này. Bạn chủ yếu sử dụng mảng 2D cho các hoạt động ma trận. Một cái gì đó như thế này chỉ nên có một mảng một chiều, lưu trữ các phần tử bản ghi.

struct currency { 
    int  id; 
    char[4] symbol; 
    float value; 
} currencies[5]; 
2

Nó sẽ có ý nghĩa hơn khi sử dụng struct s ở đây thay vì mảng đa chiều.

#include <stdio.h> 

typedef struct Currency { 
    const char* symbol; 
    double value; 
} Currency; 

Currency CURRENCIES[] = { 
    {"GBP", 1.5}, 
    {"EUR", 1.23}, 
    {"JPY", 0.11}, 
    {"CAD", 0.96}, 
    {"AUD", 0.87}, 
}; 
size_t NUM_CURRENCIES = sizeof(CURRENCIES)/sizeof(Currency); 

int main() 
{ 
    size_t index; 

    for (index = 0; index < NUM_CURRENCIES; index++) 
    { 
     printf("%zu %s %.2f\n", 
     index + 1, CURRENCIES[index].symbol, CURRENCIES[index].value); 
    } 

    return 0; 
} 
Các vấn đề liên quan