おまいら!今日からC言語を学んでいくぞー!パート2
1 :
ポポ巣 ◆Qgm8RFT0/. :
2005/10/07(金) 07:23:58 おはようー! あたいのスペックは 26歳フリーター、パソコン歴インターネット歴は6年 しかしそれ以外の事は何もできにゃーい… というわけで今日から参考書を買ってがんばります! 今まさに私みたいに、これからCを勉強するぞって人いたら よろしくね!!! 前スレが一杯になりそうなので新しく作りました☆ 今日でC言語歴約2週間です^^; 簡単な文字の表示はできるようになったんですが 進むペースは亀さん並に遅いので、ゆっくり見守ってね(><。) もっと容量のいい頭がほしいー(><。)
2 :
デフォルトの名無しさん :2005/10/07(金) 07:32:25
2gets 前スレ進むの早!!
ム板にしては消費早いな
>もっと容量のいい頭 「もっと要領のいい頭」の誤変換か、「もっと容量の大きい頭」の書き間違いのどちらなんだろう。 #いずれにしろ、要領が悪いか、脳味噌が足りないという自覚はあるわけだな。
超簡単なネットワークプログラムの問題お願いします
それが出来たら通信処理の非同期化にチャレンジ
「猫でもわかる」を見ながら挑戦してるけど なかなか難しいぽ
12 :
変な人 :2005/10/07(金) 15:23:09
とりあえずCを始めてみた今日この頃
>>1 コテハン、私的なスレは自己紹介板・最悪板・夢・独り言板・おいらロビー・なんでもあり板・
PINKのなんでもあり板以外では、原則として全て削除または移動対象です。
スレ立ての内容はくだらない議論にならないような内容にしてください
猿スレや下級者スレなど類似スレが多いから、そっちでやれよって感じだよなー。 C言語のスレ、この板だけで何個あるんだよ。
猿スレってのをちょっと覗いてみたけど何だあれは・・・
SuperCon課題レベルの、高度なC言語の問題が沢山載った本を、どなたがご存じないでしょうか?
せっかく前スレが良い空気だったんだから喧嘩しないでくれ。
問題まだぁ〜?
20 :
デフォルトの名無しさん :2005/10/07(金) 18:47:10
非同期の意味がわからん UDPでGoogleのHTMLをダウンロードしたらいいのか?
めちゃイイサイトですね これから読んでみます
26 :
デフォルトの名無しさん :2005/10/07(金) 19:21:06
>>21 多分リクエストの不備だろ。
投げたリクエスト書いてみ。
>>22 同期って関数が終わるまで制御が帰ってこない事よ
>>9 #pragma comment(lib, "WinInet.lib")
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string.h>
int main()
{
const char *filename="google.html";
HINTERNET hInet, hUrl;
char buf[32000];
DWORD len;
FILE *fp;
hInet=InternetOpen("google get program", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
hUrl=InternetOpenUrl(hInet, "
http://www.google.co.jp/ ", NULL, 0,0,0);
fp=fopen(filename, "w");
while (true)
{
InternetReadFile(hUrl, buf, sizeof buf-1, &len);
/*
*/ if (len==0) break; buf[len]='\0'; fprintf(fp, "%s", buf); } InternetCloseHandle(hUrl); InternetCloseHandle(hInet); fclose(fp); return 0; } //EOF
30 :
デフォルトの名無しさん :2005/10/07(金) 19:37:35
猫でもわかるネットワークプログラミング買ってきた
やっぱrecv関数のとこでエラーが出る
コードが悪いのかorz
もう諦めた
>>30 ありがとうございました
「UNIXネットワークプログラミング」はその名の通りwindows環境でのネットワークプログラミングには向かない?
ポポ素たん結婚してー
セックスして〜
>>32 コードを晒してくれないと悪い部分も指摘できない罠
37 :
デフォルトの名無しさん :2005/10/07(金) 20:48:10
はいわろすわろす
>>9 #pragma comment (lib, "WSock32.lib")
#define WIN32_LEAN_AND_MEAN
#define MAJORVERSION 2
#define MINORVERSION 2
#define SERVER "www.google.co.jp"
#define PORT 80
#define FILENAME "google.txt"
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
int main()
{
WSADATA wsaData;
SOCKET Socket;
LPHOSTENT lpHostEnt;
SOCKADDR_IN SockAddR_In;
FILE *fp;
char RecvStr[255];
char SendStr[255];
int err;
err=WSAStartup(MAKEWORD(MAJORVERSION, MINORVERSION), &wsaData);
if (err != 0)
{
printf("エラーコード %d\n", err);
/*
*/ switch (err) { case WSASYSNOTREADY: printf("ネットワークサブシステムがネットワークへの接続を準備できていない\n"); break; case WSAVERNOTSUPPORTED: printf("要求されたwinsockのバージョンがサポートされていない\n"); break; case WSAEINPROGRESS: printf("ブロッキング操作の実行中であるか、またはサービスプロバイダがコールバック関数を処理している\n"); break; case WSAEPROCLIM: printf("winsockが処理できる最大プロセス数に達した\n"); break; case WSAEFAULT: printf("第二引数であるlpWSAData は有効なポインタではない\n"); break; default: printf("原因不明\n"); } return 1; } else { /*
*/ printf("正常に初期化できました\n"); } Socket=socket(PF_INET, SOCK_STREAM, 0); if (Socket == INVALID_SOCKET) { printf("ソケットが開けませんでした\n"); return 2; } lpHostEnt=gethostbyname(SERVER); if (lpHostEnt == NULL) { printf("サーバーが見つかりませんでした\n"); return 3; } memset( &SockAddR_In, 0, sizeof(SockAddR_In) ); SockAddR_In.sin_family = AF_INET; SockAddR_In.sin_port = htons(PORT); SockAddR_In.sin_addr = *((LPIN_ADDR)*lpHostEnt->h_addr_list); if ( connect(Socket, (PSOCKADDR)&SockAddR_In, sizeof(SockAddR_In)) !=0) { printf("ソケット接続失敗しました\n"); /*
*/ return 4; } sprintf(SendStr, "GET %s HTTP/1.0\n\n", SERVER); printf("%s を送信します\n", SendStr); send(Socket, SendStr, strlen(SendStr), 0); fp=fopen(FILENAME, "w"); printf("受信中"); while (1) { printf("."); err=recv(Socket, RecvStr, sizeof(RecvStr)-1, 0); printf("%d",err); fprintf(fp, "%s", RecvStr); if (err == 0) { break; } } fclose(fp); printf("\n終了処理開始\n"); if ( shutdown(Socket, SD_BOTH) != 0) { printf("シャットダウンに失敗しました\n"); return 5; } /*
*/ closesocket(Socket); err=WSACleanup(); if (err == SOCKET_ERROR) { printf("リソース解放失敗\n"); } else { printf("リソース解放成功\n"); } return 0; } //EOF
>>42 GETで指定するのは相対パスだから、
www.google.co.jp:80に接続したら
GET / HTTP/1.0
でルートを取得できる
44 :
38 :2005/10/07(金) 21:52:32
質問が2つあります 1.保存したファイル(google.txt)が文字化けして読めません 秀丸でエンコードにUTF-8やSJISを指定して開いても フフフフフフフフという文字があちこちに表示されました どうすれば文字化けしないファイルを作れますか? 2.「GET / HTTP/1.0」を指定すると「HTTP/1.0 302 Found」になりました 何が起きているのでしょうか? 「ページが一時的に別の場所に用意されていることを意味する」とのことですが このエラーが出る心当たりがありません 変わりに「/Top/World/Japanese/」としてみたところ正常にダウンロードできました よろしくお願いします
IEとか普通のブラウザでgoogleにアクセスして その時のログ取ってそっくり真似ればいいんだが Cとは関係ない話だし
知ってるけどCとはぜんぜん関係ない話だし
>>47 IEたちが何やってるか、パケットキャプチャ使ったり自作Proxyもどきを作ってみ
Firefox使ってるならLive HTTP Headers入れるのが楽だね。 HTTP1.1にして、Host、User-Agent、Connectionを送信してやるといいと思われ。
52 :
38 :2005/10/07(金) 23:46:24
sprintf(SendStr, "GET / HTTP/1.0\nHost: www.google.co.jp\n\n"); これで302が出なくなりました HTTP1.1だと切断されなくなったのでとりあえず避けました
53 :
デフォルトの名無しさん :2005/10/07(金) 23:56:43
Undefined first referenced symbol in file sqrt review6.o ld: fatal: Symbol referencing errors. No output written to review6.exe コンパイル通すとこぅなるんですけど原因何かわかありますか??
>>23 も
>>52 のようにするとエラーが出なくなりました
もうちっとネットワーク自体について勉強しないとダメぽorz
>>54 念のため、規格で決まっている改行コードは\r\nだから
Apacheのように多少融通が利くサーバーでは一応動くけれど
"GET / HTTP/1.0\r\nHost: www.google.co.jp\r\n\r\n"
にした方がいいと思うYO
おまえら人様のサーバでテストプログラム撃つな 自分のPCにでもサーバ立ててやれ 非常識にもほどがある
そういうことはそこらのsocket解説サイトに言ってくれ
非常識の正当化?
みんなコンソール系のプログラムなのかな? [問題] 実行するプログラム自身の名前を表示する 例)Winならコマンドプロンプトで、作ったプログラム apl.exe を実行すると 私の名前は apl.exe です。 と表示する。次に ren apl.exe apple.exe をして、apple.exe を実行すると 私の名前は apple.exe です。 と表示する。他に適当な名前に ren してもそれが表示されること。 (unix系なら ren は mv で。あとプログラムの名前も〜.exeとはしないな...)
激しくWin限定ス #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { printf("私の名前は %s です。", strrchr(argv[0], '\\')+1); return 0; }
Win限定どころかコンパイラでも違うな
依存しまくりの出題はいかがなものかと・・・ 出題者の模範解答を見てみたいものだ
それで思ったんだけど、今までの問題にも模範解答を用意して wikiの解答ページにまとめてみるってのは需要あるかな?
>>65 神キタ━━━━━━(゚∀゚)━━━━━━ !!
>>65 そういう事は、思い立ったら速やかに黙ってやれ。
ぶっちゃけおまいの自己満足の世界なんだから。
>>60 の解き方考え中なんだけど、基本的にargv[0]って定義されてないんだよね?
だから仕様にそった回答は不可能
で、メジャーなコンパイラや環境に対応すればほぼ正解としてみる
軽くググった感じじゃファイル名かフルパスのどちらかしかない←これが大前提
そこでargv[0]末尾からファイル名らしき部分を抜き出してみる
これでほぼ正解じゃね?どうよ
↓68の模範解答
>>60 の解答みたいだけど2chネラー向きの
ファイル名表示ソフトつーのを作ってみるわ
もちろんWindowsネイティブな。少しまちなー
おまいらソース出さないと何も言わないし ソース出しても碌なこと言わないな
メジャーというとWindowsとMacとUNIXくらいか? MacOS9のも頼むな
winならGetModuleFileName使えば解決だと思われ。 win32apiは駄目? そうですか。
まあ環境依存の問題はNGってことで。
76 :
74 :2005/10/08(土) 09:35:02
一応winならコンパイラにも依存しない
>>60 の回答
#include <stdio.h>
#include <windows.h>
int main(){
char name[MAX_PATH]={0};
GetModuleFileName(GetModuleHandle(0),name,MAX_PATH);
printf("私の名前は%sです",strrchr(name,'\\')+1);
return 0;
}
はいはい次次
>>76 GetModuleFileName(0, で平気のはず。
78 :
74 :2005/10/08(土) 09:55:17
建前だ建前。
Linuxはargv[0]の結果って統一されてるの?ディストリ依存?
>>70 >もちろんWindowsネイティブな。
ハゲワロス
>>60 cygwin入れてgcc使ってる環境では単純に下のでできた。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
printf("私の名前は %s です。\n", argv[0]);
return 0;
}
ポポ巣たん結婚してー
>>60 仕様に沿った解答
#include <stdio.h>
int main(int argc, char ** argv)
{
if (argc && argv[0][0] != '\0') {
printf("私の名前は %s です。\n", argv[0]);
} else {
printf("無理\n");
}
return 0;
}
85 :
デフォルトの名無しさん :2005/10/08(土) 16:48:41
>>
http://pc8.2ch.net/test/read.cgi/tech/1127501670/973 #include <stdio.h>
int main()
{
printf("int %d\n", sizeof(int));
printf("short %d\n", sizeof(short));
printf("long %d\n", sizeof(long));
printf("float %d\n", sizeof(float));
printf("double %d\n", sizeof(double));
printf("wchar_t %d\n", sizeof(wchar_t));
printf("char %d\n", sizeof(char));
return 0;
}
本とググって見つけたのはこれで全部
これ以上の型は知らん
typedef
>>85 の挑戦項目のほうって、自分で計算式を書く以外に方法ってある?
>>86 printf("typedef %d\n", sizeof(typedef));
だめだったぞ
>>85 配列とかポインタとか構造体とか共用体とか列挙体とか long longとかlong doubleとか
ついでに言うとsizeof演算子の返す型はsize_t型だからいきなり%dとかやると未定義動作
%zu(C99)と書くかキャストしる
>>87 つ<limits.h><float.h>
long longとかlong doubleとか単語2つの型って参考にしたやつには 載ってなかったぞ 何か違うの?
>>87 2の補数以外完全無視でcharが8bit決め打ち。しかも整数型限定という駄目駄目っぷりで良ければ
#include<stdio.h>
#define min(type) ((long)((type)-1<0 ?(-1l<<(sizeof(type)*8-1)):0))
#define max(type) ((unsigned long)((-1ul)>>(32-sizeof(type)*8+((type)-1<0))))
#define X(type) #type,(int)sizeof(type),min(type),max(type)
#define print_type(type) printf("%14s %4d %24ld %24lu \n", X(type));
#define su_print_type(type) print_type(type);print_type(signed type);print_type(unsigned type)
int main()
{
printf("%14s %4s %24s %24s \n","type","size","min","max");
su_print_type(int);
su_print_type(short);
su_print_type(long);
print_type(wchar_t);
su_print_type(char);
return 0;
}
ヘッダファイルなんてかかれても全然わかんねーぞ 最近スレのレベル高すぎ
うっせーバカ
>>94 横からだが俺も
>>93 に同意。
もう「今日から」とかいうレベルじゃない(初代スレ立ったの24日だし
97 :
デフォルトの名無しさん :2005/10/08(土) 18:14:02
>>93 分かる所から手ぇつければ良いんだよ
無理に理解しようとすると挫折するから
↓簡単な問題
99 :
デフォルトの名無しさん :2005/10/08(土) 18:18:08
wiki見ろよ 簡単つったらhello world表示
あんなのわざわざ見るバカいねーよ
102 :
デフォルトの名無しさん :2005/10/08(土) 18:25:58
ここで問題出すから意味あるんだよ くだらねえ
早く出せ
再帰の問題お願いします
105 :
ねた :2005/10/08(土) 18:31:13
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int num, inp, count; srand(time(NULL)); num = rand() % 1000; printf("3桁の数を当てて\n"); count = 0; do{ ++count; printf("数は? >> "); scanf("%d", &inp); if(num < inp) printf("答えは入力した数値より小さい値です。\n"); if(num > inp) printf("答えは入力した数値より大きな値です。\n"); }while(num!=inp); printf("*** %d回で当たりです ****\n", count); return 0; } こいつを参考にして、人間が準備した数を当てるプログラムを作れ。 すなわち、人間に「この数であってますか?」と質問、人間は大小か当りを答える。 (但し嘘のヒントといったずるはなしで...) なお、ヒントを無視して ・100〜999までを順番に質問してくる奴 ・乱数ででたらめに選んだ数で質問してくる奴 は却下w →高度な奴 嘘のヒントを教えられても「そういつは非論理的ですね」と指摘できるようにする
全然わかんねーぞレベル下げろゴルァ C言語始めたばかりの人間のためのスレだろ
再帰の問題 「隣り合う2つの数を加えると、次の数に等しくなる」という規則をもった数列 1,1,2,3,5,8,13,21,34・・・ を出力するプログラム 再帰を使う事。undigned longの最大値以下でいいよ。
undigned longの最大値っていくつ?
109 :
ASA :2005/10/08(土) 19:06:05
こんな問題考えてみました。 入力された、1から6の数字をサイコロの目の ように表示する。 入力が1なら、表示は ... .o. ... ていうイメージ どう、簡単すぎ?
間違えたw せっかくなので <limits.h>にある unsigned long int は ULONG_MAX 4,294,967,295 と書いておく
類似問題 デジタル時計とかの表示 ***** * * * * * * ******* * * * * * * *****
112 :
111 :2005/10/08(土) 19:17:14
ずれまくり...orz
113 :
デフォルトの名無しさん :2005/10/08(土) 19:22:14
計算は出来てるっぽいけど止まらない #include <stdio.h> #include <limits.h> void add(unsigned long int a, unsigned long int b) { if (ULONG_MAX < a+b) { return; } printf("%d\n", a+b); add(b, a+b); } int main() { add(1,1); return 0; }
ULONG_MAX < a+bは常に偽(だってオーバフローするから) だから式の順番をちょっと変えて、ULONG_MAX -b< a とかにすれば良いと思うよ
ム板勢いランキング一位返り咲きオメ
ところでみんなはエディタはメモ帳? なんかC用の使いやすいエディタないかな
>>111 時計を作れって問題じゃないよね?
#include <stdio.h>
#define N " "
#define W " ****** "
#define T "* *"
#define L "* "
#define R " *"
const char * number_display_for_1_digit(int value, int line_number) {
static const char * pattern[][9] = {
{W,T,T,T,N,T,T,T,W},{N,R,R,R,N,R,R,R,N},{W,R,R,R,W,L,L,L,W},{W,R,R,R,W,R,R,R,W},{N,T,T,T,W,R,R,R,N},
{W,L,L,L,W,R,R,R,W},{W,L,L,L,W,T,T,T,W},{W,R,R,R,N,R,R,R,N},{W,T,T,T,W,T,T,T,W},{W,T,T,T,W,R,R,R,W}
};
if (value < 0 || value >= 10 || line_number < 0 || line_number >= 9) return NULL;
return pattern[value][line_number];
}
int main(void){
int val;
while (scanf("%d", &val) == 1 && val >= 0) {
int values[10], digits = 0, i, j;
do { values[digits] = val % 10; val /= 10; digits++; } while (val);
for (i = 0; i < 9; i++) {
for (j = digits - 1; j >= 0; j--) printf(" %s ", number_display_for_1_digit(values[j], i));
puts("");
}
}
return 0;
}
>>107 #include <stdio.h>
unsigned long int fibonacci(int idx)
{
static unsigned long table[100];
if (idx < 0) return 0;
if (!table[idx]) table[idx] = idx <= 1 ? 1 : fibonacci(idx - 2) + fibonacci(idx - 1);
return table[idx];
}
int main(void)
{
int i;
for (i = 0; fibonacci(i) <= -1U - fibonacci(i - 1); i++) {
printf("%lu\n", fibonacci(i));
}
return 0;
}
【ジャンル】ポインタ 【難易度】低 【問題】 配列のアドレスをすべて表示しなさい 例えばint n[10]なら10個全部です
( ´D`)ノ<アーイ
124 :
デフォルトの名無しさん :2005/10/08(土) 22:26:34
なぁ、おまいら、自分はCを始めて2ヶ月くらいになるんだけどな、 こないだの日経ソフトウェアに載ってた、JAVAのプログラム↓ /* * *今日の金運は、 * *貧乏 普通 金持ち * *->->->->->->->->* * */ って表示する占いプログラムを C言語で作ってみて、、 最後に printf("今日も一日頑張って下さい\n"); をくっつけたんだけど、 その後に Press any key to continue の機能がデフォルトで欲しいんだけど。 VBC++とかで普通にF5で実行すると、 結果を見るまもなくすぐにコンソールウィンドウが 閉じてしまうのでこの機能が欲しい。 情報求ム。
#include <stdio.h> int main(){ int n[10], i; for (i = 0; i < 10; i++) printf("%p\n", &n[i]); return 0; }
127 :
デフォルトの名無しさん :2005/10/08(土) 22:40:11
だから、ソレだとEXEファイルだけで(VC++起動しないで) 実行したときには結果も何もワカラナイって話だ。
129 :
デフォルトの名無しさん :2005/10/08(土) 22:55:43
それじゃあ Press any key to continue はどうなるんだよ。 根本的な解決にはなってない。 いちいち「EXIT」と入力するより ボタンひとつで終了させたい。
>>129 面倒な香具師だなぁ。
--
そのプログラム
pause
--
ってバッチでも作ってそれを動かせ。
return 0の前に getchar();でもsystem("PAUSE");でも入れとけばええやん。
132 :
デフォルトの名無しさん :2005/10/08(土) 23:09:27
やべぇ、ちょっと思ってたのと違うけど、 出来たできた!! 感激です、サンクス子!!
そのお茶もらうわよ あ、だめ それにさわっちゃ… [;´Д`] (Д´;) / v (( 旦/\ Π ̄| | ̄ ̄| | ̄Π ゴゴゴゴ… ズズズズ… [;´Д`] (Д´;) /v 旦 /) Π| ̄ ̄| ))) ((( | ̄Π ズモモモモモモ… [;´Д`] (Д´;) | ̄ ̄ ̄| ム旦 | ̄ ̄ ̄|ll /) \ ll l \| ̄ ̄|/ lll l / )) | ̄Π | ̄ ̄ ̄| [;´Д`] | ̄ ̄ ̄| ぺ… \ \ ム旦J / / ペヤンゴゥ \___| ̄T ̄|__ / <| ・ / | ̄| ヽ |> | ・ 」_|_ |  ̄//|_] [_|ハ ̄ |~| |___| |~| (Д´;) ○ |___| ○ /) (( )) | ̄Π  ̄  ̄
134 :
デフォルトの名無しさん :2005/10/09(日) 20:39:01
age
【問題】 華氏⇔摂氏の温度換算プログラムを作れ また、0℃〜100℃の対応表を表示せよ
【問題】 単語カウントプログラムを作れ 単語は英字ではじまり英字・数字が連続したものである 単語はスペースで区切られている
【問題】 100までの合計を求めよ for、while、gotoを使った3通りのプログラムを作成せよ
>>138 なかなか良さそうな本ですね
問題はK&Rを見ながら考えました
>>139 おk。俺の思い違いか。
つい最近読んだら丁度書いてあったんでつい。
141 :
デフォルトの名無しさん :2005/10/10(月) 18:26:09
>>137 /*
forを使って100までの合計
*/
#include <stdio.h>
int main()
{
int loop, gokei;
gokei=0;
for (loop=0 ; loop<=100 ; loop++)
{
gokei+=loop;
}
printf("%d\n", gokei);
return 0;
}
>>137 /*
whileを使って100までの合計
*/
#include <stdio.h>
int main()
{
int loop, gokei;
gokei=0;
loop=0;
while (loop<=100)
{
gokei+=loop;
loop++;
}
printf("%d\n", gokei);
return 0;
}
>>137 #include <stdio.h>
int main()
{
int loop, gokei;
gokei=0;
loop=0;
loop1:
gokei+=loop;
loop++;
if (loop<=100)
{
goto loop1;
}
printf("%d\n", gokei);
return 0;
}
/*
whileとgotoでloop++の場所を間違えてしまって思ったより難しかった
*/
144 :
デフォルトの名無しさん :2005/10/10(月) 18:49:37
>>136 #include <stdio.h>
#include <ctype.h>
int main()
{
char *text="this is a pentium4";
int count;
int mojisuu;
count=0;
mojisuu=0;
while (*(text++) != NULL)
{
if (isalpha(*text) && mojisuu==0)
{
mojisuu++;
count++;
}
if (*text == ' ')
{
mojisuu=0;
}
}
printf("%d\n", count);
return 0;
}
説明くらい書け
146 :
144 :2005/10/10(月) 18:55:48
>>145 俺のことですか?スミマセン
いつもどおりの解答です
採点お願いします
単語は英字ではじまり英字・数字が連続したものである じゃないんですか?数字は?
148 :
デフォルトの名無しさん :2005/10/10(月) 20:48:58
xのy乗を求める問題なんだけど、どこかへんなところある? include <stdio.h> #include <math.h> main() { double x,y,z; printf("x ="); scanf("%lf",&x); printf("y ="); scanf("%lf",&y); z = pow(x ,y); printf("x\ty = %lf", z); }
>>144 変数mojisuuは名前から単語の文字数と受け取れるが、実際には0か1のどちらかであり変数名の意味と異なります。
また
>>147 で書かれているように数字が無視されています。
これはこの問題で数を数えるという点では問題ないと思われるが、こういうのは間違いなくバグにつながります。
文字列の終端はNULLではなく\0です。かなり問題。てか警告でない?
各単語の文字数を出すプログラムに変えてみて下さい。そのプログラムがいかにおかしいかがわかると思います。
で、作りなおしてみて下さい。
>>148 一行目の#
printfでのlf
returnくらい書こう
質問ですが、 コンパイルエラーでセグメンテーションの〜と でるのですが、これは何を指摘したものですか? 教えて下さいよろしくお願いしますm(_ _)m
>>153 おいおいマイケル、道順の説明でガーと行ってダーっと曲がってなんて説明、アリかい?
>>156 迷惑おかけしました
ググって探してきますのでスルーして下さい
printfでのlf C99では無問題
>>137 一番望ましいのは和の公式使ったプログラムだゴルァ
160 :
144 :2005/10/10(月) 22:05:45
アドバイスしてもらった所を直しました 単語の文字数を数えます #include <stdio.h> #include <ctype.h> int main() { char *text="this is a pentium4"; int count; int mojisuu; count=0; mojisuu=0; while (*text != '\0') { if (isalpha(*text)) { if (mojisuu==0) { count++; } mojisuu++; }
161 :
144 :2005/10/10(月) 22:06:18
if (*text == ' ') { printf("%d文字\n", mojisuu); mojisuu=0; } text++; } printf("%d文字\n", mojisuu); printf("単語%d個\n", count); return 0; }
>>161 数字はどうした。指摘された点くらい直せ。
それ以前に実行結果を確認してから書け。pentium4がお前のプログラムでは何文字になる?
ついでに最初と最後にスペースいれてみろ。" This is a pentium4 "って。
結果をみて直しせ。
結果を見て直すのは とても難しいと思うな
ごめん。pentium4の文字数は正しくでてしまうな。 pentium44444とかにしてみ。
165 :
144 :2005/10/10(月) 22:59:08
早速直しました 手で数えて確認したので、今度こそ間違いありません #include <stdio.h> #include <ctype.h> int main() { char *text=" this is a pentium44444 "; int count; int mojisuu; count=0; mojisuu=0; while (*text != '\0') { if (isalpha(*text)) { if (mojisuu==0) { count++; } mojisuu++; } if (isdigit(*text)) { mojisuu++; }
166 :
デフォルトの名無しさん :2005/10/10(月) 22:59:39
if (*text == ' ') { printf("%d文字\n", mojisuu); mojisuu=0; } text++; } printf("%d文字\n", mojisuu); printf("単語%d個\n", count); return 0; }
isalnum()・・・。
>>165 追加で問題あげよう
returnの前にtextの文字列を表示しなさい
>>166 実行結果を見て「0文字」と出てきてなんとも思わないの?
「0文字」なんて出てこないようにしてみて下さい。
wiki重いぞ
>>169 単に
if ( mojisuu != 0 ) { printf("%d文字\n", mojisuu); }
って書くだけジャネ
>>171 いや・・・そうだけど・・・そういうことじゃなくて・・・
このプログラムだと前後の空白や連続した空白を「単語」として認識しているわけじゃん?
文字数や単語数を表示っていう問題の答えとしては間違ってないけど、それってなんかおかしいだろって言いたかったの。
そういうのがバグの元になるよっていいたかったのだが・・・
>>166 がんばっている君にヒントをあげます。
例えば
if (mojisuu==0){
count++;
}
ってさ、そのまま読めば「文字数が0個のとき単語の数を1個増やす」でしょ。直感的にわかりにくくない?まぁ、これくらいならわかるけどね。
プログラム書くときどうしてもこういった表現がでてくるのはしょうがないけどさ、なくせるならなくしたいものなの。
そして今回の問題ならもっと「読みやすい、理解しやすい」プログラムが書けます。
例えば
1.与えられたインデックスの文字がスペースなら、次の英字または終端文字までインデックスを進める関数
2.与えられたインデックスの文字が英字なら、次のスペースまたは終端文字までインデックスを進める関数
を作ってみてください。それを使って単語数と文字数を出すプログラムを作ってみて下さい。
>1.与えられたインデックスの文字がスペースなら、次の英字または終端文字までインデックスを進める関数 >2.与えられたインデックスの文字が英字なら、次のスペースまたは終端文字までインデックスを進める関数 よくない 「ふらぐ」使うべき
連結リストの超簡単な問題をお願いします 難しいのはぜったい無理っす(><)
>>176 【問題】
以下の構造体を用いて、単方向リストを作れ。
struct field_t {
int val;
struct field_t *next;
}
整数値をランダムに10個発生させてその値をリストの最後尾に追加していき、最後にリストの先頭から順に表示。
>>174 普通
>>173 の言うようなプログラムになると思うが、何がよくないんだ?
つーかフラグの意味がわからん。初心者用のスレなんだからもう少し説明しろよ。
>174はてんこもりのフラグ引き数を持った一つの関数の中で細かく分岐させたい教条主義者かと。
181 :
デフォルトの名無しさん :2005/10/11(火) 11:49:34
>>178 のいう事は激しく同意
初心者を容易にフラグへ依存させるべきではない。
フラグを使うのは中級者以上になってからだな
初心者の壁を越えるにはどうすればいいんですか? 一通りある程度理解したんだけどコードが書けない・・・
まずは何か作りたい物の目標を持つことじゃない? 目標が決まったら、それに必要な知識や情報を自分で集めてみる。 なんだかんだ言って自分で1からコードを書き始めると 参考書の理解不足な部分とか、網羅されてない部分がゴロゴロ出てくるから そこに自力で対処できるようになればもう初心者の枠は超えてるかと。
>>181 フラグを使わなくなるのは、どうなってからでしょうか?
こうしなきゃダメなんて考えてると何も作れなくなるから 最初は好きなように作ればいい。 あとで見直してこっちの方がよかったなとか だんだん進歩していくから心配いらない。
初めからフラグ使ったほうがいいなと思ったら使えってこと?
マンコってこと?
入門書の演習には回答がついてないよな 回答に頼ってるといつまでも自分でプログラム作れない。
そして独り善がりな書き方が染み付いていく
>>183 >>185 参考になりましたよ!
ここの課題を出来そうなものから作ってみます(`・ω・´)
typedefとstructが別々の機能だと気づくまでに10年かかった俺様がきましたよ
193 :
144 :2005/10/11(火) 21:57:19
今日もよろしくお願いします
昨日の貰ったアドバイスを踏まえて
>>168 >>173 でいただいた問題を解きました
#include <stdio.h>
#include <ctype.h>
//英字または終端文字まで進めたポインタを返します
char *forward_space_to_alpha(char *text)
{
while (*text != '\0')
{
if (isalpha(*text))
{
break;
}
text++;
}
return text;
}
//スペースまたは終端文字まで進めたポインタを返します
char *forward_apha_to_space(char *text, int *mojisuu)
{
*mojisuu=0;
while (*text != '\0')
{
if (isspace(*text))
{
break;
}
text++;
194 :
144 :2005/10/11(火) 21:58:20
(*mojisuu)++; } return text; } int main() { char *text=" this is a pentium44444 "; int tangosuu; int mojisuu; tangosuu=0; mojisuu=0; while (*text != '\0') { if (isalpha(*text)) { text=forward_apha_to_space(text, &mojisuu); printf("%d文字\n", mojisuu); tangosuu++; } else if (isspace(*text)) { text=forward_space_to_alpha(text); }
195 :
144 :2005/10/11(火) 21:59:44
else { text++; } } printf("単語%d個\n", tangosuu); text--; while (*text != '\0') { text--; } text++; printf("%s\n", text); return 0; }
しつこいですが 数字は無視ですかそうですか。
>>193 驚いたな。
char DUMMY[4] = {'A','B','C','D'};
char *text=" this is a pentium44444 ";
↑のような状態だと行き過ぎる可能性があるぞ
>>195 while (*text != '\0') {
text--;
}
これはtextのポインタを先頭へと戻している処理だと思います。
さて、文字列の先頭は'\0'でしたか?
>>168 の人は遠回しに「変数textを書き換えたらtextの先頭のアドレスがわからなくなるだろ?」と言っていると思われます。
もう一度処理を考え直してみて下さい。
else {
text++;
}
どんな条件のときにこのelse節が実行されますか?
>>196 無視されてないと思うけど・・・
>>180 リンクはらないで普通にここに書き込んだら?
>>198 >無視されてないと思うけど・・・
forward_space_to_alphaですっとばされるぞ
>199 >136 よく嫁 仕様だ
問題の理解の仕方が人によって違うような。 「123sigo」は 単語1、文字数7 (出題者の意図と違うと思う) 単語1、文字数4 (上のプログラムの動作?) 単語0、文字数数える必要なし (俺が思ってた出題者の意図)
202 :
デフォルトの名無しさん :2005/10/11(火) 23:04:15
>>198 >リンクはらないで普通にここに書き込んだら?
なんで?
203 :
144 :2005/10/11(火) 23:09:54
>>136 の条件で用意された単語を数えろという問題だと解釈してました
実は逆で、どんな文字列が用意されてるかわからないが
>>136 の条件を満たすもののみ数えろという問題ならずっと難しいです
すぐにはちょっと想像できないです
とりあえず今までのプログラムを数字で始まる単語に対応させました
さらに
>>197 >>198 でいただいた問題も解いています
#include <stdio.h>
#include <ctype.h>
//英字、数字または終端文字まで進めたポインタを返します
char *forward_space_to_alnum(char *text)
{
while (*text != '\0')
{
if (isalnum(*text))
{
break;
}
text++;
}
return text;
}
//スペースまたは終端文字まで進めたポインタを返します
char *forward_alpha_to_space(char *text, int *mojisuu)
204 :
144 :2005/10/11(火) 23:10:56
{ *mojisuu=0; while (*text != '\0') { if (isspace(*text)) { break; } text++; (*mojisuu)++; } return text; } int main() { char *text=" this is a pentium44444 123 456abc "; //char text[4] = {'A','B','C','D'}; char *text_copy; int tangosuu; int mojisuu; int text_size; text_size=sizeof(text); if (text[text_size] != '\0') { printf("終端が\\0じゃないです\n"); return 1;
205 :
144 :2005/10/11(火) 23:11:32
} text_copy=text; tangosuu=0; mojisuu=0; while (*text_copy != '\0') { if (isalpha(*text_copy)) { text_copy=forward_alpha_to_space(text_copy, &mojisuu); printf("%d文字\n", mojisuu); tangosuu++; } else if (isspace(*text_copy)) { text_copy=forward_space_to_alnum(text_copy); } else if (isdigit(*text_copy)) { text_copy=forward_alpha_to_space(text_copy, &mojisuu); } else { text_copy++;
206 :
144 :2005/10/11(火) 23:12:03
printf("実行されません\n"); } } printf("単語%d個\n", tangosuu); printf("%s\n", text); return 0; }
if (text[text_size] != '\0')
{
printf("終端が\\0じゃないです\n");
return 1;
}
この処理に何の意味がある?文字列の終端は'\0'だ。
else
{
text_copy++;
printf("実行されません\n");
}
実行されないのになんで書くんだ?
144は指摘された点をつぎはぎのように書き加えていくんじゃなくて、
今まで指摘されたことを総合して、もう1度最初からプログラムを書いた方がいいぞ。
処理の仕方をもう1度よく見直せ。自分のプログラム見てわかりにくいと思わないか?
>>173 に書かれているような関数を使って、もっと簡潔に書けるから考えてみろ。
208 :
174 :2005/10/12(水) 02:27:46
細かく関数に分割したところで簡潔にならないなら本末転倒w 初心者に限らずプログラムはできる限りシンプルな方がよい。 そもそも数字で始まるのは単語でなくていいのか?というのはおいといて 元の問題は、 [状態S0]:単語が始まっていない 英字登場→単語数のカウントアップ、S1へ それ以外(※)→S0のまま [状態S1]:単語の途中 空白登場→S0へ それ以外(※)→S1のまま という2つの状態を行き来すると考える。 ※英字、数字、空白以外の文字がでてきた場合はどうするのか? 具体的には「ふらぐ」ってーのでS0とS1を区別する flag=0; /* 単語は始まっていない */ while(1文字取り出し){ if(英字?){ if(flag==0){ ++単語数; flag=1; /* 単語が始まった */ } } if(空白?){ if(flag==1){ flag=0; /* 単語が終わった */ } } } ってな感じ。 「ふらぐ」をやたらめったらと使うべきではないが、(この程度なら)分かり易いプログラムが書ける。
209 :
デフォルトの名無しさん :2005/10/12(水) 07:14:24
#include <stdio.h> main() { int n, i, s; printf("n を入力して下さい : ") scanf("%d", &n)"; s=0; for (i=1; i<=n; i++) { s +=i; } printf("n=%f Sum=%d/n",n,s); } 1 この例題を変更して1+1/2+1/3+........+1/n の結果を表示するプログラムを作成せよ 2 nの値を読み込んで、n!を計算し表示するプログラムを作成せよ これ課題でてるんだけど解けない。。。orz 頭いい先輩方お願いします。よろしくお願いします。
>これ課題でてるんだけど解けない。。。orz >頭いい先輩方お願いします。よろしくお願いします。 ↓ 課題スレ住人に解いてもらう ↓ 次の課題も解けない ↓ また解いて貰う ↓ 大学の授業についていけなくなる ↓ 不登校Or自主退学へ
なんかすごいステレオタイプな大学の見方だなw 専門卒?
214 :
デフォルトの名無しさん :2005/10/12(水) 13:03:03
再帰の問題 「隣り合う2つの数を加えると、次の数に等しくなる」という規則をもった数列 1,1,2,3,5,8,13,21,34・・・ を出力するプログラム #include <stdio.h> void func(unsigned long i1,unsigned long i2); int main(){ unsigned long i1=1,i2=1; printf("%u %u",i1,i2); func(i1, i2); return 0; } void func(unsigned long i1,unsigned long i2){ unsigned long i3; i3 = i1 + i2; if(i2 < i3){ printf(" %u", i3); func(i2,i3); } else{ printf("\n"); } }
あまり良問じゃないなぁ
フィボナッチの数列だっけ?
再帰ならハノイの塔あたりがいいんじゃまいか?
「このプログラムは再帰を使うべきだ!」 と見分けるポイントはどうすればいいんですか?
勘
処理時間が許容範囲で、再帰を使った方が簡潔に書ける場合。
スタックに優しい場合。
妖怪が人間になるより難しそうだ
別に難しくないだろ。 基本的には再帰は使わない方向で考えてみて、 どうしても複雑になりすぎるとか、再帰を展開する方法が分からないって時に 再帰を使えばいい。
人間の僕は、ほぼ妖怪に近いのでできそうかなw
再帰のプログラムをまだあまり見ないので、探してきます
ハノイの塔、アニメ付きで解説してるところみたけど 法則性が全然みえてこない 難しい
ああいうのは本で読んで、自分で書きながら(ペンで落書きとか)、理解したほうが早いよ
解説を見てるんなら法則性も説明してないか?
>>208 簡潔に書けないのは初心者だから。
逆にこの程度のプログラムでフラグなんて使ってたら話にならない。
君の頭の中には拡張性という単語はないのか?君はフラグを増やして拡張するのかもしれないが。
勉強をはじめたばかりの人が拡張性などを気にする必要はないし、このプログラムを拡張するわけでもないだろうが、
最初から書こうとしなければ気にするようにもならないし、いざ必要なときにアホなプログラム書いててはまるだけ。
231 :
デフォルトの名無しさん :2005/10/13(木) 00:46:13
 類似問題    デジタル時計とかの表示     *****  *       *  *       *  *       *  *******  *       *  *       *  *       *   *****
232 :
デフォルトの名無しさん :2005/10/13(木) 00:58:06
233 :
デフォルトの名無しさん :2005/10/13(木) 01:50:18
おすすめの参考書ってなんですか? まじめにcに取りかかろうと思ってます。
書籍スレ行けよ
235 :
デフォルトの名無しさん :2005/10/13(木) 02:02:46
>>234 ほい、無だレスすまそ。これもだけど…。
簡単に書くと unsigned long fib(unsigned long n){ if(n<=1) return 1; return fib(n-2)+fib(n-1); } こうだが...かなり遅い
>230 必要に「なるかもしれない」ことに心を奪われてはいけません。 このようなことを YAGNI と呼びます。 これは、「You aren't going to need it (将来必要に『ならない』)」の頭文字です。 明日のために今日作業したことが無駄になるより、明日必要なことは明日行えばよいのです。 (今日の金は、明日の金より価値があるということを覚えておいてください) 今与えられている課題に関する要求を満たすために必要なこと「だけ」をする、と言うことです。 必要かどうか未だ分からないものを作りこまない、を覚えておきましょう。
>>237 初心者というのは得てして要求仕様そのものが満足されてないから問題なんじゃまいか
なおさら > 必要に「なるかもしれない」ことに心を奪われてはいけません。 w
拡張性は皆無でも過大でも、悪い。換言するなら 仕様とは密着しすぎでも乖離しすぎでも、悪い #あぁYAGNIなんてぇ単語を言い出す奴がいるから脊髄反射レスしちまった
YAGNIなんて言葉はロクに考えもしないクライアントのクソい提案にだけ適用すりゃいいんだよ
では明日のためにリファクタリングするというのはあまり良い習慣ではないのですか?
>>237 「拡張性を過度に考慮する」、「汎用性を過度に考慮する」のは時間と金の無駄です。
だけど、それは程度の問題です。
でも少なくとも上の問題でフラグを使うというのはありえません。というか、フラグなんて極力使わない方がよい。
「この程度ならフラグの方がわかりやすい」とか言ってる奴に限って独りよがりなプログラムを書く・・・
「そんな読みにくいプログラムわかるのは書いたお前だけだよ」というまわりの声に気付かない・・・
YAGNIなんて拡張性や汎用性を過度に考慮できるようになってから知ればいい。
それは程度の問題です
246 :
144 :2005/10/14(金) 17:48:03
>>207 で簡潔にとお題をいただいたのでやりました
#include <stdio.h>
#include <ctype.h>
//英字または終端文字まで進めたポインタを返します
char *forward_space_to_alpha(char *text)
{
while (*text != '\0')
{
if (isalpha(*text))
{
break;
}
text++;
}
return text;
}
//スペースまたは終端文字まで進めたポインタを返します
char *forward_apha_to_space(char *text, int *mojisuu)
{
*mojisuu=0;
while (*text != '\0')
{
if (isspace(*text))
{
break;
}
text++;
(*mojisuu)++;
247 :
デフォルトの名無しさん :2005/10/14(金) 17:48:42
} return text; } int main() { char *text="this is a pentium44444"; int tangosuu; int mojisuu; tangosuu=0; mojisuu=0; while (*text != '\0') { text=forward_apha_to_space(text, &mojisuu); printf("%d文字\n", mojisuu); tangosuu++; text=forward_space_to_alpha(text); } printf("単語%d個\n", tangosuu); return 0; }
>>247 textがスペースから始まった場合の動作がおかしいからまた怒られるよ。
>>248 問題文の
>単語はスペースで区切られている
から先頭や最後にスペースは無いものと考えました
250 :
デフォルトの名無しさん :2005/10/14(金) 19:36:58
いまから、C習おうと思うんですけど、まずなにからすれば良いですか?
とりあえずコンパイラを用意。これがなきゃ始まらない。 フリーでもいいし、買ってきてもいい。
>>144 さんはガンガってますね。
でも、もっと短く簡潔に書けますよ?
>>214 (元の問題から外れるけど)やっぱり・・・
フィボナッチは再帰を使っちゃダメだ。
無駄が多すぎる。計算も遅い。
/*指定回数だけフィボナッチ数列を計算し、
出力するプログラム*/
#include <stdio.h>
int main(void)
{
unsigned long i, j, k;
int n, m;
printf("指定回数だけフィボナッチ数列を計算し出力します\n\
何回計算しますか? :");
257 :
デフォルトの名無しさん :2005/10/14(金) 21:28:06
scanf("%d",&n); if(n <= 0) { return 0; } else { j = 0; m = 0; for (i = 1;m <= n;j = k) { printf("%10d\n",i); k = i; i = i+j; ++m; } } return 0; }
258 :
デフォルトの名無しさん :2005/10/14(金) 21:28:41
後は皆で 小数を入力したときの問題とか、 何回も計算できるようにループを付けたりとか、 桁あふれの部分とか、 機能を充実させて下さいな。
uza
>>256 んー、
>>214 は末尾再帰だから別に良いのでは?
常識的なコンパイラなら最適化かければ普通のループと同じで無駄もないし、計算も遅くならないし
261 :
デフォルトの名無しさん :2005/10/14(金) 23:29:51
次の問題まだぁ〜?
文字列で与えられた式の計算 式は自然数の加算・減算。 どう?
>>262 例えばSEND+MORE=MONEYを解くとか?
それだと手作業で解を得るのと総当りのプログラムのどっちが早いかなw
私としては、abcd * e = fghij を解いてみてもらいたいが。
自然数ってんだから出てくるのは0-9と+-だけじゃねえのけ?
>144へ ちょっと趣向を変えて、ポインタじゃなくてインデックス変数を使ってプログラムを書いてみよう。 つまり、text[idx]とかidx++で文字列にアクセスする。*textとかtext++はしない。 練習にはいいかと。
>>262 こんな感じでどうでしょうか?
式の長さはヌル文字含めて256文字まで。1つの数字は10ケタまでです。
(本当は21億まででチェックするんだろうけど)
エラーチェックしてないので、式の途中に数字、+、-、=以外があると困ります。
1+2+3-4= みたいな感じで入力受付します。最後は必ずイコールで。
直したほうがいい所があったらアドバイスお願いします。
#include <stdio.h>
#include <ctype.h>
#define SIZE 256
#define PLUS 1
#define MINUS -1
int sampling(char *src);
int main()
{
char input[SIZE] = {'\0'};
fgets(input, SIZE - 1, stdin);
printf("%d\n", sampling(input));
return 0;
}
/*
*/ int sampling(char *src) { char temp[11] = {'\0'}; int i; int flag; switch (*src) { case '+': flag = PLUS; src++; break; case '-': flag = MINUS; src++; break; case '=': return 0; break; default: flag = PLUS; break; } for (i = 0; isdigit(*src) && i < 11; i++) { temp[i] = *src; src++; } return (atoi(temp) * flag) + sampling(src); }
>236 unsigned long fib(unsigned long n){ static unsigned long v[50]={0}; if(n<=1) return v[0]=v[1]=1; return ((v[n-2])?v[n-2]:(v[n-2]=fib(n-2)))+((v[n-1])?v[n-1]:(v[n-1]=fib(n-1))); } かるくハヤイ
おはようございます!お久しぶりです 先生方に質問があるので宜しくデス(><)/ #include <stdio.h> #include <conio.h> int main() { int a,b; int *p,*q; p=&a; q=&b; printf("a,bを入力してくれよ\n"); scanf("%d %d",p,q); printf("a=%d,b=%d\n",*p,*q); printf("a+b=%d\n",*p+*q); printf("なんかおして\n"); getch(); printf("終わり"); return 0; } aとbに 激しい桁の数字をいれたら 例えばaに56456464645646222、bに54564444455555555555555555 をいれたら a=8021902,b=1 ってなってa+bが計算されるわけなんだけど intの容量をオーバーする数字をいれたら なんでこんなことになるの? スルーで先に進んでいいのかな
>>269 変数は型によって入る値に限界がある。
charは-128~127、shortは-32768~32767といった感じ。intでも入って10桁。
これを超えるとオーバーフロー(桁溢れ)が起こって全く違うの数値になる。
しかしもうポインタか。早さ的にもやる気が感じられるな。
>intの容量をオーバー 最大値を過ぎたってことは最小値の側になる、っちゅーことだね ・最大値を超えないように入力する か ・もっと大きい整数を扱える型を使う(今時のコンパイラならlong longとか...) ・整数型をあきらめる(doubleとかにする) しかないんだよね...
272 :
デフォルトの名無しさん :2005/10/15(土) 11:27:03
どっか無料であるいいコンパイラないですか? 今ぐぐってやったんだけど、なんか起動してくれない
氏ね
274 :
252 :2005/10/15(土) 11:41:08
>>254 俺はやさしいCから始めた。絵付きの説明がしっかりしてて入門書としては最適だと思う。
読破した後は多少難い本もいけるから、独習Cとか個人の解説ページらへんが妥当かと。本格目指すならK&Rは必読。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4320026926/ ーーーーーーーーーーーここから余談ーーーーーーーーーーー
大切なのは出来るだけ多くの本を読む事、読むだけでなくサンプルプログラムや練習問題を打つ事、ノート(テキスト)を作って大切な事を書いておく。
練習問題ならこのスレで問題出るし、過去のものはwikiに載ってる(
>>5 )
後は自分で何も見ずにプログラムを打つ事とか。乱数とか覚えると軽いゲームが作れるから
数当てゲーム製作→条件(当たり外れ・大小)作成→ヒント機能追加→CPU追加(思考ルーチン作成)
とやると意外と面白い。というか、俺がそれに熱中して時間を忘れた事がある。
それと最後。質問できる相手とか協力できる仲間を探す。
入門書なんて分からない内は投げてしまいがちだし、独りで黙々とやるのも寂しい。仲間を探して互いに協力しあうのが最良の勉強法(まあ、それが出来れば誰も苦労しないんだが…
それぞれ違う視点からモノ見れるから、ソースの書き方やバグ発見にはとても有効。そして何より、独りよがりの考えになりにくい。
ここは仲間意識とかそういうのは無い方だから、もし探すならメーリングリスト(ML)とかいいかも。いい所があったら俺も逝くわ。
275 :
デフォルトの名無しさん :2005/10/15(土) 11:45:32
「K&Rが必読」と言われるけど、皆さんどうやって使ってますか? 私には、どちらかと言うと単なるリファレンスだと思います。 周辺知識の無いプログラミング初心者には難しすぎるし、 ある程度書けるようになってポインタとかも例外的な使い方を覚えれば、 わかりきったこともかなりあるし、「読む」ほどじゃないと思うんですよね。
ああ、何か日本語おかしいですねorz 逝ってきます・・・
278 :
ポポ巣 ◆Qgm8RFT0/. :2005/10/15(土) 12:03:05
>>270 >>271 intの桁数をオーバーして入力したら
どうなるのかとおもって試したら
まったく違う数字がでたので、なんでこの数字に?と悩んでおりました
回答ありがとうございます!先生方!
この表示される数値に意味はないんよね?
オーーバーしたから変な数字になったって感じで
理解しておけばいいのかな
>>278 基本的に意味は無い。
参考までに言っとくと、型の最大値を上回ると今度は桁の最小値に逝くようになってる。
例:short型に最大値の32767を代入、それに1を加えると最小値の-32768になる(初めから32768を代入しても結果は同じ
つまり、269の結果は↑の様な事を何度も繰り返して出てきた値
↑間違えたorz「桁の最小値→型の最小値」
282 :
デフォルトの名無しさん :2005/10/15(土) 12:39:21
>>279 ありがとうございます。今やってみたんですが、freecommandcompiler
ってやつですか?これ開こうとすると黒い画面が出てきて、一瞬にして
消えちゃうんですがなんでかわかります?ちなみに別のサイトからそこに行き着いて、
ユーザー登録なしでダウンロードしました
>>282 使い方を調べるのも学ぶうちだ
誰かに質問する前にまずは自分で調べろ
黒い画面が出てきて、一瞬にして消えちゃうんですが
プログラムの開始から終了までが一瞬だから
286 :
デフォルトの名無しさん :2005/10/15(土) 13:29:46
>>283 うーんプロパティでいろいろいじったんですけどよくわかりません。
>>285 その設定ってかえれるんですか?
こういうときのためにコマンドプロンプトがある。
プログラムもいいけど、OSの使い方に詳しくなろうよ
289 :
デフォルトの名無しさん :2005/10/15(土) 14:57:12
>>288 きっびしー。時間がさらさらと流れてゆくふーーー
>>287 おお!!なんですかこれは?黒い画面が出てきてかけそうな感じ!
これでいいの?これがコンパイラ???
290 :
デフォルトの名無しさん :2005/10/15(土) 15:00:08
できねーー・・ ちょっとすんげぇ簡単なプログラムさらしてくれない? なんかホームページに書いてたコンパイルの方法やってもできない。
>>288 同意。
プログラムの使い方も解らないレベルで言語の勉強をしても身に付かないと思われ。
>>289 もう少しぱちょこんの勉強をしてから出直した方がいい。
そのほうが最終的に近道だと思うぞ。
294 :
デフォルトの名無しさん :2005/10/15(土) 15:42:02
>>293 でも、漏れもN88BASICからCを勉強しはじめたとき、
コンパイルやリンクのやり方とかよくわかんなかった。
そういうものの操作とプログラミング自体は、また別のような気がするから、
とにかく操作に詳しい入門書をよく読むことだよな。
コマンドプロンプトの使いかたもよくわからない人は、
HSPあたりから始めるのがよい気がする。
http://www.onionsoft.net/hsp/
Cは古すぎる。
おまえらが一言教えてやりゃ済む話じゃねーか
297 :
デフォルトの名無しさん :2005/10/15(土) 15:46:45
温故知新
なにがうんこちんちんやねん
299 :
デフォルトの名無しさん :2005/10/15(土) 15:50:22
>>298 そういう言葉使いをしていると本当に性根が腐りますよ。
これまでのすべての積み重ねが今のあなたなのですから。
知能指数=うんこちんちん
>>294 コマンドプロンプトがわからないからと言ってHSPを勧めるのもどうかと思う。
302 :
254 :2005/10/15(土) 17:30:40
>>274 さん ありがとうございます。
それから読んでみますね。
しかし、結構たかいんですね。でも、買って見ますね。
友達にいってもやるって行ってくれそうに無いなぁ…。
そのときはここに居るみんなが友達だ!
世の中は完全にGUIに移行しちゃってるから どうしても無理がある。
<余談> 漏れはCの初心者本は一切読んでない。 問題は多くの本を読むことではなく、如何に本から情報を漏れなく読み取るかだと思う。 つまり、一冊の本から読み取れる量が少ないからたくさん読まなければならないんでないか? </余談>
みんな結局どんな本読むの? 漏れは、猫でも分かるを買った。
>>306 10年くらい前だけど、記述評論社のすぐわかるC/C++という本を読んで勉強した。
この一冊以外は入門書は読んでない。
この本、解りやすく書いてあるのはいいんだが、当時のPC-9801とボーランドの
Turbo Cにべったり依存した内容なので、あまり今の人には勧められない。方言が強くてね。
この本で覚えたことを当たり前だと思って組んでいたプログラムを他人に見せて
えらく驚かれた記憶があるよ。
#include <pc98.h>ってなんだよ、とかw
308 :
デフォルトの名無しさん :2005/10/15(土) 19:59:50
前スレは見れないの?誰かhtml化してくれよぉ。
309 :
デフォルトの名無しさん :2005/10/15(土) 20:13:36
>>293 いや、確かにぱちょこんも必要かもしれんが、大学の授業でいるからそうも言ってらんねんだ。
>>294 Cが必要なんです。
コマンドプロンプトはわからないけどコンパイルのやり方ぐらいはちょっとはわかるんだ。
ただ、大学ってやつはなぜかマックだからウィンドウズじゃわかんねぇーんだよぉ。
マックにあたるターミナルがウィンドウズでどれなのか教えてよ。
周りの俺の友だちに負けたくないんだまじ頼む。
310 :
304 :2005/10/15(土) 20:32:09
>>309 >マックにあたるターミナル
それがコマンドプロンプト(DOSプロンプト)。若干乗りは違うが、まぁ似たもんだ。
#その違いが気になり始めたらCygwinをインストールすればいい。
>>305 Cの本で買ったのは、K&RとAsciiから出てたDOSプログラミングの本。
会社で拾い読みしたのが、藤原の翁の診断室にパズル本。
C++の本ではEffectiveC++のみ。
#勿論マニュアル、WebSiteは除く。
リクエストがあれば言語歴と書籍歴を纏めてもいいけど参考にはなりそうもないね。
>>266 式を再帰処理していくって方向は合ってると思います。
もうちょっとエラー処理やら入力に自由が有ると良いけど。
あとは乗除算や括弧のサポートなんか入れていくと
面白くなっていきますよ。余裕有れば数学関数とかも。
この手問題はコンパイラ、インタプリタの基礎技術なんで
字句解析、構文解析、でググれば色々夢が広がるかと。
exprコマンドのソース読んでみるのも良いかと思います。
312 :
デフォルトの名無しさん :2005/10/15(土) 21:27:33
>>309 > マックにあたるターミナルがウィンドウズでどれなのか教えてよ。
WindowsXPだったら、
「スタート」→「すべてのプログラム」→「アクセサリ」→「コマンドプロンプト」
で出てくる。
GUIしか知らない人は、意外と見つけにくいのかもw
>>306 俺は、『Cの絵本』で今現在勉強中。
ただ、俺の場合は大学の講義の副読本だったから、全くの独学の人に薦められるかは分からん。
314 :
デフォルトの名無しさん :2005/10/15(土) 22:25:55
>>310 >>312 あれ、そーなんだ?コンパイルしようとしたらできなかったから別物かと思った。
わかったもっぺんやってみるよ。ほんとうにありがとう!
Cのエロ本
316 :
デフォルトの名無しさん :2005/10/15(土) 22:36:24
>>314 > あれ、そーなんだ?コンパイルしようとしたらできなかったから別物かと思った。
bccにパスが通ってないかもしれん。
とりあえずフルパスを書いて、
C:\borland\bcc55\Bin\bcc32 hogehoge.c
とかやってミソ。
それが面倒ならファイルをコマンドプロンプトのウィンドウへドラッグアンドドロップすれば、 フルパスが入力される。もちろんどんなファイルでもできる。
コンパイラインタプリタ〜ってなるとオートマトンとか文法とかまで勉強してる漏れは負けですか?
320 :
デフォルトの名無しさん :2005/10/16(日) 00:12:57
>>316 うーわかんねぇ。すいませんせっかく教えてもらってんのに。
というわけで直接見てください。
一応本にあるとおりにやってみました
#include <stdio.h>
int main(void)
{
printf("bigmac\n");
return 0;
}
をexamine.cで保存
そしてコマンドプロンプトで
gcc -o examine examine.c
ってうってコンパイルしようとしたら
gccは内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ
ファイルとして認識されていませんってでました。なんのこっちゃ抹茶に紅茶
gcc の部分を C:¥borland¥bcc55¥Bin¥bcc32 に置き換えてやってみれ
>>304 がCをやる以前にプログラミング経験があったのかどうか知りたいんですが
323 :
デフォルトの名無しさん :2005/10/16(日) 00:28:06
指定されたパスは存在しませんだって。なにこれどういうこと?
あっはっは。 大変だな、おい。
これ以上は、お金が発生します。
>>323 オマイさんはいったい何処にbccをインスコしたのかと
>>323 C:\borland\bcc55\Bin\bcc32.exeってファイルがあるのかどうかを確認したほうがいいな
329 :
304 :2005/10/16(日) 00:38:39
>>322 世代的にパソコンと同時にワンボードマイコンに触れた世代なもんで、
cをやる頃には何十人もの人間をダンプリストと格闘させる原因を作る側にはなっていた。
だがしかし、当時basicやアセンブラの初心者本なんて存在さえしていなかった。
Cの本少し古本屋で売ってこようっと。
応募葉書まで入ってる処女本がときどき古本屋に売ってるよなw
しょっ、しょっ、しょじょじって歌何のやつだっけか?
334 :
デフォルトの名無しさん :2005/10/16(日) 01:09:30
初めましてプログラムを作りたいと思い始めた初心者です どうかプログラムのつくりからを一から簡単に教えてくれる人はいませんか? いたら救いの手を差し伸べてください
336 :
デフォルトの名無しさん :2005/10/16(日) 02:36:23
337 :
デフォルトの名無しさん :2005/10/16(日) 04:06:54
最近Cの勉強やり始めたんだけど wikiの問題ってそこらの教本読んだだけでもできる問題なのかな? もしそうならやる気出てくる
構文解析うんぬんってのを除けば、ほぼ全て入門書レベル。
今って書籍が溢れ過ぎて逆に何やったらいいかわからん人もいそうだな 初心者と銘打ってMFCやSTLがいきなりでてる本とかあるし
いや、少なくともそれらの書籍はC言語の初心者本ではないから何の問題もないと思うが。 #CとC++の区別ができてない書籍だと言うのなら話は別だが。
>>338 とんくす
とりあえず本1冊終わらせてみる
#Cって何ですか?(><)
>>342 マジレスすると、だいたいの場合コメント(追記・チラ裏)という意味。
問題。 質問にYes,Noで答えていくと、おすすめのC言語入門書を教えてくれるプログラムを作れ。 次のような形式のファイルを読み込んで処理を行うこと。 ファイル形式の仕様が気にいらなければ変えて良い。 ----------------------- qa.txt ----------------------- # 番号:表示する文章:Yesの時に進む先,Noの時に進む先 # 番号:表示する文章:0 # 空行や#で始まる行はコメント扱い。 1:hello, world と表示するプログラムなら、よそ見しながらでも作れる。:2,5 2:ポインタがわからない。:3,4 3:前橋和弥著「C言語 ポインタ完全制覇」:0 4:B.W.カーニハン/D.M.リッチー著「プログラミング言語C」:0 5:前橋和弥著「C言語 体当たり学習 徹底入門」:0 ----------------------- qa.txt ----------------------- ↑データの形式を示したいだけであって、それ以上の意味はない。どれも読んだことないし。
ウァ-
isam
一つ提案。 ノ
ttp://www.freeml.com/ ↑ここでC初心者のML作ってみようと思うんだがどうだろう。
最近のここは問題のレベルも高いし、せいぜいあって他の誰かの解答とそれのチェック程度しか無いから学べる事が少ない、つまり、結局は入門書に頼りがちになる。
時折為になる情報は出てくるが、それ以外はほとんど勉強になってないのが現状だと思う。
もちろん入門書での独学は必須。それと平行して質問や返答・雑談を行い、C勉強の為の良い環境を作る。要は「ここ」に仲間意識をプラスしたものと考えればいい。
一つ言いたいのは、この提案はこのスレを否定するものではないという事。
前スレと比べて明らかに敷居の高くなったこの現状に付いていけない初心者の為のものであり、仲間なんて必要無い、参考書とこのスレで十分だという奴は対象にしていない。また、ここの内容にもついていけるならMLと平行して使える。
本気でやろうという奴、聞いてばかりでなく自分で調べようとする意欲のある奴は挙手頼む。
348 :
デフォルトの名無しさん :2005/10/16(日) 12:55:32
>>325 教えてくれたら君は幸せになれるよ
>>326 え、インスコ????
>>327-328 えっと、ファイルの確認ってlsでいいんですか?これはマック限定??
だめだなさすがにすごい迷惑な気がしてきた。もう少し勉強してからきまつね(´・ω・`)
>>348 bcc32.exe を検索して、コマンドプロンプトにドラッグアンドドロップ。
半角スペースを入力。またコマンドプロンプトにプログラムを書いた
ファイルをドラッグアンドドロップ。そして、Enter
これでとりあえず動くはずだから、参考まで。
手入力で走らせられたほうが後々いいんだけどね。
誰か長さん呼んできて!
>>347 だから、今の段階は前スレとここまでのレスを追いかけて来いって事だ
俺の始めたタイミングと違うからすれ立てる/ML作るじゃ知識が分散するだけ
どうせこのスレはパート4位で自然消滅するから、その後また1からやり直せばよい
初心者は何時になったって居なくならないんだから
352 :
デフォルトの名無しさん :2005/10/16(日) 23:57:10
みんなどういうきっかけでCを習い始めた? 俺は、プログラムってどんなのか興味もったから。
353 :
デフォルトの名無しさん :2005/10/17(月) 00:20:15
>>352 マイコンのプログラム書きたくて習ってる途中。
>>352 pascalのコンパイラが手に入らなかったからかな
もう雑談で埋めなのか?
356 :
デフォルトの名無しさん :2005/10/17(月) 00:58:21
Windowsに入ってるコマンドプロンプトじゃlccが反応しませんって出てきました。 そこらへんはどうしたら良いのでしょうか?教えてください
358 :
デフォルトの名無しさん :2005/10/17(月) 01:24:37
すみません間違いました 本当は対応してませんでした
今日から始めたいと思います。 開発環境:VC++6.0で
とりあえず、課題@ これでいいのかな? #include<stdio.h> int main(void) { printf("HelloWorld\n"); return 0; }
OK
いいよー
次の課題答えあっているかどうか不安だが・・。 #include<stdio.h> int main(void) { int a,b=0; for(a=1;a<50;a++) b=b+a; printf("1から50までの合計は%dです。",&b); return 0; }
printf文でちゃんと合計値は表示されてますか?
1245048と表示されます。明らかに大きいですね。見直して 来ます。
それだと1〜49のような気がする
>>363 それだと変数bのアドレスを渡してることになるよ。
scanfとprintfの違いに注意。
ちなみに1から50までの合計値っていくつ?w
それがわかってないと、
>>366 の指摘って
気づかないことあるよね。
ご指摘ありがとうございます。
テキスト片手に色々弄くった結果。
何とか正常な値がでました。
int a=0,b=0;
for(a=1;a<51;a++){
b=b+a;
printf("%d",b);
printf("%d\n",a);
}
printf("1から50までの合計は%dです。",b);
>>367 変数bのアドレスが1245048何ですか?
1/2*50*(1+50)
>>369 for(a=1;a<51;a++)
より、
for(a=1;a<=50;a++)
のほうが、「1から50まで」ってわかりやすいと思うけど、どう?
>>372 そうします。
ってここまでやったけど次は何やろう?
>>374 うーん、ファイル処理とか難解なアルゴリズム
を駆使する物は未だ良く解らないので遠慮したいです。
ファイル処理の問題での質問なんですが、 ファイルから読み込んだ数字は配列に入れるべきか、 ポインタを使うべきなのか、 どちらの方がいいのでしょうか?
試しにポインタに入れてみてください
>>377 そうですね、とりあえず両方やってみます!
>ポインタを使うべき どゆこと?もちっと詳しく 配列だと大きさをコンパイル前に決めておく必要があるけど、 大きさを実行時に決めて動的に確保する、ってこと?
[問題]調査のサンプリング unsigned long のM,Nを入力し、0〜Nの中から重複しないM個の整数を表示するプログラムを作れ
381 :
デフォルトの名無しさん :2005/10/18(火) 12:47:57
>>381 例えば、m=5、n=3000のときだと 0から3000の範囲の5個の重複しないランダムな数字、
0, 12, 543, 1015, 2020 みたいなの表示しろってことでしょう。
unsigned long だといろいろめんどいな わざとか?
なにこの糞問題 4294967295個以上もの管理テーブルでも作れって?
高々M個かN個ジャン。
問題にはランダムとは書いてないから連続でいいんだろ
べつに(
>>382 の例で言えば)randの出力値域を0〜3000
の値域に写像して取得して重複しないように5個取れば良いような気が
ところで昇順にしないと×?
いや、その理屈はおかしい。
389 :
デフォルトの名無しさん :2005/10/18(火) 19:25:19
一次元配列と比べて、二次元配列のポインタとの関係はどうなってるんですか? ソース #include<stdio.h> int main(void) { int ki[4][4] ={ {01,02,03,04}, {11,12,13,14}, {21,22,23,24}, {31,32,33,34} }; int *p_ki[4][4]; p_ki[0][0] = &ki[0][0]; printf("%d",*ki[2][2]); return 0; } エラー E2062 popo.c 12: 無効な間接参照(関数 main )
390 :
間違えた^^; :2005/10/18(火) 19:30:41
#include<stdio.h> int main(void) { int ki[4][4] ={ {01,02,03,04}, {11,12,13,14}, {21,22,23,24}, {31,32,33,34} }; int *p_ki[4][4]; p_ki[0][0] = &ki[0][0]; printf("%d",*p_ki[2][2]); return 0; } エラー E2062 popo.c 10: 無効な間接参照(関数 main )
391 :
デフォルトの名無しさん :2005/10/18(火) 19:37:36
p_ki[0][0] = &ki[0][0]; p_ki[0][1] = &ki[0][1]; ・ ・ これを全て書けばいいんだろうけど、何か良い方法ないんかな??
392 :
デフォルトの名無しさん :2005/10/18(火) 19:38:17
他に・・・
>>391 4×4の2次元配列へのポインタを定義したいなら
int ki[4][4] ={ {01,02,03,04}, {11,12,13,14}, {21,22,23,24}, {31,32,33,34} };
int (*p_ki)[4][4];
p_ki = &ki;
printf("%d", (*p_ki)[2][2]);
で、ポインタ経由でkiを参照できる。
配列のポインタと、ポインタの配列の定義の違いは仕様も見た目も分かりづらい所だし、
普通のポインタで取り出した方が分かりやすい、、かも。
int ki[4][4] ={ {01,02,03,04}, {11,12,13,14}, {21,22,23,24}, {31,32,33,34} };
int *p_ki;
p_ki = ki;
printf("%d", *(p_ki + 2*4 + 2)); //[2][2]を参照
スマソ、後半は p_ki = &ki[0][0]; ね
395 :
391 :2005/10/18(火) 19:56:50
>>393 さん
わかりやすく、そして丁寧な解説をありがとうございます。
int (*p_ki)[4][4]; と*(p_ki + 2*4 + 2)を参考にさせて頂いております。
どんなときにそんなポインタの使い方すんだよ・・・
>>393 >>395 これがCでは最も一般的。
int ki[4][4] = {略};
int (*p_ki)[4];
p_ki = ki;
printf("%d", p_ki[2][2]);
typedefを使って書き換えるとこうなって一次元配列のときと同じく、
配列がその先頭要素へのポインタとして扱える規則が当てはめられる。
typedef int ki_t[4];
ki_t ki[4] = {略};
ki_t *p_ki;
p_ki = ki;
398 :
オーイオチャ :2005/10/18(火) 21:50:32
この前初めてCに触った。
俺も満員電車で偶然触っちゃった…… それから癖になっちゃってやめられない
手の甲でゆっくり摩るのまでは犯罪じゃ無いよな
じゃあ、ティムポをさりげなく押し付けるのは?
OK
何の話をしている
#include <stdio.h> void main(void) { int a; long b; char *ms="何でC言語からティムポの話になるのかと小1時間(ry\n"; for(a=0;ms[a]!=NULL;a++){ printf("%c",ms[a]); for(b=0;b<30000000;b++); } }
>4294967295個以上もの管理テーブル はぁ?そんなコトスル香具師はまぬけwwww テーブル無しでできる (ヒント:残りR個の中からS個選ぶにはS/Rの確率で) どうしてもどうしてもどうしてもテーブルが欲しいならビットという手もあるが...
407 :
デフォルトの名無しさん :2005/10/19(水) 03:50:50
>>380 できた
#include <stdio.h>
#include <limits.h>
int main()
{
unsigned long n, m, num=0, i;
scanf("%d", &n);
scanf("%d", &m);
for (i=0 ; i<m ; i++)
{
num += rand()%(ULONG_MAX/m);
printf("%d\n", num);
}
return 0;
}
>例えば、m=5、n=3000のときだと 0から3000の範囲の5個の重複しないランダムな数字、 >0, 12, 543, 1015, 2020 みたいなの表示しろってことでしょう。 3000 ← これを入力 5 ← これを入力 0 622772474 849156758 1260379561 1592777631 ...orz
#include <stdio.h> #include <stdlib.h> int main() { unsigned long n; unsigned i,j,m; scanf("%ld", &n); scanf("%d", &m); if(m > (unsigned)n){ fprintf(stderr,"error\n"); exit(-1); } unsigned long *arg = (unsigned long*)malloc(sizeof(unsigned long)*m); for(i=0;i<m;++i){ begin: arg[i] = ((unsigned long) rand() << 16L | rand()) % n; for(j=0;j<i;++j) if(arg[i] == arg[j]) goto begin; } for(i=0;i<m;++i) printf("num %d : %ld \n",i,arg[i]); free(arg); } でいいんか? goto文使ってるけど
0..n-1 の数列を作る。 それを完全にシャッフルする。 先頭から m 個取る。 というのを考えたが、n が大きいとつらいな。
413 :
デフォルトの名無しさん :2005/10/19(水) 20:04:14
学校の宿題なんですけどまったくわかりませんorz どなたか教えてくださいm( __ __ )m @円柱の体積を求めるプログラムを作りなさい ただし半径と高さはキーボードから入力する(変数の型をfloatにする) A時速(km/時)をキーボードから入力し、時速(m/秒)に変換して出力するプログラム作りなさい (変数の型をfloatにする) 以上の2問でつ お願いします
宿題スレがあるのにわざわざここで質問する神経が理解できない。
>>413 まさか計算式までわからないとは言わないよな?
416 :
デフォルトの名無しさん :2005/10/19(水) 20:27:27
そして、マルチなの。
>>413 みたいなのがわからない人は入門本でも入門サイトでも見ればすぐ解決するのにな。
413みたいのばかりだからC言語厨は痛い
しょーがねーなー、答えてあげるよ unsigned long Select,Remaining,i; Select=m; Remaining=n; for(i=0; i<=n; ++i){ if(rand()/((double)RAND_MAX+1) < (double)Select/Remaining){ printf("%lu\n", i); --Select; } --Remaining; }
>>421 正直感動した
勉強になった
ありがとう
なんでそれだけの頭もってながら、
人を煽って優位に立つことでしか快感を覚えられないくだらない人間になったんだ?
俗人は、ついつい、自分はこういう事を知っていると言いたくなってしまう、 嫌な癖があるのさ…
答えを教えてもらっても理解できないorz
helloworldしか出来ない俺だけど コンソールの簡易スレッドビューア作ることにした 渡されたスレッドのurlに接続して レスを取得してくるだけで良いんだけど さっぱりワカンネ。
ほとんどネットワークスレ的なコードになっちゃいそう。
427 :
デフォルトの名無しさん :2005/10/20(木) 12:08:09
>>425 C言語を覚えたいのか、ネットワークプログラムをしたいのかによるが
単純にネットワークプログラムしたいだけならその程度の物はJavaで書いた方が楽
>>427 C言語を覚えたいんだけど
偏っているかな?
もうちょいバランス良く覚えられて、面白い物があれば良いんだけど…
429 :
デフォルトの名無しさん :2005/10/20(木) 13:38:27
>>428 それならこのスレの>>28-でも見てくれ
ネットワークプログラミングがしたいのだけど Cはあまり向いてないの? Windowsネイティブで作りたいのでC+winsockで勉強中です 他に選択肢があれば教えてください
>>430 サーバならCで書くが、クライアントなら何でもいいよ
C言語にはネットワークの概念はないよ だからネットワークに向いてないかといったら、全然そんなことなくて インターネットなんかは元々Cで開発されてきたわけだから
>>425 C言語とは何の関係もないが、それ便利だよ。頑張って作れ。
私は、Perl+(wget+nkf+jless)で作ったのを使ってる。
等幅フォントのターミナルで見てるから、AAはちゃんと見れないけど、
プログラム板ではAAなんかどうでもいいし、プログラムは見やすい。
(書き込むときは「おちゅーしゃ」を起動してます。書き込み機能書けよな>自分)
>>421 みたいな面白いソースが載ってる本かウェブサイトないですか?
435 :
デフォルトの名無しさん :2005/10/21(金) 01:43:59
>>380 できましたー!!
#include <stdlib.h>
#include <limits.h>
#include <set>
using namespace std;
int main()
{
set<int> random_table;
set<int>::iterator p;
unsigned long n,m;
printf("範囲:");
scanf("%d", &n);
printf("個数:");
scanf("%d", &m);
do
{
random_table.insert(rand() % n);
}
while (random_table.size() < m);
for (p=random_table.begin() ; p!=random_table.end() ; p++)
{
printf("%d\n", *p);
}
return 0;
}
436 :
405 :2005/10/21(金) 02:53:00
問題点が理解できないかわいそうな
>>436 がいるスレはここですね
>>435 せめて380の仕様内の事が動くソース貼ってくれ・・・
>>439 動くつもりでうぷした奴にそんな事を言っても無駄だろうよ
なんつうか、Cでこんな書き方しちゃだめだよ。という見本。でもちゃんと核のめんどくさい #include <stdio.h> #include <stdlib.h> void random_sampling(unsigned long max, unsigned long count_of_samples, void f(unsigned long)) { if (count_of_samples) { if (rand() % (max + 1) < count_of_samples) { random_sampling(max - 1, count_of_samples - 1, f); f(max); } else { random_sampling(max - 1, count_of_samples, f); } } } void print(unsigned long x) { printf(" %lu", x); } int main(void) { unsigned long M, N; printf("M> "), scanf("%lu", &M); printf("N> "), scanf("%lu", &N); random_sampling(N, M, print); puts(""); return 0; }
443 :
デフォルトの名無しさん :2005/10/22(土) 20:22:12
メトロイドみたいなゲーム作りたい。 スーパーメトロイドを考えた人は凄い。あのクオリティはヤバイ。 helloworldしかできないけど、メトロイドクローンを作ってみたい。
>>443 アクション系はゲームの中でもかなり難い分類だからな。
俺もまだ未熟だが、その手の物は作ってみたいと思ってる。
どうでもいいが、デカいプログラム一人で作るには結構な時間と労力がいるみたいだな。
本気でやるなら仲間ぐらい作っといた方がいいかも。
445 :
デフォルトの名無しさん :2005/10/22(土) 22:39:49
アクション系って障害物との当たり判定どうやってんの? 当たってもとの場所に戻すだけだと隙間できるじゃん あれがうまくいかねー
>>445 基本は座標と方向ベクトルと衝突判定
背景との当たり判定は仮想画面のオブジェクト配置を当たり判定に使うと衝突判定で手抜きが出来る
これをコンパイルして実行しても segmentation faultとか言われるんですが何が原因かわからないんです 誰か教えてください・・・ #include<stdio.h> int main(){ float hour, second; printf("時速(km/h)を入力してください。\n秒速(m/s)に変換します\n"); scanf("%f", hour); second = (hour * 1000.0) / 3600.0; printf("秒速は%f(m/s)です。\n", second); return 0; }
[問題](ほかのスレで見たような気がするが) "いち たす に は"とか入力すると"さん"と表示するプログラム 数字は"れい","いち","に","さん","よん","ご","ろく","なな","はち","きゅう" 取り敢えず1桁の加減算ができればいいか "たす","ひく" [応用] ・加減乗除に対応 ・他に"し"とか"しち"とか"ひ","ふ","み"とか複数パターンの入力に対応できる ・2桁以上 "じゅう" とかも使えるようにする
>scanf("%f", hour); あどれすを渡さなきゃ
>>447 × scanf("%f", hour);
○ scanf("%f", &hour);
451 :
447 :2005/10/23(日) 01:30:58
わかりました!こんなミスするのはポインタとかがよくわかってないからですね 精進します。
てかdebag汁よ ウィンならturbodebagger unixならlintでエラー判るだろ
>>452 >unixならlintでエラー判るだろ
lintはねぇ。「出力が多すぎて全部見る気がしない」という問題点があってねぇ。
この発言をする人間は「lintクリーンなコードを書く習慣を身に付けている」という資格が必要だ
と思うのだけど。どうか?
gccで事が足りる。
455 :
デフォルトの名無しさん :2005/10/23(日) 21:25:00
数字を入れればその階乗を計算するプログラミングってどうすればいい? 再起つかわず
int n, i, result; scanf("%d", &n); for(i=result=1;i<=n;i++) result*=i;
>>448 おもしろそうですね
勝手にやってもいいんですかね?
459 :
デフォルトの名無しさん :2005/10/23(日) 21:46:03
n!=n*(n-1)*(n-2)*・・・*1
そうだとしたらヒドイぞ・・・
>>457 揚げ足取りだと思うけど、intだと実際問題使い物にならないと思うが・・・
12か13くらいで変な数字が出ました
>>465 どのぐらいの数まで階乗を求めたいんだ?
それによって、用いる型が変わると思うがね。
>>466 大差なし。つか、longって・・・俺の環境だとintと同じサイズですが……
>>448 "いちたすいちは"
"いちたすには"
"いちたすさんは"
・・・・
・・・・
"きゅうたすきゅうは"
"いちひくいちは"
"いちひくには"
・・・・
・・・・
・・・・
"きゅうひくきゅうは"
に対応する答えを全部用意しておくっていうのはダメですよね
469 :
457 :2005/10/23(日) 22:01:25
質問の意図が再帰せずに階乗を算出する方法だったから適当に書いた。 反省はしていない。
初心者の俺が予想するに、いち〜じゅうを作っておいて 結合するんだな!! だからマクロをつかうんですよね?先生!
>>466 まぁ俺もそうだけど、俺の少ない脳味噌じゃそれくらいしか考えられなかったんで。
>457で、doubleを使えばそれなりに計算できる。 もしかしたらループの方向を逆にした方がいいかも知らん。
なんでdoubleなん?
今問題なのは有効桁数じゃない
>474 >465
12! = 479001600
13! = 6227020800
2^31 = 2147483648
>>457 の実装で表示がおかしくなるのは当たり前。
だが
>>455 は非再帰での階乗算出法を問うているのだから
有効桁数は問題ではない。
477 :
デフォルトの名無しさん :2005/10/24(月) 07:12:17
>>455 #include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main()
{
int i, num, sum=1;
scanf_s("%d", &num);
printf_s("1");
for (i=2 ; i<=num ; i++)
{
if( (INT_MAX/i) < sum)
{
printf_s("=%d\n", sum);
printf_s("もう限界(´・ω・`)ショボーン\n");
exit(1);
}
printf_s("*%d", i);
sum*=i;
}
printf_s("=%d\n", sum);
return 0;
}
doubleで表現できる数値は
正の数 4.940656458412465×10の-324乗〜1.797693134862316×10の308乗
負の数 -1.797693134862316×10の308乗〜-4.940656458412465×10の-324乗
2147483648以上の数値を扱いたければdouble使っとけ。
>>455
479 :
デフォルトの名無しさん :2005/10/24(月) 21:51:58
>>455 です。
>>457 ありがとうございます。でも当方あまりにも初心者のためできません。
なにが間違えてるか見てくれませんか?
include<stdio.h>
int main(void)
{
int n, i, result;
scanf("%d", &n);
for(i=result=1;i<=n;i++) result*=i;
return 0;
}
なぜかコンパイルできない・・・
最初の行を include<stdio.h> から #include <stdio.h> にしましょ〜
483 :
デフォルトの名無しさん :2005/10/24(月) 22:40:30
>>480-481 あ、そーだ。ほかになにか教えてください。
もしかしてプリントFじゃないですか?にしても書き方がわからないんですが
2chに来れるくらいなら、そんくらい自分でできませんか?
>>479 それ位で人を頼るな!そんなんじゃ上達しないぞ!自分の頭を使え!
目的を明白にしろ!方法を考えろ!分らなきゃ調べろ!
エラーメッセージを見ろ!参考書片手に文法間違えてないか確認しろ!
単位が欲しいだけなら誰かのコピーしろ(lol)
487 :
デフォルトの名無しさん :2005/10/24(月) 23:39:49
>>484-486 いや、ごめんまじわかんねぇんだ。頼むから教えて。
>>457 が書いてくれた文の意味はわかるんだけど、それだけになんで実行できないのか
わかんない。ほんとお願い!
i=result=1がまずいんだろな
>>488 どこがまずいんだ?
単に1行目の#がないだけだろ
>>488 二重代入は何も問題ない。
result=1が行われた後にi=resultが行われる。
488は皮肉? 俺はそう理解してた
きっと、return 0;の前の行にprintf("result:%d\n", result);を書けばいいって話なんだよ。
もう眠いから問題出して寝るわ ノシ 1、文字列を入力し、文字列の長さを調べるコードを作成 2、文字列を入力し、文字列にいくつ「a」の文字が含まれるかを調べるコードを作成 3、文字列を入力し、文字列中の「a」という文字を「b」に置き換えるコードを作成 いずれもstdio.h以外のヘッダを使用しないで作る事
>>448 キーボードからひらがなを入力する方法が分かりません
DOS窓で半角英数を入力する方法しか分かりません
!
?
釣りだと思ったのにそうじゃなかったの「!」。
>>495 #include <stdio.h>
int main(){
char str[250];
int i, cnt_a = 0;
printf("文字列を入力-> "); scanf("%s", str);
for (i = 0; str[i] != '\0'; i++){
if (str[i] == 'a'){
cnt_a++;
str[i] = 'b';
}
}
printf("\n文字列の長さは%d\n", i);
printf("「a」の数は%d個\n", cnt_a);
printf("「a」を「b」に置換え-> %s\n", str);
return 0;
}
503 :
デフォルトの名無しさん :2005/10/25(火) 07:26:17
>>495 の1
#include <stdio.h>
//文字列の長さを返す変数
int string_length(char *string)
{
int len=0;
while (*string != '\0')
{
string++;
len++;
}
return len;
}
int main()
{
char *buf="hello, world";
int len;
len=string_length(buf);
printf("%sの長さは%dです\n", buf, len);
return 0;
}
504 :
デフォルトの名無しさん :2005/10/25(火) 07:30:37
>>495 の2
#include <stdio.h>
//aの数を返す変数
int count_a(char *string)
{
int count=0;
while (*string != '\0')
{
if (*string == 'a')
{
count++;
}
string++;
}
return count;
}
int main()
{
char *buf="an an an tottemo daisuki doraemon.";
int count;
count=count_a(buf);
printf("%sのaの数は%dです\n", buf, count);
return 0;
}
ageんなバカ 空気嫁
>>495 の3
先生!質問です
関数の中で文字を置換する方法がわからないので教えてください
#include <stdio.h>
//aをbに置換する関数
void replace_a_to_b(char *string)
{
while (*string != '\0')
{
if (*string == 'a')
{
*string='b'; //うまくいかない
}
string++;
}
}
int main()
{
char *buf="an an an tottemo daisuki doraemon.";
printf("%s -> ", buf);
replace_a_to_b(buf);
printf("%s\n", buf);
return 0;
}
>>506 そこでコケてるかどうかは別にして常識として
char *buf="an an an tottemo daisuki doraemon.";
↑
これだと書き換え可能であることが保障されない。
文字列定数へのポインタという意味になる。
正しくはこう。
char buf[] = "an an an tottemo daisuki doraemon.";
bufはchar型配列でmain関数上の自動変数であり書き換えが可能。
配列長は文字列幅によってコンパイル時に自動的に設定される。
>>507 うまくいきました
ありがとうございます
509 :
デフォルトの名無しさん :2005/10/25(火) 10:03:12
この問題を解いていただけませんか 1)プログラムに0以上59以下の値をとる二つの整数を与える.これらの2数を順にm, nとする.これらをm分n秒と解釈する. 与えられた時間の(秒単位で)半分となる時間をコロン(:)で区切られた二組の二桁の整数で表示するプログラムを作成しなさい. 課題実行においては以下の点に注意すること. 表示する分数、秒数が9以下のときは10の桁にはスペースを置く. 秒数が2で割り切れないときは切り捨てを行う. m,nのどちらかが0以上59以下でなければ,errorのみを表示すること. 2)プログラムに三つの整数を与える.これらの数を順にならべたとき, 最初から大きさが2番目にあたる数を表示するプログラムを作成しなさい. 3)3個の整数を入力し(順に a, d, n とする),初項 a ,項差 d の等差数列を n 項表示するプログラムを作成しなさい.ただし,項数が 0 以下の場合は, 何も表示しないもの(改行のみ)とする.また,数列を表示するときは, 数の前に1文字のスペースを挿入することとし,最後の数を表示したところで改行すること. プログラムを作成するとき,初項 a の等差数列の第 i 項 (これを a(i) と表す)を求める関数 int ap( int a, int d, int i ) を定義し, これを main 関数から呼び出し,結果の表示は main 関数内で行うものとする. また,関数 ap は,第一引数に初項 a ,第二引数に項差 d , 第三引数に求める項の番号 i を与えると,戻り値として等差数列の 第 i 項 a( i ) を返すものとする.
自分でやれよ 学ぶ気が無い奴がどうしてこのスレに?
>>509 宿題スレ逝け。まあ一応打ってはみるが。
>>509 馬鹿だなー。
「この問題を解いていただけませんか」じゃなくて、「問題を出してやろう」と言うんだよ。
あとは問題文を如何にも宿題なその文章からもっと柔らかい自分で考えた文章にする。
そうすりゃ誰かが解いたかもしれないだろ?
でも一番簡単なのは適当な入門本を買って軽く勉強することだよ。
解いてもらったって、今回は良くても次からは問題の難易度も上がっていくのに対応できないっしょ。
514 :
デフォルトの名無しさん :2005/10/25(火) 22:15:29
>>509 #include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n;
int half_m, half_n;
int sum;
//mとnの入力
printf("m(分)=");
scanf("%d", &m);
if (!(m>=0 || m<=59))
{
printf("error\n");
exit(EXIT_FAILURE);
}
printf("n(秒)=");
scanf("%d", &n);
if (!(n>=0 || n<=59))
{
printf("error\n");
exit(EXIT_FAILURE);
}
515 :
デフォルトの名無しさん :2005/10/25(火) 22:16:00
//半分を計算 sum=m*60+n; sum=sum/2; half_m=sum/60; half_n=sum%60; //結果表示 printf("%d分%d秒の半分は%d分%d秒\n", m, n, half_m, half_n); return EXIT_SUCCESS; }
>>516 #include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n;
int half_m, half_n;
int sum;
//mとnの入力
printf("m(分)=");
scanf("%d", &m);
if (!(m>=0 || m<=59))
{
printf("error\n");
exit(EXIT_FAILURE);
}
printf("n(秒)=");
scanf("%d", &n);
if (!(n>=0 || n<=59))
{
printf("error\n");
exit(EXIT_FAILURE);
}
//半分を計算 sum=m*60+n; sum=sum/2; half_m=sum/60; half_n=sum%60; //結果表示 printf("%2d:%2d\n", half_m, half_n); return EXIT_SUCCESS; }
%02d
>>520 > if (!(m>=0 || m<=59))
この論理式を日本語で書き直して見ましょう。
#include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv) { int m, n, m2, n2; char dummy; if (argc != 3 || sscanf(argv[1], "%d %c", &m, &dummy) != 1 || sscanf(argv[2], "%d %c", &n, &dummy) != 1 || !(0 <= m && m <= 59) || !(0 <= n && n <= 59)) { fprintf(stderr, "error\n"); return -1; } m2 = m / 2, n2 = n / 2 + m % 2 * 30; printf("%2d'%2d\"\n", m2, n2); return 0; }
#include <stdio.h> int main(int argc, char ** argv) { int x, y, z; char dummy; if (argc != 4 || sscanf(argv[1], "%d %c", &x, &dummy) != 1 || sscanf(argv[2], "%d %c", &y, &dummy) != 1 || sscanf(argv[3], "%d %c", &z, &dummy) != 1) { fprintf(stderr, "error\n"); return -1; } printf("%d\n", x < y != x < z ? x : y < z != y < x ? y : z); return 0; }
//つーか、もっと簡単な記述でいいのでは? #include <stdio.h> void main(void){ int m, n; scanf("%d%d", &m, &n); if(m < 0 || m > 59 || n < 0 || n > 59){ printf("error\n"); return; } m = (m*60+n)/2; printf("%2d:%2d\n", m/60, m%60); }
#include <stdio.h> int input(int * var, const char * msg) { char dummy, buf[256]; printf("%s> ", msg); if (fgets(buf, sizeof(buf), stdin) == NULL || sscanf(buf, "%d %c", var, &dummy) != 1) return 0; return 1; } int ap(int a, int d, int i) { return a + d * i; } int main(void) { int a, d, n; int i; if (!input(&a, "a") || !input(&d, "d") || !input(&n, "n")) { fprintf(stderr, "error\n"); return -1; } for (i = 0; i < n; i++) { printf(" %d", ap(a, d, i)); } puts(""); return 0; }
>>527 問題をよく読め。
「プログラムに..与える」って書いてあるだろ
#include<stdio.h> #include<stdlib.h> void swap(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } void sort3(int *x, int *y, int *z) { if (*x>*y) swap(x, y); if (*x>*z) swap(x, z); if (*y>*z) swap(y, z); } int main(int argc, char **argv) { int x, y, z; if (argc != 4) { fprintf(stderr, "usage: %s num1 num2 num3\n", argv[0]); return 1; } x=atoi(argv[1]); y=atoi(argv[2]); z=atoi(argv[3]); sort3(&x, &y, &z); // この時点で x <= y <= z if (x==z) return 0; // 全部同じ。二番目に大きな数は無い if (x==y) { // 3 3 5 二番目に大きいのは x と y printf("%d\n", x); return 0; } if (y==z) { // 3 5 5 二番目に大きいのは x printf("%d\n", x); return 0; } // 3 4 5 二番目に大きいのは y printf("%d\n", y); return 0; } ふざけすぎ?
>>509 の3番は
#include<stdio.h>
int ap(int a, int d, int i);
int main(void){
int a, d, n, i ,*x;
printf("a,d,n= ");
scanf("%d,%d,%d", &a, &d, &n);
if(n > 0){
for (i=1; i <= n; i++){
printf(" %d", ap(a, d, i));
}
}
printf("\n");
return;
}
int ap(int a, int d, int i){
int x;
x = a + d * (i - 1);
return x;
}
こんな感じで良いのかな。
533 :
デフォルトの名無しさん :2005/10/26(水) 03:09:20
>>509 の2
#include <stdio.h>
#include <stdlib.h>
int cmp(int *l, int *r)
{
if (*l < *r)
return -1;
else if (*l > *r)
return 1;
return 0;
}
int main()
{
int num[3],i;
for (i=0 ; i<3 ; i++)
{
printf("%d個目の数字を入力してください。\n", i+1);
scanf("%d", &num[i]);
}
qsort(num, 3, sizeof(int), cmp);
printf("2番目の数は%dです\n", num[1]);
return EXIT_SUCCESS;
}
534 :
デフォルトの名無しさん :2005/10/26(水) 05:15:59
>>448 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int jap2keisan(char *jap)
{
const char suuji[2][5]={"たす","ひく"};
int i=0;
while (strcmp(jap, suuji[i]) )
{
i++;
if (i>2)
break;
}
return i;
}
const char *int2jap(int num)
{
static const char suuji[10][7]={"れい","いち","に","さん","よん","ご","ろく","なな","はち","きゅう"};
return suuji[num];
}
int jap2int(char *jap) { const char suuji[10][7]={"れい","いち","に","さん","よん","ご","ろく","なな","はち","きゅう"}; int i=0; while (strcmp(jap, suuji[i]) ) { i++; if (i>9) break; } return i; } int main() { int a ,b; char command[]="いち たす に は"; char *pToken; int keisan, kekka; printf("%s ", command); pToken = strtok( command, " " ); a=jap2int(pToken); pToken = strtok( NULL," " ); keisan=jap2keisan(pToken);
pToken = strtok( NULL," " ); b=jap2int(pToken); if (keisan==0) kekka=a+b; else if (keisan==1) kekka=a-b; printf("%s\n", int2jap(kekka)); return EXIT_SUCCESS; }
540 :
デフォルトの名無しさん :2005/10/26(水) 12:31:05
「プログラムに与えて」なんて要求仕様でプログラムを作らせる事をさせているから コンピュータ業界はダメになるんだよな。 ここはやはりきちんと与える方法の定義を引き出さずに回答したらすべてNGにするくらいで無いと
ソースばっかりでみにくいな、このスレ
日本人なら醤油とソースは区別しろ
おとついから始めたんだけど、ポインタがよくわからない ググったらいろいろ見つかるんだけど、どのサイトがわかりやすいか教えてください。
しょーゆー屁理屈ばっかりいってるとママにしかってもらいますよ
>>545 サンクス
やっぱり結構な分量あるんですね。とりあえずがんばってみます。
>>547 >545のページは初心者向けでないばかりか、誤解を招きかねない表現も含まれるのでお勧めできない。
ポインタは最近になって良い書籍がたくさん出てる
そんなことはない
そうだな
ポインタは、変数の定義や関数の引数定義、 そして、キャストするときの定義で、 int * とかやるときと、ポインタの指し示すデータを見る演算子 * が、別物だということがわかると、だいたい意味がわかってくる。 漏れ自身、それがわかってから、やっと使えるようになった。
自分語りオツ
554 :
デフォルトの名無しさん :2005/10/26(水) 16:44:43
C以外の言語でポインタ覚えりゃどうって事ないんだがな Cは他の言語じゃやっちゃいけない事がポインタ使って出来てしまう所が良い所でも有り悪い所でもある
他言語でやっちゃいけない事って何さ?
メモリ内の任意の領域にAPIを経由せずアクセスするとか?
ん?そんなもんCでもやっちゃイカンよ。
組み込み系では普通に使うが。 メモリマップドIOとか
VRAM書いたりとか普通にやってたな。
おまいら実メモリへのアクセスと仮想メモリへのアクセスがごっちゃになってるだろ
言語仕様として許されているかどうかの話であって 実行環境がどうなのかは関係ないからな
563 :
デフォルトの名無しさん :2005/10/26(水) 22:46:46
次の問題まだぁ〜?
じゃあ軽く一つ。以下の動作を行うプログラムを作成せよ。 配列(10)を作成、それに値を入力し別の関数で合計を求め、戻り値を返し出力
つまらん
566 :
デフォルトの名無しさん :2005/10/27(木) 00:01:06
>>455 ですおひさしぶりです。あほな質問をくりかえしまくって一時はなれて勉強して
まいりました。ここでいただいたアドバイスをそのまま使ってプログラミングしてみた
のですが、どの数字を入れても
result=1
にしかなりません。どこがまずいかどなたかお願いできないでしょうか?
#include(stdio.h)
int main(void)
{
int n,i,result;
scanf("%d",&n);
for(i=result=1;i<=n;i++)
result*=1;
printf("result:%d\n",result);
retur#include <stdio.h>
n 0;
}
result*=1; ←これ調べれ
568 :
デフォルトの名無しさん :2005/10/27(木) 00:10:13
>>567 ありがとう!ほんとありがとう!!
でもこれ50とか計算できない・・・どうすれば?
return *= i; に修正したなら、バッファオーバーフローを 起こしたんだろ。int が扱える範囲を超えた。
概数でいいなら浮動小数使うといい。 多倍長整数はC++のほうがいいね。
言い忘れた。Long型とかunsigned頭につけるとかある。調べてみ。
GCCはlong long、VCは__int64だったかな。 ちなみにrubyだとこんな感じ irb(main):001:0> def kaijo(n) irb(main):002:1> n > 1 ? n * kaijo(n-1) : 1 irb(main):003:1> end => nil irb(main):004:0> kaijo(50) => 30414093201713378043612608166064768844377641568960512000000000000 irb(main):005:0> こんなん64bit整数使っても表現不可能だろ。
>>564 #include <stdio.h>
#include <stdlib.h>
int sum(int *int_array, int size)
{
int i, sum_num=0;
for (i=0 ; i<size ; i++)
{
sum_num += int_array[i];
}
return sum_num;
}
int main() { int int_array[10], size, sum_num, i; for (i=0 ; i<10 ; i++) { int_array[i]=rand()%100; } size=sizeof(int_array) / sizeof(int); sum_num=sum(int_array, size); i=0; while (1) { printf(" %d ", int_array[i]); i++; if (i>9) break; printf("+"); } printf("= "); printf("%d\n", sum_num); return EXIT_SUCCESS; }
それでは出題。 AとBの戦闘。 それぞれのライフをA_HP,B_HPとする。 どちらかのライフがなくなるまで実行する。 次のコマンドを選択させる。攻撃かなにもしない。 さて、どのように書く? また、次のターンのダメージを軽減する「防御」コマンドの追加。
ナップザック問題。 商品の代金を与えるとお札、ないしコイン枚数が最少となる自作関数。
説明がヘタクソすぎてやる気がでない
それには同意せざるを得ない
自分の言葉を意訳して(ということが間違いだった)
短く書いたんだが、以下
>>575 を書き直す。
AとBが戦闘をする。AとBは交互に行動する。
行動の内容は選択を促すことで選ぶ。
その行動には、「攻撃」と「なにもしない」があり、
毎ターンどちらかを1回行動する。
この行動選択はどちらかのライフがなくなるまで選択を促す。
このAとBそれぞれのライフはA_HP, B_HP に保持する。
また、次のターンに相手の「攻撃」によって与えられるダメージを
無効ないし半減する「防御」行動を追加する。
学校の宿題は自分でやるものだ。
>>572 VCもlong longだ。ただしVC7以降。
>>579 >行動の内容は選択を促すことで選ぶ。
「促す」のは誰? 「選ぶ」のは誰?
「主語」と「述語」について中学校辺りからやり直せ。
>>584 ユーザーとかプログラマーとか言いたくなく、
しかし別の言葉が思いつかなかった。
>>583 >>585 初期HPを10 として「攻撃」で与えるダメージが2、
相手が「防御」していたら1。
587 :
デフォルトの名無しさん :2005/10/28(金) 12:22:05
>>579 の1つ目の問題
#include <stdio.h>
#include <stdlib.h>
typedef struct status_tag
{
int hp;
int attack;
} STATUS;
STATUS status[2];
void init_game()
{
int i;
for (i=0 ; i<2 ; i++)
{
status[i].hp=10;
status[i].attack=2;
}
}
void show_status()
{
int i;
for (i=0 ; i<2 ; i++)
{
printf("Player %d\n", i+1);
printf("hp:%d\n", status[i].hp);
printf("attack:%d\n\n", status[i].attack); } } int main() { int player=1, command; init_game(); while(status[player].hp>0) { player=1-player; show_status(); printf("Player %d コマンド?\n1:戦う\n2:なにもしない\n", player+1); scanf("%d", &command); switch(command) { case 1: printf("Player %dの攻撃\n", player+1); printf("Player %dに%dポイントのダメージをあたえた\n\n", (1-player)+1, status[1-player].attack); status[player].hp-=status[1-player].attack; break; case 2: switch(rand()%3) {
case 0: printf("Player %dはようすをみている\n", player+1); break; case 1: printf("Player %dはぼーっとしている\n", player+1); break; case 2: printf("Player %dはあわてふためいている\n", player+1); break; } break; } } return EXIT_SUCCESS; }
>>589 DQコマンド、ナツカシス。
Cは長らくやってないが、STATUS構造体定義のところで
} STATUS; を
} STATUS[2]; にすれば
STATUS status[2]; を省ける。
591 :
デフォルトの名無しさん :2005/10/28(金) 14:27:59
>>590 そういう拡張性を損なう最適化は施す意味が無い
592 :
デフォルトの名無しさん :2005/10/29(土) 01:16:45
>>579 の2つ目の問題です
>>590 さんのアドバイス通りやってもエラーがでてうまくいきませんでした
#include <stdio.h>
#include <stdlib.h>
typedef struct status_tag
{
int hp;
int attack;
int defense;
} STATUS;
STATUS status[2];
void init_game()
{
int i;
for (i=0 ; i<2 ; i++)
{
status[i].hp=10;
status[i].attack=2;
status[i].defense=1;
}
}
void show_status()
{
int i;
for (i=0 ; i<2 ; i++)
{
printf("Player %d\n", i+1); printf("hp:%d\n", status[i].hp); printf("attack:%d\n\n", status[i].attack); } } int main() { int player=0, enemy=1, command, damage; init_game(); while(status[player].hp>0) { status[player].defense=1; //防御解除 show_status(); printf("Player %d コマンド?\n1:戦う\n2:なにもしない\n3:防御\n", player+1); scanf("%d", &command); switch(command) { case 1: damage = status[player].attack / status[enemy].defense; printf("Player %dの攻撃\n", player+1); printf("Player %dに%dポイントのダメージをあたえた\n\n", enemy+1, damage); status[1-player].hp -= status[player].attack / status[1-player].defense;
break; case 2: switch(rand()%3) { case 0: printf("Player %dはようすをみている\n", player+1); break; case 1: printf("Player %dはぼーっとしている\n", player+1); break; case 2: printf("Player %dはあわてふためいている\n", player+1); break;
} break; case 3: status[player].defense=2; printf("Player %dはみをまもっている\n", player+1); break; } player=1-player; enemy=1-enemy; } return EXIT_SUCCESS; }
調べてみました statusの宣言が省略できてないですがこれでよかったでしょうか typedef struct status_tag { int hp; int attack; int defense; } STATUS[2]; STATUS status;
元も子もないけど 今更C言語なんか学んでどうするの?
・プログラミングの基本はC言語 ・潰しが利く ・世界で一番使われている
600 :
デフォルトの名無しさん :2005/10/29(土) 02:56:13
・プログラミングの基本はJava ・潰されます ・組み込み・制御・ゲームでしか使われてない(しかもハードの知識がないと意味がない)
602 :
デフォルトの名無しさん :2005/10/29(土) 12:04:49
立場が違うだけで、どちらも現実
Javaは今Web系で使われまくりなんだが。
>>604 C厨に言わせると、WebサーバはCで書いてるからWeb系もCらしいよ
実際はJava>JSP>COBOL>VB>Cの順じゃね?仕事の量的に
Cで作ったソフトならいくらでも知ってるけど Javaで作ったソフトってほとんど知らない。
>>606 CとJavaは対象があまり重ならないからそうなる。
Javaでの仕事はWeb関係しかないってこと?
>>608 最近の仕事はイントラでもWeb使っちゃう事が多い
その中で一番しんどいのはCだけどな
>>605 それってWindowsがCで書かれてるから世の中の95%はCだっていうぐらい乱暴な話だな
Apacheなんてソースすら見たことがない奴ばかりだろうに
>>613 家電製品にJAVA使われてる。
ポットとか電気釜とかね。
そしてCellにも・・・
WEB以外にプログラミングの仕事があるのか?って意味かと思ったw
WindowsがC#で書かれる様になるのはいつ頃の予定ですか?
>>615 実際にどの製品でJavaが使われているんですか?
C#は多品種少量生産向け Windowsみたいな大量生産には向かない
いわゆる、パッケージとなってる製品にJavaはほとんどないのは事実。 バーチャルマシーンがないと動かないからなw でもオラクルの設定プログラムとかはJavaだと思った。 オープンオフィスもJava使ってるみたい。 C#.netやVB.netは.netフレームワークがどれだけ浸透するかだろう。 100メガ以内のランタイムで動くようになれば普及すると思う。 今はそうなのかもしれないが、.netフレームワークを知っている人は ほとんどいないのが現状なのでは。 Javaよりさらにわかりにくいのが.netの使用環境。
>>622 どのポットとか電気釜にJavaが使われてるんですかと聞いているんです
携帯なんて出されても当たり前すぎなんですが。
WindowsUpdateすれば勝手に.NETがインスコされるお
Rubyマンセー
pythonやろーぜ
627 :
デフォルトの名無しさん :2005/11/01(火) 07:07:39
次の問題まだー?
【問題】 わかったから初心者どもはまず”HelloWorld!”を画面に出すプログラムを作りやがれ 【言語】 python 【回答】 print '”HelloWorld!”'
【問題】 1から50までの和を計算して表示 【言語】 python 【回答】 sum=0 for i in range(51): sum+=i print sum
631 :
デフォルトの名無しさん :2005/11/01(火) 11:52:42
632 :
デフォルトの名無しさん :2005/11/01(火) 16:19:29
アイツは星になったんだよ・・・。マリアンヌー!!
636 :
デフォルトの名無しさん :2005/11/02(水) 01:23:42
次の問題まだぁ〜?
そろそろC言語っぽい問題にするか 環境依存だろうがこんな感じで 数字を漢数字の文字列に変換するライブラリを作れ 条件は以下で 1.動作確認用のテストプログラムを作る事 2.テストプログラムと変換のモジュールは別ファイルとする事 3.ヘッダーファイルを作る事
もうちっと簡単そうな香具師 某表計算ソフトはセルの横軸が A,B,C,...,Z,AA,AB,AC,...,ZZ,AAA,AAB,... といった表記になっている これを数字1〜と相互に変換できるプログラム2つ
ぜんぜんわからね〜w
>>638 //とても難しい
//2桁以上になる数字が変換できなかった
#include <stdio.h>
#include <stdlib.h>
#define KETA_MAX 3
// 数字からAAA形式に変換するプログラム
int main()
{
const char *alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int num;
int AAA[KETA_MAX];
int keta=0;
int keta_num=26;
int i;
scanf("%d", &num);
if (num<1)
{
return EXIT_FAILURE;
}
num--;
do
{
AAA[keta]=num%keta_num;
num=num/26;
keta++;
if (keta>KETA_MAX) { return EXIT_FAILURE; } printf("num(10進数)%d桁目:%d\n", keta, num); } while(num!=0); for (i=0 ; i<keta ; i++) { printf("%c", alpha[AAA[i]]); } printf("\n"); return 0; }
642 :
640 :2005/11/02(水) 09:42:09
//今ふと思いついた //最後の表示する部分を訂正します //これでうまくいくはず!! for (i=0 ; i<keta ; i++) { if (i>0) { printf("%c", alpha[AAA[i]]-1); } else { printf("%c", alpha[AAA[i]]); } } printf("\n");
643 :
デフォルトの名無しさん :2005/11/02(水) 10:52:41
windows依存でいいからゲーム作りたい
>>637 正の整数限定版。少数はマンドクセ。あと「じょ」が漢字変換できんかった。
#include <stdio.h>
#include <string.h>
#include "digit2ksuji.h"
int main(int argc, char **argv)
{
charin[128], out[1024];
while(1) {
scanf("%s", in);
if(!strcmp(in, "q")) {break;}
if(digit2ksuji(in, out) < 0) {fprintf(stderr, "error\n"); continue;}
printf("%s\n", out);
}
return 0;
}
/* digit2ksuji.h */ #ifndef DIGIT2KSUJI_H #define DIGIT2KSUJI_H extern int digit2ksuji(const char *in, char *out); #endif /* #ifndef DIGIT2KSUJI_H */ 変換モジュール本体 #include <stdio.h> #include <string.h> #include <ctype.h> const char *number[] = {"","一","二","三","四","五","六","七","八","九"}; const char *fig1[] = {"","十","百","千"}; const char *fig2[] = {"","万","億","兆","京","垓","じょ","穣","溝","澗","正","載","極","恒河沙","阿僧祗","那由他","不可思議","無量大数"}; int digit2ksuji(char *in, char *out) { int i, fig; fig = strlen(in); for(i = 0, out[0] = '\0'; i < fig; i++) { if(!isdigit(in[i])) {return -1;} if(!((fig-i-1)%4) || in[i] != '1') {strcat(out, number[in[i]-'0']);} if(in[i]!='0') {strcat(out, fig1[(fig-1-i)%4]);} if(!((fig-i-1)%4)) {strcat(out, fig2[(fig-1-i)/4]);} } if(strlen(out) == 0) {strcat(out,"零");} return 0; }
試してみたら一億万とか出るわ、73桁以上でぬるぽだわで訂正。 int digit2ksuji(const char *in, char *out) { inti, fig, disp_fig2 = 0; if((fig = strlen(in)) > 72) {return -1;} for(i = 0, out[0] = '\0'; i < fig; i++) { if(!isdigit(in[i])) {return -1;} if(!((fig-i-1)%4) || in[i] != '1') {strcat(out, number[in[i]-'0']);} if(in[i]!='0') {disp_fig2 = 0; strcat(out, fig1[(fig-1-i)%4]);} if(!disp_fig2 && !((fig-i-1)%4)) {disp_fig2 = 1;strcat(out, fig2[(fig-1-i)/4]);} } if(strlen(out) == 0) {strcat(out,"零");} return 0; }
647 :
デフォルトの名無しさん :2005/11/02(水) 20:37:01
>>637 千百十なども使うの?それとも
「一九四二」のようにただアラビア数字を漢数字に置換するだけ?
千百十も使わないとつまらないだろう。
649 :
デフォルトの名無しさん :2005/11/02(水) 21:07:11
.netは、なんで定数テーブルを勝手にconstと判断するんだ?
int value = 0, i; const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (i = 0, value = 0; src[i] != '\0'; i++) { char *p = strchr(table, src[i]); if (p == NULL) return NULL; value = value * strlen(table) + 1; value += p - table; } if (pow(10, size) <= value) return NULL; sprintf(dest, "%d", value); return dest; } int main(int argc, char ** argv) { int i; char str[30]; for (i = 1; i < argc; i++) { if (digit2alpha(str, argv[i], sizeof(str))) { printf("%s=>%s\n", argv[i], str); } else if (alpha2digit(str, argv[i], sizeof(str))) { printf("%s=>%s\n", argv[i], str); } } return 0; }
>>638 #include <stdio.h>
#include <string.h>
#include <math.h>
char * digit2alpha(char * dest, const char * src, int size) {
int temp, i, value;
const char table[] = "ZABCDEFGHIJKLMNOPQRSTUVWXY";
char dummy;
if (sscanf(src, "%d %c", &value, &dummy) != 1 || value <= 0)
return NULL;
for (i = 0, temp = value; temp; i++) {
temp = (temp - 1) / strlen(table);
}
if (i >= size)
return NULL;
dest[i--] = '\0';
for (; i >= 0; i--) {
dest[i] = table[value % strlen(table)];
value = (value - 1) / strlen(table);
}
return dest;
}
char * alpha2digit(char * dest, const char * src, int size) {
てすと bash-2.05$ a.out 26 27 28 hoge 702 703 AAA ZZZ 18279 26=>Z 27=>AA 28=>AB 702=>ZZ 703=>AAA AAA=>703 ZZZ=>18278 18279=>AAAA
>>637 文字列を返す関数の作り方がわからなかったので表示だけ
//lib.h
#ifndef _lib_c_
#define _lib_c_
#include <stdio.h>
extern void draw_kansuji(int num);
#endif
//lib.c
#include "lib.c"
void draw_kansuji(int num)
{
const char kanji[10][3]={"零","壱","弐","参","四","五","六","七","八","九"};
if (num==0)
return;
draw_kansuji(num/10);
printf("%s", kanji[num%10]);
}
655 :
デフォルトの名無しさん :2005/11/03(木) 18:55:48
#include <stdio.h> #include <stdlib.h> #include "lib.h" int main() { int input_num; scanf("%d", &input_num); draw_kansuji(input_num); return EXIT_SUCCESS; }
>>654 の#include "lib.c"は.hの間違いです
なぜかワーニングもなく動いてたけど
657 :
デフォルトの名無しさん :2005/11/03(木) 20:12:50
【問題】1から50までの和を計算して表示 #include <stdio.h> int main() { int sum=0; _asm { mov eax, 0 mov ecx, 50 LOOP1: add eax, ecx loop LOOP1 mov sum, eax } printf("%d\n", sum); return 0; }
【問題】 1+3-5+7-9+11-13+・・・を50回計算した合計を出力するプログラムを。 #include <stdio.h> int main() { int sum; _asm { mov ecx, 25 mov eax, 1 mov ebx, 3 LOOP1: add eax, ebx add ebx, 2 sub eax, ebx add ebx, 2 loop LOOP1 mov sum, eax } printf("%d\n", sum); return 0; }
659 :
デフォルトの名無しさん :2005/11/03(木) 20:47:48
>>654 > 文字列を返す関数の作り方がわからなかった
私もC言語勉強中なので、関数から文字列を返す方法を書いてみる。
間違ってたら指摘よろしく > 詳しい人。
関数から、「文字列そのもの」を返そうとするとC言語的には無理だと思う。
私が思い付く、可能な方法は、
方法1、char の配列の先頭アドレスを関数が受け取って、そこに書き込む。
方法2、関数内で malloc で領域を確保して、そこに書き込んで、そのアドレスを返す。
あってます?
static な配列なら
>>659 2つも正解。そして
>>660 の方法もあるが最近の流行ではない。
どちらかというと前者の方式が使われていることが多い気がすると俺は思う。
後者の場合、mallocで確保した文字列はやっぱりどこかで解放しないとダメなの?
staticだと再帰できない気がする
>>662 ユーザがfreeしなきゃいけない。WIN32APIとかは前者が多いね。
665 :
デフォルトの名無しさん :2005/11/03(木) 21:21:04
static版作った //lib.h #ifndef _lib_c_ #define _lib_c_ #include <stdio.h> extern char *draw_kansuji(int num); #endif //lib.c #include "lib.h" char *draw_kansuji(int num) { const char kanji[10][3]={"零","壱","弐","参","四","五","六","七","八","九"}; static char str[80]=""; if (num==0) return 0; draw_kansuji(num/10); strcat(str, kanji[num%10]); return str; }
#include <stdio.h> #include <stdlib.h> #include "lib.h" int main() { int input_num; scanf("%d", &input_num); printf("%s\n", draw_kansuji(input_num)); return EXIT_SUCCESS; }
方法1版 #ifndef _lib_c_ #define _lib_c_ #include <stdio.h> extern char *draw_kansuji(int num, char *str); #endif #include "lib.h" char *draw_kansuji(int num, char *str) { const char kanji[10][3]={"零","壱","弐","参","四","五","六","七","八","九"}; if (num==0) return 0; draw_kansuji(num/10, str); strcat(str, kanji[num%10]); return str; }
#include <stdio.h> #include <stdlib.h> #include "lib.h" int main() { int input_num; char str[80]=""; scanf("%d", &input_num); printf("%s\n", draw_kansuji(input_num, str)); return EXIT_SUCCESS; }
方法2、関数内で malloc で領域を確保して、そこに書き込んで、そのアドレスを返す。 //lib.h #ifndef _lib_c_ #define _lib_c_ #include <stdio.h> extern char *draw_kansuji(int num, char *str); #endif //lib.c #include "lib.h" char *draw_kansuji(int num, char *str) { const char kanji[10][3]={"零","壱","弐","参","四","五","六","七","八","九"}; if (num==0) return 0; if (str==NULL) str=calloc(80, sizeof(char)); draw_kansuji(num/10, str); strcat(str, kanji[num%10]); return str; }
#include <stdio.h> #include <stdlib.h> #include "lib.h" int main() { int input_num; char *pStr; scanf("%d", &input_num); pStr=draw_kansuji(input_num, NULL); printf("%s\n", pStr); free(pStr); return EXIT_SUCCESS; }
【問題】 100までの合計を求めよ for、while、gotoを使った3通りのプログラムを作成せよ //loop命令を使いました #include <stdio.h> int sum(int num) { _asm { mov eax, 0 mov ecx, num LOOP1: add eax, ecx loop LOOP1 } } int main() { printf("%d\n", sum(100)); return 0; }
【問題】 100までの合計を求めよ for、while、gotoを使った3通りのプログラムを作成せよ //jnz命令を使いました #include <stdio.h> int sum(int num) { _asm { mov eax, 0 mov ecx, 0 LOOP1: add ecx, 1 add eax, ecx cmp ecx, 100 jnz LOOP1 } } int main() { printf("%d\n", sum(100)); return 0; }
static版の欠点は、>663もあるがマルチスレッド環境で使えないということもある。 malloc版の欠点であるオーバヘッドと解放義務の発生についても回避できない。 呼び出し側確保版の欠点であるバッファオーバランの可能性は、確保した長さも渡すことである程度回避できる。
【問題】数字を入れればその階乗を計算するプログラミングってどうすればいい? 再起つかわず #include <stdio.h> int kaijou(int num) { _asm { mov eax, 1 mov ecx, num LOOP1: mul ecx loop LOOP1 } } int main() { printf("%d\n", kaijou(10)); return 0; }
【問題】 1、文字列を入力し、文字列の長さを調べるコードを作成 2、文字列を入力し、文字列にいくつ「a」の文字が含まれるかを調べるコードを作成 3、文字列を入力し、文字列中の「a」という文字を「b」に置き換えるコードを作成 いずれもstdio.h以外のヘッダを使用しないで作る事 // 1、文字列を入力し、文字列の長さを調べるコードを作成 #include <stdio.h> int len(const char *str) { _asm { mov eax, 0 mov esi, str LOOP1: cmp [esi], 0 jz END add eax, 1 add esi, 1 jmp LOOP1 END: } } int main() { const char *str="123456789012345678901234567890"; printf("%d\n", len(str)); return 0; }
>>674 何故アセンブラみたいなコードが混じってるのですか。
>>676 インラインアセンブラでオナニーしたい(精神的)年頃なんだろう。ほっといてやれ。
【問題】2、文字列を入力し、文字列にいくつ「a」の文字が含まれるかを調べるコードを作成 #include <stdio.h> int count(const char *str, char alpha) { _asm { mov eax, 0 mov bl, alpha mov esi, str LOOP1: cmp [esi], 0 jz END cmp [esi], bl jnz SKIP add eax, 1 SKIP: add esi, 1 jmp LOOP1 END: } } int main() { const char *str="abracadabra"; printf("%d\n", count(str, 'a')); return 0; }
なんでも良いが、インラインアセンブラ使うんなら環境とコンパイラ名位書いとけな ポータビリティないから他の人が試せないから正しいかどうかの指摘も出来ないな
VC
681 :
デフォルトの名無しさん :2005/11/04(金) 00:00:55
【問題】 3、文字列を入力し、文字列中の「a」という文字を「b」に置き換えるコードを作成 //windowsでVCです #include <stdio.h> char *replace(char *src, char alpha1, char alpha2) { _asm { mov eax, 0 mov bl, alpha1 mov dl, alpha2 mov esi, src LOOP1: cmp [esi], 0 jz END cmp [esi], bl jnz SKIP mov [esi], dl SKIP: add esi, 1 jmp LOOP1 END: } return src; } int main() { char str[]="abracadabra"; printf("%s\n", replace(str, 'a', 'b')); return 0; }
Intel形式ダサス
683 :
デフォルトの名無しさん :2005/11/04(金) 01:30:41
コンパイルは出来たのに、実行したら何も表示されないのはどのような原因が考えられるでしょうか? ○○が原因で、○○.exe にエラーが生じましたとなるのですが。 3次元問題を差分法で解くために、時間と含めて4次元配列をつくりましたが、メモリのことも考慮して、時間の配列要素は2つにしました。 つまり3次元分の必要メモリ数*2だけのメモリが必要なのですが。。。
VCでインライン使ってるならfastcallも使えよ
>>671 を__fastcallを使って書き直した
引き数がecxに代入されて便利
#include <stdio.h>
int __fastcall sum(int num)
{
_asm
{
mov eax, 0
LOOP1:
add eax, ecx
loop LOOP1
}
}
int main()
{
printf("%d\n", sum(100));
return 0;
}
「便利」はいいけど、そんな関数ループで作るようなもんじゃないだろう……
//ループが無くなるように変更 #include <stdio.h> int __fastcall sum(int num) { _asm { mov eax, ecx add eax, 1 mul ecx shr eax,1 } } int main() { printf("%d\n", sum(100)); return 0; }
>>638 lea命令を使うほうがいいですよ。
int __declspec(naked)__fastcall sum(int num)
{
_asm
{
lea eax,[ecx+1]
mul ecx
shr eax,1
ret
}
}
690 :
689 :2005/11/04(金) 12:39:36
なにこのアセンブラスレ
インラインアセンブラやりたいなら他所でやってろ C関係ねーだろ
693 :
デフォルトの名無しさん :2005/11/04(金) 15:15:56
次の問題まだぁ〜?
いんらいんアセンブラとやらを使うと何かいいことありますか?
>>694 ・最適化しにくくなる。
・ポータビリティが落ちる。
>>694 MMXやSSEなどコンパイラが利用してくれない機能を使える
698 :
デフォルトの名無しさん :2005/11/04(金) 18:33:30
>>697 性能がアップしたと思っているとcpuが変わった時に性能激減でもう一度書き直す羽目になる
699 :
デフォルトの名無しさん :2005/11/04(金) 18:57:42
700 :
デフォルトの名無しさん :2005/11/05(土) 00:24:01
>>699 凄く分かりやすい例えですね。
つまり698のことなんですね!
>>693 > 次の問題まだぁ〜?
じゃあ、点を動かしていく問題。
点の初期座標は xy 平面上の (0, 0) とする。
プログラムには、点を動かす指令と、方向転換の指令がコマンドライン引数として交互に与えられる。
点を動かす指令は、ゼロより大きい整数で与えられる。
方向転換の指令は、文字 t (turn の略) で与えられる。
例:
> program.exe t 50 t 50 t 50
150
点は、「動く方向」を持っており、初期値は「上向き」である。
点を動かす指令が与えられるたびに点は、xy 平面上を指定された距離だけそのときの「動く方向」に動く。
動く方向は、方向転換の指令が与えられるたびに、上(初期値)→右→下→左→上と、90度変化する。
上記の例では、コの字を描くように、点が動く。
点がそれまでに描いた軌跡の上を、再度、点が通過しようとした場合、衝突と判断し、
衝突した旨を表示し、衝突までに点が移動した距離を表示し、プログラムを異常終了すること。
全ての指令を衝突無しで完了した場合は、点が移動した距離を表示し、プログラムを正常終了すること。
2種類の指令は必ず交互に与えられる。(ある種類の指令が連続して与えられたかどうかを考慮しなくて良い。)
2種類の指令のうちどちらが先に与えられるかはわからない。(どちらが先に与えられても正しく動くように書くこと。)
指令の個数はゼロ個かも知れない。(移動しないので衝突もしない。移動距離はゼロになるはず。)
点が動いて行く様子を表示する必要はない。
【問題】 以下の構造体を用いて、単方向リストを作れ。 struct field_t { int val; struct field_t *next; } #include <stdio.h> #include <stdlib.h> struct field_t { int val; struct field_t *next; }; void draw_field(struct field_t *head) { struct field_t *field; field=head->next; while (field!=NULL) { printf("%d\n", field->val); field=field->next; } }
void add_field(struct field_t *head, int num) { struct field_t *field; field=head; while (field->next!=NULL) { field=field->next; } field->next=malloc(sizeof(struct field_t)); field=field->next; field->val=num; field->next=NULL; } void delete_all_field(struct field_t *head) { struct field_t *field, *beforeField; field=head; while (field!=NULL) { beforeField=field; field=field->next; free(beforeField); } }
struct field_t *init_field(struct field_t *head) { delete_all_field(head); head=malloc(sizeof(struct field_t)); head->val=0; head->next=NULL; return head; } int main() { struct field_t *head=NULL; int i; head=init_field(head); for (i=0 ; i<100 ; i++) { add_field(head, i); } draw_field(head); delete_all_field(head); return 0; }
過疎ってんな。 VIP Cスレは夜帰りにはとても追い付かないスピードだぞ。
新しいネタを次々と潰すんだもの しかも当人たちはダンマリ これじゃ盛り上がれっていうほうが無理だ
ネタでいいんなら
>>701 #include <stdio.h>
typedef struct Point { int x,y,dx,dy; struct Point *prev; } Point;
void turn(Point * p) { int temp = p->dy; p->dy = -p->dx; p->dx = temp; }
int move(Point * p, int rest, char ** step_list, int step) {
Point p2, *temp;
if (!rest) {
if (*step_list == NULL)
return step;
turn(p);
sscanf(*step_list++, "%d", &rest);
}
p2 = *p, p2.x += p2.dx, p2.y += p2.dy, p2.prev = p;
for (temp = p; temp != NULL; temp = temp->prev) {
if (p2.x == temp->x && p2.y == temp->y)
return -step; } return move(&p2, rest - 1, step_list, step + 1); } int main(int argc, char ** argv) { int i = 1, j = 0, step; Point p = {0,0,1,1}; for (; i < argc; i++) { if (argv[i][0] != 't') { argv[j++] = argv[i]; } } argv[j] = NULL; step = move(&p, 0, argv, 0); if (step < 0) printf("%d(clashed!)\n", -step); else printf("%d\n", step); return 0; }
//衝突させるとこでわけわかんなくなったから //距離の計算までやったよ #include <stdio.h> #include <stdlib.h> #include <string.h> #define ARRAY_SIZE 255 struct dot_tag { int x; int y; int direction; }; void push_data(struct dot_tag *dot_dest, struct dot_tag *dot_src) { memcpy(dot_dest, dot_src, sizeof(struct dot_tag)); } int check(struct dot_tag *dot_array, int dp) { int i; for (i=0 ; i<=dp ; dp++) { /* if (collision()) { exit(EXIT_FAILURE);
} */ } return 0; } int main(int argc, char *argv[]) { struct dot_tag dot={0,0,0}; struct dot_tag dot_array[ARRAY_SIZE]; int dp=0; int distance=0; int ax[]={0,1,0,-1}; int ay[]={-1,0,1,0}; int i; int sum=0; push_data(&dot_array[dp++], &dot); for (i=1 ; i<argc ; i++) { printf("\ncommand:%s\n", argv[i]); if (!strcmp(argv[i], "t")) { dot.direction++; if(dot.direction>3) { dot.direction=0;
} } else { distance=atoi(argv[i]); dot.x+=ax[dot.direction]*distance; dot.y+=ay[dot.direction]*distance; sum+=distance; push_data(&dot_array[dp++], &dot); /* if (check(dot_array, dp-1)) { printf("衝突しました\n"); printf("総移動距離:%d\n", sum); return EXIT_FAILURE; } */ } printf("argv:%s\n", argv[i]); printf("dis:%d\n", distance); printf("dir:%d\n", dot.direction);
712 :
デフォルトの名無しさん :2005/11/10(木) 10:45:45
printf("x:%d\n", dot.x); printf("y:%d\n", dot.y); } printf("\n\n全データ\n"); for (i=0 ; i<dp ; i++) { printf("%d番目\n", i); printf("dir:%d\n", dot_array[i].direction); printf("x:%d\n", dot_array[i].x); printf("y:%d\n", dot_array[i].y); } printf("\n\n\n結果\n"); printf("dir:%d\n", dot.direction); printf("x:%d\n", dot.x); printf("y:%d\n", dot.y); printf("総移動距離:%d\n", sum); return EXIT_SUCCESS; }
[マイスペック]
24歳。
フリーター。
PC、インターネット暦5年。文系。
[備考]
バイトやめてから2ヶ月程ひきこもっていた。
--------------------------------------
俺も今日からC言語学ぶべ!
因みに自分、上記の通り文系で数学は高1で終了してしまってるもののふ。
そんな自分が今日からがんがってみようと思う。皆さんよろすく。
本は「やさしいC(第2版)」を購入。
>>274 氏の書き込みになにやら惹かれるものがあったので。
数学苦手な自分がどこまで根をあげずできるか試してみるYO。
とりあえず今日のところは、
この本が難しくなってきたなと感じるところまで読んでみる事にする。
>>714 C言語を学ぶ姿勢が気にいらないのか、
ただ単に苛立ちを感じる書き込みになっていただけなのか・・・
どちらにしてもスマンかった。ん、マジメにやる。
やさしいC、とりあえずLESSON2まで読み終わる。
ここまで読んで感じた事は、今まで立ち読みしたC言語入門の中では
一番読み易かったって事。
なかでも、二進数やら八進数やらの表し方まで丁寧に説明してくれていたのが
個人的に嬉しかった。
今まで俺の頭は「二進数とは食べれるのですか?」という認識だったからw
これだけでもこの本で良かったなぁと思う。
>>274 氏に拝む。
ところで、
こんな感じで頻繁にチラシの裏しに来るつもりなんだけどいいのかな・・・?
イマイチこのスレの基盤が見えないのでそこら辺が少し心配。
>>713 高1の数学じゃ役に立たんだろ
線形代数必須
高3ぐらいだっけ SINCOSで悩んでた直後にやった気がする そういえばSINCOSってマンコクサインに似てるよね
719 :
274 :2005/11/10(木) 19:59:32
>>714 拝むってw俺年下だよw
まあ、俺のレスでやさC読者が増えたのは良かったと思う。少し根気があればそうなかなか投げ出さない本だと思うから。
それと、二進八進は情報技術検定3級の方がよっぽどkwsk説明してる。何か資料とか参考書があったら是非とも学んでおくべし。
やさCの事で何か質問あったら言って(まず無いか; 「やさしい」だし
出来る限り協力するわ。
wikiの過去問2問目で詰まりました。 何だよファイル処理って・・・orz
721 :
デフォルトの名無しさん :2005/11/10(木) 20:33:40
ちなみに麻奈タンは男だよ
>>720 何か本を買いな。Wikiは(今のところ)過去問を置いているに過ぎないから、
あれだけ見ていればできるようにはなれない。
>>721 〃∩ _, ,_ /) 〃∩ _, ,_ /) 〃∩ _, ,_ /)゛
⊂⌒( `Д´)ミ( ⌒ヽつ⊂⌒( `Д´)ミ( ⌒ヽつ⊂⌒( `Д´)ミ( ⌒ヽつ
`ヽ._つ⊂ノ⊂( ,∀、)つ.`ヽ._つ⊂ノ⊂( ,∀、)つ.`ヽ._つ⊂ノ⊂( ,∀、)つ
ソンナノヤダアアアアアァァァァァァァァ!!!!!!!!
まぁテキストファイルをstdin/stdoutと同様に扱うだけなら以下を押さえればおk ・FILE構造体へのポインタを宣言する(これをfpとする) ・fpにfopen関数でファイルを結びつける - fopen("FILENAME", "MODE"); - MODEには読み込みならr, 書き込みならw(このとき既存ファイルは消去される) 追記ならaを指定する ・printf/scanfの代わりにfprintf/fscanfを使う - 変更点は第一引数としてfpが来る ex) fprintf(fp, "%d\n", 123); ・使い終わったファイルはちゃんとfclose関数で閉じる - fclose(fp);
726 :
274 :2005/11/10(木) 21:46:54
>>716 ありがとう。
C言語ど素人のニートがどこまで頑張れるか、
生暖かい目で見守ってくれると嬉しいw
>>717 ( д) ゚ ゚
ソレ、タベレマスカ?
一日で基礎だけでも覚えれるようなものなら良いけどと思ってググったら、
全くそんな気がしなくてワラタwでも必須ならこれもやらにゃなぁ。
>>719 良いモン紹介してくれた上に
協力までとは・・・その心意気にホント感謝・゚・(ノ∀`)
お言葉に甘えまする。拝むもんに年の差なんてー(ry
今、資格の本見て探してたら情報技術検定見つけた。
取る取らんは別として年に二回しか試験やってないのって
結構厳しいね(´・ω・`)
-------------------------
あれから、本書に載ってなかった(と思われる)
n進法を10進法にする公式とその逆の公式をググッて覚える。
その後「プログラムを打って」と書いてる所は打ちながら、
なんとかLesson3まで読み終わる。まだ本にはついていけそうな感じ。
scanfとprintf使って、文字入れたら返答するとこまではいけました。
小さいながらもこの達成感。こんな感覚いつぶりの事だろう。
明日も頑張りたい。今日はもう寝ます。
728 :
デフォルトの名無しさん :2005/11/10(木) 23:33:00
<HTML><HEAD><TITLE>例8</TITLE></HEAD> <BODY> <FORM NAME="TEST"> 調べたい数= <INPUT TYPE="TEXT"NAME="NYURYOKU"onChange= "x=TEST.NYURYOKU.value; TEST.KEKKA.value=Math.sqrt(x);"> <HR> あなたが入力した数の平方根は <INPUT TYPE="TEXT"NAME="KEKKA"> です。 </FORM> </BODY></HTML> と、 <HTML><HEAD><TITLE>例8</TITLE></HEAD> <BODY> <SCRIPT language="javascript"> x=5; y=1; s=0; while(y<=x){ s=s+y; y=y+1; } alert("1から"+x+"までの合計は"+s+"です。"); </SCRIPT> </BODY></HTML> を組み合わせて、1からユーザーの入力した数までの合計値を求めて表示する javascriptを作ってください!
>>728 <HTML><HEAD><TITLE>例8</TITLE></HEAD>
<BODY>
<FORM NAME="TEST">
調べたい数=
<INPUT TYPE="TEXT"NAME="NYURYOKU"onChange=
"x=eval(TEST.NYURYOKU.value);
TEST.KEKKA.value=x*(x+1)/2;">
<HR>
あなたが入力した数の合計は
<INPUT TYPE="TEXT"NAME="KEKKA">
です。
</FORM>
</BODY></HTML>
>>727 >>716 ではないが、俺も4月から始めたばかりの初心者だ。(しかも、バリバリの文系。数学は数2Bまでしかやってない)
夏までは『Cの絵本』と大学の講義で基礎部分を学んだ。今は『猫でもわかる〜』を使って独学している。
今日は『Cの絵本』だと今一つぴんとこなかったポインタの基礎を、やっと理解できた。
まだまだ先は長いが、お互い頑張ろう。
>>697 っ[Intel C++][xmmintrin.h]
学校の数学ってそんなに大切なの? C言語覚えるのと同じでやりながら必要なもの覚えればいいんじゃない?
やりながら覚えるっていうのは仕事に追われた場末のマが自虐的に言う台詞だぞ あまり真剣に受け止めるな
>>727 線形代数って名前でもメインは行列とベクトルだけどな
数Cの教科書で基礎、線形代数のでその他をやるが吉
アルゴリズム考えるときに結構応用が利く
737 :
デフォルトの名無しさん :2005/11/11(金) 02:09:44
>>730 スレ違いの中、本当にありがとうございました(/_;)
助かりました!
738 :
デフォルトの名無しさん :2005/11/11(金) 02:52:37
935 名前: デフォルトの名無しさん [sage] 投稿日: 2005/11/06(日) 15:25:10 このsageない基地外なんか過去から全部同じ椰子じゃないかとまで思ってしまう。 (ネタがつまらんのが致命的にキモイ)
こんにちは。
>>731 こちらこそ(_ ´∀`)_
朝方、WIKIと前スレ読んでたんだけども
「猫でもわかる〜」っていうのは前スレで紹介されてたやつですな。
まだ見てないけれど、自分もこの本読破できたら行ってみようと思っとります。
同じ文系の人がいた事に親近感(*´Д`*)
>>736 なるほど、全部が全部でなく、抑えるべき要所を覚えれば良いのですな。
覚えるのはまだ先の話だけど、やる気出てきた(`・ω・´)
--------------------------
朝の9時から13時過ぎまでやって、LESSON4がようやく終了。
重ねて言ってるけどこの本(やさしいC)、ホント親切。
自分が疑問に思った事を見透かしたかのように次のページには
その解が書いてある。図解も分かり易く、よほど俺には合うみたい。
今回は式と演算子の章だったので、数学苦手な人間としては
突然難易度を上げられた感じ。まだどうにか食いついていってるが。
「キーボードで五科目のテストの点数を入力して、
合計値と平均値を求めるコードを記述しろ」
って問題には、息も絶え絶えクリアできたものの、
「整数を入力した際、正負を反転して出力するコードを記述しろ」
には頭抱えてましたw解答見た時は唖然「ははは!こやつめ!(AA略」
昼飯食べたら関係演算子やらif文やらのLESSON5に入ります。
参考書で理解できない所があるので質問させて下さい ↓文字列sの複製を作る関数です char *strdup(const char *s) { char *p = (char *)malloc(strlen(s) + 1); return (strcpy(p, s)) } ↑の関数の内容は理解できますが、strdupの関数名に なぜ*がつくのか理解できません。 なんで*strdupになるのですか?
これが噂の関数ポインタって奴ですか? まったく知らないけど。
戻り値が文字列の先頭を指すポインタ
>>742 さん
>戻り値が文字列の先頭を指すポインタ
というのはstrdupがsを指すポインタという事ですか?
>>743 char *func();の書き方がわかりにくいなら
char* func();だと考えてくれ
要はchar*型を戻り値にもってるってこと
つーか、いくら入門書とはいえ(むしろ入門書だからこそ)
malloc後のNULLチェックを飛ばすのはダメだろ
>>744 ああぁあっ!!分かった気がします!
戻り値が文字列なので*strdupは先頭を指すポインタの
意味がたぶんわかりました!
NULLチェックの重要性について丁寧にやってみます!
答えてくださってありがとうございます
かなり興奮中です(゚∀゚)
return strcpy(malloc(strlen(s) + 1), s); むしろここまでやってくれたら尊敬する ちなみにstr[a-z].*という名前の外部関数をプログラム側で定義するのはだめだって話を宿題スレでやってた。
>>746 そこまで短縮できるまでの頭のキレがほしいです!
これまたレベル高い情報で尊敬の眼差しが・・・
本当にありがとうございます、やる気でてきました(`・ω・´)
>>747 >>746 は絶対にやっちゃダメだろ
strcpyは領域チェックをしない
NULLにコピー何てしたら何が起こるかシラネ
ちなみにWindowsではヌルポインタにアクセスしようとすると例外が飛ぶ。 ただNullPointerExceptionでないのが惜しい。
明日のための鉄則その1 mallocの戻り値は必ずチェックしろ
>>749 そういやCじゃ例外機構ないよな
例外発生すると有無を言わさず強制終了?
>>751 VCやBCCではCにもWin独自の例外機構(SEH)が備えられている。(__try〜__except/__finally)
C++ではC++の例外とSEHをまぜて使える。
>NULLにコピー何てしたら何が起こるかシラネ って事は領域確保したら安全性のため領域確保できたか チェックもいれなければだめなんですね。参考になります。
半ばニート頑張るなw
C言語を学び始めて2日目です。 このスレに書いてある事がサッパリわからない。 今現在「ネコでもわかる〜」のC言語編第八章です。 ってか「ネコでもわかる〜」すげー難しいんですけど・・・ 百章まであると思うとクラクラする。 11月22日にテストなのにヤヴァイ・・・
>>755 8,9,10は後でやることを先にやってるだけだから飛ばそう。
猫でも〜は何が言いたいのか良く分からないけど。
>>755 俺もそれ思ったw
ネットでならネコやる前に苦Cのが分かりやすかったよ
>>756 >>757 マジでぇえ?情報をどーもです。
他のもイロイロ見てみよう。わかんないとこがわからん・・・
今日はC言語勉強3日目です。
あと9日でCの基礎、制御文、データ型、変数、式の詳細を学ばなければならない。
今日と明日は会社が休みなのでひきもって勉強するつもり。
今から勉強します。
>>755 猫でもは非初心者向け。面倒だと思わずに入門書を買うなり図書館から借りるなりした方が懸命。
つーか、前にも言ってただろ確か。
こんにちは。
>>754 わかる間は面白いです。全く理解できなくなった時がコワス(´・ω・`)
>>758 勉強始めた日が同じだw
(*´∀`)人(´∀`*)ナカーマ
本なら
>>274 氏同様、やさしいCを超オススメ。
これなら、覚えの良い人なら二日漬けで内容3分の2以上は消化できるかと。
覚え悪い俺でも今日で半分まで進めました。
日にちが差し迫ってるのが辛いトコだけど、がんがって!
----------------------------
昨日はLesson5を消化してから、マ版に行ってました。
半端な知識でプログラマーになるって事がどうゆう末路を辿るのかを理解完了orz
最初は「これで就職を・・・」と思っていたけれども、
今それを考える事は後回しにする。働く事も後回しにしたi(ry
昨日同様朝9時から今さっきまでで、ようやくLesson6終了。
繰り返し文についてだったんだけども、応用がやたらと利くのか、
練習問題はほとんどクリアできず(´-ω-`)
解を見ればしくみは理解できるんだけど、
問題見てそういうしくみを自分で閃けなかった。
こんなので大丈夫なんだろかなぁ・・・。
全Lesson、12に対し半分を終えれました。
ずっとこもってたので今日は外出。走る。泳ぐ。筋トレしてみる。
帰ったら配列のLesson7に挑戦。
>>760 乙。結構頑張ってるみたいで。
>半端な知識でプログラマーになるって事がどうゆう末路を辿るのかを理解完了orz
PGは理想と現実のギャップが激しいからな;俺は「それでもSEになりたいか」という本を読んで概要を知った口。>残業とバグと納期との戦い までは読んださ。
>練習問題はほとんどクリアできず(´-ω-`)
ちょっと待てwそれじゃ先進む意味無いだろw
時間かけてでも内容をしっかりと把握するべし。
仕組み、というか文の流れをイメージできる様にすれば割と簡単に覚えられると思う。丁度、やさCの解説絵みたいな漢字。
>>758 俺は猫Cの本の方を今読んでいるが、正直言ってWEBの内容も本の内容も、全くの初学者(特に文系の人)が手を付けるには少しわかり辛い気がする。
というか、初学者は素直に入門書を買った方が良いぞ。
WEBに挙がっているテキストは、編集者の目が入っていないのでわかり辛くなっているものも多い。
お勧め本としては、『Cの絵本』あたりかな。
ただ、これは練習問題が入っていないので、そこら辺を上手く補強する必要があるが。
『やさC』も
>>274 氏や半ばニート氏が言うように良い本なんだろうが、俺は買ったことがないので薦めることはしない。
(別に
>>274 氏や半ばニート氏を信用していないのではなくて、俺は本屋で立ち読みした程度なので、薦めると無責任になってしまうから。)
>>760 >>761 (273氏)も言っているように、解けない問題は自力で解けるまでやり直した方が良いと思う。
急がば回れじゃないけど、焦って急ぐと後で大変になるから。
人の話の受け売りだが、良いプログラマの条件はアルゴリズムのネタを多くもっていることらしいし。
初心者が偉そうなこと書いてスマソ。orz
>>762 printf("(273氏)は(274氏)の間違えです。\nスレ汚しスマソ。orz\n");
走って泳いで腕立てふせ辺りで疲れ果てて居眠りこいてました、
あきれ果てた顔のドラえもんAAが頭よぎった半ばニート24歳です。
>>761 >>762 ども(´∀`)ノ
ちょっと離れた間に心配かけてたみたいで恐縮(´・ω・`)
お二人の言う通り「これわからないので後回し」ってのは
昔からよくありました。これを機に脱したい。気ぃつけます(`・ω・´)ゝ
今のところ一度解答さえ見れば、
>>274 氏の言う「流れ」がなんとか見え隠れしているのか、
二度目同じ問題をやるとできているようです。
明日もっぺんやってちゃんと理解できてるか確認してみます。
ただ、初挑戦の段階でその流れを閃く事ができなかったってのがどうにも。
基礎の構文覚えても応用をまるで利かせれない自分の頭にアワレワロス。
慣れなのかな。ネタ、一つでも多く持ちたいです。がむばる。
今日は結局Lesson6のみでした。明日この章の練習問題を経てLesson7行きます。
>>764 読んでる本は猫だっけ?
あの本はscanfかなんかの危険性を指摘せずに使ってるというのを見たから
全く読んだこと無いけど、とりあえずリストとかの基本的なデータ構造を
一回自分で作ってみるといい
一度書けば、どんな物なのかというのが理解できるし、それが必要となったときに
楽に実装できるようになる
>>751 setjmp/longjmpで似たようなもの実装できるし現にRubyがそうやってる。
あとこのへんの実装はOS依存だがシグナルとか。
今レポートやっつけ中。VBなんて窓から放り投げてCがやりたい…
>>762 解答なんて全章終わった後に読むぐらいのつもりでないと。っつか、俺が現にその状態なんだが。
正常に動けば形がどうであれ正解なんだし、分かるまでやってみたらどう?必要なら応用問題も出すよ。
変な時間に睡眠とったんで、寝れそうで寝れないorz
>>765 読んでるのは、やさしいCっす。
なるほど、練習問題なら複数回やったことはあれど、自分で作った事はマダーです。
そうですな、明日(というよりもう今日)早速その方法を参考にさせて頂きつつ、
ちょっとノートかPCにまとめてみます。アドバイスどもです(`・ω・´)ゝ
>>768 アンカー違うけど、俺宛ぽいので。
うーん、確かに。
・・・ニート属性として「諦め早い」のスキル持ってるのですが、
俺はここから一歩でも前へ進みたい。この際です。捨ててみます。
応用問題とはありがたい!俺は今の段階では答えられそもありませんが、
問題を出すなら今でもいいぽいと思われます。
ここ数日、俺ばかり奇襲して暴れ放題チラシ放題ですが、
このスレには自分以外にも問題を待ってる人、沢山いると思うんで。
元々ここはそういうスレだと、昨日WIKIで見かけました。
俺はスレのログは残してるので、
然るべき日(基礎ができたかなと自分で納得できた辺り)になれば
後でこっそりやりますよー。
おはようございます。
>>755 >>758 です。
今日はC言語勉強4日目。今日は制御文forループってのからやってみるつもり。
>>759 本は「独習C」ってゆー黄色い本を持ってます。
ってかテストがこの本の第1〜第4まで出ます。
チンプンカンプンなのでC初心者HPを参考に並行して勉強してる次第であります。
>>760 おお、勉強をはじめた日が同じなんて奇遇ですね。共に頑張りましょう。
私のほうが先に脱落するかもだけど。
初心者本は明日仕事中(営業マンなので自由がきく)に見てこようと思います。
今から勉強します。また夜きます。では。
お前らたまにはageないと埋もれますよ
772 :
デフォルトの名無しさん :2005/11/13(日) 13:17:35
じゃあage
>>764 >「流れ」がなんとか見え隠れしているのか〜
手間と時間と金が惜しくなければ、例題や解答のソースを自分で打って何枚か印刷し、それぞれ、赤ペンで使って線を引きながら、処理ごとにプログラムの動きを追ってみると良いかも。
例えば、
int main(){
int a;
printf("aさんの出席番号を入力して下さい。>>");
scanf("%d",&a);
printf("aさんの出席番号は%dです。\n",&a);
returne 0;
/*適当に書いたので、細かいツッコミはしないでね。*/
}
というプログラムだったら、main関数に入る所から線を引き始めて、int a;の所に来たら「int型の変数aをつくる」、最初のprintfの所に来たら、「番号の入力を求めるのか〜」、
scanfの所に来たら「さっきのaにキーボードから入力するのか…とりあえず、1を入れとこ。すると、今のaは1だな。」、
printfの所に来たら「%dに入るのは…&aだからaの値で…1か」みたいな。
俺は普段頭の中でやって、良く分からない時だけ紙に書いてるけど、これをやるとコメント(/*〜*/)を書くのが少し上手くなる(気がする)。
何故線を引くのかは、条件分岐やループなんかを入れたソースでやってみると、良くわかると思う。
ついでに、暇だったらそれをフローチャートに起こしてみる。
そうすると、自分が1からフローチャートを起こす時にも多少は役立つのではないかと。
初心者対して、よく「フローチャートを書いてから作れ」という人が居るけど、俺の場合はそれはしなかった。(というか、できなかった)
俺自身、フロチャを起こすようになったのはつい最近、CやVBで複雑なプログラムを組み始めてからだった。
アルゴリズムのネタが少ない内は、かえって混乱するから、"自分でソースを書く時に限っては"フロチャを書かないほうが良いかもしれないね。
以上、あくまでもいい加減な主観だから、参考にもならんが。
>>770 どこまで進んだかだけでなく、どの程度理解しているかも書くとスレの住民も反応しやすいかと。
レベルは「本の練習問題を数回やって解けるレベル」とか、「まとめwikiの○番目の問題が解けた」とか。
こんにちは。
>>770 俺も朝方ようやくforループに一区切りつけたトコです。
whileやらdo whileやら複数種類あってややこしかったーヽ(`Д´)ノ
>>773 おお、アドバイスどもです。俺とよく似た方法ですね。
自分はまだ脳内のみでやり始めると
文字達が勝手に頭の中でBダッシュジャンプしてどっか行くので
わかるのもわからないのもノートに手書きで書き写して、
上から順に「ここがどうでそこがああで」と音読しながら線引いてます。
フローチャートの意味を知らなかったのでググりました。
なるほど図形に起こすのか。新鮮です。
確かにこれは慣れてからの方が良さそうですが、良い事聞きました(*´∀`)
----------------------
繰り返し文もちょっとずつ見えて来ました。
んで、今Lesson7にいます。早くも壁来ましたorz もう同じ問題に早や2時間。
ついに低学歴がアダになる時が来たか、と。ウワアアアアン。
「Lesson7の7.5です」と言うと内輪な話になるので
本書から抜粋しました。
C言語質問スレ【激初心者】に行くべきか迷いましたが、
せっかく
>>274 が協力して下さるとの好意に甘えたいので今回のみここで。
以後、この手の質問は上記スレ行こうと思ってます。
#include<stdio.h> #define NUM 5 int main(void) {int test[NUM]; int tmp; int i,j,s,t; printf("%d人の点数を入力して下さい。\n",NUM); for(i=0; i<NUM; i++){ scanf("%d", &test[i]); } for(s=0; s<NUM-1; s++){ /*この行と*/ for(t=s+1; t<NUM; t++){/*この行が問題*/ if(test[t] > test[s]){ tmp = test[t]; test[t] = test[s]; test[s] = tmp; } } } for(j=0; j<NUM; j++){ printf("%d番目の人の人数は%dです。\n", j+1, test[j]); } return 0; } 上記コメント二行の部分、 繰り返しの流れが理解できず悶絶してます。 本書にも「ちょっとややこしいですが」と図解付きの説明がありますが、 それでもこの脳では許容できずorz
バブルソート
仮に上のループを条件1として下のループを条件2と考えて まず for(s=0; s<NUM-1; s++) 条件1 は5回のループを意味する このループの間for(t=s+1; t<NUM; t++) 条件2 を繰り返す。 if(test[t] > test[s]) は初めの値(配列0番目)と次の値 (t=s+1によって)を比較して交換する意味 0番目と1番目、0と2・・・0と4(配列にして5番目の値)の比較が 終わったら条件1の判定に戻りsの値を1増やして、繰り返す と言う事。の説明でオッケ−だと思われ? 初心者の説明でスマン
はう!!交換のとことか間違えた('A`) でもいっかwwwwwwww
>>779 調べて意味を見てたら開眼できました(゚∀゚)!
ありがとうございますm()m
>>781 ちょwwwwwww
でもわざわざ助力頂き助かりましたm()m
------------------
>>779 氏の一言のおかげの開眼と、
>>780 氏の説明部分のおかげで
自分の質問がずれている事に気がつけました。
コメント入れた部分自体は前Lessonで把握済みでした。
全体の流れがしっかり把握できてなく曖昧であったのに、
無理にどこがわからないのか具体的な目星をつけた事が、
ずれを引き起こした原因だったようです。
バブルソート、覚えました。
>>274 氏、申し訳ない。まだ頑張れそうです。
>>773 細かい揚げ足取ると
・returne
・printfに&a使うとアドレスが出力される、aだけで十分
>>778 氏付けなくていいって。大した事やって無い&&年下だし…と言いたいが、俺も小手で呼ぶ時は「半ニ氏」みたいになりそうだな…
777の問題は俺も時間かかったな。ソースと解説だけでしつこくやってたらいつの間にか完璧にソース覚えちまった。
簡素な処理ばかりだった初期の頃で「プログラムすげぇw」と思えた初めてのソースだったな。
さて、そろそろ練習問題逝っとく?
やべ、細かいツッコミはタブーだったかorz
(  ̄∀ ̄) <問題!問題!
>>783 おお、ご指摘どうもです。
&aはscanfを書いた後に書いたので、うっかりしてました。
returnのスペルミスは、普段int main()ではなくvoid main()で書いているので、これまた単純ミスです。
わざわざ、すいませんです。orz
788 :
ddd :2005/11/13(日) 21:05:28
>>787 問題
キキキキタタタタ━━━(((((゚(゚(゚(((゚゚∀∀゚゚)))゚)゚)゚)))))━━━!!!!!!
んっ?多次元?点数を配列に格納するんですか?
すいません キー連打してたらdddとか打っちゃった
>>788 >>787 は俺ね。(コテハン記憶し忘れた)
>>274 氏が出す前に初心者の俺が出すのは問題かも知れんが…。
よかったら解いて見てください。
但し、多次元配列とfor文が使えることが前提です。(何度も言うように、俺は『やさC』を持っていないので、Lessonいくつと書かれても、具体的にどこまで出来るのかわからんので。)
問題1
多次元配列を利用して、学生10人分の出席番号・国語の点数・社会の点数・英語の点数を入力し、標準出力でアウトプットするプログラムを作りなさい。
出力例
学生1の国語の点数は100点、社会の点数は100点、英語の点数は100点です。
学生2の国語の点数は90点、社会の点数は75点、英語の点数は100点です。
(以下略)
あ、ちなみに、出力例の「学生」に続いている数字(1とか2とか)が出席番号ね。 ちょっと長いので、項目ごとに改行して出力しても良いです。 例 学生1 国語100 社会100 英語100 学生2 国語100 社会100 英語65 (以下略) while文が使えるのであれば、ちょっとした追加問題も用意してるんで言って下さい。
792 :
デフォルトの名無しさん :2005/11/13(日) 21:38:30
問題出現アゲ∩(・ω・)∩
さっきから連レススマソ。orz もうひとつ補足。 出席番号と点数の入力は標準入力(キーボード)を使って下さい。 入力例はこんな感じで。 例 出席番号を入力>> 1 国語の点数を入力>> 100 社会の点数を入力>> 100 英語の点数を入力>> 100 スレ汚しスマソ。
こんばんは。
>>755 >>758 >>770 です。
今日は明日の仕事の設計書とかプレゼンの練習であんまり勉強できなかったなぁ。
forループ、演算子、printf()とエスケープ文字をやりました。
wikiの「1から50までの和」が解けました。
>>776 同じ日にはじめたのにもう随分差をつけられちゃったっぽいなー(笑い
因みに24歳なんですね。歳近いですな。私は25歳です。
>>790 うげっ!わからん・・・多次元配列?もっと勉強して解かせて頂きます。
問題だああsはうあふああh やってみるお(´・ω・`)
>>790 >274氏が出す前に初心者の俺が出すのは問題かも知れんが…。
全然お構いなく。俺もまだ文字列ポインタ・ポインタ配列辺りで苦戦中だから、皆と同じぐらいのレベルだし。
今だ片付かないレポートをよそに俺もやってみるわ>問題
>>794 普通の配列は分かりますか。
それだったらば、ちょっとした問題を出せますが。
>>795 >>796 >やってみるお(´・ω・`)
>今だ片付かないレポートをよそに俺もやってみるわ>問題
そういって頂けると、何だか凄く嬉しいです。
まったりいい流れ。 俺も4月からc習い始めてる理系学生です。 蝶初心者向けの本を構造体の前まで(友達にぱくられた)読み終えて、今は猫読んでます。 けど今まで理解した気になってるだけで、実は理解してないんじゃないかと不安になってるんです。 というのも猫をパラ見しながら感じたんですが問題を解いた数が少ないんです。 学校の課題はやるんですけどその時やったことだけだったり、応用的な問題や違う切り口の問題を解くことが少ない。 猫を見てみたら問題が少ない。やっぱ数こなすことも大事だと思うんで・・・ そんな時ここのwiki見つけて喜んでました。問題いっぱい! 最近時間なくて問題は解けないけど通学時間に本読んで勉強する気ではいます。 やっぱ実際打ってみないと力つかないし覚えられないからなぁ・・・ とチラシの裏みたいになったけど用は問題出してくれるこのスレに感謝!ってこと 最近出題が少なくてしょんぼりだけど。 出題者がんばれ!初心者もっとがんばれ! 790の問題時間見つけてやってみます。
一応
>>790 の問題をやってみたんだけど、
入力は出来るんだけど何故か「1」が出る。も〜何でw
こんなカンジで↓ 「1」後は普通に入力出来るんだけどなぁ。。。
出席番号を入力>> 1
国語の点数を入力>> 1
社会の点数を入力>> 1
英語の点数を入力>> 1
はぁ、明日仕事なんでもう寝なきゃ。
>>799 ソースコード上げてもらえますか。
これから数日、この板に来れないかもしれないのですが、間に合えば問題点を指摘しますんで。
少し時間が経ったのと問題が補足等で複数レスに渡ってしまったので、整理とヒント、追加問題出しも含めて再書き込み。
>>790 の問題
問題1
多次元配列を利用して、学生10人分の出席番号・国語の点数・社会の点数・英語の点数を標準入力(キーボード)から入力し、標準出力(画面)に出力するプログラムを作りなさい。
入力部分の例
出席番号を入力>> 1
国語の点数を入力>> 100
社会の点数を入力>> 100
英語の点数を入力>> 65
出力部分の例
出席番号1の国語の点数は100点、社会の点数は100点、英語の点数は100点です。
出席番号77の国語の点数は90点、社会の点数は75点、英語の点数は100点です。
(以下略)
または
出席番号1
国語100
社会100
英語100
出席番号88
国語100
社会100
英語65
(以下略)
以下は問題1のヒントです。 良く分からない方は、上から順を追って読んでみて下さい。 但し、解き方が何パターンかあると思うので、あくまでも私と同じ解答を導き出すことを前提としたヒントです。(要するに、私と違った解き方をするならば役に立たないよ、ということ) ヒント1> 配列の次元数は二次元です。 ヒント2> for文を使うと楽。 ヒント3> for文は二重になります。 ヒント4> 二重のfor文?…二次元配列…? 同じ2だなぁ。 ヒント5> 二次元配列を宣言する時、配列の後ろの[ ]に入る数字は4。 つまり、4つのデータを格納するということ。 ヒント6> 二次元配列の数がよくわからなかったらば、とりあえず1人分の出席番号と国社英の点数を入力するプログラムを考えてみよう。 今回のヒントはここまで。
ここまで解けた方は、以下の追加問題もどうぞ。 問題2 問題1で作ったプログラムに、ありえないデータが入力された場合のエラー処理を付け加えなさい。 なお、具体的な処理内容は以下の通り。 1.出席番号を入力する際、0以下の値を入力されたらば、「1以上の値を入力して下さい」と画面に出力し、キーボードからデータの再入力を求める。 2.各教科の点数を入力する際、0未満の値と100よりも大きい値が入力されたらば、「0から100までの値を入力して下さい」と画面に出力し、キーボードからデータの再入力を求める。 補足1.上記二つの処理は、文字列が入力されることは想定しなくて良いです。 補足2.エラーの内容(「1以上の値を〜」等)を出力した後は、このプログラムの利用者が正しい値を入力してくれるものと考えて良いです。 問題3 問題2で作ったエラー処理を改良し、エラー内容を出力した後に入力される値が正しい値になるまで同様の処理を続けるようにしなさい。 例(出席番号の場合) 1.出力:「出席番号を入力>>」 2.キーボードから0を入力し、Enterキーを押す 3.出力:「1以上の値を入力して下さい」 4.キーボードから0を入力し、Enterキーを押す 5.出力:「1以上の値を入力して下さい」 (以下、正しい値(この場合は1以上の値)が入力されるまで、同じ処理を繰り返す。) ヒント>while文を使うと楽かも
まったり系のスレとはいえ、何度も連レスしてしまい、すいませんでした。orz さっきも書いたように、明日から数日間このスレに来れないかもしれませんが、数日以内に解答のソースは必ず書き込みますのでご勘弁を。 (「俺が書いたる」という方がいらっしゃったらば、書いちゃって頂いても構いません。) それでは、今晩は寝ます。
「ミスター」を名乗るからにはもう少し知識を身につけて欲しいなぁ。 或いは自分の書いた文章の間違いに気を配るとか。 #理系だからそれらが許されると言うことでもないが。
>>805 ちょっと見ただけだけど。
・main()関数の型が間違っている。
#どこからcharが……
・voidでない関数はreturnで値を返さないといけない。
・別々の配列(少なくとも一つの配列と一つの二重配列)にすべきものを無理矢理二重配列としてしまうのは如何なものか。
#あ〜、ヒントが悪いのか。
・整数定数は、使い回しが利くようにマクロにするほうがいい。
・無限ループはコンパイラによっては無駄な警告が出るwhile (1)よりfor (;;)がお勧め。
#そのためにわざわざ1を書かなくてもいいように仕様が決められているのだから。
・馴れないうちは(俗に言う)一行野郎で書こうとせずに複文化したほうがいい。
#if (...) ...; などね。
・scanf()で数値を入力するのは間違って英字を入力したときに悲惨なので避けた方がいい。
#慣れないと判りにくいから今後の課題と言うことでいいと思うが。
・(固定)文字列の配列は、const char * sub[] = {"...", "...", "...",};とするのが常道。
#人間がわざわざ数を数えることはない。
808 :
274 :2005/11/14(月) 09:12:22
>>807 ・main()関数の型が間違っている。
これはcharの関数作ろうと思って消し忘れた奴
・別々の配列(少なくとも一つの配列と一つの二重配列)に〜
多次元配列で作れと指定されてる
・馴れないうちは(俗に言う)一行野郎で〜
馴れてるから書いてるだけ。レスで貼付ける時にはスマートかと。
・scanf()で数値を入力するのは間違って〜
つ[スレタイ && 最新100]
810 :
807 :2005/11/14(月) 11:26:22
>>808 言い訳せんでいいよ。ヒントを書いているだけで教える気があるわけじゃないから。
疑問があるなら質問してくれ。暇があったらスレチェックしているから。
811 :
807 :2005/11/14(月) 11:29:43
>>809 漏れに惚れちゃぁいけねぇぜ。
追記。
「多次元配列で作れ」≠「単一の多次元配列に放り込めるものは全て放り込んで作れ」
言い訳を捻出する暇があったら行間を読む努力をする方がいい。
Cの勉強中で基本はもう終わったので、プログラムを作ってみたりしてるんですが、 データベースファイルのようなものにCの標準機能だけでプログラムで登録、削除、参照などを したい場合って、CSV形式のファイルを利用するのが一般的なのでしょうか?
データベースにアクセスしたいなら専用ライブラリが無料配布されてるぞ
815 :
813 :2005/11/14(月) 13:29:31
データベースにアクセスしたいというよりも、ファイル操作等の練習のためにやってみたいだけなんです。 でも練習なんだし、普通はどうするとか考えるよりもとりあえずやってみればいいですよね。 どうもありがとうございました。
>>815 それならCSVでもいいんでない?
できたファイルをExcelで読み込んでもいいし、エディタで開いてもいいし。
#尤も、ただのTSV(項目をカンマではなくタブコードで区切る)でもいいかも知れない。
>>810 こちとら眠気押さえて打ってたんだ、手直し後にコンパイルしてなければミスに気付かない事もある。
配列分けろだのconst付けろだの、俺はあんたの物差しに沿って打ってる訳でも無いし、あんたがC覚える為に読んできた書籍も知らない。それを皆が皆最善だと思うとは考えにくいが。
自意識過剰を自覚してるのならHCS(ヒューマンコミュニケーションスキル)を学ぶ事から始めたらどうだ?あんたの文面は叩き荒らしの特性によく似ている。
818 :
デフォルトの名無しさん :2005/11/14(月) 17:51:56
不穏な空気になってまいりました。
どう見ても精子です。 本当にありがとうございました
僕の息子は常時スタンバってます('A`)
>>817 同じ学び中の者から少し。
こういう初心者スレでわざわざソースを見てくれて悪いところを指摘してくれる人なんて悪い人じゃないと思うよ。
間違った変な知識で指摘する人もいるかもしれないけど、そういう場合って大概別の知識のある人からの
突っ込みが入ったりする。
匿名のネットで指摘されたって恥をかくわけじゃないんだから、こういうのは謙虚に受け取っとけばいいと思う。
現時点からしたら細かい指摘なのかもしれないけれど、constの件などはおそらく最善の部類に入ることだろうし、
プログラミング時眠かったとか手直し後に再度コンパイルしてないってのは初心者だからとか関係ない。
結果間違ってたところ、改善可能な点を知れたなんて良いことじゃないか。
俺にも参考になったし、今後他の人の参考にもなるかもしれない。
一応固定みたいにしてるなら些細なことでツンケンせずに楽しくいこうぜ!
>>817 >こちとら眠気押さえて打ってたんだ、
私の知ったことではない。嫌ならやらなければいいだろう。
寧ろ、眠気を抑えながらの学習は効果が薄いと思うが如何だろうか。
>手直し後にコンパイルしてなければミスに気付かない事もある。
コンパイラが発見できないようなケアレスミスで苦しむこともなかろうと極力ミスが発生しないやり方を書いている。
>配列分けろだのconst付けろだの、
命令してはいない。参考にするもしないも私の知ったことではない。
>俺はあんたの物差しに沿って打ってる訳でも無いし、あんたがC覚える為に読んできた書籍も知らない。
当たり前だ。私は何冊も読んだわけではないからそれを明かしたところで参考にさえならないだろう。
>それを皆が皆最善だと思うとは考えにくいが。
一部反論もあるだろうが、概ね受け入れられるように書いている積もりだ。
また、>821も書いている通り、問題があるなら他から指摘されるだろう。
>自意識過剰を自覚してるのならHCS(ヒューマンコミュニケーションスキル)を学ぶ事から始めたらどうだ?
その言葉、そのままお返ししよう。
>あんたの文面は叩き荒らしの特性によく似ている。
これもそのままお返ししておこうか。
>疑問があるなら質問してくれ。
あー、一つだけ命令口調になっていたか。これは「疑問があるなら質問してくれても構わない」と言い換えておこう。
たまたま虫の居所が悪いところに紋切り型の口調が気に入らなかったのかもしれないが、
自分が誰のために学習しているのかよく考えてみてみたらどうだろうか。
>>822 気が多いなw
もう不倫はしません(´・ω・`)
825 :
デフォルトの名無しさん :2005/11/14(月) 19:11:27
まあ、二人とも落ち着けや せっかく俺スゲーって作ったらダメだし食らって切れちゃっただけなんだし
日本語にコンパイルしてください でないと、あなたが何者か分か・・・(ry
807は命令口調のようだったのがまずかったな。 #しかし2chではあれくらいでも普通だと思うけどな。 とにかく言っていることは正しい。俺も保障する。(保障になっていないってw
>>807 一応C99からはintで宣言したmain関数は明示的にreturnしなかった場合0を返すことが保証されている。
まあ個人的には
・C99で追加された機能はできるだけ使わない
・C99で削除された機能は絶対使わない
という態度で書くのが良いとは思うが
829 :
807 :2005/11/14(月) 20:42:14
>>828 >一応C99からはintで宣言したmain関数は明示的にreturnしなかった場合0を返すことが保証されている。
ついついそれを忘れちゃうんだよね。フォロー感謝。
>・C99で追加された機能はできるだけ使わない
>・C99で削除された機能は絶対使わない
同意。特に初心者はその方がいいね。
#と言いつつ自分はC99で追加された機能(ブロックの途中での変数宣言や関数のinline指定)を使うけど。
むつかしくて何言ってんのかわかんねえや
問題: int配列の重複がないことをチェックする関数 つまり 配列の先頭要素へのポインタと配列の長さを受け取り、 配列中の他の要素と同じ値を持つ要素があれば0を、なければ0以外の値を返す関数を作りなさい 例: {1,2,3,4,5,6,7,8} => 0以外を返す {1,2,3,4,5,2,7,8} => 0を返す もしこの問題が解けて退屈だったら 選択文(if,switch)や条件演算子(?:),繰返し文(for,while,do-while)を使わないで作るってのはどう?
俺の場合、C++にあればC99にあろうとなかろうと気にせず使う。
835 :
832 :2005/11/14(月) 21:18:42
>>834 あ、、、。orz
後ろの問題はgotoも禁止ね。thx
836 :
832 :2005/11/14(月) 21:22:46
連投スマソ いや、むしろgoto使って書けるもんなら書いてほしいと思ったり
837 :
813 :2005/11/14(月) 22:11:47
>>816 区切り文字をタブにした形式もあるんですね。
数字を1,000のように書いたりする場合にはそっちのが良さそう。
ありがとうございます。
>>823 言い訳を捻出する暇があったら行間を読む努力をする方がいい。
つか、互いに言い訳、互いに屑。そういう事にしとこうか。
>>831 ざっと見た範囲で。
・バックスラッシュが2バイト文字になっているけど大丈夫?
・問題の性格上仕方ないけど、memcpy()かぁ……
・点数の入力に関して、条件判断とメッセージの内容が噛みあっていない。
#片や1以上、片や0以上。
・printStudentInfo()はprintf()一文で書いてもいいかも。
#その場合、文字列リテラルが連結できることを利用するといい。
・enumの最後の値の後に','を置くのは間違い。
#コンパイラによっては通るかもしれないが。
・feof()を呼ぶまでもなくfgets()の戻り値を見るだけで充分。
#feof()を禁止するわけではない。
・intValueと言う名前のint変数でlongの値チェックをするのは如何なものかと。
>>838 まだ続けるの? そういうのを恥の上塗りと言うのだよ。
>>839 もう締めようとしてんだろ屑。
インテリ気取る前に鏡の前に逝けよ
>>840 師匠になにを言う(`・ω・´)
ってかそろそろやめなって・・・www
真面目な指摘してくれて、聞く立場からすれば
とても参考になるし、勉強になる。
なんだ、スレを通してみたら妙に納得してしまった。
>>274 君、面白いよ。その純粋な子供らしさを失わないようにね。
>>839 >・intValueと言う名前のint変数でlongの値チェックをするのは如何なものかと。
これはどうしろと?
843 :
274 :2005/11/14(月) 23:50:39
>>841 勝手な言い掛かりで煽られれば
頭にも来るし、反論したくもなる。
俺は
>>808 でありのままに答えた(多次元は違っていたとしても)
だがあんたは煽るかの様に言い訳と決めつけた。これが問題。
「初心者には容赦しない知ってる君」みたいな態度に頭が来ただけ。
初心者そっちのけで喚き散らしてる時点で言い訳不能だと思うが
うぜーよ
846 :
デフォルトの名無しさん :2005/11/15(火) 00:37:22
盛 り 上 が っ て ま い り ま し た
|ω・`)
>>847 なんで隠れてるのお前www
ω・` >⊂ おら、出て来いw
>>832 やってみました。むずかしーよー。頭テンパった。
#include <stdio.h>
#include <string.h>
int CheckSameValue(int *array, int len);
int main(void)
{
int n[] = {1,2,3,4,5,6,1,8};
int len;
int checked;
len = sizeof(n);
len = len / sizeof(int);
checked = CheckSameValue(n, len);
if (checked) {
printf("同じ値無し");
}else{
printf("同じ値あり");
}
return 0;
}
int CheckSameValue(int *array, int len) { int ret; int i, j; for (i = 0; i < len; i++) { for (j = i + 1; j < len; j++) { if (i != j) { if (*(array + i) == *(array + j)) { return 0; }else{ ret = 1; } } } } return ret; }
>832 思いついたのはソートして隣と不一致な事を確認する、で >選択文(if,switch)や条件演算子(?:),繰返し文(for,while,do-while)を使わないで作るってのは 思いつかんかった...
>>832 再帰書いてたら頭痛くなってきた。
俺には再帰無理かも。
int not_find_int(int array[],int n,int c){
return n==0 || (array[0]!=c && not_find_int(array+1,n-1,c));
}
int not_find_ints(int array[],int n){
return n==0 ||(
not_find_int(array+1,n-1,array[0]) &&
not_find_ints(array+1,n-1)
);
}
#include<stdio.h>
int main(){
int a[]={1,2,3,4,5,6,7,8};/* => 0以外を返す */
int b[]={1,2,3,4,5,2,7,8};/* => 0を返す */
printf("%d\n%d",not_find_ints(a,8),not_find_ints(b,8));
}
>>832 #include <stdio.h>
#include <stdlib.h>
int greater(const int *l, const int *r)
{
return (*l-*r);
}
int overlap(int *array, int len)
{
int i;
qsort(array, 8, sizeof(int), greater);
for (i=1 ; i<len ; i++)
{
if (array[i-1]==array[i])
{
return 0;
}
}
return 1;
}
int main()
{
int ex1[]={1,2,3,4,5,6,7,8};// => 0以外を返す
int ex2[]={1,2,3,4,5,2,7,8};// => 0を返す
printf("%d\n", overlap(ex1, sizeof(ex1)/sizeof(int)));
printf("%d\n", overlap(ex2, sizeof(ex2)/sizeof(int)));
return 0;
}
>>855 例によってぱっと見で。
・ソート用比較関数の引き数は、qsort()の第4引き数にあわせたほうがいい。
#const int *だと警告が出ると思う。
・int同士の引き算だと、差がINT_MAXを超えてしまうので都合が悪い。
#より大きな型を使うか、一般的には条件文でいいだろう。
##値域が限定されていることが保証されているなら構わないが。
・qsort()の第二引き数の固定値は拙かろう。
#つーか、len使ってないじゃん。
・配列の要素数を求めるのは、sizeof(配列) / sizeof(*配列)の方が一般的。
#sizeof(int)もこの場合は間違いではないが、ex1の型を変更したらアボン。
##どうせそのときはoverlap()自体を変更する必要があるからとやかく言うなという意見もありそうだが。
弱気にならんでも。 プログラム書いた人間じゃないけど参考になってるよ。
861 :
831 :2005/11/15(火) 20:12:13
>>839 添削ありがとうございますた。
>・問題の性格上仕方ないけど、memcpy()かぁ……
memcpy()をつかうと何かマズいんでそーか・・・?
横着せずに、一つずつした方が良いんですか?
>・enumの最後の値の後に','を置くのは間違い。
ずーっとカンマ置いてました。
たぶんココで指摘されなかったら
カンマ要るもんだと思い込んでた鴨。
>・点数の入力に関して、条件判断とメッセージの内容が噛みあっていない。
>・intValueと言う名前のint変数でlongの値チェックをするのは如何なものかと。
うぁ、全く気づきませんですた。
名前重要、名前重要と・・。
何回も見直したつもりでしたが、まだまだのようで。
精進しまつ。
>>861 その手のロジックでは、構造体を使うのが一般的。構造体なら、代入が使える。
→しかし、その問題では配列を使うと言う縛りがあるから仕方ないね。
ということです。仕事柄、memcpy()があると注意Lvが一段上がるからw
で、念のために書くけどintValueはlong型でないとダメで、その場合名前が変だと言うことね。
#LONG_MAXなどを扱うのだから。
863 :
831 :2005/11/15(火) 21:22:24
>>862 >→しかし、その問題では配列を使うと言う縛りがあるから仕方ないね。
>ということです。仕事柄、memcpy()があると注意Lvが一段上がるからw
なるほどぉ、構造体でつか・・・。
にしてもmemcpy()には要注意とはコレ如何に?
何度もスンマセンです。
>で、念のために書くけどintValueはlong型でないとダメで、その場合名前が変だと言うことね。
>#LONG_MAXなどを扱うのだから。
指摘されて、遅まきながら気づきましたです。ハイ。
>>863 memcpy()を使わなければ、転送サイズ間違いなどによるバグは発生しない。
仕事柄他人のソースのバグを探ることが多いのだが、バッファオーバランなどのバグは
「本人は正しいと思い込んでいて」、「簡単な動作確認は問題なく通り」、見つけにくいことが多いからね。
他にも、memset(), strncpy(), strncat(), strdup(), realloc()なども注意Lvが一段上がる。
#malloc(), realloc(), calloc(), strdup(), free()はメモリ管理一般として元々注意Lv高めなのだが。
>>842 スレ見返してたらこれ見落としてた。スマン。
そういうわけで、>862参照で。
865 :
831 :2005/11/15(火) 22:19:04
>>864 詳しいフォロー、サンクスでつ。
すんごい勉強になります。
ありがとうございますた。
うがっ、
>>382 の問題漏れには難しすぎるぽぉ。
頭よじれたけど何も出てきませんですた。
頭よじれすぎてアンカー間違えたorz.
>>832 ですた。
俺はこのスレ見てるとC言語やってるのが 馬鹿みたい思えてくるw だって難しいんだもん・・・こんなの反則だよ('A`)
>>868 C言語やってるのが馬鹿じゃなくって
お前が馬鹿なんだよ
871 :
文系 :2005/11/16(水) 00:22:50
何だか、私の問題が悪かった所為で荒れてしまったようで、申し訳ありません。orz
>>806 すいません。以後、気を付けます。
とりあえず、私の解答例を書いておきます。
#include<stdio.h>
int main(){
int tensuhyo[10][4];
int gakusei,date;
for(gakusei=0;gakusei<10;gakusei++){
for(date=0;date<4;date++){
872 :
文系 :2005/11/16(水) 00:23:18
switch(date){ case 0: printf("出席番号を入力>>"); scanf("%d",&tensuhyo[gakusei][date]); while(tensuhyo[gakusei][date]<1){ printf("1以上の値を入力して下さい。>>"); scanf("%d",&tensuhyo[gakusei][date]); } break; case 1: printf("国語の点数を入力>>"); scanf("%d",&tensuhyo[gakusei][date]); while(tensuhyo[gakusei][date]<0 || tensuhyo[gakusei][date]>100){ printf("0から100までの値を入力して下さい。>>"); scanf("%d",&tensuhyo[gakusei][date]); } break; }
873 :
文系 :2005/11/16(水) 00:24:55
case 2: printf("社会の点数を入力>>"); scanf("%d",&tensuhyo[gakusei][date]); while(tensuhyo[gakusei][date]<0 || tensuhyo[gakusei][date]>100){ printf("0から100までの値を入力して下さい。>>"); scanf("%d",&tensuhyo[gakusei][date]); } break; case 3: printf("英語の点数を入力>>"); scanf("%d",&tensuhyo[gakusei][date]); while(tensuhyo[gakusei][date]<0 || tensuhyo[gakusei][date]>100){ printf("0から100までの値を入力して下さい。>>"); scanf("%d",&tensuhyo[gakusei][date]); } break; } } } for(gakusei=0;gakusei<10;gakusei++){ date=0; printf("出席番号%dの国語の点数は%d、社会の点数は%d、英語の点数は%dです。\n",tensuhyo[gakusei][date],tensuhyo[gakusei][date+1],tensuhyo[gakusei][date+2],tensuhyo[gakusei][date+3]); } return 0; }
874 :
文系 :2005/11/16(水) 00:28:19
本によっては、まだ(自作)関数が分からない方も居ると思うので、エラー処理はそのつど書いてあります。 同様に、今回はヒントの書き方が悪かったので分からなかった方もいらっしゃったようですが、原則として文字列が入力されることは考えなくて良いとしてあるので、scanf関数を使用しています。 勿論、使える方はfgetsとsscanf等の組み合わせを使用して頂いても構いません。 なんか、本当にわかり辛くて申し訳ありませんでした。 反省として、暫く出題は控えさせて頂きます。
あの、誤変換や誤用くらいならまだ可愛いもんだと思うのですが、 変数名dateは流石に鼻でせせら笑いたくなるんですけど。
きっと宮城県出身なんだよ。
877 :
文系 :2005/11/16(水) 00:52:30
>>875 すいません。
英語に弱いもので。
C言語、やめた方が良いかも知れませんね…。orz
せめて国語、社会、英語の点数入力くらいはループで処理しても良いと思うんだ。
>英語に弱いもので だったら最初から、「文系」なんて名乗るなよ。 date(日付け)なんて中学英語以下の問題だろうが。
>>879 このスレの皆さんには散々迷惑をかけた上、大した解答も出来ず、本当にすいませんでした。
もう二度と書き込まないので、それでどうか許して下さい。
ROMるなと言われれば、ROMもしません。
本当にすいませんでした。
882 :
880 :2005/11/16(水) 08:26:50
>>881 もう書き込まないと言っておきながら、すいません。
一晩経ったのと
>>881 さんの書き込みで頭が冷えました。
英語の件と、ソースの件を指摘されてから、もっとスレにとって有意義な方向にもっていくべきだったと思います。(今更遅いですが)
言い訳のしようもありません。
>>878 点数をfor文で回すことは思いつきませんでした。(実を言うと最初は考えたのですが、思い付かなくてswitchに逃げたので。)
もしよかったら、今後の勉強のためにそのアルゴリズムを使ったソースを上げてもらえませんでしょうか。
>>879 ご指摘ありがとうございました。
何度も言うように俺は本当に英語が駄目なので、これを機に英語から逃げず、改めて勉強しなおすことにします。
住民のみなさん
こうしてスレと無関係な話題でスレを汚したり、雰囲気を悪くしてしまい、すいませんでした。
>>882 3科目の点数の入力処理で異なる部分は、入力を促すメッセージだけでしょ。それなら
const char *subject[3] = {"国語", "社会","英語"}; とか追加してしまえば
入力処理をこんな感じで纏められるでしょ。
for(gakusei=0;gakusei<10;gakusei++) {
printf("出席番号を入力>>");
scanf("%d",&tensuhyo[gakusei][0]);
while(tensuhyo[gakusei][0]<1){
printf("1以上の値を入力して下さい。>>");
scanf("%d",&tensuhyo[gakusei][date]);
}
for(date=1;date<4;date++) {
printf("%sの点数を入力>>", subject[date-1]);
scanf("%d",&tensuhyo[gakusei][date]);
while(tensuhyo[gakusei][date]<0 || tensuhyo[gakusei][date]>100) {
printf("0から100までの値を入力して下さい。>>");
scanf("%d",&tensuhyo[gakusei][date]);
}
}
}
885 :
832 :2005/11/16(水) 14:18:27
>>850-851 はーい、正解乙。でも気になった点があるのでまずは3つ
・i == j になることってないよね
・*(array + i) という式には syntax-sugar(※)があって、array[i]と書くことができる。こう書くことの方が多分多いよ
※意味は同じだけどもっと書きやすい表現。構文糖、糖衣構文、構文糖衣ともいう
# []演算子は本当は *いつでも* そういう意味なんだけど、説明すると長くなるから最初は「配列にも使えるし、配列の要素を指すポインタにも使える」ということで。
・retを使うより。2重ループを抜けた時点で単に1を返した方がすっきりする。
# 出口を一つに(return文は1つしか書かない)、というコンセプトで書きたいなら話は別だけど
さらに。
俺が出した例が悪かったのかもしれんが、テストパターンが1つというのは寂しいんでない?
int n0[] = {1,2,3,4,5,6,1,8};
int n1[] = {1,2,3,4,5,6,7,1};
int n2[] = {1,2,3,8,5,6,7,8};
int n3[] = {1,2,3,4,5,2,7,8};
int n4[] = {1,2,3,4,5,6,7,8,4};
int len = sizeof(n0)/sizeof(n0[0]);
特に境界部分のチェックは重要。
n4は「指定範囲外を調べないか」をチェックするため。
886 :
832 :2005/11/16(水) 15:08:53
int n3[] = {1,2,2,4,5,6,7,8};
こっちの方がいいか。
>>885 >>854 「再帰で書こう」ではなく、「重複しないとはどういうことかを説明しよう」と思って書けば簡単だと思う。
not_find_intsを日本語に訳せば
・配列の長さが1以下であるか(あ、0か。これはやめた方がいい。このコードはたまたま大丈夫だけど(※))、または
・先頭要素が残りの部分に含まれず、残りの部分でも重複がない
って書いてるだけだよね。たまたま説明が再帰的なだけ。
ループだけでなく条件分岐も排除したのはそういう考え方で書かせたかったから。
「こうだったらああしてそうじゃなかったらこうする」みたいな(つまり手続き的な)考え方はして欲しくなかった。
# 書いていい文はreturn文だけ。条件演算子は使用禁止。で良かったかも
# 勿論これは普通の書き方で書けた上での応用問題
※ この書き方だと要素数が1のときnot_find_intに1番目の要素を指すポインタが渡される。
つまり配列の範囲外を指すポインタになるわけで、そういう(実際には何も指していない)ポインタは生成するだけで未定義動作を引き起こす(注:ヌルポインタは別)。
ただ、例外があって、配列の最後の要素の次の要素を指すポインタは生成するだけなら問題ない。
でも指しているオブジェクトの中身を覗こうとするとやっぱり未定義動作になる。
で、not_find_intの定義をみると覗こうとはしていないから実際には大丈夫。だけど呼び出し先の関数にそんなことは期待しちゃいけない。ブラックボックスのように取り扱うべきだ、と。
887 :
832 :2005/11/16(水) 16:08:47
はう、見難くてすまん。
>>855 STL(C++)のuniqueと同じ考え方だね。(あれは予めソートしなきゃいかんが)
基本的に
>>856 なんだけど
>・ソート用比較関数の引き数は、qsort()の第4引き数にあわせたほうがいい。
あわせた方がいいというか、あわせなきゃいかんのよ。処理系によっては「引数や戻り値の型が一部異なっていてもそれがポインタなら大丈夫」というのもあるが、一般には保証されない。
>・int同士の引き算だと、差がINT_MAXを超えてしまうので都合が悪い。
<チラシの裏>
時々比較関数を、*第1引数 - *第2引数 の結果を返す。
という風に説明しているのを見かけるが、悪い説明の典型だと思う。
引き算で書いても大丈夫だとわかった上で自分で書くのは問題ないが、初心者にはそんな説明はしちゃいかんよな。
・符号付きの型だとオーバー/アンダーフローする(かもしれない)
・符号なしの型だと負数が返らない
・引き算のない型だと書き様がない
とかで初心者がはまったらそういう説明をした奴の責任は重いと思う。
</チラシの裏>
あと、greaterという名前はやめた方がいい compare_int_in_ascending あたりが妥当かな。長いか?
greaterだと述語みたいだし、qsortの比較関数だということがわかったとしても降順だと思われそうだ。
>>884 なるほど、勉強になりました。
ありがとうございました。
読みづらい。
890 :
850 :2005/11/17(木) 02:07:39
>>885 >・i == j になることってないよね
あ、あれ?もう頭こんがらがっていつの間にか入ってた・・・
>・*(array + i) という式には syntax-sugar(※)があって、array[i]と書くことができる。こう書くことの方が多分多いよ
すいません。array[i]を*(array + i)で書けること最近覚えたんですが
その逆もまたできることに気づかなかった頭の固さが憎い。
>・retを使うより。2重ループを抜けた時点で単に1を返した方がすっきりする。
最初 return 0 を ret = 0 にしてて有り得ない挙動だったから思い切ってここでループ抜けて
他のは直して無かったです。でもこれってgoto文と変わらないですね。
>>890 >でもこれってgoto文と変わらないですね
だから嫌う人もいるけど、私は手頃な妥協だと思う。
何よりも、retを使って見通しを悪くしてバグの原因を増やすことはない。
#勿論、このケースではgotoを使うべきではないのは言うまでもないけど。
「複数の出口」と「goto」を同一視するのは間違いだと思うけど。 breakやcontinueをgotoと同一視するならまだしも
returnは関数出口へのgotoとも言えるべ。 #実装も普通そう作るし。
gccで遊んでたのですが、以下のソースで /tmp/cclObBZ1.o: In function `main': /tmp/cclObBZ1.o(.text+0x20): the `gets' function is dangerous and should not be used. と怒られました。何が原因ですか? #include<stdio.h> void cpt(char *str); int main(void) { char ms[50]; printf("暗号化プログラム\n文字?:"); gets(ms); cpt(ms); printf("暗号化\n\t%s\n",ms); return 0; } void cpt(char *str) { while(*str!='\0'){ *str=(*str+3); str++; } }
>>894 そのくらいの英語、判らないならExcite翻訳にでも掛けなさいよ。
余りにも簡単すぎるから敢えてノーヒントで。
>>895 ええ、「危険だから使うべきでない」って書いてるのは分かりますが、
どう危険なのかなと思って。"原因"です。
>>896 なるほど、バッファオーバーランが起こる危険性があるですね。
gets()が危険だと警告が出ているのに、なんでソース貼るかな。 つーか、どうせしょぼい暗号を試すなら+3じゃなくて-1でIBMを入力してみればいいのに。
899 :
デフォルトの名無しさん :2005/11/17(木) 20:16:19
C言語を1(初級)から10(上級)まで学びたいのですが、オススメの本とかありますか?
getsが悪いとでるならscanfでも出るのかw ポインタの使い方を誤ると結構warでたりするが そこは配列の方が良いんじゃないか?
普通に使うだけでワーニングがでる関数 strcpy, strncpy, fopen, plitpath, sprintf, getenv, strcat, itoa
>>901 マジ?gccじゃ出ないんだが
strcpyでワーニング出るオプション教えてくれ
>>894 の、*str=(*str+3); は
*str = *(str+3)と書いてもいいんですよね?
>>903 いいえ、違います。
(*str+3)はstrが指す位置にある文字の文字コードに3加えた値になるが、
*(str+3)はstrの3文字先の値になる。
ところで*str=(*str+3);より*str += 3と書くのが一般的。
>>904 レスして頂きありがとう御座います。
そうなるのでしたか。考えが足りてませんでした・・・('A`)
全角スペースを半角スペース2個に変換するプログラムを書こうとしたら挫折してしまった… これって簡単?
俺の使ってるエディタで簡単に出来た。
>>906 どこでつっかかったんだ?
自分で途中まで書いたソースなり、フローチャートっぽいものなりを書き込めば、誰かヒント出してくれるかもよ。
n文字をm文字に置換するのが訳分からない。 イメージとしては 文字列 ABCDABBG 検索文字 AB 置換文字 NTT 置換結果 NTTCDNTTBG だけど、置換結果用に新しく大きな配列を用意する必要ありですか?
NTTの人ですか?
いや、IBOとかSTOとかFBIとか浮かんだ結果、 最後に残ったのがNTTだった。
>>906 system("sed -e 's/ / /g' inFile > outFile");
913 :
906 :2005/11/18(金) 00:19:59
>>908 下のプログラムを作ってみたけど、全部そのままコピーするだけになってしまいました。
ちなみにうちのcygwin環境だといろいろヘッダを足してもgetwcharとかはundefinedだと怒られて
コンパイルが通らなかったのでvc2005でコンパイルしました。
if(wch==' ')とか間違ってるんだろうけど""でも駄目でどうすればいいのやら、といった状態です。
>>912 できればCで書きたいのですが…
#include <stdio.h>
int main(void)
{
int wch;
while((wch=getwchar()) != WEOF){
if(wch==' ')
printf(" ");
else
putwchar(wch);
}
return 0;
}
>>909 char * replace1(char * dest, char const * source, const char * key, const char * repl)
{
char * p = strstr(source, key);
if (p) {
sprintf(dest, "%.*s%s%s", p - source, source, repl, p + strlen(key));
}
return p;
}
void replace(char * dest, char const * source, const char * key, const char * repl)
{
char * work = malloc(strlen(source) + strlen(repl));
strcpy(work, source);
while (replace1(dest, work, key, repl)) {
strcpy(work, dest);
}
free(work);
}
>>913 /* 空白だと見えにくいので「外」で */
int cho = EOF;
while ((ch = getchar()) != EOF) {
if (cho == "外"[0] && ch == "外"[1]) {
cho = 'タ';
ch = 'ト';
}
putchar(cho);
cho = ch;
}
if (cho != EOF) {
putchar(cho);
}
916 :
906 :2005/11/18(金) 00:53:33
>>915 うーん、うまく動きそうだけどこれもそのままコピーになってしまいます。
明日また試してみます。
917 :
デフォルトの名無しさん :2005/11/21(月) 05:44:26
>>916 まさか、タトを外に見間違えたって落ちじゃないよな。
>>918 if文中の外を全角スペース、タとトを半角スペースに入れ替えるんですよね?
それで無理でした。
ちょこちょこいじってみてもなんか駄目ですが、
>>915 でいけました?
>>920 試してない。うちに帰って気力があったら試してみるわさ。
922 :
915 :2005/11/22(火) 01:40:02
/* ほい、修正版 */ int ch; int cho = EOF; while ((ch = getchar()) != EOF) { if (cho == (unsigned char) "外"[0] && ch == (unsigned char) "外"[1]) { cho = 'タ'; ch = 'ト'; } if (cho != EOF) { putchar(cho); } cho = ch; } if (cho != EOF) { putchar(cho); }
制御プログラム(C言語)を扱う必要が出てきたのですが、 フォートランとVBをかじった程度の人間でも分かる参考書って どなたかご存知ないですか? 立ち読みした限り、「猫でも分かる」は結構難しかったっす
925 :
デフォルトの名無しさん :2005/11/23(水) 11:39:28
C言語のプログラムを作成中なんですが、 文字列で関数を指定する方法ってないですか? 引数でもらう値によって使う関数を変えたいので。 if文でもよいのですが(以下のように) sub(char c) { if(strcmp(c,"A")==0) { A(); } else { B(); } return; } 引数に関数名(c)が入ってくるので直接使えればなと思い。。。
>>925 お望み通りのものは無理。
関数テーブルを、関数名をキーにして持つって手もあるけど
その程度なら素直にstrcmpで分けた方がいい。
927 :
デフォルトの名無しさん :2005/11/23(水) 12:13:29
>>926 やっぱそうなんですかー。
なんかうまい手があるかもしれないと思っていたので残念です。
レスありがとうございました。
928 :
915 :2005/11/23(水) 13:42:48
いや、strcmp()じゃダメだろう。 その例なら、 void sub(char c) { void (*func)(); switch (c) { case 'A': func = A; break; case 'B': default: func = B; break; } func(); return; } ってところかな。
番号残ってた……
ホシュ
931 :
デフォルトの名無しさん :2005/11/24(木) 22:55:13
gccでdefineしたら無効だと怒られました。何ですか? #include<stdio.h> #define >= <= int main(void) { int a[5],f=0,i,w,j; printf("5つの整数をいれてください\n"); for(i=0;i<5;i++){ printf("%dつ目:",i+1); scanf("%d",&a[i]); } for(j=0;j<5;j++){ for(i=4;i>=j;i--){ if(a[i] <= a[i-1]){ w=a[i]; a[i]=a[i-1]; a[i-1]=w; } } } for(i=0;i<5;i++) printf("%d ",a[i]); printf("\n"); return 0; }
>>931 #defineで定義する名前は識別子でなければならない。
変数・関数名などと同じで英字・下線で始まり,2文字目以降はそれに加え数字が使える。
だから#define gt_eq <=のような例はいいけど、その例のように記号は無理。
要約:そんな#defineをするな!
934 :
デフォルトの名無しさん :2005/11/24(木) 23:52:18
#define ID_MAX 255
>>935 プリプロセッサにm4使ったり自作したりすればいいw
937 :
デフォルトの名無しさん :2005/11/28(月) 15:17:02
初級編: gets関数を使ってif文を作りなさい
そんなアバウトな
中級編: gets関数を使ってwhile文を作りなさい
そんなアバウトな
941 :
デフォルトの名無しさん :2005/11/29(火) 13:56:39
中級編: gets関数を使ってif文とwhile文を使った7行のプログラムを無理矢理作りなさい
いいかげんウザいんだよ しらけてる空気を読めよ馬鹿
945 :
デフォルトの名無しさん :2005/11/29(火) 17:44:28
>>937 ってネタ?マジでそんなことできるんですか?
できるよ。
>>1 が逃げたので、このスレはこれで終了します。
続きは沢山あるC言語のスレのどれかへ移動です。
まとめサイトまであるのに逃げたって・・・。
951 :
デフォルトの名無しさん :2005/11/30(水) 02:44:40
ksk
952 :
デフォルトの名無しさん :2005/11/30(水) 02:56:53
kwsk
たしかに最近のやりとり見てもここのスレで行う意味無いねぇ 宿題スレやC/C++室でやる方が人の分散も無く良いんじゃないかな 次を立てても廃墟の予感
>>955 いいじゃんかよーここもコテの私物から始まったんじゃん?
>>956 おまえのやってることはただの荒らし依頼だ
>>958 無関係のスレを次スレとして指定することに違和感ない?
両方のスレの合意を取るのが先だろう
両方Cを学んでいくスレじゃん。どこが無関係だっつーの。
>>960 いや、あっちの中身はスレタイとはかなりそぐわない。
俺はこのスレが好きなんだけどなあ。 とても勉強になったよ。ありがとう。
このスレ終わって欲しくない・・・嫌だ
久々にスレが伸びてると思ったら嵐だったってのは良くある罠
乱数で既に出た数字を再び出さないようにするには、 どのように処理すれば良いですか? 具体的にはトランプなどです。
int toranpu[52]={1,2,3,4,.......}
>>965 あらかじめ出るであろう数だけ配列作っておいて
出た奴は1にでもしてifで判定する
>>967 スイッチ立てまくるんですね。
>>968 CASLで取ったので見てませんでした。
見てみます。
俺のも立ちまくり
フラグ立てる方法だと、たまたま乱数が既出の数字と 同じものが連続して出てくるケースだといつまでたっても・・・ ということでシャッフルが終わる時間の保証がありません。 他のアルゴリズムを採用することをお勧めします。
配列にトランプの数字を入れる(1-13を4組、順番は問わない。) 0〜51までの乱数を発生させる その乱数の位置にある数がカードの山から取り出した数になる 取り出した数はもう2度と使わないので一番後ろの数とスワップする カードは51枚になったので0〜50までの乱数を発生させる ・ ・ ・ (以下繰り返し)
頭良いなぁ。
>>974 その方法は偏り具合が決まって出るのであまり良くない
どっちかというと
>>973 の方を薦める
丁度、今月のCマガでシャッフルについての連載があった希ガス
>>976 975ではないが解答編なら大丈夫っぽい
回答編も要素数に比例して時間がかかる
あ、正しくシャッフルできるかどうかではなく、時間が重要だったのね。 ワタシニポンゴヨクワカラナイヨ
>>980 まああれだ。文章は読むな、空気を嫁。と。
もっと容量のいい頭がほしいー(><。)
電脳化をオススメする。 それと、もっと早くプログラムを打ち込みたいなら 手の一部を擬態化するといい。
×擬態 ○義体
>>982 要領のいい頭じゃないことはよくわかった。
次スレよろ
次スレあるなら漏れ激しく頑張るからおせーて下さいね ここの問題4,5問やっと解けるようになってからのレベルがテラタカス
ム板にしては消費早いな
次スレ立ててもこの過疎り様じゃあな。
あとは宿題スレとかでいいんじゃないか? Cスレ立ちすぎ。
次スレほしいお…(´・ω・`)
次は猿スレで行います(^^) みんなきてねーwwwww
猿スレは断られただろ 移動するならおまえが説得してこい
猿スレは講師、生徒随時募集中なのでまったく問題ありませんよ(^^) なんでも反対したがるアフォは無視してみんなでもりあげてくださいね(^^)
いっぱいスレあるんだから各自好きな場所へ行けばいい。 解散。
>>994 関係者ならコテだせよ
あと断った奴を誤りに来させろ
キモイーなにそれー いやだねーあたまのおかしい人は(^^) こんなキモいヤシにコテ出したらつきまとわれるの確実wwww
埋め。
結局ポポ巣はC言語できるようになったのか?
おはようー! あたいのスペックは 26歳フリーター、パソコン歴インターネット歴は6年 しかしそれ以外の事は何もできにゃーい… というわけで今日から参考書を買ってがんばります! 今まさに私みたいに、これからCを勉強するぞって人いたら よろしくね!!! 前スレが一杯になりそうなので新しく作りました☆ 今日でC言語歴約2週間です^^; 簡単な文字の表示はできるようになったんですが 進むペースは亀さん並に遅いので、ゆっくり見守ってね(><。) もっと容量のいい頭がほしいー(><。)
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。