C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   無題   
     ・[1398] Justy 
     ・[1399] Justy 
     ・[1400] 宿題で困っています。 
     ・[1401] Justy 
     ・[1402] 宿題で困ってます。 
     ・[1403] Justy 
     ・[1404] 宿題で困ってます。 
     ・[1405] Justy 
     ・[1407] 宿題で困ってます。 
     ・[1413] miki 
     ・[1429] Justy 
     ・[1455] 宿題で困ってます。 
     ・[1456] box 
     ・[1457] 管理人 
     ・[1465] 宿題で困ってます。 
     ・[1467] box 
     ・[1468] 管理人 
     ・[1469] box 
     ・[1497] 宿題で困ってます。 
     ・[1503] 管理人 
     ・[1586] 宿題で困ってます。 
     ・[1690] 宿題で困ってます。 
     ・[1691] バグ 
     ・[1692] なぎ 
     ・[1693] GPGA 
     ・[1694] 宿題で困ってます。 
     ・[1695] なぎ 
     ・[1696] keichan 
     ・[1697] keichan 
     ・[1698] GPGA 
     ・[1837] 宿題で困ってます。 
     ・[1838] なぎ 
     ・[1840] 宿題で困ってます。 
     ・[1933] 宿題で困ってます。 
     ・[1934] 管理人 
   DxLibを使用したプロジ ....   
     ・[1834] 管理人 
     ・[1835] Justy 
     ・[1836] 管理人 
     ・[1841] 管理人 
     ・[1842] Justy 
     ・[1843] 管理人 
     ・[1847] Justy 
   再帰の例としての「ハ ....   
     ・[1844] 管理人 
   小さい順に並び替える   
     ・[1746] 管理人 
     ・[1747] ☆ 
     ・[1748] 管理人 
     ・[1749] ☆ 
     ・[1750] 管理人 
     ・[1751] 管理人 
     ・[1752] ☆ 
     ・[1753] ☆ 
     ・[1754] 管理人 
     ・[1755] box 
     ・[1756] ☆ 
     ・[1757] 管理人 
     ・[1758] 管理人 
     ・[1759] 管理人 
     ・[1760] ☆ 
     ・[1762] 管理人 
     ・[1763] 管理人 
     ・[1764] ☆ 
     ・[1765] ☆ 
     ・[1766] 管理人 
     ・[1767] 管理人 
     ・[1768] 管理人 
     ・[1769] 管理人 
     ・[1782] 管理人 
     ・[1784] 管理人 
     ・[1790] ☆ 
     ・[1792] 管理人 
     ・[1794] ☆ 
     ・[1798] 管理人 
     ・[1805] 管理人 
     ・[1807] なぎ 
     ・[1810] 管理人 
     ・[1811] ぽん太 
     ・[1813] 管理人 
     ・[1820] box 
     ・[1821] ぽん太 
     ・[1822] box 
     ・[1823] ぽん太 
     ・[1824] 管理人 
     ・[1826] ぽん太 
     ・[1827] 管理人 
     ・[1828] ぽん太 
     ・[1829] 管理人 
     ・[1830] ぽん太 
     ・[1831] なぎ 
     ・[1833] 管理人 
   クイックソート解説ア ....   
     ・[1808] ぽん太 
     ・[1812] 管理人 
     ・[1817] 管理人 
     ・[1818] ぽん太 
     ・[1819] 管理人 
     ・[1825] 管理人 
   CUBE   
     ・[1557] 管理人 
     ・[1559] ぽん太 
     ・[1561] 管理人 
     ・[1562] 管理人 
     ・[1563] ぽん太 
     ・[1565] 管理人 
     ・[1566] ぽん太 
     ・[1567] 管理人 
     ・[1569] ぽん太 
     ・[1571] 管理人 
     ・[1572] ぽん太 
     ・[1573] 管理人 
     ・[1574] ぽん太 
     ・[1575] 管理人 
     ・[1576] 管理人 
     ・[1577] 管理人 
     ・[1578] 管理人 
     ・[1579] ぽん太 
     ・[1580] 管理人 
     ・[1581] ぽん太 
     ・[1582] 管理人 
     ・[1583] 管理人 
     ・[1584] ぽん太 
     ・[1585] 管理人 
     ・[1587] ぽん太 
     ・[1588] 管理人 
     ・[1590] ぽん太 
     ・[1591] 管理人 
     ・[1592] 管理人 
     ・[1593] ぽん太 
     ・[1594] ぽん太 
     ・[1595] 管理人 
     ・[1596] 管理人 
     ・[1597] 管理人 
     ・[1598] ぽん太 
     ・[1599] 管理人 
     ・[1600] 管理人 
     ・[1601] ぽん太 
     ・[1602] 管理人 
     ・[1603] 管理人 
     ・[1604] ぽん太 
     ・[1605] 管理人 
     ・[1606] ぽん太 
     ・[1607] ぽん太 
     ・[1608] 管理人 
     ・[1609] ぽん太 
     ・[1610] 管理人 
     ・[1611] 管理人 
     ・[1612] 管理人 
     ・[1613] 管理人 
     ・[1614] ぽん太 
     ・[1615] 管理人 
     ・[1616] ぽん太 
     ・[1617] 管理人 
     ・[1618] ぽん太 
     ・[1619] 管理人 
     ・[1620] ぽん太 
     ・[1621] 管理人 
     ・[1622] 管理人 
     ・[1623] ぽん太 
     ・[1624] 管理人 
     ・[1625] ぽん太 
     ・[1626] 管理人 
     ・[1627] ぽん太 
     ・[1628] 管理人 
     ・[1629] ぽん太 
     ・[1630] ぽん太 
     ・[1631] 管理人 
     ・[1632] 管理人 
     ・[1633] ぽん太 
     ・[1634] ぽん太 
     ・[1635] 管理人 
     ・[1636] ぽん太 
     ・[1637] 管理人 
     ・[1638] 管理人 
     ・[1639] 管理人 
     ・[1640] ぽん太 
     ・[1641] 管理人 
     ・[1642] ぽん太 
     ・[1643] ぽん太 
     ・[1644] 管理人 
     ・[1645] ぽん太 
     ・[1646] 管理人 
     ・[1647] 管理人 
     ・[1648] ぽん太 
     ・[1649] ぽん太 
     ・[1650] 管理人 
     ・[1651] ぽん太 
     ・[1655] 管理人 
     ・[1658] ぽん太 
     ・[1659] 管理人 
     ・[1661] ぽん太 
     ・[1662] 管理人 
     ・[1663] 管理人 
     ・[1664] ぽん太 
     ・[1665] 管理人 
     ・[1666] 管理人 
     ・[1667] ぽん太 
     ・[1668] 管理人 
     ・[1669] ぽん太 
     ・[1670] 管理人 
     ・[1671] ぽん太 
     ・[1672] 管理人 
     ・[1673] 管理人 
     ・[1674] 管理人 
     ・[1675] 管理人 
     ・[1676] 管理人 
     ・[1677] 管理人 
     ・[1678] 管理人 
     ・[1679] ぽん太 
     ・[1680] ぽん太 
     ・[1681] 管理人 
     ・[1682] 管理人 
     ・[1683] ぽん太 
     ・[1684] ぽん太 
     ・[1685] 管理人 
     ・[1686] 管理人 
     ・[1687] ぽん太 
     ・[1688] 管理人 
     ・[1689] 管理人 
     ・[1700] ぽん太 
     ・[1702] 管理人 
     ・[1703] ぽん太 
     ・[1704] 管理人 
     ・[1705] ぽん太 
     ・[1706] 管理人 
     ・[1707] ぽん太 
     ・[1708] 管理人 
     ・[1709] ぽん太 
     ・[1710] 管理人 
     ・[1711] 管理人 
     ・[1712] ぽん太 
     ・[1713] 管理人 
     ・[1714] 管理人 
     ・[1715] ぽん太 
     ・[1716] 管理人 
     ・[1717] ぽん太 
     ・[1718] ぽん太 
     ・[1719] 管理人 
     ・[1720] ぽん太 
     ・[1721] 管理人 
     ・[1722] 管理人 
     ・[1723] 管理人 
     ・[1724] ぽん太 
     ・[1725] 管理人 
     ・[1726] ぽん太 
     ・[1727] 管理人 
     ・[1728] ぽん太 
     ・[1729] 管理人 
     ・[1731] 管理人 
     ・[1732] ぽん太 
     ・[1736] 管理人 
     ・[1741] ぽん太 
     ・[1742] 管理人 
     ・[1743] ぽん太 
     ・[1745] 管理人 
     ・[1761] ぽん太 
     ・[1770] 管理人 
     ・[1771] 管理人 
     ・[1772] ぽん太 
     ・[1773] ぽん太 
     ・[1774] 管理人 
     ・[1775] ぽん太 
     ・[1776] 管理人 
     ・[1777] ぽん太 
     ・[1778] ぽん太 
     ・[1779] 管理人 
     ・[1780] ぽん太 
     ・[1781] 管理人 
     ・[1783] ぽん太 
     ・[1785] 管理人 
     ・[1786] ぽん太 
     ・[1787] 管理人 
     ・[1789] ぽん太 
     ・[1791] 管理人 
     ・[1795] ぽん太 
     ・[1796] 管理人 
     ・[1797] 管理人 
     ・[1799] ぽん太 
     ・[1800] 管理人 
     ・[1801] ぽん太 
     ・[1802] 管理人 
     ・[1803] ぽん太 
     ・[1804] 管理人 
     ・[1809] ぽん太 
     ・[1814] 管理人 
     ・[1815] ぽん太 
     ・[1816] 管理人 
   COLOR_DROP関連スレ   
     ・[1560] 管理人 
     ・[1564] 管理人 
     ・[1568] バグ 
     ・[1570] 管理人 
     ・[1657] バグ 
     ・[1660] 管理人 
     ・[1699] バグ 
     ・[1701] 管理人 
     ・[1735] バグ 
     ・[1737] 管理人 
     ・[1788] バグ 
     ・[1793] 管理人 
   DXライブラリ導入編☆   
     ・[1733] ぽん太 
     ・[1734] バグ 
     ・[1738] 管理人 
     ・[1739] keichan 
     ・[1740] 管理人 
   サイコロコロコロ-スコ ....   
     ・[1530] バグ 
     ・[1531] 管理人 
     ・[1558] 管理人 
     ・[1656] 管理人 
     ・[14991172764660] むつ 
   コンパイラについて   
     ・[1539] 管理人 
     ・[1540] ぽん太 
     ・[1542] 管理人 
     ・[1543] ぽん太 
     ・[1544] 管理人 
     ・[1545] 管理人 
     ・[1546] 管理人 
     ・[1548] ぽん太 
     ・[1549] 管理人 
     ・[1551] なぎ 
     ・[1552] 管理人 
     ・[1652] keichan 
     ・[1653] なぎ 
     ・[1654] 管理人 
   新ゲームダウンロード ....   
     ・[1489] バグ 
     ・[1500] 管理人 
     ・[1516] Justy 
     ・[1517] 管理人 
     ・[1518] 管理人 
     ・[1519] Justy 
     ・[1520] 管理人 
     ・[1521] 管理人 
     ・[1522] Justy 
     ・[1523] 管理人 
     ・[1524] 管理人 
     ・[1525] 管理人 
     ・[1526] バグ 
     ・[1527] 管理人 
     ・[1528] バグ 
     ・[1529] 管理人 
     ・[1553] Justy 
     ・[1554] 管理人 
   Cのライブラリについて ....   
     ・[1541] 管理人 
     ・[1547] 暇人 
     ・[1550] 管理人 
   関数について   
     ・[1533] なぎ 
     ・[1534] バグ 
     ・[1535] ぽん太 
     ・[1537] バグ 
   質問投稿削除時の回答 ....   
     ・[1513] 管理人 
     ・[1514] box 
     ・[1515] 管理人 
   カラフルドロップ-スコ ....   
     ・[1493] 管理人 
     ・[1498] みみっく 
     ・[1504] 管理人 
     ・[1505] Justy 
     ・[1506] 管理人 
     ・[1508] ミレイユ 
     ・[1512] 管理人 
   質問・・・   
     ・[1501] 管理人 
     ・[1502] 管理人 
     ・[1507] ユウ 
     ・[1511] 管理人 
   構造体のメンバのint ....   
     ・[1495] box 
     ・[1509] k 
   はじめまして 教えてく ....   
     ・[1487] みみっく 
     ・[1490] box 
     ・[1491] win 
   質問です・・・   
     ・[1451] 管理人 
     ・[1459] ユウ 
     ・[1460] 管理人 
     ・[1461] 管理人 
     ・[1462] 管理人 
     ・[1478] ユウ 
     ・[1480] 管理人 
     ・[1482] ユウ 
     ・[1483] 管理人 
     ・[1484] ユウ 
     ・[1485] 管理人 

Name: 宿題で困ってます。  ..ぴよぴよ(38ポイント)   Date: 2006/11/04(土) 12:04   No:1397       
Title: 無題    
英単語を各行に1語ずつ入力し、単語が何回ずつ出現したかの頻度を出力しなさい。また、単語を辞書式順序で出力しなさい。という問題なんですが、期限が今日中なのですごくあせっています。

双方向リスト、バブルソートを使うのが条件なのですが、どのようにしたらいいでしょうか。 助けてください。


38ポイント を手に入れた。


Name: Justy  ..上級者(19,490ポイント)   Date: 2006/11/04(土) 16:50   No:1398     
Title: Re:無題    
 今日提出のものを今日掲示板で訊いてもなかなか難しいものがあります。
 細かいことも聞けないですし、そもそも双方が理解する為の時間も足りません。

 時間がないとのことなので、回答をそのまま載せます。
 ただ、入力は実行時にキーボードで入力していいのかどうか、何をもって入力の終了とするのかわからなかったので、そのあたりは適当に作ってあります。
 又、どこまで習っているのかわかりませんが、双方向リストが出てくる位なので関数・ポインタ・構造体は履修済みと考えました。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// 単語の最大文字数
#define WORD_STRING_MAX 32

// 数値を文字列化するマクロ
#define VALUE_STR_(v) #v
#define VALUE_STR(v) VALUE_STR_(v)


// 単語構造体
typedef struct WordList
{
char word[WORD_STRING_MAX+1];
int count;
struct WordList * next;
struct WordList * prev;
} WordList;

// 辞書構造体
typedef struct Dictionary
{
int list_num; // 登録単語数
WordList *list; // 単語リスト
} Dictionary;

// 辞書の実体
static Dictionary gDictionary;


// ----- 辞書の初期化
static void InitializeDictionary(void)
{
gDictionary.list_num = 0;
gDictionary.list = NULL;
}

// ----- 辞書の破棄
static void DestroyDictionary(void)
{
WordList * curr = gDictionary.list;
while(curr)
{
WordList *next = curr->next;
free(curr);
curr = next;
};
}

// ---- 辞書から単語を検索する
static WordList *FindWordDictionary(const char *word)
{
WordList *curr = NULL;

// NULLチェック
if(word)
{
curr = gDictionary.list;
while(curr)
{
if(!strcmp(curr->word, word))
break;
curr = curr->next;
};
}
return curr;
}

// ----- 辞書に単語を追加
static void InsertDictionary(const char *word)
{
WordList *wordList;

// NULLチェック
if(!word) return;

// 既に単語があるかどうか
wordList = FindWordDictionary(word);
if(wordList)
wordList->count++;
else
{
// Dictionary領域確保
wordList = (WordList*)malloc(sizeof(WordList));

// リスト繋ぎ買え
if(gDictionary.list)
{
gDictionary.list->prev = wordList;
wordList->next = gDictionary.list;
wordList->prev = NULL;
gDictionary.list = wordList;
}
else
{
gDictionary.list = wordList;
wordList->prev = wordList->next = NULL;
}

// 数と単語を設定
gDictionary.list_num++;
strcpy(wordList->word, word);
wordList->count = 1;
}
}

// ----- 辞書のソート(バブル)
static void SortDictionary(void)
{
int count, loop_count;

// 単語数が0ならスキップ
if(gDictionary.list_num <= 0)
return;

loop_count = gDictionary.list_num;

while(--loop_count)
{
WordList *curr = gDictionary.list;
count = 0;
while(curr->next && count < loop_count)
{
WordList *next = curr->next;
if(strcmp(curr->word, next->word) > 0)
{
next->prev = curr->prev;
curr->next = next->next;
if(curr->prev) curr->prev->next = next;
if(next->next) next->next->prev = curr;
curr->prev = next;
next->next = curr;
if(gDictionary.list == curr)
gDictionary.list = next;
}
else
curr = next;
++count;
};
}
}

// 辞書の内容を出力
static void DispDictionary(void)
{
WordList * wordList = gDictionary.list;
int index = 0;
while(wordList)
{
printf("%4d : %s -> %2d time%c\n",
++index, wordList->word, wordList->count,
wordList->count>1?'s': ' ');
wordList = wordList->next;
}
}

 まだ続きます


2,285ポイント を手に入れた。

Name: Justy  ..上級者(20,375ポイント)   Date: 2006/11/04(土) 17:01   No:1399     
Title: Re:無題    


// ----- 単語を1つ入力し、辞書に追加する(アルファベット以外が入力されたら終了)
static int InputWord(void)
{
char buff[WORD_STRING_MAX];
int ret;

// 単語入力
ret = scanf("%" VALUE_STR(WORD_STRING_MAX) "s", buff);

// 終了
if(ret != 1 || !isalpha(buff[0]))
return 0;

// 辞書に追加
InsertDictionary(buff);

return 1;
}

// ----- 単語を複数回入力する
static void LoopInputWord(void)
{
do
{
printf("Input word > ");
}
while(InputWord());
}

// ----- メイン関数
int main(void)
{
// 辞書情報を初期化
InitializeDictionary();

// 単語を入力
LoopInputWord();

// 辞書をソート
SortDictionary();

// 出力
DispDictionary();

// 辞書の破棄
DestroyDictionary();

return EXIT_SUCCESS;
}


 
 かなり長く、又初心者の方にはかなり難しい内容になってしまいました。

 構造体は2つ作っています。単語の情報用とその単語を集めた"辞書"の情報用です。
 全体の流れは main関数を見ればわかると思います。
 単語の入力の終了は最初の文字がアルファベット以外を入力したとき(isalpha()で判定)です。

 これで全部ですが、問題の求めるところと異なるところがありましたら、宿題で困ってます。さんの方で適当に直してみてください。


※ ポインタの繋ぎ換えなんて久々だったので、間違えていないか心配・・・


885ポイント を手に入れた。

Name: 宿題で困っています。  ..ぴよぴよ(80ポイント)   Date: 2006/11/04(土) 19:20   No:1400     
Title: Re:無題    
本当にありがとうございます。
無理を言ってすいませんでした。
10時間以上いろいろ調べたり考えたりしたのですが解決できなくて。。
授業がわからなくて、パソコン教室に通おうかどうかくらい悩んでいたのですが、とりあえず印刷したり、写したりしながら考えます。
このソースのわからないところや、授業でわからないところなどこれからもちょくちょく質問しても良いでしょうか?



80ポイント を手に入れた。

Name: Justy  ..上級者(20,596ポイント)   Date: 2006/11/04(土) 22:33   No:1401     
Title: Re:無題    
>本当にありがとうございます。
 いえいえ、どういたしまして。

>悩んでいたのですが、とりあえず印刷したり、写したりしながら考えます。
 頑張ってください。

>このソースのわからないところや、授業でわからないところなど
>これからもちょくちょく質問しても良いでしょうか?

 (私から言うことではないですが)勿論良いと思います。
 ここはその為の掲示板ですから。


221ポイント を手に入れた。

Name: 宿題で困ってます。  ..ぴよぴよ(608ポイント)   Date: 2006/11/05(日) 12:35   No:1402     
Title: Re:無題    

下記は参考書に書いてあったプログラムの質問したい部分で、必要な部分だけ写したものですが、(写し間違えてたらすいません)
@〜Dの疑問があるのですが、教えていただけないでしょうか?


typedef struct Person2 {
char name[40];
int age;
struct person2 *prev;
struct person2 *next;
} Person2;

Person head, tail;

void ls_addFirst(char *nm, int ag) /*@なぜ、ここのnmには*がついているのでしょうか?山田次郎という文字はポインタということでしょうか?*/
{
Person *dt; /*AここではPersonという構造体のポインタをとりあえず*dtにしたということでしょうか?head、tailという二つの構造体を宣言しているのに、ポインタとheadやtailというのは関係ないということでしょうか?*/
dt=psn_malloc(nm,ag);
if(head.next==NULL) tail.prev=dt;

dt->next=head.next;
head.next=dt;/*Bhead.nextと書くのとhead->nextと書くのはどう違いますか?*/

if(dt->next!=NUJLL) dt->next->prev=dt;
}

Person2 *psn_malloc(char *nm, int ag)/*Cpsn_mallocの前に*がついているのは、dtがポインタだからですよね?*/
{
person2 *p;
if((p=(person*)malloc(sizeof(Person2)))=NULL) {
printf("メモリ確保できません\n");exit(1);
strcpy(p->name, nm);/*D既にchar *nmでnmをポインタということにしているので、ここのnmには前に*をつけなくてもポインタということですよね?*/
p->age=ag;
p->prev=p->next=NULL;
return p;
}

int main(void)
{
head.next=tail.prev=NULL;
ls_addFirst("山田次郎",22);
return 0;
}


570ポイント を手に入れた。

Name: Justy  ..上級者(21,602ポイント)   Date: 2006/11/05(日) 14:06   No:1403     
Title: Re:無題    
>@なぜ、ここのnmには*がついているのでしょうか?
>山田次郎という文字はポインタということでしょうか?

 そうです。文字列へのポインタだからです。
 C言語では
    char *name = "山田次郎";
 と書くことができます。


>AここではPersonという構造体のポインタをとりあえず*dtにしたということでしょうか?
>head、tailという二つの構造体を宣言しているのに、ポインタとheadやtailというのは関係ないということでしょうか?

 dtは一時的に Person2の情報を扱いたい為に、ローカル変数で宣言しています。
 psn_malloc()の関数の戻り値を受け、直後の head/tailの中身を変更するために一時的に必要になった変数と考えてください。

 "dt"という名前がどこから来ているのかは判りませんが(data temporaryかも!?)、規定の範囲内なら自由に名前を付けられるので、とりあえず dtと名付けたのでしょう。


>Bhead.nextと書くのとhead->nextと書くのはどう違いますか?
 head->nextはコンパイルエラーになります。
 head変数はポインタ型ではありません。ポインタ型の構造体の変数がメンバ変数(prev/nextとか)にアクセスする場合は -> を使いますが、head/tailのようにポインタ型ではない実体の型の場合は .でアクセスします。

例)
    Person2 A;

Person2 *pA = &A;
strcpy(pA->name, "山田次郎");
printf("%s\n", A.name); // 実体からアクセス
printf("%s\n", pA->name); // ポインタからアクセス

 

>Cpsn_mallocの前に*がついているのは、dtがポインタだからですよね?
 そうですね。
 厳密にどっちが先かはともかく、psn_malloc()の戻り値の型と代入先 dtの型は一致させなければいけませんので。


>D既にchar *nmでnmをポインタということにしているので、
>ここのnmには前に*をつけなくてもポインタということですよね?

 そうです。 *をつけてポインタ型として宣言した変数はずっとポインタ型です。


 と、こんな感じでしょうか。


1,006ポイント を手に入れた。

Name: 宿題で困ってます。  ..ぴよぴよ(821ポイント)   Date: 2006/11/06(月) 00:22   No:1404     
Title: Re:無題    
なるほど。ものすごくわかりやすかったです。
Justyさんに直接お礼が言えないのが残念です。

実体とポインタの違いはだいたいわかった気がします。

例は、
Person2 *pA;
Person2 A;
pA=&A;
strcpy(A.name,"山田次郎");
と書いても同じですよね?


それと
Person2 *p;
  for(p=&head; p->next->next!=NULL; p=p->next)

のようなfor文というのは、

  Person2 tmp;
for(tmp=head; tmp.next.next!=NULL; tmp=tmp.next)

のように実体を使って書くことはできますか?