いちおつ
これが2なら今年こそ34年目にして初めて彼女ができる
5 :
デフォルトの名無しさん:2007/08/24(金) 22:51:48
ちょっと質問。
std::istreamから区切り文字のある場所を発見するのに
std::find(first, last, '&');
ってやると、戻り値がfirstと一致してしまうんだけど、
こういう使い方って駄目なの?
>>3 96代目が待っている。どんどん問題を解いてスレ消化
____
/ \
/ ─ ─ \
/ (●) (●) \
>>3さん2GETできなかった気分はどう?
| :::::: (__人__) :::::: |
\. `ー'´ /ヽ
(ヽ、 / ̄) |
| ``ー――‐''| ヽ、. |
ゝ ノ ヽ ノ |
しつこい粘着は嫌われる
しつこくない粘着は好かれる
だよね〜 きれいにはがれないとむかつくよね〜
はがれて欲しい時はサクッとはがれてほしいし
はがれては困る時にははがれてほしくない
人間ってゼイタクだよな
ゼイタクだから今の経済は回ってるんだよな
14 :
デフォルトの名無しさん:2007/08/26(日) 14:36:25
1] 授業単元:C言語
[2] 問題文:
月(1〜12)と日(1〜31)をキーボードから入力し、入力された日付を表示する
プログラムを作成しなさい。
条件@:月の入力については1〜12で範囲チェックを行い。範囲外の入力
だった場合は、エラーメッセージを表示して再入力させること
条件A:日の入力については1〜31で範囲チェックを行い。範囲外の入力
だった場合は、エラーメッセージを表示して再入力させること
[3] 環境
[3.1] OS:windows
[3.2] コンパイラ名とバージョン: (VS 2005)
[3.3] 言語: C
[4] 期限: (2007年9月1日まで)
[5] その他の制限:
実行結果
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃月を入力:15 (15の部分はキーボードからの入力)
┃月の入力は「1以上12以下」にしてください
┃月を入力:8 (8の部分はキーボードからの入力)
┃日を入力:46 (46の部分はキーボードからの入力)
┃日の入力は「1以上31以下」にしてください
┃日を入力:25 (25の部分はキーボードからの入力)
┃入力された日付は「8月25日」です
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━
↑みたいな感じでよろしくお願いします<(_ _*)>
説明下手ですいません^^;
>>14 #include <stdio.h>
int main(void) {
int m,d;
do{
printf("月を入力:");
scanf("%d",&m);
if( m<1 || m>12 ) printf("月の入力は「1以上12以下」にしてください\n");
else break;
}while( 1 );
do{
printf("日を入力:");
scanf("%d",&d);
if( d<1 || d>31 ) printf("日の入力は「1以上31以下」にしてください\n");
else break;
}while( 1 );
printf("入力された日付は「%d月%d日」です\n",m,d);
return 0;
}
16 :
デフォルトの名無しさん:2007/08/26(日) 15:54:08
14です。
素早い返信ありがとうございます^^
またよろしくお願いします(*- -)(*_ _)ペコリ
>>17 #include <stdio.h>
#include <string.h>
main(){char b1[10],b2[10];scanf("%s %s",b1,b2);if(strcmp(b1,b2)<1)printf("%s %s",b1,b2);else printf("%s %s",b2,b1);}
#include <stdio.h>
#include <string.h>
main(){char b1[10],b2[10];scanf("%s %s",b1,b2);if(strcmp(b1,b2)<1){strcat(b1,b2);printf("%s",b1);}else{strcat(b2,b1);printf("%s",b2);}}
#include <stdio.h>
#include <stdlib.h>
main(){char b1[10];scanf("%s",b1);printf("%d %lf",atoi(b1),atof(b1));}
>>20 1
#include <stdio.h>
void exch_order(int *pa, int *pb) {
if(*pa>*pb)
{
int tmp=*pa;
*pa=*pb;
*pb=tmp;
}
}
int main(void) {
int a,b;
printf("Input > ");
scanf("%d %d",&a,&b);
exch_order(&a, &b);
printf("%d %d\n",a,b);
return 0;
}
>>20 2 きんもぉ〜☆なクソース♪
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 256
#define swap(type,x,y) do{type tmp=x; x=y; y=tmp;}while(0);
int main(void) {
char str[MAX];
size_t i,str_len;
printf("Input > ");
for(i=0; i<sizeof str/ sizeof str[0] -1; i++) {
str[i]=getchar();
if( !isprint(str[i]) ) break;
}
str[i]='\0';
str_len=strlen(str)-1;
for(i=0; i<=str_len/2; i++)
swap(char,str[i],str[str_len-i]);
printf("%s \n",str);
return 0;
}
>>21 >20の1は、こういうことではないのか?
>整数a,bを入力とし、以下の関数を定義して、小大の順に出力するプログラムを作成せよ。区切りは空白とする。
入力:整数
出力対象:以下の関数
出力条件:小大の順に
関数を小大の順に出力ってのがどういうことかはわかりませんが。
しかし、京大にもまとに文章を書けない指導教官がいるんだなぁ……
っつか
> void exch_order(int *pa, int *pb)
> ポインタ引数を用い、大小関係により、 *pa と *pb を入れ替えて格納する。
入れ替えて格納する機能だけで十分でしょ。前文には「以下の関数を定義して」とあるんだし。
以下に該当する関数が、表示するところまでは条件に入ってない。
27 :
デフォルトの名無しさん:2007/08/28(火) 17:20:57
xy平面の図形の問題なのですが、
二点(xs,ys)-(xe,ye)で与えられる線分が、長方形の領域(左下コーナー(xmin,ymin)、右上コーナー(xmax,ymax))
と交わるかどうか判定したいのですが、良い方法はありますか?
細かく場合分けして、判定したら出来そうなのですが、
何か物凄くいい方法で、数行で書けるような判定方法があればうれしいのですが。
Cで書いています。
よろしく
月を入力したら、1日からその月の最後の日までを
日 月 火・・・
1 2・・・
・・・
と表示するプログラムを教えてください。
>>28 カレンダーを見た事は有りますか?
年も指定しないと無理なんですよ。
>>29 日本語を見たことありますか?
書かれたまんまのことを答えれば良いのですよ。
つまり、実際の曜日に関わらず月の下に1と書けば宜しいか。
>>31 たぶん、
>>28の内容からしたらそうアルよ。難しく考えないで、答えるアルよ。
けど、テンプレに則ってないんで無視しチャイナ。
int *pstr でいいんすか?
>>33 #include<ctype.h>
int mystrlen(int*pstr){
char*pstr_=(char*)pstr;
int count = 0;
for(;*pstr_;++pstr_)
if(isspace(*pstr_)) ++count;
return count;
}
void mystrcpy(int*pstr,int*pans){
char*pstr_=(char*)pstr;
char*pans_=(char*)pans;
do if(!isdigit(*pans_))*pstr_++ = *pans_;
while(*pans++);
}
36 :
デフォルトの名無しさん:2007/08/28(火) 21:52:09
[1] 授業単元:C言語
[2] 問題文:
二次座標平面において,ランダムに4〜5個ほど点が与えられる.
そのような複数の点の最近傍を通る円の方程式を求めよ.
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:gcc 3.4
[3.3] 言語:C
[4] 期限:[2007年08月31日24:00まで]
[5] その他の制限:計算速度が速い方が好ましい.
今現在最急降下法で作ってみたのですがうまく動きません。
よろしくお願いします。
37 :
ジャレ:2007/08/28(火) 22:05:11
1] 授業単元:プログラミング
[2] 問題文: pgmファイルを読み込み、幅(width)、高さ(height)、色調(val)を
を表示する。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:visual C++
[3.3] 言語:C
[4] 期限:[2007年08月29日12:00まで]
[5] 自分の実力のなさでグローバル変数を使用しないと上手くいきませんでした・・。
ですので、グローバル変数は使わない方向でお願い致します。
読み込んだ後フーリエ変換させる必要があるので、pgmの読み込み部分は
関数化してくだい。では、よろしくお願い致します!!
>>36 回帰直線(最小二乗法)のように数式で表現できるはずだから、それを晒してくれれば…
>>27 >>1 の質問テンプレ
それと線分の交差って高校の数学でやらなかったっけ?
もう忘れてしまったけど
42 :
デフォルトの名無しさん:2007/08/29(水) 07:31:35
[1] 授業単元:C
[2] 問題文(含コード&リンク):
テーマ:ユーザ関数の作成
再帰関数を使って、Xのn乗を求めるプログラムを作成しなさい
プロトタイプ宣言:int power(int x, int n);
実行画面
文字列入力==>2
文字列入力==0
値:1
文字列入力==>2
文字列入力==>3
値:8
文字列入力==>6
文字列入力==>4
値:1296
[3] 環境
[3.1] OS: (Windows/Linux/等々) XP
[3.2] コンパイラ名とバージョン: ボーランド
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
[1] 授業単元: C
[2] 問題文(含コード&リンク): 50行以上のプログラムをつくりなさい。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VS2005
[3.3] 言語: C
[4] 期限: 2007年8月31日
[5] その他の制限: C言語検定3級まで習いましたので、その範囲でお願いします。
>>42 #include<stdio.h>
int result;
int power(int x,int n){
if(n==0)
return 0;
result*=x;
n<0?n++:n--;
return power(x,n);
}
int main(void){
for(;;){
int x,n;
result=1;
printf("文字列入力==");
scanf("%d",&x);
printf("文字列入力==");
scanf("%d",&n);
power(x,n);
printf("値:%s%s%d\n",result<0?"-":"",n<0&&(result<-1||result>1)?"1/":"",result<0?-result:result);
}
return 0;
}
[1] 授業単元: C
[2] 問題文(含コード&リンク):非負整数の不定長配列 arr[] 中で、指定データ data が出現する回数を返却するプログラムを関数
arr_occur_ct() を用い作成せよ。終端番兵は、EOA(-1) とする。反復変数を用いず、ポインタのアドレス演算を用いる。
int arr_occur_ct(int *arr, int data)
システム上では、入力の先頭をdata、それ以降はarrとする。入力の終了はEOA(-1)とする。
入力例 0 2 0 0 7 0 7 1 0 -1
出力例 4
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:bcc
[3.3] 言語: C
[4] 期限: 2007年8月30日
unsigned arr_occur_ct(unsigned const * array, unsigned data)
{
if (array == NULL || data == EOA) return 0;
unsigned count = 0;
for (unsinged ic = 0; array[ic] != EOA; ++ic) {
if (array[ic] == data) ++count;
}
return count;
}
仕様を勝手に変えるのは最悪
問題が悪いな、非負整数の不定長配列と言いつつint *なんだから。
とは言え、>46は性質が悪すぎる。
>>46 ソース全部書いて貰えるとうれしいのですが
//
>>45 // >46を参考に。
#include <stdio.h>
#include <stdlib.h>
#define EOA (-1)
int arr_occur_ct(int const * array, int data)
{
if (array == NULL || data == EOA) return 0;
unsigned count = 0;
for (const int * p = array; * p != EOA; ++p) {
if (* p == data) ++count;
}
return count;
}
int main()
{
int data = EOA;
scanf("%d", & data);
if (data == EOA) return 0;
unsigned cnt = 0;
int * arr = NULL;
do {
int val = EOA;
scanf("%d", & val);
arr = realloc(arr, (cnt + 1) * sizeof(* arr));
arr[cnt] = val;
} while (arr[cnt++] != EOA);
printf("%d\n", arr_occur_ct(arr, data));
return 0;
}
数字一つごとにreallocって凄いな
realloc()が毎回API叩く仕様だったら泣けるね。
何個か一括して要求したらいいのに。
54 :
デフォルトの名無しさん:2007/08/29(水) 12:25:57
[1] 授業単元:C
[2] 問題文(含コード&リンク):
問題1
テーマ:文字配列の操作
文字型の配列変数mojiに設定されている文字数を数えなさい
char moji[] = "ABCDEFG";
実行画面
文字数:7
問題2
テーマ:ユーザ関数の作成
問題1をもとに文字数を返すユーザ関数を作成しなさい
プロトタイプ宣言:int MyLen(char *s);
char moji[]="ABCDEFG";
実行画面
文字数:7
[3] 環境
[3.1] OS: (Windows/Linux/等々) XP
[3.2] コンパイラ名とバージョン: ボーランド
[4] 期限:
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
55 :
デフォルトの名無しさん:2007/08/29(水) 12:33:33
[1] 授業単元:C
[2] 問題文(含コード&リンク): 検索する文字列を入力し、その一を返すユーザ関数を作成しなさい
プロトタイプ宣言:char *MojiSearch(char *m,char *s);
引数1:検索対象文字列
引数2:検索文字列
戻り値:あった場合(一致した文字列を先頭アドレス)
なかった場合(NULL)
char moji[] = "ABCDEFGHJABFGHSKL";
結果
検索文字列==>HS
検索位置:HSKL
[3] 環境
[3.1] OS: (Windows/Linux/等々) XP
[3.2] コンパイラ名とバージョン: ボーランド
[4] 期限:
[5] その他の制限:
何方かお願いします
>>54 strlenでググれ。
それだけで解決するから。
57 :
【4200円(定額)】:2007/08/29(水) 13:06:24
>>56 #include <stdio.h>
#include <string.h>
char *MojiSearch(char *m,char *s){
int i = 0;
int j = 0;
int result = 0;
while(i < strlen(m)-strlen(s)+1){
for(j=0;j<strlen(s);j++){
if(m[i+j] == s[j]){
result++;
}
else{
result = 0;
break;
}
}
if(result != 0)
break;
i++;
}
if(result == 0)
return NULL;
else
return &m[i];
}
悪い見本のようなコードだな
>>58 BM法でやれとか書いてないからいいんじゃないかな。
いかにもって感じで。
60 :
デフォルトの名無しさん:2007/08/29(水) 13:18:42
>>55
char *Mystrstr(const char *m, const char *s)
{
char *cp = (char *)m;
if(*s == '\0')
return cp;
while(*cp != '\0')
{
char *tp = cp;
char *pp = (char *)s;
while(*tp == *pp)
{
if(*pp =='\0')
return cp;
tp++;
pp++;
}
if(*pp == '\0')
return cp;
cp++;
}
return NULL;
}
>>37のやつ、真面目にやろうとすると、コメント行読み飛ばしたり、
区切り文字判別したりしなきゃならないのか。
・改行が出現するまでを1行とする
・1行は70文字未満
・区切り文字は空白、タブ、改行の三種類
効率よく単語毎に切り出せるプログラムってどうやって作るの?
[1] 授業単元: C
[2] 問題文(含コード&リンク): 自作プログラム作成
1.ステップは最低50文
2.1次元配列or2次元配列を使用
3.if文,while文,for文使用
4.自作関数使用
5.♯define使用
6.ヘッダファイル化
7.必ずプロンプトで誰が見てもわかる対応型プログラムにする
[3] 環境
[3.1] OS:Windows
[3.2] VS2005
[3.3] 言語: C
[4] 期限: ([2007年8月31日AM8:00まで]
お願いします。
>>62 その条件を満たせばどんなプログラムでもいいってこと?
>必ずプロンプトで誰が見てもわかる対応型プログラム
物凄く難しくね?
65 :
62:2007/08/29(水) 14:31:50
対応型じゃなくて対話型?
>>64 >>66 問題文には対応型と書いてあったのですが、よくわからないので7番目の条件はどうでも良いです。
すいません。
7.がどうでもいいのなら無意味なコードを書き連ねて完成だなw
>>62 2〜5の条件にある文は既に習ったんだろうけど
それぞれを学んだ時の題材として作ったのはどんなプログラム?
70 :
デフォルトの名無しさん:2007/08/29(水) 15:21:16
>>69 入力した数値が処理された数値として出力されるようなプログラムですかね。
平均を出したりとか。
あと、例としてはカレンダーをつくってみてはどうか?と書いてありました。
72 :
33:2007/08/29(水) 20:52:18
>>35 ソース全部を書いて貰えるとうれしいのです
後、2もお願いできませんか
73 :
ジャレ:2007/08/29(水) 22:51:12
>>61 pgmにはバイナリとアスキーがあって、どちらもヘッダ部(コメント含む)を読んだら後は、前者はfread()、
後者は本体部分が70文字以上の長い行のデータが多いことを鑑みてfscanf()で取り出せばいい。
問題はヘッダ部で、途中で改行されると読めないツールや逆に改行がないと読めないツールもあって、
どう解釈するかが微妙。
なんだ、>73を見る限りヘッダだけ読めば本体読む必要ないじゃん。
しかし、depthを色調と言われてもぴんとこないなぁ。
77 :
デフォルトの名無しさん:2007/08/30(木) 02:29:00
[1] 授業単元:C言語
[2] 問題文: int型の配列に設定されている値の中の最大値と最小値
を求めて出力するプログラム
条件1:int型配列のサイズは10とし、
あらかじめ初期リストによって値が設定されているものとする。
条件2:アルゴリズムは繰り返しで処理すること。
※初期化リストは{10,7,3,15,12,1,18,21,25,14}と設定されているものとする。
[3] 環境
[3.1] OS:windows
[3.2] コンパイラ名とバージョン: (VS 2005)
[3.3] 言語: C
[4] 期限: (2007年9月1日まで)
[5] その他の制限:
よろしくお願いします<(_ _*)>
79 :
デフォルトの名無しさん:2007/08/30(木) 03:13:12
>>76
#include <string.h> #include <stdlib.h> #include <stdio.h> #define EOA 0.0
void arr_cycle(int *arr, int len){ int *temp = malloc((sizeof(int))*len); memcpy(temp,arr,((sizeof(int))*len));
memcpy(arr+1,temp,((sizeof(int))*(len-1))); memcpy(arr,temp+len-1,((sizeof(int))));
free(temp);}
int arr_positive(double *arr1, double *arr2)
{double *temp;int i;
for(temp = arr1,i = 0; *temp != EOA; temp++){
if(*temp > 0.0){arr2[i] = *temp;i++;
}
}
arr2[i] = EOA;
return i;
}
int main()
{
int ary[] = {1,2,3,4,5,6};
int i,positive;
double arr1[] = {1.2, -0.8, 2.3, 3.4, -1.1, EOA};
double arr2[sizeof(arr1)/sizeof(double)] = {0};
double *temp;
arr_cycle(ary,6);
for(i = 0; i < 6; i++)
printf("%d ",ary[i]);
putchar('\n');
positive = arr_positive(arr1,arr2);
for(temp = arr2; *temp != EOA; temp++)
printf("%lf ",*temp);
putchar('\n');
return 0;
}
80 :
デフォルトの名無しさん:2007/08/30(木) 03:25:38
>>77 #include <stdio.h>
#define N 10
void bubble_sort(int sort[], int elements)
{
int i,j,temp;
for(i=0; i < elements-1; i++){
for(j=i+1; j < elements; j++){
if(sort[i] > sort[j]){
temp = sort[i];
sort[i] = sort[j];
sort[j] = temp;
}
}
}
}
int main()
{
int ary[N] ={10,7,3,15,12,1,18,21,25,14};
bubble_sort(ary, N);
printf("MAX %d MIN %d \n",ary[9],ary[0]);
return 0;
}
81 :
デフォルトの名無しさん:2007/08/30(木) 03:45:09
>>33
#include <stdio.h> #include <ctype.h> #define EOA -1
int mystrlen(int *pstr); int usepointersum(int *ary); void mystrcpy(char *pstr,char *pans);
int main()
{ char ary1[] = "Kyoto"; char ary2[] = "Kyoto Univ"; int iary[] ={ 1,3,5,7,9,2,10,4,8,6,EOA};
char ary3[] = "m04d12t5"; char ary4[20] ={'\0'}; int i;
printf("%s\t%d\n",ary1,mystrlen(ary1)); printf("%s\t%d\n",ary2,mystrlen(ary2));
for(i = 0; i < sizeof(iary)/sizeof(int);i++) printf("%d ",iary[i]);
putchar('\n'); printf("%d \n",usepointersum(iary)); printf("%s \n",ary3);
mystrcpy(ary3,ary4); for(i = 0; ary4[i] != '\0';i++) putchar(ary4[i]);
putchar('\n'); return 0; }
int mystrlen(int *pstr)
{ char *temp=NULL; int num = 0; int i = 0; for(temp = (char *)pstr; *temp!='\0';temp++){
if(*temp > ' '){ num++; } } return num; } int usepointersum(int *ary) {
int sum = 0; int *temp; for(temp = ary; *temp != EOA;temp++) sum += *temp;
return sum; }
void mystrcpy(char *pstr,char *pans)
{
char *tstr;
int i,j=0;
for(tstr = pstr; *tstr != '\0'; tstr++)
if(!(isdigit(*tstr))){
pans[j] = *tstr;
j++;
}
pans[j]='\0';
}
82 :
デフォルトの名無しさん:2007/08/30(木) 04:32:39
83 :
デフォルトの名無しさん:2007/08/30(木) 12:08:13
授業単元: C
[2] 問題文(含コード&リンク):
テーマ:文字列配列の操作
問題1:文字列を入力して偶数番目の要素と奇数番目の要素を別の配列に格納し、文字列として表示しなさい
実行画面
文字列入力==>ABC123def
偶数要素:AC2df
奇数要素:B13e
問題2:文字列と削除文字列を入力し文字列中から削除文字を排除しなさい
実行画面
文字列入力(m1)==>ABCDEFAABCDABC
削除文字==>A
結果文字列(m2):BCDEFBCDBC
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:ボーランド
[3.3] 言語: C
[4] 期限:
[5] その他の制限:
84 :
デフォルトの名無しさん:2007/08/30(木) 12:18:53
授業単元: C
[2] 問題文(含コード&リンク):
テーマ:ポインタの利用
問題1: ポインタ変数を利用して、2つの合計を求めなさい
int a=10,b=5,g;
int *pa,*pb;
実行画面
g:15
問題2:ポインタ変数を利用して、文字型の配列変数mojiの値を実行画面のように表示させなさい
char moji[]="ABCD";
char *mp;
実行画面
A
B
C
D
問題3:文字列を入力し、文字列中の数字のみを別の配列に格納し表示しなさい
実行画面
文字列入力==>AB1CDE23FG4
数字文字列:1234
実行画面
実行画面
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:ボーランド
[3.3] 言語: C
[4] 期限:
[5] その他の制限:
85 :
デフォルトの名無しさん:2007/08/30(木) 12:27:03
こんな問題もできないのか
86 :
デフォルトの名無しさん:2007/08/30(木) 12:27:56
授業単元: C
[2] 問題文(含コード&リンク):
テーマ:文字列配列の操作
問題1:2値を小さい順に表示するユーザ関数を作成しなさい
プロトタイプ宣言:void SortDisp(int dt1,int dt2);
実行画面
数値1入力==>10
数値2入力==>15
数値1:10
数値2:15
数値1入力==>15
数値2入力==>10
数値1:10
数値2:15
問題2:2値の合計を返すユーザ関数を作成しなさい
プロトタイプ宣言:int Add(int aa,int bb);
実行画面
変数a入力==>3
実数b入力==>8
合計:11
数値1入力==>15
数値2入力==>
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:ボーランド
[3.3] 言語: C
[4] 期限:
[5] その他の制限:
>>74 仕様に忠実にするなら
P5 100 100 255
P5
#hoge hoge
100 100
255
どちらも読めなきゃだめだよなあ。
課題というより依頼みたいなものもここでいいのでしょうか?
宿題・課題のみです。
あるC++のプログラムをC言語のプログラムに書き変えてほしいのですが
該当スレなどはありませんか?
91 :
デフォルトの名無しさん:2007/08/30(木) 14:01:05
何方か83 84お願いします
>>83の問題1
#include <stdio.h>
#define MAX_NUM 128
int main()
{
char str[MAX_NUM], even[MAX_NUM/2], odd[MAX_NUM/2];
int i, j, k;
printf("文字列入力==>");
scanf("%s", str);
for(i=0, j=0, k=0; str[i]; i++)
{
if(i%2) {odd[j] = str[i];j++;}
else {even[k] = str[i];k++;}
}
odd[j] = even[k] = '\0';
printf("偶数要素:%s\n", even);
printf("奇数要素:%s\n", odd);
return 0;
}
>>83の問題2
#include <stdio.h>
#define MAX_NUM 128
int main()
{
char m1[MAX_NUM], m2[MAX_NUM], delchr;
int i, j;
printf("文字列入力(m1)==>");
scanf("%s", m1);
fflush(stdin);
printf("削除文字==>");
delchr = (char)getchar();
for(i=0, j=0; m1[i]; i++)
{
if(m1[i] != delchr) {m2[j] = m1[i]; j++;}
}
m2[j] = '\0';
printf("結果文字列(m2):%s", m2);
return 0;
}
>>84の問題1
#include <stdio.h>
int main()
{
int a=10, b=5, g;
int *pa, *pb;
pa = &a;
pb = &b;
g = *pa + *pb;
printf("g:%d", g);
return 0;
}
>>84の問題2
#include <stdio.h>
int main()
{
char moji[]="ABCD";
char *mp;
mp = moji;
while(*mp) putchar(*mp++);
return 0;
}
>>84の問題3
#include <stdio.h>
#include <ctype.h>
#define MAX_NUM 128
int main()
{
char moji[MAX_NUM], digit[MAX_NUM];
int i, j;
printf("文字列入力==>");
scanf("%s", moji);
for(i=0, j=0; moji[i]; i++)
{
if(!isdigit(moji[i]) == 0) {digit[j] = moji[i]; j++;}
}
digit[j] = '\0';
printf("数字文字列:%s", digit);
return 0;
}
97 :
デフォルトの名無しさん:2007/08/30(木) 14:28:18
何方か86お願いします
>>86の問題1
void SortDisp(int dt1,int dt2)
{
printf("数値1:%d\n数値2:%d\n", dt1<dt2 ? dt1 : dt2, dt1<dt2 ? dt2 : dt1);
}
>>86の問題2
int Add(int aa,int bb)
{
return aa+bb;
}
99 :
デフォルトの名無しさん:2007/08/30(木) 14:59:04
[1] 授業単元: ランダム関数
[2] 問題文(含コード&リンク):20〜100までのランダムな値を表示
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:BorlandC++
[3.3] 言語:C++
100 :
76:2007/08/30(木) 14:59:28
102 :
デフォルトの名無しさん:2007/08/30(木) 15:22:46
>>76
あとから、これ参照してとか言うなカス
作った関数意味ねーだろうが
あと>>33の2も答え出てるだろうが
103 :
82:2007/08/30(木) 15:23:50
何方か82お願いします
>>99 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL));
printf("%d", rand()%81 + 20);
return 0;
}
106 :
デフォルトの名無しさん:2007/08/30(木) 15:45:54
[1] 授業単元: 配列
[2] 2次元配列の中に1~100までの連続した数字を格納し、表示させる
[3.1] WinXP
[3.2] Borland
[3.3] C++
[5] 1 2 3 4 5 6 7 8 910
11121314151617181920
21222324252627282930
…こんな感じで100まで表示させたいのです。
#include <stdio.h>
int main(void)
{
int array[100], i;
for (i = 1; i <= 100; i++)
array[i-1] = i;
for (i = 0; i < 100; i++) {
printf("%2d", array[i]);
if (array[i] % 10 == 0)
putchar('\n');
}
}
#include <stdio.h>
int main(void)
{
int num[10][10], i, j;
for(i=0; i<10; i++){
for(j=0; j<10; j++){
num[i][j] = i*10 + j + 1;
printf("%2d", num[i][j]);
}
putchar('\n');
}
return(0);
}
>>101 3番めこんなのでどうでしょう?
/*
xの昇順階乗を計算する。
fact_pow(10,3) = 10*11*12 = 1320
fact_pow(0,3) = 0*1*2 = 0
fact_pow(3,0) = 1;
fact_pow(-3,3) = -3*-2*-1 = -6
*/
#include <stdio.h>
#include <stdlib.h>
int fact_pow(int x,int p);
int main(void) {
int x, p;
printf("整数[x]を入力してください:");
scanf("%d",&x);
printf("整数[p]を入力してください:");
scanf("%d",&p);
printf("%d^[%d] = %d\n",x,p,fact_pow(x,p));
return 0;
}
int fact_pow(int x,int p) {
int value = 1;
int i;
if(p == 0)
return 1;
for(i = 0; i < p; i++)
value *= (x + i);
return value;
}
110 :
デフォルトの名無しさん:2007/08/30(木) 16:12:55
[1] 授業単元: 乱数
[2] 1~25までの数字をランダムで25個表示させる。その際同じ値がでないようにする。
[3.1] WinXP
[3.2] Borland
[3.3] C++
よろしくお願いします
111 :
デフォルトの名無しさん:2007/08/30(木) 16:24:11
>>110 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int num[25];
int i, index, tmp;
for(i=0; i<25; i++) num[i] = i+1;
srand(time(NULL));
for(i=0; i<25; i++)
{
index = rand() % (i + 1);
tmp = num[i];
num[i] = num[index];
num[index] = tmp;
}
for(i=0; i<25; i++) printf("%d\n", num[i]);
return 0;
}
113 :
デフォルトの名無しさん:2007/08/30(木) 16:47:21
>>110 #include <iostream>
#include <cstdlib>
#include <ctime>
const int N = 25;
int main()
{
int rnd[N] = {0};
int i,r,r1,r2,temp;
srand((unsigned)time(NULL));
for(i = 0; i < N; i++)
rnd[i] = i + 1;
r = rand();
for(i = 0; i < r; i++){
r1 =rand()%N;
r2 =rand()%N;
temp = rnd[r1];
rnd[r1] = rnd[r2];
rnd[r2] = temp;
}
for(i = 0; i < N; i++)
std::cout << rnd[i] << ' ';
std::cout << '\n';
return 0;
}
>>110 #include <iostream>
#include <cstdlib>
#include <ctime>
#include <deque>
using namespace std;
int main(void)
{
const int NUM = 25; //定数宣言
srand((unsigned)time(NULL)); //乱数初期化
//配列qiの宣言と初期化
deque<int> qi;
for(int i = 0; i != NUM; i++)
{
qi.push_back(i+1); //1〜NUMまでの数値を並べる
}
//乱数を使って数値をランダムに取り出す
for(int i = NUM; i != 0; i--)
{
int n = rand() % i; //0〜(i-1)までの乱数を取り出す
cout << qi.at(n) << endl; // n番目の数値を表示
qi.erase(qi.begin()+n); // n番目の数値を配列から削除
}
return 0;
}
115 :
104:2007/08/30(木) 17:23:00
>>111 お早い回答ありがとうございます!!
おかげで助かりました!
116 :
111:2007/08/30(木) 17:48:33
久々ありがとうレスをもらった
「どういたしまして」
>>116 回答をしてもらったわけではない部外者だが、他の回答者として
自分よりお早く回答してくれてありがとうございました!
おかげで自分が回答せずに済みました!
>>114 このスレでGNUスタイルのコードは初めて見た気がする
残念だが C++ の標準スタイルでは引数がないなら
int main() で良いんだよ。CはISO準拠だとint main(void)ってなるが
>>73 こんなもんでおk?後々P5 を読む気が無いコードだけど…
#include<stdio.h>
FILE *comment_remove(const char *filename){ // P5 の時はデータ領域が不正になります
FILE *fp_src, *fp_work;
int moji, is_comment=0;
if((fp_src=fopen(filename, "r"))==NULL) return NULL;
if((fp_work=tmpfile())!=NULL){
while((moji=fgetc(fp_src))!=EOF){
if(moji=='#') is_comment=1;
if(moji=='\n') is_comment=0;
if(!is_comment) fputc(moji, fp_work);
}
fseek(fp_work, 0L, SEEK_SET);
}
fclose(fp_src);
return fp_work;
}
int pgm_info(const char *filename, char *pformat, int *pwidth, int *pheight, int *pdepth){
FILE *fp;
char buf[3+1];
int width, height, depth;
fp=comment_remove(filename);
if(fp!=NULL){
if(fscanf(fp, "%3s%d%d%d", buf, &width, &height, &depth)==4) sprintf(pformat, "%s", buf),*pwidth=width,*pheight=height,*pdepth=depth;
fclose(fp);
}
return 0;
}
>>73 >>120 の訂正と使い方 (関数 pgm_info の返り値で成否を判定できるようにした)
int pgm_info(const char *filename, char *pformat, int *pwidth, int *pheight, int *pdepth){
FILE *fp;
char buf[3+1];
int width, height, depth, ret=0;
fp=comment_remove(filename);
if(fp!=NULL){
if(fscanf(fp, "%3s%d%d%d", buf, &width, &height, &depth)==4){
sprintf(pformat, "%s", buf),*pwidth=width,*pheight=height,*pdepth=depth,ret=1;
}
fclose(fp);
}
return ret;
}
int main(void){
char format[3+1];
int width, height, depth;
pgm_info("a.pgm", format, &width, &height, &depth);
printf("format : %s\nwidth : %d\nheight : %d\ndepth : %d\n", format, width, height, depth);
return 0;
}
>>109 ありがとうございます。
1,2の方もお願いできませんか
>>109 1はyの範囲に制限を付けないと難しいのではないかな。
例えば1900年以降でよいとか、前提はないの?
124 :
123:2007/08/30(木) 23:57:24
>>124 問題を確認しましたが101で書いたことしか載ってませんでした。
76の1で
void arr_cycle(int *arr, int len)
{
int i, temp;
temp = a[len-1];
for(i=len-1;i>0;i--) arr[i] = arr[i-1];
a[0] = temp:
}
でソースをかいてくれませんか
>>101 日付チェックはしてない。グレゴリオ暦が使われた年以降。
int leap(int y)
{
return (y%4==0)?(y%100==0)?(y%400==0)?1:0:1:0;
}
int days(int y,int m,int d)
{
int dom[2][12]=
{{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
int day=0,i,j;
j=leap(y);
for(i=0;i<m-1;i++) day+=dom[j][i];
day+=d;
return day;
}
main()
{
int y,m,d;
scanf("%d %d %d",&y,&m,&d);
printf("days=%d\n",days(y,m,d));
}
>>101 #include<stdio.h>
int f(int y,int m,int d){
if(m<3)
y--,m+=12;
return y*365+y/4-y/100+y/400+(m+1)*306/10+d-428;
}
int leap(int y){
return f(y,3,1)-f(y,2,29);
}
int days(int y,int m,int d){
return f(y,m,d)-f(y,1,0);
}
int main(void){
int ymd;
printf("yyyymmdd="); scanf("%d",&ymd); printf("leap=%d\ndays=%d\n",leap(ymd/10000),days(ymd/10000,ymd%10000/100,ymd%100));
return 0;
}
#include<stdio.h>
#define PI 3.1415926535897932384626433832795
double rad(double s){
return s*PI/180;
}
double deg(double r){
return r*180/PI;
}
int main(void){
double s;
printf("s="); scanf("%lf",&s); printf("rad(s)=%.9f\ndeg(rad(s))=%.9f\n",rad(s),deg(rad(s)));
return 0;
}
>>73 バイナリフォーマットにも対応できるように作りなおしてみた
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int pgm_get_word(FILE *fp, char buf[], int buf_size){
int i=0, moji;
while(i<buf_size-1 && (moji=getc(fp))!=EOF){
if(isspace(moji)){ if(i>0) break; }
else if(moji=='#'){
fscanf(fp, "%*[^\n]");
if(i>0) break;
}else{ buf[i++]=moji; }
}
buf[i]='\0';
if(i>=buf_size-1) while((moji=getc(fp))!=EOF && !isspace(moji)) ;
return (i>0);
}
int pgm_info(const char *filename, char *pformat, int *pwidth, int *pheight, int *pdepth){
FILE *fp;
char format[3+1], width[10+1], height[10+1], depth[4+1];
int ret=0;
fp=fopen(filename, "rb");
if(fp!=NULL){
if(pgm_get_word(fp, format, sizeof(format)) && pgm_get_word(fp, width, sizeof(width)) &&
pgm_get_word(fp, height, sizeof(height)) && pgm_get_word(fp, depth, sizeof(depth)) ){
sprintf(pformat, "%s", format); *pwidth=atoi(width); *pheight=atoi(height); *pdepth=atoi(depth);
ret=1;
}
fclose(fp);
}
return ret;
}
これを76の1のようにずらしたいのですが
#include <stdio.h>
void arr_cycle(int arr[], int len)
{
int i, temp;
temp = arr[len-1];
for(i=len-1;i>0;--i)
arr[i] = arr[i-1];
arr[0] = temp;
}
int main(void) {
int i;
int n;
int data[10];
scanf("%d", &n);
for(i = 0;i < n;i++)
scanf("%d",&data[i]);
arr_cycle(&data[i], n);
for(i=0;i<n;i++)
printf("%d ",data[i]);
return 0;
}
[1] 授業単元: c言語
[2] 非負整数の不定長配列 arr[] 中で、全てのデータが閾値 thre 以上かどうかの真偽値(0または1)を返却する関数 arr_thre_all() を作成する。終端番兵は、EOA(-1) とする。反復変数を用いず、ポインタのアドレス演算を用いる。
システム上では、入力の先頭をthre、それ以降はarrとする。入力の終了はEOA(-1)とする。全て閾値以上の場合は 1 、そうでない場合は 0 を出力するプログラムを作れ。
入力例:1 2 3 4 1 -1
出力例:1
[3.1] WinXP
[3.2] bcc
[3.3] C
[4]8/31
135 :
デフォルトの名無しさん:2007/08/31(金) 12:48:51
[1] 授業単元:
[2] 問題文:1~10までの数字を2回入力し1番目と2番目までの入力された値を足し算して表示させる
[3.1] WinXp
[3.2] Borland
[3.3] C++
[5] その他の制限:2番目に入力される値は1番目よりも小さくなるようにする。
8 4 と入力されたら
8+7+6+5+4と計算され、30と表示される感じです
>>136 > int iary[] ={0};
これだとそもそも一個しか入力できないわけだが。
入力ロジックは兎も角、積算ロジックはぱっと見良さそうだよ。
サイズの問題以外にも配列にEOAを入れないのはまずいだろ。
139 :
136:2007/08/31(金) 14:29:34
どのように入力を変えればよいのでしょうか?
int iary[数値] ={0};
ってやればいいんじゃない?
入力の終了条件を-1が入力されたらにする。
142 :
136:2007/08/31(金) 15:04:55
ちょっとよくわからないので書いてくれませんか?
143 :
デフォルトの名無しさん:2007/08/31(金) 15:23:51
144 :
136:2007/08/31(金) 15:31:29
>>143 すいませんでした。
ソースから数値を読み取るんじゃなくて、コンパイラから入力したいのですが
>>144 もう我慢ならねえ!!!!
コマンドラインから受け取るようにしろよ、この穀つぶしが!!!!!!!
146 :
143:2007/08/31(金) 16:06:11
「コンパイラから入力したいのですが」の意味が俺にはわからない。
コンパイラが対話式とみた
コンパイルオプションで -Dxxx=yyy とか付けるんじゃない?
統合開発環境で、デバッグ時に、引数を与えたいが、やり方がわからない。
こうなんじゃないか?
最近のコンパイラは賢いな。ESP機能がある。
>>132 #include <stdio.h>
#define EOA -1
#define ARRMAX 1024
int arr_thre_all(int* arr, int thre){
while(*arr != EOA) if(*(arr++) < thre) return 0;
return 1;}
int main(void){
int i; int arr[ARRMAX]; unsigned int thre;
scanf("%d", &thre);
for(i = 0; i != ARRMAX; i++){
scanf("%d", &arr[i]);
if(arr[i] == EOA) break;}
i = arr_thre_all(arr, thre);
printf("%d\n", i);
return 0;}
#include <stdio.h>
int main(){
int u,l;
while(1){scanf("%d",&u);if(u<11 && u>0){break;}}
while(1){scanf("%d",&l);if(l<u && l>0){break;}}
//printf("%d +%s%d = %d\n", u, (u-l>2)?" ... + ":" ", l, ( u + l )*( u - l + 1 ) / 2);
printf("%u\n", ( u + l )*( u - l + 1 ) / 2);
return 0;}
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
C#でクラスを用いてシューティングゲームを作れ。
スタート・中断・再開ボタン機能を必ず入れ、敵味方と弾は全てオブジェクトとする
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:Windows visual studio2005
[3.3] 言語: C#
[4] 期限:9月4日
[5] その他の制限: なし
C#は駄目でしょうか。
C#のソース付きのゲームとかがあればそれを参考にやれるんですが・・・
C/C++のみです。C#は他言語です。
C#のソース付きのゲームのサンプルってテトリスぐらいしかしらんな〜
1対1のガンマンシューティングなんてどうだ?
159 :
デフォルトの名無しさん:2007/09/01(土) 20:50:01
[1] 授業単元:C言語
[2] 問題文: 文字列に含まれるすべての文字を、1つ後のASCUコードをもつ文字に置き換えるプログラムを作成する。
例:Nurupo → Ovsvqp
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ: bcc
[3.3] 言語: C
[4] 期限: 9月4日
[5] その他の制限: 特にありません。 よろしくお願いします。
>>159 #include <stdio.h>
#define MAX_LENGTH 512
int main(void)
{
char str[MAX_LENGTH] = "Nurupo", buf[MAX_LENGTH];
int i;
for(i=0; str[i]; i++) buf[i] = str[i] + 1;
buf[i] = '\0';
printf("%s → %s", str, buf);
return 0;
}
ああ、置き換えるのか・・・仕様とは違うなorz
do *p+=1; while(*++p);
適当に置き換えておいてくれ
アスキーコード最後の文字はどうするん?
何も考えずに1つ後のASCUコードをもつ文字にするんだろ
165 :
デフォルトの名無しさん:2007/09/01(土) 22:56:37
[1] 授業単元:C言語
[2] 問題文: 長方形の縦と横の長さ(double型)を引数として受け取り、その長方形の面積(double型)を
返す関数Xを作り、mainから呼び出して動作を確認するプログラムの作成
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:Windows visual studio2005
[3.3] 言語: C
[4] 期限: 9月3日 21時
[5] その他の制限: なし
#include <stdio.h>
double X(double width, double hight)
{
return width * hight;
}
int main(void)
{
printf("%g", X(10.0, 8.0));
return 0;
}
>>155 テトリスでもいいんで教えてもらえないでしょうか。要領さえ分かれば何とかなるんで
>>156 全然違う事の勉強です。
>>162 これって1文字目が\0だとPC爆発しないか?
しないよ
171 :
デフォルトの名無しさん:2007/09/02(日) 20:09:48
>>160 お早い回答ありがとうございます!!
おかげで助かりました!
>>162 どこを置き換えればいいかもおしえていただけると助かるのですが
おしえていただけないでしょうか?
>>171 void replaceFollower(char * foo)
{
for (unsigned ic = 0; foo[ic] != '\0'; ++ic) {
++foo[ic];
}
}
#include <stdio.h>
int main()
{
char str[] = "Nurupo";
printf("%s\n", str);
replaceFollower(str);
printf("%s\n", str);
return 0;
}
173 :
36:2007/09/02(日) 22:49:56
>>36です.
遅くなりましたが,答えてくださった方ありがとうございます.
無事に課題提出を行うことができました.
実は
>>36で書いた課題にはオプション問題がありまして,
自分には全く分からなかったので手を出さなかったのですが….
どのように解答するか気になるので,
もし分かる方がいたらよろしくお願いします.
[1] 授業単元:C言語
[2] 問題文:
二次座標平面において,ランダムに4〜5個ほど点が与えられる.
そのような複数の点の最近傍を通る円の方程式を求めよ.
ただし,中心座標(x_0,y_0)は
(1)一番低いy座標よりも下にある.
(2)一番低いx座標よりも左にある.または,一番高いx座標よりも右にある.
{if((x_0<=xmin||x_0<=xmax)&&y_0<=ymin) true;}
を満たすものとする.
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:gcc 3.4
[3.3] 言語:C
[4] 期限:期限なし
[5] その他の制限:計算速度が速い方が好ましい.
>>173 最近傍の評価はどうするの?
円と点 n の距離を Dn と置く時
Σ(Dn)
Σ((Dn)^2)
とかそういうのが無いと解けないっぽ
175 :
36:2007/09/02(日) 23:28:37
>>174 評価関数は各自で任意に設定すると言われているのですが….
今回は
Σ(Dn^2)
の最小二乗法でお願いします.
176 :
デフォルトの名無しさん:2007/09/03(月) 00:47:20
[1] 授業単元:C言語
[2] 問題文: 整数aと自然数nを入力してaのn乗を求める。入力は正しく行われるものとする。
[3] 環境
[3.1] OS:Win
[3.2] コンパイラ:Win visual studio2005
[3.3] 言語: C
[4] 期限: 9月5日
[5] その他の制限: --nを使うところまではわかるのですが、どうも上手くできません。
お力を貸していただけると助かります。
int factorial(int a,int n){
long int buf=a;
while(n!=0){
buf *=a;
n--;
}
return buf;
}
ただし少しnを大きくしただけでオーバーフローする
178 :
デフォルトの名無しさん:2007/09/03(月) 07:13:30
[1] 授業単元:C言語
[2] 問題文:掛け算の九九の表をファイルprod99.txtに書き込むプログラムを作成する。
[3.1] OS:Windows
[3.2] コンパイラ:Windows visual studio2005
[3.3] 言語: C
[4] 期限: 9月5日 12時
[5] その他の制限: 特にありません
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク):
仕事は「納期 T、作業時間 W、ペナルティ C」の
三つの情報で特徴付けられるとする。
N 個の仕事が与えられる。これらの仕事を適当に並び替えて
「納期から遅れた時間×ペナルティ」の総和を最小にせよ。
なお、開始の時刻は 0 とする。
入力:
一行目は仕事の総数 N (正の整数、N ≦ 50 としてよい)
二行目から n+1 行目までは仕事の情報 T W C (すべて正の整数)
出力:
最小の「納期から遅れた時間×ペナルティ」の総和。
例:
(入力)
2
1 2 3
1 1 1
(出力)
5
(1番目の仕事をやってから2番目の仕事をやる。両方納期には遅れるが
ペナルティ 5。逆にすると2番目の仕事は納期に間に合うがペナルティ 6)
[3] 環境:特に指定なし(OS環境問わず、C/C++どちらでも可)
[4] 期限:9月10日
[5] その他の制限:特になし
>>173 付帯条件がよくわからんのだけど、つまり円の右上だけ(or 左上だけ)で
他の点に近い円を描けってことでよいのかね?
>>178 #include <stdio.h>
int main() {
int i, j;
FILE *fp = fopen("prod99.txt", "w");
for (i = 1; i <= 9; ++i) {
for (j = 1; j <= 9; ++j) {
fprintf(fp, "%2d ", i*j);
}
fprintf(fp, "\n");
}
fclose(fp);
}
>>178 #include <stdio.h>
int main(void){
FILE *file;
if(({file=fopen("prod99.txt","r"))==NULL){
fputs("エディタを開いて、ファイル名 prod99.txt に以下を書き込んでください\n"
" 1 2 3 4 5 6 7 8 9\n"
" 1 1 2 3 4 5 6 7 8 9\n"
" 2 2 4 6 81012141618\n"
" 3 3 6 9121518212427\n"
" 4 4 812162024283236\n"
" 5 51015202530354045\n"
" 6 61218243036424854\n"
" 7 71421283542495663\n"
" 8 81624324048566472\n"
" 9 91827364554637281\n",stderr);
return 1;
}
fputs( " 1 2 3 4 5 6 7 8 9\n"
" 1 1 2 3 4 5 6 7 8 9\n"
" 2 2 4 6 81012141618\n"
" 3 3 6 9121518212427\n"
" 4 4 812162024283236\n"
" 5 51015202530354045\n"
" 6 61218243036424854\n"
" 7 71421283542495663\n"
" 8 81624324048566472\n"
" 9 91827364554637281\n",file);
fclose(file);
return 0;
}
183 :
182:2007/09/03(月) 09:01:27
if(({file=fopen("prod99.txt","r"))==NULL){
→
if(({file=fopen("prod99.txt","w"))==NULL){
{
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 逆ポーランド記法に変換してから計算する四則演算の電卓プログラムを作れ
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:bcc
[3.3] 言語: c
[4] 期限: 2007年9月4日
よろしくおねがいします。
186 :
◆kRtmRcQ9ak :2007/09/03(月) 12:41:26
[1] 授業単元: コンピュータプログラミング
[2] 問題文: 名前&身長&体重の入力&ファイルに記録&読み出し&BMI計算(BMI=体重kg/(身長m)^2)&身長順に並び替え
[3] 環境
[3.1] windows
[3.2] コンパイラ名とバージョン:C++Compiler5.5
[3.3] 言語: C
[4] 期限:2007 9/5まで
[5] その他の制限:無し。
よろしくお願いします。
188 :
billy:2007/09/03(月) 14:58:50
構造体に入っている値を32個ずつ別のテキストファイルに出力したいのですが、どうしたらいいのですか?
190 :
デフォルトの名無しさん:2007/09/03(月) 16:19:38
〔1〕C言語
〔2〕問題(下記)
#include<stdio.h>
void main()
{
int ia;
printf("整数を入力してください:");
scanf("%d",&ia);
if(○○)
printf("偶数です");
else
printf(”奇数です”);
}
問
上記に示したのは、入力した整数が偶数か奇数かを判断するプログラムである。
if(○○)の○○を埋めよ。
〔3〕WinXP
9月4日〆
よろしくお願い致します。
192 :
デフォルトの名無しさん:2007/09/03(月) 16:35:44
[1] 授業単元:C言語
[2] 問題:引数として渡された2つの整数の小さい方の値を返す関数である。
〔 〕のを埋めて関数を完成させよ。
〔 〕imin(int ia,int ib)
{
if(ia<ib)
〔 〕
else
〔 〕
}
[3] 環境
[3.1] OS:WindowsXP
[3.3] 言語:C++
[4] 期限: 9月4日まで
[5] その他の制限: なし
葬式で1週間授業休んだらおいてかれた\(^o^)/
>>193 〔int〕imin(int ia,int ib)
{
if(ia<ib)
〔return ia;〕
else
〔return ib;〕
}
〔/* 〕imin(int ia,int ib)
{
if(ia<ib)
〔; 〕
else
〔*/int imin(int ia,int ib){return ia<ib?ia:ib;〕
}
>195の勝ち。
200 :
36:2007/09/03(月) 21:35:18
>>180 そうです,右上または左上となる円を描くイメージです.
もしお時間ありましたらよろしくお願いします.
>>199 「正規分布のデータで『評価』」ってなに?
アップローダにあるほうもグダグダかかれてて
結局問題でやるべきことがよくわからないんだが。
評価するっていうのは平均と分散からできる分布のグラフ
(横軸が数値で、縦軸が度数(ここでは確率))において
入力データと数値を見比べて一致したところの確率を出すことを評価するっていうんです。
1つのデータが9次元なんです。
9次元の入力データから9次元の平均をひいたものを2乗して
9次元の分散でわる。そうすると9個の値がでますからそれをたせばexpの中身になって
expの前にある変数とexpをかけると確率が出せるわけです。
それがfです。
すいませんfの式がここでかけなくて。
>>202 平均分散が与えられた多次元正規分布の式に、与えられた
20個のデータを突っ込んだときの値を出せと言っている?
『評価』は estimate じゃなくて evaluate だということ?
そうです。まさしくそうです
しかしこの正規分布で出した確率があまりに小さくなってあってるかどうかもわからないまま
他のアルゴリズムに用いないといけないから困る。
値いくらになりました?
logで表示してくれるとありがたいです。
検算させていただきます。
>>208 目的関数の性質が悪そうなんだけど、単純な降下法でうまくいくの?
210 :
208:2007/09/04(火) 07:23:05
>>209 多分うまくいかない
局所解にはまってしまうと思う
でも、数学はもう解けない頭になってしまった
(仕事ならやるけどね)
数式で表すと、適当な平行移動と反転をして
min. Σ| (x-x_i)^2 + (y-y_i)^2 - r^2 |
s.t. x ≧ 0, y ≧ 0, r ≧ 0
を解く、という問題に落ちるんだけど、この目的関数は
凸でないし、滑らかでもないので非常に面倒な問題になるはず。
ただ、関数が綺麗だから逐次二次緩和くらいで十分解けそう。
とても実装する気にはならないけど。
212 :
デフォルトの名無しさん:2007/09/04(火) 15:02:44
[1] 授業単元: ランダム関数
[2] 問題文(含コード&リンク): トランプをランダムで表示させる
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:Borland
[3.3] 言語:C++
表示が○○(マーク)の○(数字)と表示させたいのです
>>212 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
enum {MK_HEART, MK_DIAMOND, MK_CLOVER, MK_SPADE};
int mark, num;
srand(time(NULL));
mark = rand() % 4;
num = rand() % 13 + 1;
switch(mark)
{
case MK_HEART:printf("ハート");break;
case MK_DIAMOND:printf("ダイヤ");break;
case MK_CLOVER:printf("クローバー");break;
case MK_SPADE:printf("スペード");break;
}
if(1 < num && num < 11) printf("%d", num);
else
{
switch(num)
{
case 11:putchar('J');break;
case 12:putchar('Q');break;
case 13:putchar('K');break;
case 1:putchar('A');break;
}
}
return 0;
}
214 :
デフォルトの名無しさん:2007/09/04(火) 21:20:09
MMXでも使ってんのかと思った
216 :
デフォルトの名無しさん:2007/09/04(火) 21:26:26
[1] 授業単元:C言語
[2] 問題文:文字列を入力し、その文字列を縦に並べて表示するプログラムの作成。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名:Windows visual studio2005
[3.3] 言語: C
[4] 期限: 9月5日 21時
[5] その他の制限: ないです。
よろしくお願いします。
>>216 #include <stdio.h>
int main(void)
{
char buf[512], *p = buf;
scanf("%s", buf);
while(*p)
{
printf("%c\n", *p);
p++;
}
return 0;
}
海栗に書き換えればいいだけ
220 :
214:2007/09/04(火) 22:13:01
自己解決しました。
スレ汚しすみませんでした。
221 :
デフォルトの名無しさん:2007/09/04(火) 23:04:34
授業単元:C
問題文(含コード&リンク):
テーマ:文字配列の操作
1問目:キーボードより表示開始文字と表示終了文字を入力開始〜終了までの文字を表示しなさい
char moji[]="ABCDEF〜XYZ"; /*大文字26文字*/
実行画面
moji:ABCDEF〜XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
moji:ABCDEF〜XYZ
開始位置==>D
終了位置==>D
表示:D
moji:ABCDEF〜XYZ
開始位置==>E
終了位置==>B
表示:EF〜XYZAB
環境:
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:
222 :
デフォルトの名無しさん:2007/09/04(火) 23:06:43
授業単元:C
問題文(含コード&リンク):
テーマ:文字配列の操作
問題2:文字列と検索文字、置換文字を入力し文字列中の検索文字を置換文字に置き換え
なさい
実行画面
文字列(m1)入力==>ABCDEFAABCDABC
削除文字==>A
置換文字==>*
結果文字列(m1):*BCDEF**BCD*BC
環境:
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:
>>211 #include <stdio.h>
#include <ctype.h>
int main(void)
{
char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /*大文字26文字*/
char start, end, *p;
printf("moji:%s\n", moji);
printf("開始位置==>");
scanf("%c", &start);
fflush(stdin);
printf("終了位置==>");
scanf("%c", &end);
fflush(stdin);
if(!isalpha((int)start) || !isalpha(end)) return 1;
start = (char)toupper(start);
end = (char)toupper(end);
p = moji + start - 'A';
for(;;)
{
putchar(*p);
if(*p == end) break;
if(*(++p) == '\0') p = moji;
}
return 0;
}
>>222 #include <stdio.h>
#include <ctype.h>
int main(void)
{
char m1[512];
char del, rplc, *p = m1;
printf("文字列(m1)入力==>");
scanf("%s", m1);
fflush(stdin);
printf("削除文字==>");
scanf("%c", &del);
fflush(stdin);
printf("置換文字==>");
scanf("%c", &rplc);
fflush(stdin);
for(; *p; p++)
{
if(*p == del)
{
*p = rplc;
}
}
printf("結果文字列(m1):%s", m1);
return 0;
}
225 :
デフォルトの名無しさん:2007/09/05(水) 00:32:04
[1] 授業単元:C言語
[2] 問題文: 文字(char型)を引数として受け取り、その文字が英小文字ならば大文字に、英大文字なら小文字に変換して返す関数toulを作り、
mainから呼び出して動作を確認するプログラムの作成する。ただし、引数はスペース、英字、数字のみとし、スペースや字数はそのまま変更しない。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:Windows visual studio2005
[3.3] 言語: C
[4] 期限: 9月6日 22時
[5] その他の制限: なし
>>225 mainは省略
動作確認も省略
char toul(char buf){
int dif='A'-'a';
if(buf >= 'a' && buf <='z'){
return char + dif;
}else if(buf >= 'A' && buf <='Z'){
return char - dif;
}
>>225 #include <stdio.h>
#include <ctype.h>
char toul(char ch)
{
if(isupper(ch))
return tolower(ch);
else if(islower(ch))
return toupper(ch);
else
return ch;
}
int main(void)
{
printf("'%c' → '%c'\n", 'a', toul('a'));
printf("'%c' → '%c'\n", 'B', toul('B'));
printf("'%c' → '%c'\n", ' ', toul(' '));
printf("'%c' → '%c'\n", '2', toul('2'));
return 0;
}
228 :
デフォルトの名無しさん:2007/09/05(水) 01:24:23
授業単元:C
問題文(含コード&リンク):
文字列と削除文字列を入力し文字列中から削除文字を排除しなさい
実行画面
文字配列入力(m1)==>ABCDEFAABCDABC
排除文字==>A
結果文字列(m2):BCDEFBCDBC
環境:
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:
>>228 #include <stdio.h>
#include <string.h>
#define MAX 256
int main(void)
{
char str[MAX],ch;
size_t sz_str,i;
printf("文字配列入力(m1)==>");
fgets(str,sizeof(str)/sizeof(str[0]),stdin);
sz_str=strlen(str);
printf("排除文字==>");
ch=getchar();
for(i=0; i<sz_str; i++) {
if(str[i]!=ch) putchar(str[i]);
}
return 0;
}
230 :
デフォルトの名無しさん:2007/09/05(水) 07:31:01
授業単元:C
問題文(含コード&リンク):
問題1:テーマ:標準関数の利用
文字型の配列変数m1[20]、m2[10]に文字列を入力し、m1側にm2の文字列を連結させなさい
使用する標準関数:strcat()
実行画面
実数m1入力==>ABC
実数m2入力==>DEFGHIJ
結果m1:ABCDEFGHIJ
問題2:文字列1と文字列2を入力し比較を行い、結果を表示しなさい
使用する標準関数:strcmp()
実行画面
文字列1入力==>ABC
文字列2入力==>ABC
結果:2つの文字列は同じです。
文字列1入力==>ABC
文字列2入力==>DEF
結果:2つの文字列は違います
環境:
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:
>>229 はちと改善した方が良いかな・・・自己レス。
>>232 それは無問題。なんなら改行する前にEOFを入れておけば良い。
何この馬鹿。
>>234 いや、バカは知ったかのお前。何が問題かが分かってないな。
MAXで指定した以上の文字列を入力した場合の問題だよ、アホ。
失せろ、初心者。なんか、去年このスレで世話になったのか知らんが
今年はおかしな知ったか無知初心者が回答者に紛れ込んで大嘘ついて恥さらしをしているよな・・・
失せろガキ
236 :
自信過剰のアホの極み発言:2007/09/05(水) 08:48:41
232 名前:デフォルトの名無しさん 投稿日:2007/09/05(水) 08:06:40
>>231 入力の改行文字を取り除いていない。
入力の改行文字を取り除いていない。
入力の改行文字を取り除いていない。
入力の改行文字を取り除いていない。
入力の改行文字を取り除いていない。
>>234 ( ´,_ゝ`)プ (ゝc_,´・)プププッ (◆*ノ、っ'`*)ップ (●´っ`)ブッ:;.:.. (*Ф3Ф).:∵ぶっ ブハァッ(_Д_)・:∴・
お前笑えるw
>>234 おいっリアル馬鹿、何か言えよ?知ったか君よぉ(プッ
>>234 調子ぶっこいて恥さらしをするくらいなら
>>230 にでも答えてやれよ、知ったか初心者w
>>230 問題2
#include<stdio.h>
#include<string.h>
int main(void)
{
char T_T[256], orz[256];
int ml,o,lm =0;
printf("文字列1入力==>");
fgets(T_T, sizeof(T_T), stdin);
printf("文字列2入力==>");
fgets(orz, sizeof(orz), stdin);
ml=strcmp(T_T, orz);
if( ml^0^lm ) printf("結果:2つの文字列は違います\n");
else printf("結果:2つの文字列は同じです。\n");
return 0;
}
242 :
デフォルトの名無しさん:2007/09/05(水) 12:28:42
授業単元:C
問題文(含コード&リンク):
問題:ポインタで操作しなさい
char moji[] ="ABCDEF〜XYZ"; /*最大文字26文字*/
char *pc;
pc=moji;
結果
moji:ABCDEF〜XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
moji:ABCEF〜XYZ
開始位置==>D
終了位置==>D
表示:D
moji:ABCDEF〜XYZ
開始位置==>E
終了位置==>B
表示:EF〜XYZAB
環境:
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:
>>242 // 実験してないからバグるかも
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print(char* s, char* e)
{
printf("表示:");
for( ; s <= e ; s++ ) putchar(*s);
puts("");
}
int main(void)
{
char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *pc = moji, *pcstart, *pcend, start, end;
while(1) {
printf("moji:%s\n開始位置==>", moji); scanf("%c", &start);
printf("終了位置==>"); scanf("%c", &end);
pcstart = strchr(moji, start);
pcend = strchr(moji, end);
if( pcstart == NULL || pcend == NULL ) break;
if( pcstart <= pcend ) print(pcstart, pcend);
else print(pcend, pcstart);
}
return 0;
}
>>244 問題が読めない
『bcvrf.yahoo.com というサーバが見つかりませんでした。』だって…
問題文がテキストなら
>>1のろだに上げてよ
246 :
デフォルトの名無しさん:2007/09/05(水) 16:25:01
[1] 授業単元: ランダム関数
[2] 問題文(含コード&リンク): トランプをランダムで表示させる
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:Borland
[3.3] 言語:C++
212の発展で今度は5枚表示させたいのです。
ハート6ダイアAクラブ4スペード5クラブ4 みたいな感じです
同じカードが出てもいいんなら、5回繰り返せばいいだけじゃん。
ジョーカーを考慮に入れなくて良いの?
さあ、
>>212 は何回問題を小出しにしてくるかなぁ?
>>246 Cだけど。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int myrand(void) { return (int)(rand() / (RAND_MAX + 1.0) * 52); }
int main(void)
{
char *suit[4] = {"スペード", "ハート", "クラブ", "ダイア"};
char *num[13] = {"A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3", "2"};
int i;
srand(time(NULL));
for(i=0; i<5; i++) {
int temp = myrand();
printf("%s%s ", suit[temp/13], num[temp%13]);
}
return 0;
}
251 :
デフォルトの名無しさん:2007/09/05(水) 20:20:36
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):簡単な機能をもったアドレス帳の作成
[3] 環境
[3.1] OS:Linux
[3.3] 言語:C言語
[4] 期限:2007年9月5日24時まで
[5] その他の制限:
実行結果
アドレス管理です。今日は何をしますか?
入力:1 表示:2 終了:0
<入力の場合>
氏名をローマ字で入力してください
satou
電話番号を入力してください
090-0000-0000
メールアドレスを入力してください
aaaa@aaa.com
メモ、備考があれば入力してください、なければEnterを押してください
memo
作業を続けますか?
入力:1 表示:2 終了:0
<表示の場合>
****アドレス一覧****
[no1]
name satou
tel 090-0000-0000
mail aaaa@aaa.com
memo memo
[2]
name・・・
見にくくてすいません、宜しくお願いします
252 :
251:2007/09/05(水) 20:21:39
ちなみに終了の場合は
お疲れ様でした、終了します。
の一文でプログラムを終了させるようにしたいです。
長くなりましたがお願いします。
253 :
デフォルトの名無しさん:2007/09/05(水) 21:59:40
[1] 授業単元:C言語
[2] 問題文: 0とは異なる二つの実数(double型)を入力し、それらの和差積商を求めるプログラム
[3] 環境
[3.1] OS:Win
[3.2] コンパイラ:Win visual studio2005
[3.3] 言語: C
[4] 期限: 9月7日
[5] その他の制限: なし
235 名前:デフォルトの名無しさん[sage] 投稿日:2007/09/05(水) 08:47:47
236 名前:自信過剰のアホの極み発言[] 投稿日:2007/09/05(水) 08:48:41
237 名前:デフォルトの名無しさん[sage] 投稿日:2007/09/05(水) 08:49:57
238 名前:デフォルトの名無しさん[sage] 投稿日:2007/09/05(水) 08:51:53
239 名前:デフォルトの名無しさん[sage] 投稿日:2007/09/05(水) 08:57:29
240 名前:デフォルトの名無しさん[sage] 投稿日:2007/09/05(水) 09:10:01
--
なるほど、5回連続書き込みで規制が入ったのか。
しかもここで間が開いているようだが?
238 名前:デフォルトの名無しさん[sage] 投稿日:2007/09/05(水) 08:51:53
239 名前:デフォルトの名無しさん[sage] 投稿日:2007/09/05(水) 08:57:29
5回連続書き込みで規制が入って、6回目まで間が空いたと言いたいのだろ。
その5回目も規制後かも知らんが。
258 :
244:2007/09/06(木) 00:26:11
259 :
たなか:2007/09/06(木) 00:32:25
【質問テンプレ】
[1] 授業単元: 数理計画法
[2] 問題文(含コード&リンク): シンプレックス法をC言語で作る
[3] 環境
[3.1] OS: (Windows/Linux/等々) Windows
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: 9月6日 9時
[5] その他の制限: ないです。
260 :
デフォルトの名無しさん:2007/09/06(木) 07:17:48
授業単元:C
問題文(含コード&リンク):
テーマ:標準関数の利用
文字列と検索文字列を入力し、文字列中の検索文字の検索文字列と一致する位置を表示しなさい
使用する標準関数:strncmp(),strlen()
実行画面
文字列入力==>ABCDEABCAABCDEFABC
検索文字列入力==>ABC
一致場所:0
一致場所:5
一致場所:9
一致場所:15
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:
問題:
262 :
デフォルトの名無しさん:2007/09/06(木) 09:18:04
strstr()は使っちゃ駄目みたいです
使っちゃいけないなら自分でほぼ同じ関数を定義しとけば一発だな
配列のサイズをMAXで定義してるのに、sizeof使ってsize_tで求める意味がわからん。
>>264 に要らんもんが入ってたっけ。
上の方にある↓の部分を消しておいて
> printf("%d / %d \n",str_sz,search_sz);
>>265 お前みたいな理解力のない奴に意味を説明しても分からんだろうけど
今年になってからよく知らない初心者が要らぬ発言をしているみたいでうざいんだが?
黙ってろよ、分からないなら。お前みたいな固有の環境でしかプログラムを作らない奴には
一生分からない。
配列の要素の数をMAXで指定しているだけであって、実際のところはMAXでなくても
指定が可能だろ。そのときにも対処できるようにしてあるんだよ。
まぁ、そういうときはMAXを変えれば良いんだが、それでも 理屈 からして
配列の要素の数をああいう形で導くのが適切。大学くらい出ろよ、低学歴
例えば
char str[MAX]="\0",search[MAX]="\0",ch;
ここのMAXの部分をMAX以外で指定した場合に対処できるだろ?
そうする必要があるのかって言う必要性については一個人の主観でしかないから
理屈からして筋が通るんであればそれに対して要らぬ指摘をするなよ、バカ初心者
269 :
昨日もいたクソガキ:2007/09/06(木) 09:35:27
232 名前:デフォルトの名無しさん 投稿日:2007/09/05(水) 08:06:40
>>231 入力の改行文字を取り除いていない。
234 名前:デフォルトの名無しさん 投稿日:2007/09/05(水) 08:42:13
何この馬鹿。
265 名前:デフォルトの名無しさん 投稿日:2007/09/06(木) 09:29:03
配列のサイズをMAXで定義してるのに、sizeof使ってsize_tで求める意味がわからん。
>>265 お前に理解力がないだけじゃん。分からないなら黙ってろよw
あっ、俺は上の人とは別の人だから、同じ人が連続投稿していると思わないでねw
みなさんすみません
できました
#define STRMAX (1024)
void test(int ofs, char *s, char *c, int clen){
char t;
if(s[ofs]=='\0') return;
t=s[ofs+clen];
s[ofs+clen]='\0';
if(strcmp(s+ofs,c)==0)
printf("matched at %d\n", ofs);
s[ofs+clen]=t;
test(ofs+1, s, c, clen);
return;
}
int main(void){
char s[STRMAX], c[STRMAX];
printf("input str:"); scanf("%s",s);
printf("check str:"); scanf("%s",c);
test(0, s, c, strlen(c));
}
>>260じゃないけど。
最近size_t覚えて嬉しくってはしゃいでるのはわかるけど、もうちょっと使いどころ考えろよw
MAXと同じ数値を無駄な計算で出すんじゃなくて、文字列の長さを入れて条件判定部や引数に
strlen()使わないようにするとかさ。
意味がわからないっていうのは、無意味で無駄な計算乙って意味の婉曲な皮肉だったんだが。
大学いける見込みもない引きこもりには理解できなかったかなw
276 :
デフォルトの名無しさん:2007/09/06(木) 10:23:34
授業単元:C
問題文(含コード&リンク):
テーマ:ユーザー関数の作成
問題:2値を小さい順に表示するユーザー関数を作成しなさい
プロトタイプ宣言:void SortDisp(int dt1,int dt2);
実行画面
数値1入力==>10
数値2入力==>15
数値1:10
数値2:15
数値1入力==>10
数値2入力==>15
数値1:10
数値2:15
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:
>>276 なんというか、命名もキモいし、動作説明もキモいな…
void SortDisp(int dt1, int dt2);
void SortDisp(int dt1, int dt2){
printf("数値1:%d\n数値2:%d\n", dt1<dt2?dt1:dt2, dt1<dt2?dt2:dt1);
}
279 :
デフォルトの名無しさん:2007/09/06(木) 12:12:56
授業単元:C
問題文(含コード&リンク):
問題1:文字列1と文字列2を入力し比較を行い、結果を表示しなさい
使用する標準関数:strcmp()
実行画面
文字列1==>ABC
文字列2==>ABC
結果:2つの文字列は同じです
文字列1==>ABC
文字列2==>DEF
結果:2つの文字列は違います
問題2:文字列を入力し、文字列中の英字と数字の文字数をカウントしなさい
使用する標準関数:isdigit()
実行画面
文字列入力==>AB123CDEF45G
英字:7
数字:5
問題3:文字列を入力し、英字とそれ以外を格納する配列に振り分けなさい
使用する標準関数:isalpha()など
実行画面
文字列入力==>A12H&jfTy8uz3#
英字:AHjfTyuZ
その他:12&83
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:
280 :
デフォルトの名無しさん:2007/09/06(木) 12:25:46
授業単元:C
問題文(含コード&リンク): 配列データの平均を求めるユーザ関数を作成しなさい
プロトタイプ宣言:double Average(int *p);
引数:数字が格納された配列アドレス
戻り値:平均
実行画面
整数[0]==>100
整数[1]==>80
整数[2]==>60
整数[3]==>75
整数[4]==>89
整数[5]==>62
整数[6]==>71
整数[7]==>50
整数[8]==>49
整数[9]==>90
平均:72.6
整数[0]==>100
整数[1]==>80
整数[2]==>60
整数[3]==>75
整数[4]==>89
整数[5]==>64
整数[6]==>-1
平均:78.0
実行画面の形式が全部同じで良いね^^
282 :
デフォルトの名無しさん:2007/09/06(木) 15:23:21
[1] 授業単元: c++
[2] 問題文(含コード&リンク):
ウィンドウに、
・「正解は?」と表示したラベル、
・入力用のテキストボックス、
・回答用のボタン、
・「正解」or「残念」と表示するラベル
を作成する。
ある文字列が入力されて一致した場合は「正解」と表示する。
なお、正解の文字列や各種コントロールの配置は任意とする
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:
[3.3] 言語: c++
[4] 期限: 2007年9月7日
ウィンドウズプログラムのGUIがよくわかりません。
よろしくお願いします。
たぶん、
>>280 はエスパーじゃないと作れないと思う。
>283
比較的エスパーレベルが低くても対応は出来そうだけどな。
>> 280
配列が最大10個、-1が出てきたら終了とすると、こんな感じ。
表示するところが必要なら適当に作って。
あと、コンパイルはしてないので、動くかはわかりません。
double Average(int *p){
double sum = 0;
int i;
for( i=0 ; i<10 ; i++ ){
if( p[i] != -1 ) break;
sum += p[i];
}
if( i==0 )return 0.0;
return ( sum / i );
}
286 :
デフォルトの名無しさん:2007/09/06(木) 19:59:28
>>274 > 無意味で無駄な計算乙
すでに理屈と説明がされているのだが、それについて理解できないお前が
勝手に無意味とか無駄にしているだけ、だから知ったか初心者は口を出さずに
間違っていないことに対して口を出すなって言ってんだよ。
お前みたいな浅はかな考えの未熟者はいつまでたってもまともなソースの記述は出来ない。
下手に手間を惜しむ奴は、横着がバグの横行の原因となる
とにかくお前みたいな低学歴は黙ってろ、うぜぇ
お前の場合主観ばかりで何の説明にもなってないだろ。
287 :
相当な思い込み勘違いのアホ:2007/09/06(木) 20:02:52
272 名前:デフォルトの名無しさん 投稿日:2007/09/06(木) 09:55:54
最近size_t覚えて嬉しくってはしゃいでるのはわかるけど、もうちょっと使いどころ考えろよw
↑最近ってなんだよ?もうかなり前から知っているしどこをどう見たら
うれしくてはしゃいでいるように見える????気持ち悪い。これもお前の思い込みか
お前がキャッキャ言いながらはしゃいでsize_tを使ってんだろw
MAXと同じ数値を無駄な計算で出すんじゃなくて、文字列の長さを入れて条件判定部や引数に
↑説明したことを理解していない証拠
strlen()使わないようにするとかさ。
↑
>>260の問題読めてますか?w
> 使用する標準関数:strncmp(),strlen()
> 文字列の長さを入れて条件判定部や引数に
これはバカだな。文字列の長さの条件って、まだ入力されていない
文字列の長さなんて算出できねーよ。そもそも文字列の長さじゃなくて
size_tには配列の要素数の算出がされているんだが?
文字の終端を意味するNULL文字を入れた文字列の長さだったら
文字列を格納した配列の要素数じゃなくてstrlenを使うだろw
初心者は黙ってなさい。
あと、fgetsを使えだの言い出すかもしれんが、MAXで指定した以上の文字を入力した
場合のトラブルは、そう過去ではないすぐ上に問題として出ているはず。
だから入力された文字列の最後までgetchar()で読み込み、その中で文字列を入れるのに
指定した配列に格納できる範囲内で入力を受け付けている仕組みが理解できなかったか。
だからわざわざ きんもぉ〜☆ なソースだといっておいたのにw
その辺の問題解決が出来ているなら示してくれんかね?
俺、専門でプログラミングやってないんでw
とにかく、目的の処理が果たせている以上、つまらぬ言いがかりをせずに
お前がソースを書いて、物申す自分でも出来るぞって証拠を示せ。
まぁ口出しするだけで、あの関数は使っちゃダメなのか?とか実装すりゃ良いとか
口先だけで終わって実際にソースが書けないようじゃ話にならないけどなw
あとな、この世には多種様々な考えの人間がいるんだよ。自分と意見が合わない奴なんて
この世にどんだけいると思ってんだ?しかし、それはおまえ自身の理解力がないが故に
不適切なものを信じてしまい、適切なものを無視してしまうんだよ。
幸い、俺は聞く耳は持っているんで、あしからず。
さぁ、あんたのソースを示せ!論より証拠って言うだろ?
うざい
バカにつける薬はないなw
>for(i=0; i<=strlen(str)-strlen(search); i++) {
> if( !strncmp(&str[i],search,strlen(search)) )
> printf("一致場所:%d\n",i);
> }
何回strlen()呼び出しゃ気が済むんだよw
>条件判定部や引数に strlen()使わないようにするとかさ
ってのは、この無駄なstrlenの呼び出しをやめろってことだろ。
普段ROMってるんだけど、回答に対して分からないところがあったら聞いてもいい?
聞いてはいけない理由は無いと思う
どうぞどうぞ
>>293 聞き方次第では回答にケチ付けやがったと思われてウザイ目にあうのでそのへんを考慮しておいた方がいいかも
それとここが宿題スレってことも念頭において
そうそう、最近頭悪いのが常駐しているから。
298 :
デフォルトの名無しさん:2007/09/06(木) 22:34:06
[1] 授業単元:C言語
[2] 問題文: 0とは異なる二つの実数(double型)を入力し、それらの和差積商を求めるプログラム
[3] 環境
[3.1] OS:Win
[3.2] コンパイラ:Win visual studio2005
[3.3] 言語: C
[4] 期限: 9月7日
[5] その他の制限: どうしてもわかんないんですけど、教えてもらえませんか?
どうしてもわからないんじゃなくて
何も勉強しようとすらしないからわからないんだよ
>>298 #include<stdio.h>
int main(void)
{
double x, y;
scanf("%lf %lf", &x, &y);
printf("%g + %g = %g\n", x, y, x+y);
printf("%g - %g = %g\n", x, y, x-y);
printf("%g * %g = %g\n", x, y, x*y);
printf("%g / %g = %g\n", x, y, x/y);
return 0;
}
>>293 質問なら良いかもしれんが、どこぞの知ったか無知初心者みたいに
なんでそうするんだよ?だのなんで自分が思う通りにしなかったの?
みたいな言いがかりをつけると、下手すりゃ自分の理解力のなさを露呈して
逆に答えてもらえない可能性あり。とりあえず最近、知ったかの詰まらんちゃちを入れる
上級者ぶっている初心者が一匹いるみたいで・・・
302 :
293:2007/09/07(金) 01:19:03
>285
条件逆
305 :
304:2007/09/07(金) 09:28:13
up_x = 2, up_y = 1に直しといて……
306 :
デフォルトの名無しさん:2007/09/07(金) 17:54:52
[1] 授業単元:C言語
[2] 問題文:グラフを作成するプログラムを作成せよ。
例えば、プログラムを実行すると、0〜10分間時間が計測され
その間に、使用者が↑キーを押すと1、↓キーなら2、→キーなら3、
←キーなら4という数値が入力される。
10分経過後、横軸は時間(秒)、縦軸は使用者が入力した数値
の棒グラフを出力するというようなプログラムです。
お願いします!!
[3] 環境
[3.1] OS:Win
[3.2] コンパイラ:Win visual studio2003
[3.3] 言語: C
[4] 期限: できるだけ早めでお願いします。
>>304 ないない、エロゲヲタなんてこのスレにはほとんどおらんやろw
まぁ俺ならサイドポケットだが
>>306 コンソールベース?
ウインドウベース?
マルチスレッド?
ポーリング?
>>306 ↑を押したら1
↓を押したら2
・・・は理解できた.
↑を1秒押した”後に”↓を2秒押したらどうなる?
↑を1秒押した”後に”↓を2秒押した後に→を3秒押したらどうなる?
↑を1秒押した”後に”↓を2秒押した後に→を3秒押した後に・・・ならどうなる?
あと,「できるだけ早め」って言うけど,コレって無期限ってことだから.
ん?C言語ってリアルタイミングにインプッティングをゲッティングしてカウンティングできないの?
>>310 C言語で定められた標準関数の範囲では無理
kbhit とか ReadConsoleInput とかでできるけどね
>>310 そうそう、日本語だけではあんたの文章を理解できないのと似たようなもんだ。
すべてにing系ww
314 :
306:2007/09/08(土) 10:01:20
>>308 そのあたりの指定はないのでやりやすい方でお願いします。
>>309 ↑を1秒押しつづけたら、1の数値が1秒間入力されつづけ
そのあとに、すぐ↓を2秒押した場合は2の数値を2秒間入力し続ける。
キーをおしつづけた時間だけその数値を入力しつづけるといった形です。
質問の答えになってますか??勘違いしてたらごめんなさい・・
あと期限ですが、来週中でお願います!!
>>314 よーく読み返してみろ・・・
> ↑を1秒押しつづけたら、1の数値が1秒間入力されつづけ
> そのあとに、すぐ↓を2秒押した場合は2の数値を2秒間入力し続ける
何の説明にもなってないぞ
↑キーを押すと1とかはどうでもよくて、
押した時から離した時の時間を積算すればいいんじゃないの?
というか、グラフを作成するプログラムならなんでもいいのか、例えば〜のプログラムを作るのか、どっちなの?
↑キーと↓キーが同時に検出できたらどうなるんだろうね
318 :
デフォルトの名無しさん:2007/09/08(土) 14:22:55
[1] 授業単元: コンピュータープログラミング
[2] 問題文(含コード&リンク):
下のデータをマージソートを使ってp[i]/w[i]を大きい順にソートし、それを元にアイテムに並べ替えよ』
item 1 2 3 4 5 6 7 8 9 10
p[i] 12 15 22 88 43 55 23 91 15 78
w[i] 3 4 7 41 32 18 12 64 7 33
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:gcc 3.4
[3.3] 言語: C
[4] 期限: 9月9日2400まで
[5] その他の制限: 特に無し
宜しくお願いします。
>>318 すまんが俺の悪い頭ではその問題文は理解できん。
320 :
デフォルトの名無しさん:2007/09/08(土) 16:01:16
>>319 例えばですね、
itemの5項目目はp[5]=43,w[5]=18になります。
でp[5]/w[5]=43/18となります。
このような値を大きい順に並べ替えるようなプログラムを作る問題です。
説明が足らずすいませんでした。
ずれてるぞ
マージ程度ならググッたほうがはやそうだが・・・
p[i]/w[i]入れる配列作って放り込めばいいんじゃないか
答えは5 8 7 9 4 10 6 3 2 1 って表示させればいいの?
p[i]/w[i]入れる配列作らないと毎回比較の際に割り算を計算するはめになるな
325 :
デフォルトの名無しさん:2007/09/08(土) 16:45:06
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
課題9
ファイルun.txtから文字を読み込み、大文字と小文字を区別しないでアルファベット
26文字の出現頻度をカウントし度数分布表を作るプログラムを作れ。
un.txtは大文字と小文字のアルファベットが縦に26文字書いてある自分で作った
ファイル。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C++
できれば、早めにお願いします.....
>318
表示するのはアイテムだけ。
#include <stdio.h>
typedef struct {
double div;
int item;
} st;
void mergesort(st *p, st *temp, int left, int right)
{
int i, j, k, mid = (left + right) / 2;
if(left >= right) return;
mergesort(p, temp, left, mid);
mergesort(p, temp, mid + 1, right);
for(i=left; i<=mid; i++) temp[i] = p[i];
for(j=right; i<=right; i++, j--) temp[i] = p[j];
i = left;
j = right;
for(k=left; k<=right; k++) p[k] = temp[i].div < temp[j].div ? temp[i++] : temp[j--];
}
int main(void)
{
int i, p[10] = {12,15,22,88,43,55,23,91,15,78}, w[10] = {3,4,7,41,32,18,12,64,7,33};
st data[10], temp[10];
for(i=0; i<10; i++) {
data[i].item = i + 1;
data[i].div = (double)p[i] / w[i];
}
mergesort(data, temp, 0, 9);
for(i=0; i<10; i++) printf("%d ", data[i].item);
return 0;
}
>>325 CかC++か判らないから、とりあえずCで。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int ch, i, alpha[26] = {0};
FILE *fp;
fp = fopen("un.txt", "r");
if(fp==NULL) return 0;
while((ch=fgetc(fp))!=EOF) {
if(islower(ch)) alpha[ch-'a']++;
else if(isupper(ch)) alpha[ch-'A']++;
}
for(i=0; i<26; i++) printf("%c:%d\n", 'a'+i, alpha[i]);
return 0;
}
328 :
デフォルトの名無しさん:2007/09/08(土) 17:04:18
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
ある自然数nを引数として受け取り、その自然数nが素数かどうか判定し素数の時は
1、でないときは0を値として返す関数prime()を作成する。そして、その関数を
利用して、ある自然数をキーボートから入力すると1からその自然数までの素数を列
挙し、その素数の統計を出力するプログラムを作れ。
実行例
自然数を入れろ
30
1〜30までの素数は、
2,3,5,7,11,13,17,19,23,29
個数は十個です。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C++
お願いします。。
授業単元がC言語で言語がC++だと、どっちにしていいかわかんないんだけど。
330 :
デフォルトの名無しさん:2007/09/08(土) 17:15:53
>>327さん
本当に助かりました。ありがとうございます。
>>328 #include <iostream>
int prime(int num)
{
int div;
if(num < 2) return 0;
for(div=2; div<=num/2 && num%div!=0; div++);
return (div>num/2) ? 1 : 0;
}
int main()
{
int n, sum = 0;
std::cout << "自然数を入れろ" << std::endl;
std::cin >> n;
std::cout << "1〜" << n << "までの素数は、" << std::endl;
for(int i=1; i<=n; i++)
{
if(prime(i))
{
std::cout << (sum?",":"") << i;
sum++;
}
}
std::cout << "\n個数は" << sum << "個です。" << std::endl;
return 0;
}
332 :
デフォルトの名無しさん:2007/09/08(土) 17:17:52
333 :
デフォルトの名無しさん:2007/09/08(土) 17:18:55
>>331 本当に感謝してます、単位取れます 本当にありがとうございます!
>>332 gccでコンパルするのに、なぜC++なんだ?
335 :
デフォルトの名無しさん:2007/09/08(土) 17:26:54
>>331 何度も申し訳ありません。。。。
Cでやると、どうなります。。。??
>>335 #include <stdio.h>
int prime(int num)
{
int div;
if(num < 2) return 0;
for(div=2; div<=num/2 && num%div!=0; div++);
return (div>num/2) ? 1 : 0;
}
int main()
{
int n, sum = 0, i;
printf("自然数を入れろ");
scanf("%d", &n);
printf("1〜%dまでの素数は、\n", n);
for(i=1; i<=n; i++)
{
if(prime(i))
{
printf("%s%d", sum?",":"", i);
sum++;
}
}
printf("\n個数は%d個です。\n", sum);
return 0;
}
337 :
デフォルトの名無しさん:2007/09/08(土) 17:36:44
>>336様
本当に何度もすみません。
感謝の気持ちでいっぱいです。
本当にありがとうございます。プログラミングは本当に苦手です。。
338 :
デフォルトの名無しさん:2007/09/08(土) 19:10:37
計算機のプログラムを作りました
#include <stdio.h>
void main()
{
int a;
int b;
char operater;
printf("input number : ");
scanf("%d",&a);
do{
printf("input number : ");
scanf("%d",&b);
printf("input operater : ");
scanf("%c",&operater);
switch(operater){
case '+' : a = a + b; printf("%d\n",a); break;
case '-' : a = a - b; printf("%d\n",a); break;
case '*' : a = a * b; printf("%d\n",a); break;
case '/' : a = a / b; printf("%d\n",a); break;
default : printf("such an operater does not exist!\n"); break;
}
}while(1);
}
340 :
339:2007/09/08(土) 22:16:47
しかし、以下のように演算子を入力する前にsuch an 〜 と表示されてしまいますなぜですか?
input number : 3
input number : 2
input operater : such an operater does not exist !input number :
341 :
339:2007/09/08(土) 22:17:34
あげ
>>339 scanf("%c",&operater);
↓
scanf("%*[ \t\n]");
scanf("%c",&operater);
343 :
デフォルトの名無しさん:2007/09/08(土) 22:53:20
>>339 rewind(stdin);
を
scanf("%c",&operator);
の前に追加
変数名にoperatorは…
むしろ
>operater
に突っ込んではいけないのか
345 :
339:2007/09/08(土) 23:02:54
すいません
どの方法をやっても結果が同じなのですが・・・
346 :
デフォルトの名無しさん:2007/09/08(土) 23:05:05
348 :
339:2007/09/08(土) 23:46:37
Cygwinのgccです
349 :
デフォルトの名無しさん:2007/09/09(日) 11:21:02
[1] 授業単元:
[2] 問題文(含コード&リンク):
入力された10以下の数に、左から1,2,3,4…をそれぞれかけて、それらの和をとるプログラムを作成せよ。
実行例
Input Number: 4 0 8 8 7 3 1 0 4
Sum: 156
この場合の計算方法
4×1 + 0×2 + 8×3 + 8×4 + 7×5 + 3×6 + 1×7 + 0×8 + 4×9
=156
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007年9月10日0:00まで
[5] その他の制限: 特になし
どうぞよろしくお願いします
#include <stdio.h>
int main(void)
{
int i, n, sum = 0;
printf("Input Number:");
for(i=1; i<10; i++) {
scanf("%d", &n);
sum += n * i;
}
printf("Sum : %d", sum);
return 0;
}
351 :
349:2007/09/09(日) 12:10:48
素早いご回答、どうもありがとうございます
352 :
306:2007/09/09(日) 15:50:45
たびたびすいません。
いろいろ考えた結果、↑が1、↓が2・・・というのは抜きにして
単純に、プログラムを実行したら0〜10分間時間を計測する。
その間に、使用者が↑キーを押した時、その押した時間とキーを離した時間を
最後に出力するというプログラムをつくっていただきたいです。どうかおねがいします!!
あと、いろいろめんどうなこといってすいません・・・
>>352 もうお前自分でやれよ・・・
その例にしたって正確にはどう出力すればいいか判断できんよ。
354 :
デフォルトの名無しさん:2007/09/09(日) 17:16:46
[1] 授業単元:
[2] 問題文(含コード&リンク): 44.1kHzサンプリング周波数で
1kHzの正弦波を10秒間作るプログラム
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 期限無し、早期希望
[5] その他の制限: 無し
よろしくお願いします
>>354 おk
なにも出力しなくていいんだな?
void make_seigen_haaaaaaaaaaaaaa(int);
int main(){
make_seigen_haaaaaaaaaaaaaa(44100);
}
void make_seigen_haaaaaaaaaaaaaa(int x){
//後の人に任せる
make_seigen_haaaaaaaaaaaaaa(x); //宇宙が消滅しても尚計算が必要だけど,そのうち作られるはず
}
357 :
デフォルトの名無しさん:2007/09/09(日) 18:49:10
354です
>>355 すみません。忘れてました。
波形をgnuplotで出力できるようにしてもらいたいです。
>>354 #include<stdio.h>
#include<math.h>
int main(void){
double theta=0.0;
short value;
char *filename="
[email protected]";
long i;
FILE *fp;
fp=fopen(filename, "wb");
if(fp==NULL) return 1;
for(i=0;i<44100*10;i++){
theta=i*2*M_PI*1000/44100;
value=30000*sin(theta);
fwrite(&value, sizeof(value), 1, fp);
}
fclose(fp);
return 0;
}
>>357 >>358 を変更
fwrite(&value, sizeof(value), 1, fp);
↓
fprintf(fp, "%d\n", value);
360 :
デフォルトの名無しさん:2007/09/09(日) 19:05:07
362 :
デフォルトの名無しさん:2007/09/09(日) 21:44:33
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int
main()
{
int sock0;
struct sockaddr_in addr;
struct sockaddr_in client;
int len;
int sock;
sock0 = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sock0, (struct sockaddr *)&addr, sizeof(addr));
listen(sock0, 5);
363 :
デフォルトの名無しさん:2007/09/09(日) 21:46:04
while (1) {
len = sizeof(client);
sock = accept(sock0, (struct sockaddr *)&client, &len);
write(sock, "HELLO", 5);
close(sock);
}
close(sock0);
return 0;
}
364 :
デフォルトの名無しさん:2007/09/09(日) 21:48:41
このプログラムは複数のクライアントと接続するサーバプログラムらしいのですが
なぜ複数のクライアントと接続することができるんですか?
実際、このプログラムはどのように動作するんですか?
まず、listen(sock0, 5);で接続受付状態になって停止して
接続を受け付けたらwhile以下を実行するんですよね?
366 :
デフォルトの名無しさん:2007/09/10(月) 12:13:27
トゥエラーの定義で年と月を入力したときでるカレンダーをだしてください
Zellerの公式か
368 :
デフォルトの名無しさん:2007/09/10(月) 13:22:37
たぶんそうだと思います ご協力お願い致します
370 :
デフォルトの名無しさん:2007/09/10(月) 14:09:32
[1] 授業単元: c言語
[2] 問題文(含コード&リンク):
西暦と月を入力するカレンダーを出力するプログラムを作成せよ.
閏年(うるうどし)にも対応すること.
西暦年が4で割り切れる年は閏年
ただし、西暦年が100で割り切れる年は平年
ただし、西暦年が400で割り切れる年は閏年
指定された年,月の一日(ついたち)の曜日を求めると良い.曜日を求めるには,Zellerの公式を使う.年も月も整数型の変数を用い,日の部分は1に置き換えること.
(年+年/4-年/100+年/400+(13*月+8)/5+日 )%7
1月と2月は前年の13月,14月として考える.
この式の答えと曜日の関係は以下の通り.
0:日曜日,1:月曜日,2:火曜日....,6:土曜日
色付け
printf("\033[31m%d",x);と記述すれば,変数xを赤で表示する.
printf("\033[34m%d",x);と記述すれば,変数xを青で表示する.
printf("\033[0m%d",x);と記述すれば,変数xを標準設定で表示する.
一度色指定すれば,次に色指定するまで設定が反映されることに注意する.
[3] 環境
[3.1] OS: Linux
[3.2] gcc 3.4
[3.3] 言語: c言語
[4] 期限: 9月25日
[5] その他の制限:for文やdo while文などの基本的なものをできるだけ使ってほしいです
>>370 #include <stdio.h>
#define COL_NORM (0)
#define COL_BLUE (1)
#define COL_RED (2)
static bool isCat( int year )
{
if( ! ( year % 400 ) )
return true;
if( ! ( year % 100 ) )
return false;
if( ! ( year % 4 ) )
return true;
return false;
}
static void color( int col )
{
// エスケープシーケンスがDOS窓では機能しないので殺してる
#if 0
switch( col ) {
case COL_RED: printf("\033[31m"); return;
case COL_BLUE: printf("\033[34m"); return;
default: printf("\033[0m"); return;
}
#endif
}
続く
int main( void )
{
int year, mon;
int tbl[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int i, max, d;
while( 1 ) {
printf( "year:" );
scanf( "%d", &year );
printf( "mon:" );
scanf( "%d", &mon );
if( mon > 12 ) {
mon -= 12;
year++;
}
if( mon == 2 ) {
if( isCat( year ) )
max = 29;
else
max = 28;
}
else {
max = tbl[mon-1];
}
続く
d = (year+year/4-year/100+year/400+(13*mon+8)/5+1)%7;
printf( "\n%d - %d\n", year, mon );
for(i=0;i<d;i++)
printf(" ");
for(i=1;i<=max;i++) {
d = (year+year/4-year/100+year/400+(13*mon+8)/5+i)%7;
switch(d) {
case 0: color(COL_RED); printf("%3d",i);break;
case 1: color(COL_NORM); printf("%3d",i);break;
case 6: color(COL_BLUE); printf("%3d\n",i);break;
default: printf("%3d",i);break;
}
}
printf( "\n\n" );
}
}
終わり
我ながら汚ねぇコード...
>>364 スレの趣旨とは異なるが...
間違い - listen() は単に接続待ちキューの設定を行うだけ(必須)
接続要求に対する応答は accept() で行う(接続要求が無い場合ここで停止している)
accept() が返すソケットIDが接続要求に対する通信ソケットとなる
376 :
デフォルトの名無しさん:2007/09/10(月) 17:13:09
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
377 :
デフォルトの名無しさん:2007/09/10(月) 17:13:41
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
378 :
デフォルトの名無しさん:2007/09/10(月) 17:14:58
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
糞アメリカ人は世界貿易センタービルから飛び降り自殺して地面にブチ当って死ね
なんだかものすごく嫌なタイミングで荒されましたが、よろしくお願いします
[1] 授業単元:?
[2] 問題文(含コード&リンク):
-Declare 3 variables of string data type.
-Name the first variable FIRST, the second variable SECOND, and ALPHABET.
-Assign a string of characters to FIRST.
( The string should consist of the first 13 letters of the alphabet 'a' to 'm' )
-Assign a string of characters to SECOND.
( The string should consist of the first 13 letters of the alphabet 'n' to 'z' )
-Assign the first 13 characters and second 13 characters to the variable ALPHABET.
( alphabet=first+second; )
-Output the following on separate lines, as shown:
This is my fourth C++ program.
This string: abcdefghijklm + plus this string: nopqrstuvwxyz is the whole alphabet.
The alphabet is: abcdefghijklmnopqrstuvwxyz.
[3] 環境
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン: VC++
[3.3] 言語: C++
[4] 期限: なるべく早くお願いします
[5] その他の制限: C言語未習。アメの大学で授業始まったばかりです。
380 :
379:2007/09/10(月) 18:44:32
自分なりの解答は以下の通りですが、エラーが2つでました。
修正をお願いいたします。
#include <iostream>
#include <string>
using namespace std;
int name ()
{
string first;
first="abcdefghijklm";
string second;
second="nopqrstuvwxyz";
string alphabet;
alphabet=first+second;
cout << "This is my fourth C++ program." << endl;
cout << "This string: " << first << "+ plus this string: " << second << " is the whole alphabet." << endl;
cout << "The alphabet is: " << alphabet << endl;
return 0;
}
>>380 コンパイル、実行も問題なしだった
ファイルはcppで保存した?
もしくはmain()の方に問題あるかも
>>380 合ってると思うが。環境が悪いかもしれん
>>380 もしかしてmain() 置いてないとか?
main()が無いなら関数名をname()じゃなくてmain()に.
#include <iostream>
#include <string>
using namespace std;
int main() //←ここ
{
string first;
first="abcdefghijklm";
string second;
second="nopqrstuvwxyz";
string alphabet;
alphabet=first+second;
cout << "This is my fourth C++ program." << endl;
cout << "This string: " << first << "+ plus this string: " << second << " is the whole alphabet." << endl;
cout << "The alphabet is: " << alphabet << endl;
return 0;
}
皆さま本当に素早い解答ありがとうございました
ご指摘の通り int name () を int main () に修正したら、エラーが2から0になりました
他の授業の宿題もものすごく重なっていてちょっとパニック状態だったので涙が出るくらい感激しています。おさがわせしました
>>370を面白そうだからやってみた
#include<stdio.h>
#include<conio.h>
int z(int y,int m,int d){
if(m<3) y--,m+=12;
return (y+y/4-y/100+y/400+(13*m+8)/5+d)%7;
}
int main(void){
while(1){
int y,m,d;
printf("\ny=",y); scanf("%d",&y);
printf("m=",m); scanf("%d",&m);
for(d=0;d<z(y,m,1);d++) printf(" ");
for(d=1;d<(z(y,m+1,1)-z(y,m,1)+7)%7+29;d++){
#if 1
if(z(y,m,d)%7==0) printf("\n"),textcolor(LIGHTRED);
else if(z(y,m,d)%7==6) textcolor(LIGHTBLUE);
else textcolor(WHITE);
cprintf("%3d",d);
#else
if(z(y,m,d)%7==0) printf("\n\033[31m%d",d);
else if(z(y,m,d)%7==6) printf("\033[34m%d",d);
else printf("\033[0m%d",d);
#endif
}
}
}
387 :
386:2007/09/10(月) 22:15:49
>>386 元の数式が分からないことには答えようが無いよ
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):メールを受信送信閲覧できるプログラムを書け。(できる人はメーリングリストや機能を増やしてもよい)
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:特に指定してないが自分はBorland C++ Compiler 5.5 無償ダウンロードを使っています
[3.3] 言語:C
[4] 期限: [2007年9月24日まで]
[5] その他の制限: GUI環境で。できたプログラムはメール等で先生に送りテストは先生が行う
392 :
デフォルトの名無しさん:2007/09/11(火) 00:54:46
【質問テンプレ】
[1] 授業単元:C言語
[2] 問題文:指数関数eのx乗の値をマクローリン展開式を用いて、xの値-3から3までを計算
するプログラムを作成せよ。その結果をExcelファイルに出力しグラフを作りなさい。ただし、
この時の刻み幅Δxは0.1以下で設定せよ。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:
[3.3] 言語:C++
[4] 期限: 2007年9月24日まで
[5] その他の制限: 1.出力をfprintf(fp1,"%f %22.15e", x, exp(x) )などのようにして、xの値とeのx乗の値
を同時に出力させると後で処理しやすい。
2.出力ファイルをExcelファイルにするためには、拡張子を「***.xls」にすればよい。
です。お願いします。
ここ見てるとC言語が多いね。なんでC++じゃなくわざわざCなんだろ?
うちの大学は初めからC++だったけど
>>394 情報系以外の学部からすれば、簡単なアルゴリズムやるだけならCだけで十分だから
逆にわざわざC++する必要ないって感じじゃないだろうか?
>>395 そういえば別に情報学部以外の学部でもプログラミング勉強してたんだね
そのこと忘れてた
科学技術計算にもC++のようなオブジェクト指向がある言語の方が有利だと思うが
>>390 先生がどの環境でテストするかが問題であって
>>390 の環境ははっきりいってどうでもいい
GUIは環境依存だから作りなおしは面倒なんだぞ
まあ、俺には回答できない宿題なんだが口出しだけしてみた
科学技術計算にFortranではなくCやC++を使う馬鹿はいない。
>>390 1週間でメイラー作れとは厳しいね
ちゃんとできれば実務で使えるレベルだと思う
Socket 送受信、POP/SMTP プロトコルの処理だけでも真面目に書けば
1000ステップ位になりそうだから、ここで回答を期待するのは難しいかと
地道に頑張ってね
>>401 地道に頑張ります。実はこれちょっと前に出された課題で忘れてた自分が悪いんです。本買ってきて
作るというのはできるでしょうか?
猫に劣る漏れが言うのも何だが、GUIは元より、送受信も何かしらのライブラリをつかうんじゃないの?
情報系以外なら、それはそれで今更Cをやらせる意義が分からんが
シミュレーションで3Dグラフィックスぐりぐり動かしたり
機械の制御とかやらせたりするのかな?
405 :
403:2007/09/11(火) 14:49:29
>>390 borland 5.5である必要ねーのか……。
VCとかでやる課題だぜ。
>>390 Visual Cでやろう。
MAPIを使えば簡単にできる。
Visual C++なら見たことあるけどVisual Cって?
すまそ。寝ぼけてた
>>392 fprintf 使うようなのでCで書いた。あとcsvフォーマットで出力した。
#include<stdio.h>
#include<stdlib.h>
double myexp(double x){
double ret=1.0, work=1.0;
int i;
for(i=1;i<=30;i++){
work*=x/i;
ret+=work;
}
return ret;
}
int main(void){
char *filename="output.csv";
FILE *fp;
double x;
int i;
fp=fopen(filename, "w");
if(fp==NULL){
fprintf(stderr, "\nError: %s file cannot open.\n", filename);
exit(1);
}
for(i=-30;i<=30;i++){
x=i/10.0;
fprintf(fp, "%f,%22.15e\n", x, myexp(x));
}
fclose(fp);
return 0;
}
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):身長は?という問いに対して自分の身長を入れるプログラムを作成せよ。
また、確認として最後にYと入力すると「入力を終了します」と表示され終了、Nが入力されるともう一度身長の入力するとこに戻りループする
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5
[3.3] 言語:C
[4] 期限: 今週まで
[5] その他の制限: 実行例
あなたの身長は?:180cm
これでよろしいですか?【Y・・・はい/N・・・いいえ】
あなたの身長180cmです。入力を終了します。
>>402 POP3(受信)に関して言えば使うコマンドは USER, PASS, LIST, RETR, DELE, QUIT くらいだろう
同様にSMTP(送信)は HELLO, MAIL FROM, RCPT TO, DATA, QUIT あたりかな
そんなに厚くない本で POP3/SMTP について書いてる本は有った方が良いかな
ネットでも十分だとは思うけど...
それより socket は大丈夫?
BC++で WinSock を使った事ないけどヘッダーとかあったっけ?(普通有るとは思うけど)
WinSock 入門みたいな本が一冊有れば良いと思うけど、こいつもネットでも十分
getaddrinfo(), socket(), connect(), recv(), send() くらいについて調べれば良いと思う
>>406 が言うようにVC++使って MAPI 使った方が楽かも知れないけど、宿題の趣旨が
socket の基礎とか各種プロトコルに対する理解度を求めるモノであれば題意に反する気もする
>>411 #include <stdio.h>
main()
{
char buf[10];
int ch;
loop:
printf("bタ的身長是幾cm?:");
scanf("%s", buf);
printf("這個可以dウ?【Y・・・可/N・・・不可】\n");
ch = getchar();
if(ch != 'Y' && ch != 'y') goto loop;
printf("bタ的身長是%s。由於這個結束。\n", buf);
}
>>413 ありがとうございます。最初のmain()のところはint main(void)ではなくてもいいんですか?
>>414 判断できないなら気にする必要ないと思うよ。
>>415 分かりました!ありがとうございます。中国語のとこを日本語に変えましたが結果が
あなたの身長は?:180cm
これでよろしいですか?【Y・・・はい/N・・・いいえ】
あなたの身長は?:Y
あなたの身長180cmです。入力を終了します。
というふうになります・・・
417 :
デフォルトの名無しさん:2007/09/11(火) 19:25:58
>>416 maybe
ch = getchar();
↓
while((ch = getchar())=='\n');
419 :
417:2007/09/11(火) 19:27:37
>>409 すいません。打ち間違えました。
ありがとうございます!
>>418 正常に動きました!ありがとうございますい!
421 :
デフォルトの名無しさん:2007/09/11(火) 20:53:53
入力された文字列を逆順に表示する関数void strrev(char *s)を作成しなさい
#include <stdio.h>
void strrev(char *s);
void main(void)
{
char s[100];
printf("please input string -> ");
scanf("%s",s);
strrev(s);
}
void strrev(char *s)
{
char *p,q;
p=s;
while(*p!='\0')
p++;
ここれまではわかったのですがこの先がいまいちわかりません。
わかるかたいたらお願いします。
while(s!=p--) putchar(*p);
>>421 while(--p>s) q=*s,*s++=*p,*p=q;
424 :
423:2007/09/11(火) 21:01:47
勘違いしてたorz
425 :
421:2007/09/11(火) 21:01:55
>>422できました。
お早い回答ありがとうございました。
426 :
デフォルトの名無しさん:2007/09/12(水) 00:00:08
>>426 無理
1を置ける場所は4箇所のみ
3x3魔方陣は例に出ているものの回転鏡像解しか存在しない
>>427 また知ったかのお前か、いい加減うっとうしいんだよ、調べもしないで。
奇数魔方陣について調べてから出直せ。それから無理じゃないからw
>>428 >>427の言うとおり、3x3の場合は1が置けるのは4箇所のみだから
どこにもおける訳ではないよ
出来るというんだったら例を挙げてみて
430 :
デフォルトの名無しさん:2007/09/12(水) 02:45:10
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
問題1:文字列を入力し、英字とそれ以外を格納する配列に振り分けなさい
使用しする標準関数:isalpha()
実行結果
文字列入力==>A12H&jfTy8uZ3#
英字:AHjfTyuZ
その他:12&83#
問題2:文字列と削除文字列を入力し、文字列中から削除文字列を排除しなさい
使用する標準関数:strncmp(),strcpy(),strlen()
実行結果
文字列入力(m1)==>ABCDEFAABCDABC
削除文字列(m2)==>ABC
結果文字列(m1):DEFAD
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5
[3.3] 言語:C
[4] 期限: 明後日まで
[
>>427の言うとおり
1をどこにでもおけるのが前提なら無理
1を真ん中に置いてとけるかっつーの
苦し紛れにこんなの作ったりしてw
1 0 5
6 2 -2
-1 4 3
1を基準に、右上、右下、左上、左下に順番に入れて
3まで進んだら、4は上下左右どちらか。それらの法則は
おりはさっぱりなんで誰か解説プリーズ。
>>430 void sep( char* in, char* alpha, char* other )
{
while( *in ) {
if( isalpha( *in ) ) { *alpha = *in; alpha++; }
else { *other = *in; other++; }
in++;
}
*alpha = *other = 0x00;
}
void del( char* in, char* del, char* out )
{
int i, in_len, d;
d = strlen( del ); i = strlen( in ) - d + 1;
while( i > 0 ) {
if( strncmp( in, del, d ) ) { *out = *in; out++; in++; i--; } // 美しくない、誰か直して
else { in+=d; i-=d; }
}
*out = 0x00;
if( strncmp( in, del, d ) ) strcpy( out, in );
}
>>436 美しいよぉ〜、美しいよぉ〜、綺麗だよぉ〜、素晴らしいよぉ〜
今君、すっごく輝いているよぉ〜、それじゃ、一枚脱いでみようか?
あと、mainをつけるともっと良くなるよぉ〜
439 :
デフォルトの名無しさん:2007/09/12(水) 07:23:05
1] 授業単元:C言語
[2] 問題文(含コード&リンク):英文中の単語の出現度をカウントしなさい
英文中に含まれる単語数は10以下とする
ポインタ配列を使用する
char english[]="My name is Taro.Your name is Hanako.";
実行画面
My:1
name:2
is:2
Taro:1
Your:1
hanako:1
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5
[3.3] 言語:C
>>439 無駄に発展問題にも対応しやすいようにしてみたw
#include<stdio.h>
#include<string.h>
#define WORD_KIND_MAX 10
int main(void){
char english[]="My name is Taro.Your name is Hanako.";
char *word[WORD_KIND_MAX], buf[100];
int i, word_kind=0, word_num[WORD_KIND_MAX];
FILE *fp;
fp=tmpfile();
fprintf(fp, "%s", english);
fseek(fp, 0L, SEEK_SET);
while(1){
if(fscanf(fp, "%[A-Za-z]", buf)==1){
for(i=0;i<word_kind;i++){
if(stricmp(word[i], buf)==0){
word_num[i]++;
break;
}
}
if(i>=word_kind && i<WORD_KIND_MAX){
word[word_kind]=strdup(buf);
word_num[word_kind]=1;
word_kind++;
}
}
else if(fscanf(fp, "%[^A-Za-z]", buf)!=1) break;
}
for(i=0;i<word_kind;i++) printf("%s:%d\n", word[i], word_num[i]);
fclose(fp);
return 0;
}
文字列のstrの中に文字cが含まれている個数(含まれていなければ0とする)
を返す関数int str_src)char *s,int c)を空白部分に作成しなさい。
空白部分とはint str_src(char *s,int c)のしたのカッコです。
わかるかたいたらお願いいたします。
#include <stdio.h>
int str_src(char *,int);
void main()
{
char s[200],c[10];
printf("input string -> ");
scanf("%s",s);
printf("input find character ->");
scanf("%s",c);
printf("find %c is %\n",c[0] str_src(s,c[0]));
}
int str_src(char *s,int c)
{
}
>>441 int str_src(char *s, int c)
{
int count;
for(count=0;(s=strchr(s,c))!=NULL;count++,s++);
return count;
}
>>441 おかしなところを変えたが勝手に直してくれ
#include <stdio.h>
int str_src(char *,char);
int main(void)
{
char s[200],c;
printf("input string -> ");
scanf("%s",s);
printf("input find character ->");
scanf(" %c",&c);
printf("find %c is %i\n",c,str_src(s,c));
return 0;
}
int str_src(char *s,char c)
{
int count=0;
int i;
for(i=0; s[i]!='\0'; ++i)
if(s[i] == c) ++count;
return count;
}
>>437 だって問題に strstr() は使って良いと書いてないから
StrStr() を書いたらイヤミって言われそうですし..
>>438 今はシャネルの5番だけなので脱げないの...ゴメンナサイ
main() も書けないボウヤには興味が無いの...ゴメンナサイ.
なんかおまいらのやってる宿題ってそんな数十行でおわるコードばっかなのか?
つーかそんなのやっても役にたつんかなあ
行数など意味を成さない
450 :
446:2007/09/12(水) 22:16:44
446はまああれだが390は無理w
僕が間違っていました。
みなさん一緒に宿題がんばりましょう
じゃあ間に
>>306 入れて簡単な方から順に
>>439 >>306 >>390 でどうかな?
でも、回答者のセンスのおかげで
行数が少なくなっていることもあるということを
言いたかっただけで本当に解かなくてもいいんだ
汎用性とかバグ出さないとか可読性とかそういうこと考えると行数増えるけど、
その場限りでバグも可読性も無視できるならずいぶん減る。
>>390 メーラー作るのはいいとしてGUIをCで作るとはなんと酔狂なwwwwせめてC++でできないかな。俺は無理だけど
Cでも十分に楽だろう。
Windowsなのがダルイ
GUIってならそれに応じたリソースが・・・Visual C++でそ。
460 :
デフォルトの名無しさん:2007/09/13(木) 07:17:36
授業単元:C言語
問題文(含コード&リンク):2値を小さい順に表示するユーザ関数を作成しなさい
プロトタイプ宣言:boid SortDisp(int dt1,int dt2);
実行画面
数値1入力==>10
数値2入力==>15
数値:10
数値:15
数値1入力==>15
数値2入力==>10
数値1:10
数値2:15
環境
OS:WindowsXP
コンパイラ名とバージョン:Borland C++ Compiler 5.5
言語:C
462 :
デフォルトの名無しさん:2007/09/13(木) 07:26:50
授業単元:C言語
問題文(含コード&リンク):文字列を入力し、圧縮しながら他の文字列配列に格納しなさい
使用する主な標準関数:strlen()、sprintf()など
実行画面
入力文字列(m1)==>AAAAAAABBBCddEEEE####
圧縮(m2):@7A@3BC@2d@4E@5#
圧縮比:72.7%
環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:ボーランド
[3.3] 言語:C
[4] 期限:
[5] その他の制限:
463 :
デフォルトの名無しさん:2007/09/13(木) 07:29:02
461>それエラーがでたんですが
>>462 #include <stdio.h>
#include <string.h>
void comp_text( char* in, char* out )
{
char tmp[8];
char last = 0x00;
int count = 0;
*out = 0x00;
while( 1 ) {
if( *in != last ) {
switch( count ) {
case 0: tmp[0] = 0x00; break;
case 1: sprintf( tmp, "%c", last ); break;
default: sprintf( tmp, "@%d%c", count, last ); break;
}
strcat( out, tmp );
last = *in;
count = 1;
}
else {
count++;
}
if( last == 0x00 ) break;
in++;
}
}
>>462 おまけの main()
void main( void )
{
char* in = "AAAAAAABBBCddEEEE#####";
char out[64];
comp_text( in, out );
printf( "in -> %s\n", in );
printf( "out-> %s\n", out );
printf( "rate = %.1lf\n", (double)strlen( out ) / (double)strlen( in ) * 100.0 );
}
問題文の(m1)は "#" が一個足らないよな(最後だけ一個多くするとかの仕様ではなく)
>>462 その圧縮方法だと圧縮率が1以上になることあるなw
>>465 "1111111111"
を圧縮すると…
>>462 便乗
#include <stdio.h>
#include <string.h>
void comp_str(char *str, char *comp){
int i, j, cnt, len = (int)strlen(str);
for(i = j = 0; i < len; i++, j++){
cnt = 1;
while(str[i] == str[i + 1]) i++, cnt++;
if(cnt == 1) comp[j] = str[i];
else sprintf(comp + j, "@%d%c", cnt, str[i]), j += cnt/10 + 2;
}
}
int main(void){
char *str = "abcddddddddddddeeeeeeeeeeeeeeeefffff", comp[256];
comp_str(str, comp);
puts(comp);
return 0;
}
>j += cnt/10 + 2
20個だったらどうすんの?
471 :
469:2007/09/13(木) 11:39:20
底が10のlogにしなきゃ駄目か……
ま、いいや
472 :
465:2007/09/13(木) 11:41:05
473 :
問題2の答え:2007/09/13(木) 12:16:41
授業単元:C言語
問題文(含コード&リンク):検索する文字列を入力し、その値を返すユーザ関数を作成しなさい
引数1:検索対象文字列
引数2:検索文字列
戻り値:あった場合(一致した文字列の先頭アドレス)
なかった場合(NULL)
char moji[] ="ABCDEFGHJABFGHSKL"; */検索対象文字列*/
実行画面
検索文字列==>HS
検索位置:HSKL
環境
OS:WindowsXP
コンパイラ名とバージョン:Borland C++ Compiler 5.5
言語:C
>>473 char *FindStr(const char *tgt, const chat *str)
{
return strstr(tgt, str);
}
>>473 #include <stdio.h>
#include <string.h>
char *my_strstr(char *str, char *ptn){
int i, j, str_len = (int)strlen(str), ptn_len = (int)strlen(ptn);
for(i = 0; i < str_len - ptn_len; i++)
if(!strncmp(str + i, ptn, ptn_len))
return str + i;
return NULL;
}
int main(void){
char moji[] = "ABCDEFGHJABFGHSKL", ptn[] = "HS";
puts(my_strstr(moji, ptn));
return 0;
}
#include <stdio.h>
char* mai_strstr(const char *tgt, const char *str)
{
if(str[0]=='H' && str[1]=='S')
return tgt+13;
return 0;
}
int main(void)
{
char moji[] ="ABCDEFGHJABFGHSKL"; /*検索対象文字列*/
char buf[256];
printf("検索文字列==>");
scanf("%s",buf);
printf("検索位置:%s\n",mai_strstr(moji,buf));
return 0;
}
実行画面
検索文字列==>HS
検索位置:HSKL
>>476 strlen(), strncmp() 使うなら
>>474 と同じじゃね?
char* StrStr( char* s1, char* s2 )
{
char* p1 = s1;
char* p2 = s2;
while( *s1 ) {
while( *p1 == *p2 ) {
p1++;
p2++;
if( ! *p2 ) return s1;
if( ! *p1 ) return NULL;
}
s1++;
p1 = s1;
p2 = s2;
}
return NULL;
}
二つの整数を入力して、前者の値が後者の何%であるか求めるプログラムはどうやればいいですか?
前者に100を掛けて後者で割る!!
>>480 それだと小数点以下が切り捨てに...
とネタとも思える質問の回答に突っ込んでみた
481
小数点以下については触れてないからね
すみません。何%であるかを実数で表示です。
よろしくお願いします。
前者に100.0を掛けて後者で割る!!
(double)
#include <stdio.h>
int main(void)
{
int na,nb;
puts("二つの整数を入力してください。");
printf("整数A:"); scanf("%d",&na);
printf("整数B:"); scanf("%d",&nb);
printf("Aの値はBの%f%です。\n",(double)na*100/nb);
return (0);
}
#include <stdio.h>
#define N 128
static int table[N];
static void make_table(char *ptn){
int i = 1;
char *p, *q;
table[0] = 0;
if(*ptn == '\0') return;
while(i < N){
p = ptn + i, q = ptn;
if(*p == '\0') break;
while(*p == *q) p++, q++;
table[i++] = q - ptn;
}
}
char *my_strstr(char *str, char *ptn){
char *p, *q;
make_table(ptn);
while(*str != '\0'){
p = str, q = ptn;
while(*p && *q && *p == *q) p++, q++;
if(*p == '\0') break;
if(*q == '\0') return str;
str += table[q - ptn] + 1;
}
return NULL;
}
int main(void){
char moji[] ="ABCDEFGHJABFGHSKL", ptn[N] = "HS";
puts(my_strstr(moji, ptn));
return 0;
}
>>486 ×printf("Aの値はBの%f%です。\n",(double)na*100/nb);
○printf("Aの値はBの%f%です。\n",(double)na*100.0/(double)nb);
型の昇格があるから、一箇所doubleなら十分
そんなことはない。
少なくとも488が指摘した部分だってそのままで問題ない。
%%ではないのかと
printf("Aの値はBの%g%%です。\n", na * 100. / nb);
%か%%のどっち?
%%
%
*** *
* * *
*** *
*
* ***
* * *
* ***
o% Oシュワッチ
501 :
デフォルトの名無しさん:2007/09/14(金) 12:48:18
>>467 あらゆる文字列を短く圧縮する方法は情報理論的にありえないから、おっけーなのでは?
問題は「ありがちな文字列が縮まらない」かどうか。
502 :
デフォルトの名無しさん:2007/09/14(金) 15:06:16
int i,j;
int l1,l2,w,h;
printf("一辺(その1):"); scanf("%d",&l1);
printf("一辺(その2):"); scanf("%d",&l2);
if(l1 < l2){
l1 = h; l2 = w;
}
else{
l1 = w; l2 = h;
}
for(i = 1; i <= h; i++){
for(j = 1; j <= w; j++)
putchar('*');
putchar('\n');
}
*を並べて長方形を表示するプログラムを作っています。
これは横長の長方形を出力するようにしてるのですが、
実行すると*が延々と並ぶのですが、何処が間違っているのでしょう?
おそらく
l1 = h; l2 = w;
とかがミステリー。
h = l1, w = l2;
みたいに逆なのではないだろうか?
for文がとまらないのは、hとwに不定値が詰まっているからだろう
暇だな。
メールでもやるかな。
いや、やめとこう。
505 :
デフォルトの名無しさん:2007/09/14(金) 15:19:31
今そこを修正してみたんですけど、結果は一緒でした。
でもこれ以外に原因は無いと思うんですけどね…
こんな具合なのではなかろうか
#include <stdio.h>
int main(void){
int i, j, h, w, l1, l2;
scanf("%d%d", &l1, &l2);
if(l1 < l2)
h = l1, w = l2;
else
h = l2, w = l1;
for(i = 1; i <= h; i++){
for(j = 1; j <= w; j++)
putchar('*');
putchar('\n');
}
return 0;
}
507 :
デフォルトの名無しさん:2007/09/14(金) 15:31:40
すみません。自分が作ったところとはどこが違うのでしょう?
if文のあたりですかね?
if文のあたりだと思います。
l1 = h と h = l1 という様に、左辺と右辺が逆なのだと思います。
509 :
デフォルトの名無しさん:2007/09/14(金) 15:34:27
なるほど。
今作り直してみたら同じ結果になりました。
どうもありがとうございました。
510 :
デフォルトの名無しさん:2007/09/15(土) 00:37:54
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):1から10の数字をランダムで表示せよ。ただし一度出た数字は重複しないこと
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5
[3.3] 言語:C
[4] 期限: 2007年9月17日
[5] その他の制限:
>>510 1個だけ出力でいいなら重複しようもない
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
srand(time(NULL));
printf("%d\n", (rand()%10)+1);
return 0;
}
>>511 すいません。説明不足だったみたいです。1から10までの数字を全部重複しないようにランダムで表示します
>>510 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int array[10], i, index, temp;
srand(time(NULL));
for(i=0;i<10;i++) array[i]=i+1;
for(i=0;i<10;i++){
index=rand()%10;
temp=array[i];
array[i]=array[index];
array[index]=temp;
}
for(i=0;i<10;i++) printf("%d\n", array[i]);
return 0;
}
確率偏ってるから間違いだろ。
最近、知ったかの痛々しい初心者が紛れ込んでるなぁ〜w
確率w 偏ってるw 間違いw
rand()%10 を rand()%(i+1)にすれば一様になるんだけどね。
>>517 両方やって統計を取ってみて欲しい
>>513 の方が一様になると思う
コンパイラの rand 関数の実装にもよるけど
>>518 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int array[10], sum[10]={0}, i, j,index, temp;
srand(time(NULL));
for(j=0; j<10000; j++) {
for(i=0;i<10;i++) array[i]=i+1;
for(i=0;i<10;i++){
index=rand()%10;
temp=array[i];
array[i]=array[index];
array[index]=temp;
}
for(i=0; i<10; i++) sum[i]+=array[i];
//for(i=0;i<10;i++) printf("%d\n", array[i]);
}
for(i=0; i<10; i++) printf("%d\n", sum[i]);
return 0;
}
これを実行して見れ。
その後、rand()%(i+1)で実行して数値のばらつきを比較してみな
やっぱり題意が分かっていない香具師が紛れ込んでいるなw
頼むから無意味なソース貼るなよ、スレ違い
1から10までの系列の場合の数は 10! 個あるのに、
>>513 のプログラムの自由度は
10の10乗しかない。
シャッフルで等確率に出すのはけっこうむずい。
>>517 はもっと出ない系列が増える。
あと、等確率とか乱数の質とか言っている場合は rand()%なんとか と
乱数の下位のビットを使わず、RAND_MAX で割って上位のビットを使うこと。
>>519 確かに偏りがある
rand()%(i+1)
にするとその時点毎に一様になりそうなことは分かる
rand()%10
にすると偏るのはなぜ?
>>512 > 1から10までの数字を全部重複しないようにランダムで表示します
要するに1〜10を並び替えているだけ。重複しないように発生させているんじゃなくて
単に1〜10を先頭の要素からランダムに選んだ要素と交換するのに一様とかあまり深く関わらんぞ。
>>521 10^10 >> 10!
じゃないか?
そうそう、強いて一様とか言うなら、例えば0〜1の間の乱数を10個発生させるとき
偏らないようにRAND_MAXを用いるとかって話なら分かるけどなw
例えばよ、1〜10の中から5つ適当に数字を選べっていうなら、その5つが
常にある一定の範囲内の値しか出さないようなアルゴリズムなら偏りとか
話は分かるけど、全部を重複せずに出すのに偏りとかないからw
っつーか重複していないんだから偏れないってw
横道に逸れているのは分かっているが、
なぜそうなるのか興味がある。
10^10回の試行でシャッフルした結果が、各位置に対して数字の分布が均一になってないからとしか。
rand()に依存している以上その辺は仕方がない。なんなら
srand()に入れるSEEDも工夫してみたら。
これである位置にある値が常に入っているとかでなければ問題はないっしょ。
Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 1992 (2nd ed., p. 277)) では、次のようなコメントがなされている。
「1 と 10 の間の乱数を生成したいのであれば、常に
j = 1 + (int) (10.0 * rand() / (RAND_MAX + 1.0));
のように上位ビットを用いること。
j = 1 + (rand() % 10);
のような、下位のビットを用いるような方法は決してしないこと。」
513の偏りはそういう問題じゃないんだけど
532 :
513:2007/09/15(土) 12:17:40
>>513 の偏りについて計算してみた
array[0] について
1 が入る確率 0.100
2 が入る確率 0.129
3 が入る確率 0.120
4 が入る確率 0.112
5 が入る確率 0.104
6 が入る確率 0.098
7 が入る確率 0.092
8 が入る確率 0.087
9 が入る確率 0.082
10 が入る確率 0.077
1から10の範囲の乱数を生成、
その番号が未使用なら採用、
使用済なら再度乱数生成に戻る。
10個取得したら終了する。
これで良いんじゃないの?
534 :
513:2007/09/15(土) 12:21:13
検証コード
ratio[x][y] は x 回目のシャッフルが終わった時に数値 n が y 番目に入っている確率
但し ratio[0][0-9]=0.0, ratio[0][n-1]=1.0; とする
#include<stdio.h>
#define NUM_MAX 10
void disp_ratio(double ratio[], int n){
double sum=0.0;
int i;
for(i=0;i<n;i++){printf("%.3f ", ratio[i]);sum+=ratio[i];}
printf("sum=%.3f\n", sum);
}
int main(void){
double ratio[NUM_MAX+1][NUM_MAX];
int i, j, k, l;
for(l=0;l<NUM_MAX;l++){
for(i=0;i<NUM_MAX;i++) ratio[0][i]=0.0;
ratio[0][l]=1.0;
for(i=0;i<NUM_MAX;i++){
for(j=0;j<NUM_MAX;j++){
if(i==j){
ratio[i+1][j]=0.0;
for(k=0;k<NUM_MAX;k++) ratio[i+1][j]+=ratio[i][k]/NUM_MAX;
}else{
ratio[i+1][j]=ratio[i][j]*(NUM_MAX-1)/NUM_MAX+ratio[i][i]/NUM_MAX;
}
}
}
for(i=0;i<NUM_MAX+1;i++) disp_ratio(ratio[i], NUM_MAX);
printf("\n");
}
return 0;
}
> その番号が未使用なら採用、
> 使用済なら再度乱数生成に戻る。
ここが非効率的
だったら、10個の配列をランダムにシャッフルして...ってやるかな
>>533 そうそう。それなら全ての系列が等確率なのは自明。
ちなみに試行は平均 n log n 回。
ran()%(i+1)を(int)(rand() / (RAND_MAX + 1.0) * (i+1))にすれば517ので十分
だから既に生成された乱数かどうかを調べて採用だのやってたら
数が多くなったら時間が掛かるぞ。実際にやってみろ。
俺、それ数年前にやってみたけど、そのアルゴリズムを見せたら
モロに笑われたよw
なんで i+1 にこだわるのか分からん。明らかにこれの方が偏るぞ。
一部だけをランダムに取り出す場合なんかは有効なこともあるけどね。
540は535と538にね
どう有効なのやら
>>535 10件程度の番号取得する宿題じゃ、効率よりもわかりやすい方が
依頼者や出題者wからは喜ばれるのではないかな。
さすがに1000件とかなら、もう少し考えるが。
>>543 お前さすがにうざいわ。失せろ、知ったか初心者。
>>532 何を基準にサンプルをとったわけ?それがはっきりしないと
その確率も曖昧というかナンセンス。
基準・・・w
今北さんですか
計算時間としては変わらないけど、i + 1 を利用すると試行回数が N - 1 で済むっぽいな。
長年の疑問が解けたかもしれない。
i=0のときa[0]に1が入る確率は1
i=1のときa[0]に1が入る確率は、rand()%(1+1)が1のとき、つまり1/2
a[1]に1が入る確率は、rand()%(1+1)が0のとき、つまり1/2
2についても、同様にa[0]とa[1]にそれぞれ1/2の確率で入る。
i=2のときa[0]に1が入る確率はa[0]が1でrand()%(2+1)が1か2のとき、つまり1/2*2/3=1/3
a[1]に1が入る確率はa[1]が1でrand()%(2+1)が0か2のとき、つまり、1/2*2/3=1/3
a[2]に1が入る確率はa[0]が1でrand()%(2+1)が0のときと、a[1]が1でrand()%(2+1)が1のとき、
つまり1/2*1/3+1/2*1/3=1/3
以上より、a[0]からa[2]に1が入る確率はそれぞれ1/3。
1と2は同じ確率でa[0]とa[1]に入ってるから、2も同様にa[0]から[2]にそれぞれ1/3の確率ではいる。
3がa[0]に入る確率はrand()%(2+1)が0になったときなので1/3、a[1]、a[2]についてもそれぞれ
rand()%(2+1)が1,2になったときなので、同様に1/3になる。
以下iが増えても同様の計算で常に一様になる。
具体的だけど周りくどい説明の予感。
もっと帰納的に説明できる話だろうに。
帰納法だと理解できない人が多そうだったから。
>>513 のコードは直感的には一様な結果になりそうだけど
実際には一様にはならず偏りができる
>>517 のコードは一瞬あれっ?と思うが
実際には一様にシャッフルすることができる
要するに
>>517 やるじゃねーか
って話でおk?
randの下位ビットって使わない方がいいんじゃなかったっけ?
>>555 rand() の実装によるとしか・・・
少なくとも linux だと線形合同法は使われてないらしい
[1] 授業単元:無し
[2] 問題文(含コード&リンク):下記
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語: C
[4] 期限: 無期限
100個以下の整数データを読み込み、その平均値と標準偏差の自乗を求めるプログラムを考える。
全データ数をn,各データをx[i]とすると、平均値aと標準偏差の自乗σ^2(sigma2)は次の式で求まる
a=(1/n)Σx[i]
σ^2=(1/n)Σ(x[i]-a)^2
このプログラムは全部で3つのループから成っている。
しかし、ある工夫をするとaを求めるループ2とsigma2を求めるループ3は融合して1つのループにできる。
そのヒントは、σ^2の式の内部を展開して
σ^2=(1/n)Σ[x[i]^2-2ax[i]+a^2)
とすることである。この変更を加えたプログラムのループ2以降を記述せよ。変数の新たな宣言は禁止する
558 :
557:2007/09/15(土) 16:33:25
#include <stdio.h>
void main()
{
int x[100],i,n;
float s,ss,a,sigma2;
scanf("%d",&n);
//ループ1
for(i=0;i<100;i++){
scanf("%d",&x[i]);
}
s=ss=0.0;
//ループ2
for(i=0;i<100;i++){
s+=x[i];
}
a=s/n;
//ループ3
for(i=0;i<100;i++){
ss+=(x[i] - a)*(x[i] - a);
}
sigma2=ss/n;
printf("%f %f\n",a,sigma2);
}
続きです。よろしくお願いします
ループ回数はnじゃないの?
for(i=0; i<n; i++) {
s += x[i];
ss += x[i] * x[i];
}
a = s / n;
ss -= a * s;
sigma2 = ss / n;
560 :
デフォルトの名無しさん:2007/09/15(土) 17:30:58
すみません再度お願いします。
[1] 授業単元:
[2] 問題文(含コード&リンク): 44.1kHzサンプリング周波数で
1kHzの正弦波を10秒間作るプログラム
gnuplotで波形を出力
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 期限無し、早期希望
[5] その他の制限: 関数を使用しない。 fopenなどは無しで。
よろしくお願いします
>>559 ss -= a * s;
は
ss += ( - 2 * a * s + a * a * n );
じゃねぇの?
a * n = s
sigma2 = ss / n - a * a
>>560 #include<stdio.h>
#include<math.h>
int main(void){
int i;
double theta;
for(i=0;i<44100*10;i++){
theta=i*2*M_PI*1000/44100;
printf("%f\n", sin(theta));
}
return 0;
}
そういえば「M_PI_2」ってどのコンパイラにも定義されてますか?
>>565 ansiに規定がないからないのもあるよ。
# M_PIもね。
567 :
561:2007/09/15(土) 20:16:31
>>562 駄目だ俺頭固い...そろそろ引退か...
568 :
370のものです:2007/09/15(土) 23:37:28
すみません以前ここで宿題を片づけて貰ったのですがあまりに自分の習っていないことばかりを使用していたため再提出をくらいました;;。
そこで条件を少し加えてもう一度解いて貰えないでしょうか。お願いします。
【質問テンプレ】
[1] 授業単元: c言語
[2] 問題文(含コード&リンク): 西暦と月を入力すると,以下のようなカレンダーを出力するプログラムを作成せよ.
ヒント
閏年(うるうどし)にも対応すること.
西暦年が4で割り切れる年は閏年
ただし、西暦年が100で割り切れる年は平年
ただし、西暦年が400で割り切れる年は閏年
指定された年,月の一日(ついたち)の曜日を求めると良い.曜日を求めるには,Zellerの公式を使う.年も月も整数型の変数を用い,日の部分は1に置き換えること.
(年+年/4-年/100+年/400+(13*月+8)/5+日 )%7
1月と2月は前年の13月,14月として考える.
この式の答えと曜日の関係は以下の通り.
0:日曜日,1:月曜日,2:火曜日....,6:土曜日
色付け
printf("\033[31m%d",x);と記述すれば,変数xを赤で表示する.
printf("\033[34m%d",x);と記述すれば,変数xを青で表示する.
printf("\033[0m%d",x);と記述すれば,変数xを標準設定で表示する.
一度色指定すれば,次に色指定するまで設定が反映されることに注意する.
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語: c
[4] 期限: 9月18日
[5] その他の制限: <stdio.h>のヘッドファイルのみの使用
if,continue,break,do whileなどの繰り返しのを出来るだけ使用する。
. 初歩的な物のばかりを利用して大変だと思いますがよろしくお願いします。
どこが自分の習っていない場所かはわかるの?
ここで回答を求めても、また再提出を食らうのがオチなんじゃ・・・
>>371 > static bool
習ってないのはこの辺りか?
vc express で printf がコンパイル通りません
#include <stdio> とかやってるのに何故でしょうか?
.\printf.cpp(15) : error C3861: 'printf': 識別子が見つかりませんでした
>>571 つ、釣られないクマー
cstdio
stdio.h
と思ったけど、ダメだったクマー
573 :
371:2007/09/16(日) 01:46:23
ここの礼儀として最低限の関数しか使ってないけどね
『main() 以外の関数を書いてはいけない』とかなら俺は知らね
>>570 が指摘した様に、staticとboolかなぁ
static は明示的にファイル内スコープを示しているだけなので無くてもOK
bool は int に直して return true → return 1, return false → return 0 に直せばOK
残るは switch くらいかなぁ
switch は if ... else if ... else に直せば良い
#define ... が駄目ってことなら #define 行を消して COL_RED とか書いてるところを () 内の数字に
書き換える(直値のマジックナンバーは悪い習慣になるのでお勧めしないけど)
このくらいの修正は自分でやってね
#ifとかそのまんまコピペしたから怪しまれたんでしょね
575 :
371:2007/09/16(日) 01:52:08
と書いたけど、君が提出したのは
>>385 のコードだね
<conio.h> の textcolor() は確かに教わらないだろうし環境依存だから良くないかもしれないね
576 :
デフォルトの名無しさん:2007/09/16(日) 01:54:46
チョンはさっさと糞アメリカに行けや
チョンはさっさと糞アメリカに行けや
チョンはさっさと糞アメリカに行けや
チョンはさっさと糞アメリカに行けや
チョンはさっさと糞アメリカに行けや
577 :
デフォルトの名無しさん:2007/09/16(日) 01:55:46
チョンの分際でえらそうな口きくな
チョンの分際でえらそうな口きくな
チョンの分際でえらそうな口きくな
チョンの分際でえらそうな口きくな
チョンの分際でえらそうな口きくな
>>575 568 読んでコーディングしてみた輩ですが、
なんで
>>385 のコードを提出したと思ったのでしょうか
と単純に思ったので聞いてみる
579 :
385:2007/09/16(日) 02:22:30
でしゃばってすみませんでした
しかも%7とか意味のないことやってるし…
再提出してください><
>>568 #include <stdio.h>
int zeller(int year, int month, int day){
if(month <= 2) year--, month += 12;
return (year + year/4 - year/100 + year/400 + (13*month + 8)/5 + day)%7;
}
int isleap(int year){
if((year%4 == 0 && year%100 != 0) || year%400 == 0) return 1;
return 0;
}
int main(void){
int i, pos, year, month, days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
scanf("%d%d", &year, &month);
pos = zeller(year, month, 1);
if(isleap(year)) days[1]++;
printf("Sun Mon Tue Wed Thu Fri Sat\n");
for(i = 0; i < pos; i++) printf(" ");
for(i = 0; i < days[month - 1]; i++, pos = (pos + 1)%7){
if(pos == 0) printf("\033[31m%3d ", i + 1);
else if(pos == 6) printf("\033[34m%3d\n", i + 1);
else printf("\033[0m%3d ", i + 1);
}
printf("\033[0m\n");
return 0;
}
あー
for(i = 0; i < pos; i++) printf(" ");
ではなく
for(i = 0; i < pos; i++) printf(" ");
だな
return hoge;
を
if (hoge) return true else return false;
と書く人が多いね。こっちの方が読みやすいかな?
いや、
return (year%4 == 0 && year%100 != 0) || year%400 == 0;
のがスマートかもね
いちいち関数にする必要がないな……
>>584 可読性というか何やってるかを分かりやすく書くなら、
int isLeapYear(int year){
if( !(year % 400) ) return 1;
if( !(year % 100) ) return 0;
if( !(year % 4) ) return 1;
return 0;
}
こんな風に書いた方がいい気がする。
関数にする必要性は感じた方がいいと思うが。
必要とか主観的なことはナンセンス。そうでなければならないという
必然性がないならどっちでも良いよ。少なくともその一行を
無理に複雑にしなくても良いだろ。考え方なんて人それぞれ。
最終的に必要な結果が得られれば問題なし。
まぁ、自分の定義したライブラリを登録しておいて、うるう年の判別には
そのライブラリを用いるというスタイルをとっているならそれでも良し。
>>585 強いて欠点を言うなら、400で割り切れる、100で割り切れる年が
全体のどんだけぇ〜あるか。多くの場合、上から順に流すと
2つとも無駄な判別になる。果たしてそういうのが効率が良いかどうか。
だったら4で割れるものの中から100で割れるものと400で割れるものを
さらに判定したらどうだろうか?少なくとも奇数の年数だったらその時点で
無駄な判定はせずに済む。
int isLeapYear(int year) {
if(year%4) return 0;
if(year%100) return 1;
if(year%400) return 0;
return 1;
}
こう書いた方がいいってことか
370に合わせるとしたらこうなるんかな
int isLeapYear(int year)
{
if(year % 4 != 0)
{
return 0;
}
if(year % 100 != 0)
{
return 1;
}
if(year % 400 != 0)
{
return 0;
}
return 1;
}
400は100で割り切れる条件に入る。100で割り切れないという条件を使うか
400で割り切れるならという条件を先に入れるか・・・
しかし、400で割り切れず100でも割り切れない年の方多いとなると
やはり、まず4で割り切れてという条件の下に
100で割り切れないもの、100で割り切れるというならば
その中でも400で割り切れるものという条件ならどうかな?
int isLeapYear(int year)
{
if (year <= 1900 || year >= 2100) return -1;
return year % 4 != 0;
}
int isLeapYear(int year) {
if(year%4) return 0; //4で割り切れない場合、0を返す
if(year%100) return 1; //4で割り切れるけど、100で割り切れない場合1を返す
if(year%400) return 0; //100で割り切れて400で割り切れない場合0を返す
return 1; //400で割り切れたら1を返す
}
>>594 見たまんまだろ。1901年から2099年に限定すれば4年に一度閏年だ。
って、よくみたら逆になっているのかw
>>595 っ isLeapYear(1900);
!!!
>>585 の書き方が好きだ
自分の書き方と同じだから
最適化のしすぎで読みにくいなんていやだ
うるう年の判定を何百万回するつもりかしらんけど
600 :
598:2007/09/16(日) 11:10:47
確かに馬鹿だなorz
その後しっぽりむふふ、といきたいところですな
>>598 > 最適化のしすぎで読みにくいなんていやだ
読みにくいという自分規準が既におかしいと気づけ
可読性は多人数がかかわるんなら大事だよ。
>>584とか理解できない奴がいる可能性も否定できないし。
ま、
>>588が理解できない人間に対しては、どんなに可読性に気を使っても無駄だろうけど。
604 :
571:2007/09/16(日) 11:53:03
#include "stdafx.h"
#include <stdio.h>
って入れ替えたら、うまく動きました。
ただ、知る人ぞ知る書式演算子 %n
int iLength = 0;
printf("hello%n\n", &iLength);
printf("%d", iLength);
でアサート吐かれるんだけど、何でだろ?
printf_sを使えとかじゃないの?
>>604 iLength=printf("hello");
printf("\n%d\n", iLength);
じゃダメ?
しかし、やたらと if if if って並ぶのも見やすいとは思えないんだがw
授業単元:C
問題文(含コード&リンク):
テーマ:ファイル処理
問題2:ファイル"memo.txt"の中身を配列に格納してしなさい。
そのファイルの行数をcountとします。
その配列の中身と行数を表示しなさい。
"memo.txt"は
akasatana/23
ahajsjoi/21
12/4343
2/3sefs
とします。
>>578 static, bool, switch, #define くらいに文句つける講師は居ないだろと思っただけだよ
問題にエスケープシーケンスによる色設定方法を書いてるのにそれを使わないなら怒るかなと
俺と
>>385 以外に回答なかったと思うし
>>370 どっち出したの?
>>610 具体的に何かに対してではなく 習っていない という点をお忘れなく。
>>568 あるいは、講師にこの部分はどういう意味かと聞かれて説明できず
他人のを丸写しにしたのがバレたとかね。
614 :
609:2007/09/16(日) 16:37:50
ファイルにかかれたいくつかのファイルを用いてプログラムで処理するんだけど
そのファイルの数も考慮にいれるファイルでありまして。
"memo.txt"に
data0913.dat
data0912.dat
data0911.dat
とかかれていて。その拡張子.datのファイル3個を配列に格納したいんですけど、
ちょっとわからなくて。
>>609 #include<stdio.h>
int main(void){
char *filename="memo.txt";
FILE *fp;
int moji[1], last_moji='\0', count=0;
fp=fopen(filename, "r");
if(fp==NULL) return 1;
while((moji[0]=fgetc(fp))!=EOF){
if(moji[0]=='\n') count++;
printf("%c", moji[0]);
last_moji=moji[0];
}
fclose(fp);
if(last_moji!='\n') count++;
printf("\n行数 : %d\n", count);
return 0;
}
>>610 『教えてない事を使うな』ってスタンスは講師としては良くないと思うんだけどね
『教えてない=パクリ』も短絡的すぎるし
>>613 その可能性は高いね
617 :
609:2007/09/16(日) 16:57:02
>>615 作ってくれたのはありがたいんですけど、
表示じゃなくて
2次元配列の行ごとに格納する感じにしたいんだけどね
char matr[1][]="data0913.dat"
char matr[2][]="data0912.dat"
char matr[3][]="data0911.dat"
618 :
609:2007/09/16(日) 17:06:28
すいません、できました。ありがとうございました。
>>609 宿題じゃないことは分かったが、何がしたいのか箇条書きで整理してくれ
>>618 >>609 ができるわけがないです
断言できます
今後できるようになる事も無いです
あきらめました。っていうなら納得です
621 :
609:2007/09/16(日) 17:16:47
#include "stdio.h"
#include <stdlib.h>
#define STR_MAX 256
int main(){
FILE *fp;
int count=0,i;
char buf[STR_MAX][STR_MAX];
fp=fopen("memo.txt","r");
count=0;
for(i=0;i<STR_MAX;i++){
if(fgets(buf[i], STR_MAX, fp) == NULL){
break;
}
count++;
}
fclose(fp);
printf("行数カウント%d\n",count);
for(i=0;i<count;i++){
printf("%d:%s\n", i, buf[i]);
}
}
実行してみた?
教えていない事柄に関しては後日その事柄の説明をしてもらいます。
それに答えられたら加点 ってやればおk。
まぁ、そこまでやってくれる講師なんぞいないだろうけどね。
624 :
デフォルトの名無しさん:2007/09/16(日) 22:12:27
茨城県の某高校でやった内容なのですが、よくわからないので教えて下さい
問題12 下の図の台形の面積を求めるプログラムを作成しなさい。
※図は省略します。
上底=12 下底=17 高さ=5
面積S float 上辺a int 下辺b int 高さh でプログラムを作成すること
C:\c>kadai12
台形の面積はXXXX
※XXXXは計算した値を表示
初歩的なことかもしれませんが、よろしくお願いします。
>>624 #include<stdio.h>
int main(void){
int a=12, b=17, h=5;
float S;
S=(a+b)*h/2.0;
printf("台形の面積は %f\n", S);
return 0;
}
>>624 #include <stdio.h>
int main(void)
{
int a = 12, b = 17, h = 5;
float S = (float)((a+b)*h) / 2.0F;
printf("台形の面積は%f", S);
return 0;
}
627 :
624:2007/09/16(日) 23:08:26
#include <stdio.h>
int main(a=12,b=17,c=5){float S;S=(a+b)*h/2.0;printf("台形の面積は %f\n");}
どぞ。
ちなみに俺が書いた。
#include <stdio.h>
typedef int n;n t[64]={0};n a(n i,n&g){n s=g%8;g+=("1987"[i%4]-48)*(i>3?-1:1);
return !((!s||s==7)&&s+g%8==7);}n h(n x,n m){n i=0,r=1,g=x;if(t[x])return 1;
for(;i<8&&a(i,g);i++,g=x){for(;t[g]==3-m&&a(i,g)&&g>=0&&g<64;){if(t[g]==m){
while(g!=x)a((i+4)%8,g),t[g]=m;r=0;}}}if(!r)printf("%s:%d %d\n",m==1?"黒":"白"
,x%8+1,x/8+1);return r;}n d(){n s=0,d,i=0;for(;i<64;i++){printf("□\0○\0●"+(
d=t[i])*3);if(i%8==7)puts("");s=s?d&&s!=d?3:s:d;}return s!=3;}void main(){n x=
1,y,p,m=0,c=0,k=0,r=-1;t[35]=t[28]=1;t[27]=t[36]=2;while(!d()||x&&k!=r){puts(
"x y");scanf("%d %d",&x,&y);m=m?m:x?1:2;if(x&&(--x>7||--y>7||h(x+y*8,m)))
continue;if(d())break;k=r=(c++/2+x*8+y)%64;while(++k!=r&&h(k,3-m))if(k>64)k=0;
}x=y=c=0;for(;c<64;c++)if(p=t[c])p==1?x++:y++;printf("黒:%d 白:%d %s",x,y,x>y?
"黒の勝ち":x<y?"白の勝ち":"引き分け");}
オセロ。
7行スレの住人か貴様はw
2行目のn&gのところでコンパイルできなかった
適当に直してみたけど入力待ちから先に進まない
明日までに直しといてね
>>634 > n&g
って明らかに参照渡しの仮引数だろ。
main()の戻り値型を省けばc++でコンパイルできたが。
>>632 void main() なんて書くな。
>>636 俺が言いたかったのはどこのコンパイラ使ったのかってこと
638 :
636:2007/09/17(月) 00:30:37
面白いの BC++ でコンパイル通した(いろいろ間違いがあったけど)
main() の引数は好きに定義できるんだっけ?処理系依存?
#include <stdio.h>
int main(float a=12.0,float b=17.0,float h=5.0)
{
float S;
printf( "%f,%f,%f\n", a,b,h); // 引数を与えないと全部0
S=(a+b)*h/2.0;
printf("台形の面積は %f\n",S);
}
ただし、a,b,h の初期化は無効、通常の argc, argv (つまり実行系の引数)で上書きされるんだろうね
これも処理系依存だったりするのかなぁ
まぁ100%実用性のない書き方だからどうでも良いけど
>>632 オセロとしておかしくねーか?
明らかに置ける場所におけない場合があるんだが。
>>642 いまやってみた。
コンパイルは問題なさそうだが、オセロとしてはおかしいな。
>>632 gccでコンパイルしようとすると2行目で止まる
g++でコンパイルしようとすると、mainはvoid返さねえよ氏ねとエラーでる。
>>644 >g++でコンパイルしようとすると、mainはvoid返さねえよ氏ねとエラーでる。
mainはint返さなきゃいけねーよ氏ねだよな。
VC++なら通ったぞ。
BC++ も通るけど、一件 warning
if(p=t[c])p==1?x++:y++;
p=t[c] は == の間違い?
動作確認は少しだけしたけど、最後までゲームをするの面倒
647 :
デフォルトの名無しさん:2007/09/17(月) 01:46:08
648 :
デフォルトの名無しさん:2007/09/17(月) 03:20:30
----【即会える出会い系サイト×優良出会い系サイト=毎日出会い!】-----------
優良出会い系サイトと即出会えるサイトを併用して使い、即会いライフを楽しんでいます。
これが面白いほど会える☆
俺の場合、出会い系サイト3つで女の子と週2〜3で出会えてます。
これ以外にもお気にの女の子とは週1で会ってます。
今回は皆さんにも出会いを楽しんでもらいたいので、俺が使っている
登録後一日以内に出会えたサイトを紹介するブログ始めました。
皆も休日にエンジョイしてください!
↓↓↓
【即出会えるサイト紹介ブログ】
http://deaigets.blog97.fc2.com/ --------------------------------------------------------------------
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):1から10までにランダムで出した数をAさんとBさんに分ける。ランダムは重複しないこと
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:BCC5.5
[3.3] 言語: C
[4] 期限: 2007年9月19日まで
[5] その他の制限: 実行例
Aさん:
1,4,5,9,10
Bさん:
2,3,8,7,6
俺の書いたやつで結構盛り上がってるね
>>633 七行スレの住人なんで。
巣に帰ります。
656 :
647:2007/09/17(月) 09:10:40
皆さん、回答ありがとうございました。
これを参考に、もう一度頑張ってみます。
[1] 授業単元: Programing concept
[2] 問題文(含コード&リンク):
-Declare a constant global variable of float data type
-Name it TAX_RATE
-Assign it a value of 0.07
-Output as shown
/* Enter January sales: 1101.55
Enter February sales: 2321.22
Enter March sales: 3313.12
Total sales for the first three months is $6735.89,
and the amount of sales tax is $471.51 /*
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: Visuall C++
[3.3] 言語: C++
[4] 期限: ASAPでお願いします
[5] その他の制限: 超初級です
658 :
657:2007/09/17(月) 14:24:46
自分のプログラムは
#include <iostream>
using namespace std;
const float TAX_RATE=0.07;
float JANUARY_SALES;
float FEBRUARY_SALES;
float MARCH_SALES;
float main ()
{
float JANUARY_SALES;
cout << "Enter January sales: " << endl;
cin >> JANUARY_SALES;
float FEBRUARY_SALES;
cout << "Enter February sales: " << endl;
cin >> FEBRUARY_SALES;
float MARCH_SALES;
cout << "Enter March sales: " << endl;
cin >> MARCH_SALES;
cout << "Total sales for the first three months is $"
<< JANUARY_SALES+FEBRUARY_SALES+MARCH_SALES
<< ", " << endl;
cout << "and the amount of sales tax is $"
<< (JANUARY_SALES+FEBRUARY_SALES+MARCH_SALES)*TAX_RATE
<< endl;
return 0;
}
659 :
657:2007/09/17(月) 14:30:08
連投失礼します
Enter January sales: //
1101.55 // どうやったらこの二行を一行にできますか?
Enter February sales:
2321.22
Enter March sales:
3313.12
Total sales for the first three months is $6735.89,
and the amount of sales tax is $471.512 // 小数点以下二桁にできません
よろしくお願い致します
>>657 main 関数の外にある三つのグローバル変数
float JANUARY_SALES;
float FEBRUARY_SALES;
float MARCH_SALES;
は使う予定がないなら削除したほうがいいと思う
662 :
657:2007/09/17(月) 18:19:09
>>660 さん
ありがとうございました
ほとんど説明のない授業なので、非常に参考になります
精度指定も全く習っていなくて、色々調べたのですがいまいち使い方が分かりませんでした
>>661 さん
助言ありがとうございます
削除しました
【質問テンプレ】
[1] 授業単元:Cプログラミング
[2] 問題文: Boyer-Moore法を用いて文字探索プログラムを作成せよ。
ランダムに発生させた100個ほどの数字列の中から4文字程度の数列を探索するものとする。
何回その数列が出てきたかを調べ、20回以上実行して平均を求めよ。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: Borland C++ Compiler 5.5
[3.3] 言語: C言語
[4] 期限: 2007年9月20日
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
検索する方の文字列ももランダムに発生させます。
Cはやり始めて2年目です。
kmpだったら前に書いたのに!
665 :
デフォルトの名無しさん:2007/09/17(月) 20:42:41
プログラムソースを、fopenで開いて、fgetsで配列bufに1行取ってくるようにしてるんですが、字句解析で、取ってきた1行の中から、1文字づつチェックをかけて、識別子か整定数かを調べて、その単語を出力したいのですが、どうすればいいか教えてください。
分かりにくいんでもう少し抽象的に話してくれ
667 :
デフォルトの名無しさん:2007/09/17(月) 20:50:36
識別子か整定数だけでなく、
@シングルクオテーションがきた時に、シングルクオテーションで単語がくくられてたら、単語を文字定数として出力し、ただ単にシングルクオテーションがあるだけなら、特殊記号として出力したい
A整定数(75とか)がきたら、識別子(a4b9とか)と比較して、整定数なら整定数、識別子なら識別子として出力したい
どうしたらいいでしょうか?
ちなみにc言語です。
668 :
デフォルトの名無しさん:2007/09/17(月) 20:52:28
抽象的に言うと、字句解析で、識別子と整定数と文字定数に分けて出力したいんです。
フラグを1個作って、対象文字が出てきたらフラグを反転する。
フラグの状況によって、処理を変える。
670 :
デフォルトの名無しさん:2007/09/17(月) 22:22:36
初心者なんで、全然意味がわからないんで詳しく教えていただけませんか?
初心者に抽象的に教えるのは厳しい。
宿題なら問題文まるまる乗せてくれ。
やさしい人ならコメントくらいつけてくれる.。
自分がどの程度まで習っているのかもちゃんと示してくれ。
673 :
デフォルトの名無しさん:2007/09/17(月) 22:42:15
問題文が無いんで、自分なりに説明すると、
文字列を単語に分割する。単語の種類には、予約語、識別子、整定数、文字定数、特殊記号がある。予約語、特殊記号はテキスト参照。
文字列はプログラミング言語KPLを適当に作成し、それを読み込んでくる。
環境はC言語、OSはLinuxで、Gnome端末というものでemacsを使っています。
674 :
デフォルトの名無しさん:2007/09/17(月) 23:15:05
[1] 授業単元:
[2] 問題文(含コード&リンク):
http://pc11.2ch.net/test/read.cgi/tech/1189892773/ 大富豪のプログラム。二人でプレイでき、ジョーカー無し。
ルールは大きい数字をどんどん出していく。同じ数字なら絵柄に関わらず
同時にだしていい。両方とも出すカードがなくなればその場を切る。
特別ルールで革命あり。先にカードがなくなったほうが負け
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン: Borland C++ Compiler 5.5
[3.3] 言語: C
[4] 期限:
[5] その他の制限:CUIで。スレ違いですいませんが自分ではどうもできません・・・お願いします・・・
>>674 君がやらなきゃいけないことじゃないが・・・
>>674 > 先にカードがなくなったほうが負け
逆では?
カードシャッフル部分だけなら作れるよ
>>675 すいません・・・自分も学校の課題で大富豪が出ておりちょうどトランプスレを見つけたんで何かヒントになれば
と思ったんですがC言語暦1ヶ月の自分には無理のようで・・・。
>>676 カードを全部出し終わった人が勝ちですね。すいません
そのスレ見るととりあえずシャッフルまでのプログラムはあるな。そこから先が問題ってことか
そのスレにも俺がいるが、いま作ってる。
2人プレイってサーバーとクライアントに分けて通信も書かなきゃならんのか・・・
面倒くさいな。何時間も掛かりそうでだるい
今欲しいのはAI同士の戦いが見れるものです。
>>663 本当にBM法になってるのか微妙
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
static int table[128];
void make_table(char *ptn){
int i, len = strlen(ptn);
for(i = 0; i < 128; i++) table[i] = len;
while(*ptn) table[*ptn++] = --len;
}
char *bm(char *str, char *ptn){
int i, len = strlen(ptn);
char *p = str + strlen(str);
if(*ptn == '\0') return NULL;
make_table(ptn);
while(p - str >= len){
for(i = len - 1; i >= 0 && str[i] == ptn[i]; i--) ;
if(i < 0) return str;
str += table[str[i]] - len + 1 + i > 0? table[str[i]] - len + 1 + i : 2;
}
return NULL;
}
int main(void){
int i, j, cnt = 0, len;
char str[101] = {0}, ptn[5] = "hoge", *p;
for(len = strlen(ptn), srand((unsigned int)time(NULL)), i = 0; i < 20; i++){
for(j = 0; j < 100; j++) str[j] = rand()/(RAND_MAX + 1.0)*(122 - 97) + 97;
for(p = bm(str, ptn); p != NULL; p = bm(p + len, ptn)) cnt++;
}
return printf("%g\n", cnt/20.0), 0;
}
とりあえずどんどんカードを出していくところも出力してもらいたいです。最後は先行後攻かどちらかの勝ちを
表示、もう一度しますか?みたいなものがあれば・・・
UIがだるいんだよ
CUIだよな?
UIよりAIがだるい
CPUは出せれば出すってだけでいいのか
大富豪自体は、ちょい面倒なだけで初心者でもそれほど難儀せずに作れると思う
せいぜいシャッフルで
>>551>>554を考慮しないといけないくらいで
むしろAIの部分が初心者にはきついんじゃないか?
そうですね
AIは出せれば出すというのでお願いできますか?
できません
690 :
デフォルトの名無しさん:2007/09/18(火) 00:52:17
じゃあまずはAI無しで普通に作ってみては?AIは後付で。
691 :
デフォルトの名無しさん:2007/09/18(火) 00:53:07
これはアメリカのゲームです。1度やってみてください。
これは、たった3分でできるゲームです。試してみてください。
驚く結果をご覧いただけます。
このゲームを考えた本人は、メールを読んでからたった10分で願い事が
かなったそうです。このゲームは、おもしろく、かつ、あっと驚く結果を貴方にもたらすでしょう。
約束してください。絶対に先を読まず、1行ずつ進む事。
たった3分ですから、ためす価値ありです。
まず、ペンと、紙をご用意下さい。
先を読むと、願い事が叶わなくなります。
@まず、1番から、11番まで、縦に数字を書いてください。A1番と2番の横に好きな3〜7の数字をそれぞれお書き下さい。
B3番と7番の横に知っている人の名前をお書き下さい。(必ず、興味の
ある性別名前を書く事。男なら女の人、女なら男の人、ゲイなら同姓の名
前をかく)
必ず、1行ずつ進んでください。先を読むと、なにもかもなくなります。
C4,5,6番の横それぞれに、自分の知っている人の名前をお書き下さい。これは、家族の人でも知り合いや、友人、誰でも結構です。
まだ、先を見てはいけませんよ!!
D8、9、10、11番の横に、歌のタイトルをお書き下さい。
E最後にお願い事をして下さい。さて、ゲームの解説です。
1)このゲームの事を、2番に書いた数字の人に伝えて下さい。
2)3番に書いた人は貴方の愛する人です。3)7番に書いた人は、好きだけれど叶わぬ恋の相手です。
4)4番に書いた人は、貴方がとても大切に思う人です。
5)5番に書いた人は、貴方の事をとても良く理解してくれる相手です。
6)6番に書いた人は、貴方に幸運をもたらしてくれる人です。
7)8番に書いた歌は、3番に書いた人を表す歌。
8)9番に書いた歌は、7番に書いた人を表す歌。9)10番に書いた歌は、貴方の心の中を表す歌。
10)そして、11番に書いた歌は、貴方の人生を表す歌です。
この書き込みを読んでから、1時間以内に10個の掲示板にこの書き込みをコピーして貼って下さい。そうすれば、あなたの願い事は叶うでしょう。もし、貼らなければ、願い事を逆のことが起こるでしょう。とても奇妙ですが当たってませんか?
>>674 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
static int trump[52];
int print_trump(int player){
int i, cnt = 0;
printf("%s\n", player > 0 ? "#player 1" : "#player 2");
#define hoge(str, start, end) \
for(printf("%s :", str), i = start; i < end; i++) \
if(trump[i] == player) printf("%3d", i%13 + 1), cnt++; \
putchar('\n');
hoge("spa", 0, 13); hoge("hea", 13, 26); hoge("clu", 26, 39); hoge("dia", 39, 52);
return cnt;
}
int isput(int field, int turn){
int i, min = 64;
for(i = 0; i < 52; i++) if(trump[i] == turn && i%13 > field%13 && min%13 >= i%13) min = i;
return min;
}
int main(void){
int i, j, field = -1, turn = -1;
for(i = 0; i < 26; i++) trump[i] = 1;
for(i = 26; i < 52; i++) trump[i] = -1;
srand((unsigned int)time(NULL));
#define swap(type, x, y) do{type tmp = x; x = y; y = tmp;}while(0)
for(i = 1; j = rand()/(RAND_MAX + 1.0)*(i + 1), i < 52; i++) swap(int, trump[i], trump[j]);
while((turn *= -1, printf("\n<%d> : %d\n", turn < 0 ? 1 : 2, field + 1), print_trump(1)) && print_trump(-1))
if((field = isput(field, turn)) != 64) trump[field] = 0, field %= 13;
else puts("pass"), field = -1;
return 0;
}
すげぇ。エラーがいっぱいw
694 :
デフォルトの名無しさん:2007/09/18(火) 01:46:26
授業単元:C
問題文(含コード&リンク):
ポインタ変数を使ったプログラム
入力された金額について最適な金種枚数を求めよ
実行画面
10000円の枚数==>12
5000円の枚数==>1
1000円の枚数==>0
500円の枚数==>1
100円の枚数==>3
50円の枚数==>0
10円の枚数==>1
1円の枚数==>2
環境
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
期限:今日の7時30分まで
その他の制限:
アクセサ
697 :
デフォルトの名無しさん:2007/09/18(火) 01:59:20
695>入力ミスりました^^;
訂正文
ポインタ変数を使ったプログラム
入力された金額について最適な金種枚数を求めよ
実行画面
入金==>125847
10000円の枚数==>12
5000円の枚数==>1
1000円の枚数==>0
500円の枚数==>1
100円の枚数==>3
50円の枚数==>0
10円の枚数==>1
1円の枚数==>2
以下のような配列名をポインタ変数で扱う
int money[] = {10000,5000,1000,500,100,50,10,5,1,0};
698 :
デフォルトの名無しさん:2007/09/18(火) 02:07:20
>>692 エラー E2206 sample.c 6: 不正な文字 '#' (0x23)(関数 print_trump )
エラー E2027 sample.c 6: メモリ上に配置されなければならない(関数 print_trump )
エラー E2206 sample.c 6: 不正な文字 '#' (0x23)(関数 print_trump )
エラー E2027 sample.c 6: メモリ上に配置されなければならない(関数 print_trump )
エラー E2140 sample.c 6: ここでは宣言はできない(関数 print_trump )
エラー E2206 sample.c 7: 不正な文字 '#' (0x23)(関数 print_trump )
エラー E2027 sample.c 7: メモリ上に配置されなければならない(関数 print_trump )
エラー E2206 sample.c 7: 不正な文字 '#' (0x23)(関数 print_trump )
エラー E2027 sample.c 7: メモリ上に配置されなければならない(関数 print_trump )
エラー E2047 sample.c 11: define 指令の構文が正しくない(関数 print_trump )
エラー E2206 sample.c 12: 不正な文字 '#' (0x23)(関数 print_trump )
エラー E2027 sample.c 12: メモリ上に配置されなければならない(関数 print_trump )
エラー E2206 sample.c 12: 不正な文字 '#' (0x23)(関数 print_trump )
エラー E2027 sample.c 12: メモリ上に配置されなければならない(関数 print_trump )
警告 W8065 sample.c 12: プロトタイプ宣言のない関数 'hoge' の呼び出し(関数 print_trump )
警告 W8065 sample.c 12: プロトタイプ宣言のない関数 'hoge' の呼び出し(関数 print_trump )
警告 W8065 sample.c 12: プロトタイプ宣言のない関数 'hoge' の呼び出し(関数 print_trump )
警告 W8065 sample.c 12: プロトタイプ宣言のない関数 'hoge' の呼び出し(関数 print_trump )
>>698の続き
エラー E2206 sample.c 13: 不正な文字 '#' (0x23)(関数 print_trump )
エラー E2027 sample.c 13: メモリ上に配置されなければならない(関数 print_trump )
エラー E2206 sample.c 13: 不正な文字 '#' (0x23)(関数 print_trump )
エラー E2027 sample.c 13: メモリ上に配置されなければならない(関数 print_trump )
エラー E2206 sample.c 16: 不正な文字 '#' (0x23)(関数 isput )
エラー E2027 sample.c 16: メモリ上に配置されなければならない(関数 isput )
エラー E2206 sample.c 16: 不正な文字 '#' (0x23)(関数 isput )
エラー E2027 sample.c 16: メモリ上に配置されなければならない(関数 isput )
エラー E2140 sample.c 16: ここでは宣言はできない(関数 isput )
エラー E2206 sample.c 17: 不正な文字 '#' (0x23)(関数 isput )
エラー E2027 sample.c 17: メモリ上に配置されなければならない(関数 isput )
エラー E2228 sample.c 17: エラーあるいは警告が多すぎる(関数 isput )
*** 26 errors in Compile ***
700 :
デフォルトの名無しさん:2007/09/18(火) 02:23:41
何方か697お願いします
>>697 >以下のような配列名をポインタ変数で扱う
相変わらず意味が分からないし、何をすれば実行画面と示した結果になるのか不明
問題自体を見直してこい
702 :
デフォルトの名無しさん:2007/09/18(火) 02:39:25
>>692 これが大富豪のプログラムなの?最近C始めたばかりでよく分からないけど遊んでみようと
思ったらエラーで遊べなかったw
>>697 下二桁が47なのになぜ10円が1枚・・・ というか5円はどうした
>>697 #include<stdio.h>
int main(){
int money[] = {10000,5000,1000,500,100,50,10,5,1,0};
int count[sizeof(money)/sizeof(money[0])],n,*p;
for(p=&money[0];*p;++p)count[p-money]=0;
printf("入金==>");scanf("%d",&n);
p=&money[0];
while(*p)if(n>=*p){n-=*p;++count[p-money];}else ++p;
for(p=&money[0];*p;++p)printf("%d円の枚数==>%d\n",*p,count[p-money]);
return 0;
}
なんかポインタを活用してるっぽく書いてみた。無意味だけど。
ん?
>>692エラーなんか出なかったぞ。VC2003とgcc(mingw)でためしたけど。
コピペのときに とか入るのちゃんと消したか?
>>692 BCC5.5でも動いた。これってどういう動きしてんだ?
707 :
デフォルトの名無しさん:2007/09/18(火) 03:27:59
動いたけどBCC5.5だと途中経過が全部表示しきれずよく分からないようになってる・・・ウィンドウが小さいのかな・・・
リダイレクトで結果をテキストファイルに出力すればいいじゃない。
709 :
デフォルトの名無しさん:2007/09/18(火) 03:52:28
[1] 後期から入るゼミで出た課題です
[2] 下記のテキストデータを読み出し
各列ごとに値の小さい順に並べて表示させよ
---------------------
6,1,92,92
1,1,93,93
5,1,94,94
2,1,95,95
4,1,97,97
3,1,99,99
2,2,142,47
4,2,144,47
5,2,146,52
1,2,149,56
6,2,151,59
---------------------
[3] 環境
[3.1] WindowsXP
[3.2] VC 6.0
[3.3] C言語
[4] 2007年9月25日まで
[5] 基本は一通りやりました・・・
データの読み出しを勉強してみて、デリミタを指定して
strtokで文字列にしてやればいいと
思い色々やってみましたがギブアップです・・・。
お願いします
strtokは指定?
あと、各列を独立してソートしていいの?
エクセルの並べ替えみたいに列1で並び変えて、同じなら列2で並び変えるとかじゃなくてOK?
711 :
709:2007/09/18(火) 03:59:57
>>710 strtokは指定ではないです
読み出した文字を配列にいれるのに
使えると思い自分で試してみただけです^^;
ソートに関してはどのようなやり方でも大丈夫だと思います
よろしくお願いします!!
>>711 ソートの方法じゃなくて各列が独立かを訊いてるんだよ
713 :
709:2007/09/18(火) 04:04:25
>>710 答えになって無くて申し訳ないです
各列独立でお願いします
strtok使わなくていいならscanfでいいんじゃね?
動作確認とかしてないし、コンパイルもしてないけどこんな感じ?
swapは自分で作ってくれ。
int iData[4][11], i, j, k;
// 読み込み
for( i = 0; i < 11; i++ ) {
scanf( "%d,%d,%d,%d", &iData[0][i], &iData[1][i], &iData[2][i], &iData[0][i] );
}
// ソート
for( i = 0; i < 4; i++ ) {
for( j = 0; j < 11; j++ ) {
for( k = j + 1; k < 11; k++ ) {
if ( iData[i][j] > iData[i][k] ) swap( &iData[i][j], &iData[i][k] );
}
}
}
716 :
709:2007/09/18(火) 04:18:55
>>715 fscanfで一度やってみて上手くいかなかったのでscanf諦めてました・・・
前に書いたプログラムと
>>715を見比べながらやってみます。
ありがとうございました(*_ _)
>>709 使い回ししにくいが、こんなのどうだろう?
#include <stdio.h>
#include <stdlib.h>
#define LINE_MAX 11
#define TEXTFILE "data.txt"
int col_a[LINE_MAX]; int col_b[LINE_MAX]; int col_c[LINE_MAX]; int col_d[LINE_MAX];
int cmp_int(const int *a, const int *b){return *a - *b;}
main(){
int i; FILE* fp = fopen(TEXTFILE, "r");
for(i = 0; i != LINE_MAX; i++)
fscanf(fp, "%d,%d,%d,%d", &col_a[i], &col_b[i], &col_c[i], &col_d[i]);
fclose(fp);
qsort(col_a, LINE_MAX, sizeof(int), (int (*)(const void*, const void*)) cmp_int);
qsort(col_b, LINE_MAX, sizeof(int), (int (*)(const void*, const void*)) cmp_int);
qsort(col_c, LINE_MAX, sizeof(int), (int (*)(const void*, const void*)) cmp_int);
qsort(col_d, LINE_MAX, sizeof(int), (int (*)(const void*, const void*)) cmp_int);
for(i = 0; i != LINE_MAX; i++)
printf("%d,%d,%d,%d\n", col_a[i], col_b[i], col_c[i], col_d[i]);}
718 :
デフォルトの名無しさん:2007/09/18(火) 07:12:53
授業単元:C
問題文(含コード&リンク):
ポインタ変数を使ったプログラム
入力された金額について最適な金種枚数を求めよ
int money[] = {10000,5000,1000,500,100,50,10,5,1,0};
実行画面
入金==>125847
10000円の枚数==>12
5000円の枚数==>1
1000円の枚数==>0
500円の枚数==>1
100円の枚数==>3
50円の枚数==>0
10円の枚数==>1
1円の枚数==>2
環境
OS:WindowsXP
コンパイラ名とバージョン:ボーランド
言語:C
719 :
709:2007/09/18(火) 07:23:40
>>717さん
いつの間にか意識が飛んでましたw
ありがとうございます。
早速動作の確認と内容の理解に取り組みます!!
>>718 #include <stdio.h>
int main(void)
{
int money[] = {10000, 5000, 1000, 500, 100, 50, 10, 5, 1, 0};
int *p, n;
printf("入金==>");
scanf("%d", &n);
p = money;
while(*p) {
printf("%d円の枚数==>%d\n", *p, n / *p);
n %= *p++;
}
return 0;
}
文字列strに中に文字Cが含まれている個数(含まれていれば0とする)を返す
関数int str_src(char *s,int c)を作成しなさい。
わかる方いましたらお願いします。
#include <stdio.h>
int str_src(char *,int);
void main()
{
char s[200],c[10];
printf("input string -> ");
scanf("%s",s);
printf("input find character ->");
scanf("%s",c);
printf("find %c is %d\n",c[0], str_src(s,c[0]));
}
int str_src(char *s,int c)
{
解答
}
>>721 // 文字Cが含まれている個数(含まれていれば0とする)を返す
int str_src(char *s,int c)
{
return 0;
}
724 :
721:2007/09/18(火) 09:24:51
1] 授業単元: 4
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows XP)
[3.2] (VC 6.0等)
[3.3] 言語: (C++)
[4] 期限: 今日中
[5] ポインタまで
int str_src(char *s, int c)
{
int cnt = 0;
while(*s) if(*s++==c) cnt++;
return cnt;
}
727 :
デフォルトの名無しさん:2007/09/18(火) 09:44:58
[1] 授業単元: C++
[2] 問題文(含コード&リンク):
下記の物は作れたのですがこれをコマンドラインで書くとどのようになるのでしょうか?
#include <stdio.h>
int main(void){
int m,n,r;
int saidai;
int yakusuu;
scanf("%d",&m);
scanf("%d",&n);
r=m%n;
if(r==0)
{
saidai=n;
}
if(r!=0)
{
m=n;
n=r;
saidai=n;
}
printf("%dと%dの最大公約数は%d\n",m,n,saidai); return (0);
}
728 :
709:2007/09/18(火) 09:52:51
717氏のプログラムで無事動かすことができました。
ただ、作りかけたfgetsで配列に読み込ませ
strtok関数を使いソースを完成させたいと思っています。
よろしければ後学のためにサンプルお願いします。
贅沢言って申し訳ないです
730 :
709:2007/09/18(火) 11:49:12
>>729 ありがとうございます;_;
少しずつでも理解しながら読んで行きます!!
多謝!!
>>727 とりあえずmとnをコマンドラインから入力、ということなら
main(void) -> main( int c, char *v[] )
int m,n,r; -> int m=atoi(v[1]), n=atoi(v[2]), r;
ただそれ、最大公約数返すようには見えないんだけど、いいの…?
>>732 括弧機能って? 187 のは括弧は対応してるみたいだが
>>735 括弧機能って?
>>735 も括弧に対応してるみたいだが
( 少なくとも (1+2)*(3+4) はきちんと処理された )
>>734 プログラムの問題じゃないじゃないか。
こういう問題を解読するプログラムを作れってことなのか?
>>734 #include <stdio.h>
char*A="ACDIMNORST";int T,S,u[10],v[99];
#define M(P) for (k=T=0;#P[k];T=T*10+v[#P[k++]]);S+=T;
void s(int i){int k;if(!A[i]){S=0;M(INTO)M(ONTO)M(CANON)M(INTACT)M(AMMONIA)
M(OMISSION)M(DIACRITIC)M(STATISTICS)M(ASSOCIATION)M(ANTIMACASSAR)
M(CONTORTIONIST)M(NONDISCRIMINATION)M(CONTRADISTINCTION)S=-S;
M(MISADMINISTRATION)if(!S)for(k=0;A[k];++k)printf("%c %d\n",A[k],v[A[k]]);}else
for(k=0;A[k];++k)if(!u[k])u[k]=1,v[A[i]]=k,s(i+1),u[k]=0;}main(){s(0);}
総当りでやる方が早くね?
この再帰の使い方はいらつくわ!
宿題スレで得意げに詰めて書くやつって何なんでしょうか。
初心者の助けにも何にもなってないでしょうが。
とっとと巣に帰れでございます。
宿題スレで宿題でもない問題にまともに答えてやるこたあない
理解できないからってファビョるなよw
総当りに見えるような
745 :
740:2007/09/18(火) 16:04:42
>>738 順列だとこういうふうに再帰するしかないっぽいな
746 :
デフォルトの名無しさん:2007/09/18(火) 16:17:44
>673を教えてください
>>746 問題文が無いんで、自分なりに説明すると、
文字列を単語に分割する。単語の種類には、予約語、識別子、整定数、文字定数、特殊記号がある。予約語、特殊記号はテキスト参照。
文字列はプログラミング言語KPLを適当に作成し、それを読み込んでくる。
環境はC言語、OSはLinuxで、Gnome端末というものでemacsを使っています。
と言う事だ、分かったかね?
748 :
927:2007/09/18(火) 16:30:19
>>931様
レスありがとうございます。
公約数返せてないですか・・・。
問題文すべて書きますね。
コマンドプロントで2つのmとmを読み込み、ユークリッドの交互方を使って
その最大公約数を求めるCプログラムを作成しなさい。
@mをnで割った余りをrとする。
Ar=0ならば、nが求める最大公約数になる。
Br!=0ならば、nをmに代入して@へ戻る。
追記で使っているコンパイラはbcc5.5で
言語はC++です。
よろしくお願い致します。
>>748 >Br!=0ならば、nをmに代入して@へ戻る。
>727は戻ってないぞ。
750 :
948:2007/09/18(火) 16:34:09
mとnの間違いです。
751 :
727:2007/09/18(火) 16:35:20
何度もすみません。
>>731 900番台ではありませんでした・・。
>>738 こういうの見てるとBASICで書かれた糞プログラムを思い出す。
753 :
デフォルトの名無しさん:2007/09/18(火) 16:39:41
>673を教えてください
#include <stdio.h>
#include <string.h>
#define SEP " "
int main(void){
char *str = "Shut up !", *p;
for(p = strtok(str, SEP); p != NULL; p = strtok(NULL, SEP)) puts(p);
return 0;
}
>>751 だから、>727は>748に書いてあるようには書かれていないぞ。
756 :
デフォルトの名無しさん:2007/09/18(火) 17:11:35
>673を教えてください
757 :
デフォルトの名無しさん:2007/09/18(火) 17:12:21
>673を教えてください
758 :
デフォルトの名無しさん:2007/09/18(火) 17:14:33
>673を教えてください
759 :
751:2007/09/18(火) 17:14:43
>>755 すみません。
もしよろしければ
>>748の@ABのやり方を教えていただけないでしょうか?
自分よくわかってないみたいです。
760 :
デフォルトの名無しさん:2007/09/18(火) 17:15:19
>673を教えてください
761 :
731:2007/09/18(火) 17:27:24
>>751 #include <stdio.h>
int main( int c, char *v[] ){
int m=atoi(v[1]), n=atoi(v[2]), r;
int saidai, yakusuu;
r=m%n;
if(r==0){ saidai=n; }
if(r!=0){
m=n;
n=r;
saidai=n;
}
printf("%dと%dの最大公約数は%d\n",m,n,saidai); return (0);
}
あなたの書いたやつに
>>731の変更してある。
まず、六行目で@をクリアしてるのはわかるな??
で、七行目でAをクリアしてる。
八行目から十三行目で
>r!=0ならば、nをmに代入して
の部分はクリアできてるんだが、
>@へ戻る。
の部分が欠けている。
762 :
デフォルトの名無しさん:2007/09/18(火) 18:09:08
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): ファイルから読み込んだ適当なプログラムを、字句解析し、その結果を出力するプログラムを作成せよ。
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語: c
[4] 期限: 2007年9月19日
[5]字句解析は予約語、識別子、整定数、文字定数、特殊記号の5つに分ける
予約語は、PROGRAM、CONST、TYPE、VAR、PROCEDURE、FUNCTION、BEGIN、END、ARRAY、OF、INTEGER、CHAR、CALL、IF、THEN、ELSE、WHILE、DO、FOR、TO
特殊記号は、+、-、*、/、<、>、=、空白、,、.、:、;、'、(、)、(.、.)、:=、!=、<=、>=
文字定数はシングルクオテーションでくくられた中の文字のこと
整定数は整数
識別子はその他の文字
文字定数と特殊記号の判別が難しいと思います。
764 :
751:2007/09/18(火) 18:22:43
>>761様
わかりやすい説明ありがとうございました。
本当に助かりました。
765 :
デフォルトの名無しさん:2007/09/18(火) 18:30:32
ガチで>762をお願いします。明日までなんですが、全然わからないんです…
>>765 しょっぱい実装なら1行ずつ読み込んでstrcmp()でも延々と回せば?
'が来たらフラグ管理でも。
767 :
デフォルトの名無しさん:2007/09/18(火) 18:50:57
>766
どう書けばいいか全然わからいんで具体的に教えてください…
>>762 予約語は大文字小文字区別すんの?
「整定数は整数」って10進の整数のみ?というか負値も?
769 :
デフォルトの名無しさん:2007/09/18(火) 19:19:43
>768
ごめんなさい、書き忘れてました…
予約語は大文字のみです
整数は特に制限が無いんで、出てきた数をそのまま出力してください。
よろしくお願いしますm(__)m
整数として -25 とか負値が登場しうるんだろ
単項演算子 - を扱うかどうかを訊いてるんだ
あと、文字定数は 'abc' のように複数の文字が入ってても文字定数でいいのか
暇つぶしにやってるがこれは先に出されるかもしれんね・・・
字句解析って何すればいいんだろ
面倒だったらtokenじゃなくてchar比較でおk
774 :
デフォルトの名無しさん:2007/09/18(火) 20:59:10
>770
その場合は
-は特殊記号
25は整定数
って出力してくださいm(__)m
いざ
>>762を張ろうとしたらC++で書いた事に気付いた。
修正面倒なんで後は頑張ってくれ。疲れた
776 :
デフォルトの名無しさん:2007/09/18(火) 21:19:19
え…
ほんとお願いします…ヤバいです…
>>762の結果出力ってどんな風に出力すればいいの?
778 :
デフォルトの名無しさん:2007/09/18(火) 22:07:21
>777
どんな形でもいいです
例えば
文字定数は
〇〇
△△
◇◇
識別子は
●●
▲▲
とかでもいいですし、1文字づつ、△△は文字定数、●●は識別子、▲▲は識別子◇◇は文字定数
みたいな感じでお願いしますm(__)m
779 :
デフォルトの名無しさん:2007/09/18(火) 23:00:19
>762>769
どなたかほんとにお願いします…
少し黙って待ってろ
781 :
デフォルトの名無しさん:2007/09/18(火) 23:06:01
はい…もう頼みの綱がここの人達しかいないので…
>>778 未定義の識別子はどうする?
それと、対になってないシングルクオーテーションは無いと仮定していいのか?('AAAだけみたいな文字列)
>>782 面倒だから文字定数は 'x' のように間に1字しか入らないものとしようか
ここで課題を解いてくれてる人達ってすげぇな。プログラム暦どのくらいなんだ?
786 :
デフォルトの名無しさん:2007/09/18(火) 23:21:09
>782
未定義の識別子とはどのようなものですか?
一応、予約語、特殊記号、文字定数、整定数以外の単語
(意味のある単語も無い単語も【appleとかg8m1jtとか】)は識別子として出力してくださいm(__)m
対になっていないシングルクオテーションは、その場合
'は特殊記号
AAAは識別子
として出力してください。
よろしくお願いしますm(__)m
787 :
デフォルトの名無しさん:2007/09/18(火) 23:22:01
[1] 授業単元:
[2] 問題文(含コード&リンク): テキスト情報に書かれた社員情報を検索する。
[3] 環境 FOXPADにて設計をしてからコーディングです。(明日にはPADを完成させなければなりません;;)
[3.1] OS: (Windows))
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: C言語です。
[4] 期限: [2007年9月19日09:00まで]
[5] その他の制限:関数、 ポインタ、構造体、乱数、単体テストなど習いました。
詳細もあるので記述しておきます。
1.社員情報を含む社員情報ファイルを作成しておいてプログラムに取り組むこと
2.社員情報は社員ID、社員指名の2つで構成すること
3.社員IDは半角4文字、社員名は全角10文字で左詰めとし、
空白は全角スペースにする
4.社員IDは数字とa-z、A-zの組み合わせで作ること
5.レコードの順番は不規則にすること
6.全レコードが改行で終わるようにすること
7.レコード数は20以下とする
もう少し細かいところもあるのですが、たくさん書いてあるので随時聞いて
くださるとありがたいです。
自分でもやってみましたがうまくできなかったのでどなたか力を貸していただけると助かります。
>762>786です
シングルクオテーションで定義された文字定数は>784が書いた1文字ではなく、複数の文字でもお願いします。
789 :
◆GRRPdDaVH. :2007/09/18(火) 23:32:06
>762>788です。
トリップつけときますm(__)m
>>787 >.>1嫁。
>・問題文は、出題されたまま全文を書いてください。
>・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
とりあえずこんなんでも、お前が挙げた条件は満たす。
#include<stdio.h>
main(){
FILE *record=fopen("record.txt","r");
char id[5], name[21], str[26], phrase[26];
printf("検索語句を入れろ:");
scanf("%s", phrase);
while( fgets(str,sizeof(str),record) ){
sscanf( str, "%4s%s", id, name );
if( strstr(str,phrase) ) printf("found[ID:%s, name:%s]\n", id, name);
}
}
----------record.txt
abcdあーあー
dcbaあああああーあ
ABCDあーあーー
BCDAああああ
------------------
>>785 1年前はプログラミングに触れたこともなかった。
確かにプログラミング歴もあるだろうけど、
受験生みたいな勢いで学習すれば1ヶ月程度である程度書けるようになると思う。
一ヶ月か。何かお勧めの本とかある?
しかるべきスレで聞くべき
ここ見てるとたまに出てくる鮮やかなコード
プログラムって数学的センスが必須だね
俺にはセンスのかけらもない事がわかった
796 :
791:2007/09/19(水) 00:14:38
797 :
デフォルトの名無しさん:2007/09/19(水) 00:17:03
>792
ありがとうございます☆ただ、ファイルはどこで読み込んでいるのでしょうか?あと、切り出したトークンをどのようなデータ、変数で返しているか教えてくださいm(__)m
798 :
デフォルトの名無しさん:2007/09/19(水) 00:18:21
>791でした…ごめんなさい…
ます☆ただ
800 :
デフォルトの名無しさん:2007/09/19(水) 00:19:35
assert.hってなんでしょうか?
801 :
791:2007/09/19(水) 00:23:04
>>797 ファイルは標準入力で渡してくれ
データ型はenum TokenTypeとstruct Tokenの定義を
>>800 assert.hはassertマクロを定義するもの
802 :
デフォルトの名無しさん:2007/09/19(水) 00:23:10
Unit系のヘッダー
803 :
デフォルトの名無しさん:2007/09/19(水) 00:28:14
これってポインタ、構造体、配列、関数しか習ってなくても、出来るプログラムですか?あと、どんな変数で返しているか教えてくださいm(__)m
安価も無しにいきなり「これ」って言われてもどれか分かんねーよ。
ちょっとは頭使え馬鹿。
805 :
デフォルトの名無しさん:2007/09/19(水) 00:33:55
>796のプログラムです…
>>803 たぶん列挙体、共用体を習っていないと思う。
学校によっちゃassert.hを扱わないことも多いだろうし。
807 :
◆GRRPdDaVH. :2007/09/19(水) 00:44:05
>806
列挙体、共有体、assert.hを使用しないように、直せるでしょうか……
この時期ってことは専門学校か何かか。
このコード持って行ったら確実に突っ込み喰らうぞ。良い意味でも悪い意味でも
809 :
デフォルトの名無しさん:2007/09/19(水) 00:44:24
>790さんありがとうございます。
ではすべて記述させていただきます。
>1の長文質問に使うやつがよくわからないので2回に分けて記述したいと思います。
[1] 授業単元:
[2] 問題文(含コード&リンク): テキスト情報に書かれた社員情報を検索する。
[3] 環境 FOXPADにて設計をしてからコーディングです。(明日にはPADを完成させなければなりません;;)
[3.1] OS: (Windows))
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: C言語です。
[4] 期限: [2007年9月19日09:00まで]
[5] その他の制限:関数、 ポインタ、構造体、乱数、単体テストなど習いました。
詳細もあるので記述しておきます。
1.社員情報を含む社員情報ファイルを作成しておいてプログラムに取り組むこと
2.社員情報は社員ID、社員指名の2つで構成すること
3.社員IDは半角4文字、社員名は全角10文字で左詰めとし、
空白は全角スペースにする
4.社員IDは数字とa-z、A-zの組み合わせで作ること
5.レコードの順番は不規則にすること
6.全レコードが改行で終わるようにすること
7.レコード数は20以下とする
810 :
デフォルトの名無しさん:2007/09/19(水) 00:45:07
・プログラムメッセージを表示すること
・社員IDで昇順ソートした社員情報を表示すること
・検索する社員IDの入力を促すメッセージを表示すること
・ファイル読み込み
・空ファイル(1文字もデータが含まれていないファイル)の場合、その旨を表示して終了すること
・社員情報ファイルが存在しない場合にはその旨を表示して終了すること
・社員情報を格納する構造体配列の要素数は20で宣言する(レコード数より多く確保する)
・ソート
・社員IDで昇順する
・社員IDの比較には標準ライブラリ関数のstrncmp()を使用する
・ソート結果表示
・ソート後の社員構造体の要素を順番に表示する
811 :
デフォルトの名無しさん:2007/09/19(水) 00:45:38
・検索
・検索の正否は関数の戻り値で判定すること
・成功の場合はポインタ渡しの引数に有効な整数(配列要素の位置)を設定すること
・検索のアルゴリズムはバイナリサーチにすること
・検索結果出力
・該当する社員情報が存在する場合、社員名を表示すること
・該当する社員情報が存在しない場合、その旨を知らせるメッセージを表示すること
・検索結果を表示するたびに、検索を繰り返すか確認すること。形式は問わない
・エラーメッセージ表示
・エラーメッセージからエラー内容が理解できる事
・以下の仕様変更を考慮する
・社員IDの長さが2-10の間で変化すること
・社員名の長さが20-40の間で変化すること
・レコード数が10-40の間で変化すること
・社員情報ファイルのファイル名を変更できる事
よろしくお願いします。
>>807 [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
死ねば?
>>807 僕、プログラムが大好きで独学しました!っていってこい。
エディタみたいに単語や文字の色分けするのも字句解析と呼べるのかな?
815 :
791:2007/09/19(水) 00:56:05
817 :
790:2007/09/19(水) 01:01:23
今日は後出しが流行なんですかね。
中学生が「子供作るのは後出しだっけ?」「違うよ中出しだよ」という会話をしてたのを思い出した。
いやブスだったんだけどさ
>>795 そのセンスってのは天賦の才能じゃないよ
既存の知識の応用・既知の解決法からの類推(ないし単なるパクり)がほとんどであって
努力次第でどうにでもなる
821 :
デフォルトの名無しさん:2007/09/19(水) 08:51:02
1] 授業単元:C言語(
[2] 問題文(含コード&リンク):
以下に示すプログラムの一部について、誤りのある箇所に下線を引き
その理由と対処方法を記述しなさい。
@if((fp=fopen(name,"r"==NULL){
自分の解答(間違っていいると思う場所)
@nameが" "で囲まれていない。
そう習ったので理由はよくわかりません教えてください。
Aswitch(c){
case'U':
++p;
case 'D':
--p;
default:
P=NULL;
自分の解答(間違っていいると思う場所
Aよくわかりません。
教えてください。
Bwhile(*d!='\0')
*d++=*s++;
自分の解答(間違っていいると思う場所
Bs++の前の*がいらない?
よくわかりません教えてください。
改行多いと出るので2回にわけます。
822 :
821:2007/09/19(水) 08:51:35
続き
C#include "stdio.h"
自分の解答(間違っていいると思う場所
Cstdio.hが" "で囲まれているが< >で囲む
そう習ったので理由がよくわかりません教えてください。
D#define MAX12
main()
{
int i;
char buf[MAX];
for(i=0; i<=MAX; i++)
buf[i]=' ';
自分の解答(間違っていいると思う場所
D理由、間違っている箇所ともにわかりません教えてください。
[3.3] 言語: (C++)
まるきし専門学校あたりのしょぼい宿題に見えるなw
こんなもん分からんのは死んだ方がいいぞ
>自分の解答(間違っていいると思う場所
間違いを何度もコピペ
(1)nameがちゃんとした文字列とかcharポインタなら問題ない。
問題は括弧がおかしいことだ。
これだけで後は分かるだろ。
(2)各caseでbreakがないから全部デフォルトを通る。
まぁ、プログラム次第では別に間違ってないとも言い張れるかもね。
ってことで屁理屈弄するなら中括弧が閉じてねえ。
(3)あえて言うならsの内容をdに写してるのに、終了条件がdで決められて意味あんの?ってところ。
まぁ、これもプログラム次第では(ry
(4)俺も完全に自信持てないから適当にググったらでてきた。
ってことでググれカス。
(5)defineのMAXと12が繋がってる。
ってことで配列宣言できない。
中括弧閉じてねえ。
826 :
デフォルトの名無しさん:2007/09/19(水) 11:06:52
ポインタで110と10をつかって演算しなさいと言う問題わかりませんお願い致します
お願いされても誰にも判らないと思います。
>1を読んで出直してください。
>1を読んで人生をやり直してください。
829 :
751:2007/09/19(水) 11:23:22
きのうはいろいろお世話になりました。
自分ではこれでよいと思ったのですが提出したところまだおかしいと言われました。
おかしなところ。
実行すると例えば 15と5の最大公約数だと15と5の最大公約数は5ときちんと出るのですが
19と9とか余りが出てしまうやつだと答えが、9と1の最大公約数は9......と出てしまいます
よろしくお願いいたします
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
if(argc!=3)
exit(3);
int m=atoi(argv[1]), n=atoi(argv[2]),r;
int saidai,x;
if(m<n){
x=m;m=n;n=x;
}
r=m%n;
if(r==0){
saidai=n;
}
while(r!=0){
m=n;
n=r;
r=m%n;
}
printf("%dと%dの最大公約数は%d\n",m,n,saidai);
}
>>829 saidaiが更新される箇所が一箇所しかないじゃないか
> if(r==0){
> saidai=n;
> }
>>829 --
foo.c:7: warning: ISO C90 forbids mixed declarations and code
foo.c:22: warning: control reaches end of non-void function
--
saidaiが設定されるに参照されている。
m, nが更新されているので更新結果が出力されている。
832 :
デフォルトの名無しさん:2007/09/19(水) 11:43:02
さっきポインタのけんで記載したものです 誰か教えてくれませんか?
>>832 プログラミング言語だけじゃなく日本語も不自由なのか?
835 :
デフォルトの名無しさん:2007/09/19(水) 11:48:06
809-811に書き込んだんですが、教えていただけないでしょうか(;_;)
>>829 #include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
if(argc != 3){
puts("引数が正しくない");
exit(EXIT_FAILURE);
}
int p=-1, q=-1;
int r, m, n;
sscanf(argv[1], "%d", &p);
sscanf(argv[2], "%d", &q);
if(p<0 || q<0){
puts("引数が正しくない");
exit(EXIT_FAILURE);
}
m = p;
n = q;
while(n!=0){
r = m%n;
m = n;
n = r;
}
printf("%dと%dの最大公約数は%d\n", p, q, m);
return EXIT_SUCCESS;
}
>>835 宿題なら授業単元を書け。
業務課題なら会社名を晒せ。
838 :
829:2007/09/19(水) 12:09:42
結局提出できなくて謝って来たとかそんなんじゃねえ?
841 :
デフォルトの名無しさん:2007/09/19(水) 12:47:20
>837
>839
ありがとうございます!
授業単元とはどんなことを書けばいいですか?><
期限は設計が今日まで、コーディングは明日までになったので大丈夫なんです^^
授業名を書け
843 :
841:2007/09/19(水) 12:59:54
>>842 アルゴリズム研修課題
社員検索
テキストファイルに記述された社員情報を構造体配列に格納し、検索する
です!
学校の授業じゃねえなw
845 :
84:2007/09/19(水) 13:23:05
あ!研修です><
>業務課題なら会社名を晒せ。
>>809 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Data{ char id[5], name[21];};
int id_cmp(struct Data *x, struct Data *y){ return strncmp(x->id, y->id, 4);}
int search(struct Data data[], int n, char *id){
int i = 0, val;
while(i <= n)
if((val = strncmp(id, data[(i + n)/2].id, 4)) == 0) return (i + n)/2;
else if(val > 0) i = (i + n)/2 + 1;
else n = (i + n)/2 - 1;
return -1;
}
int main(int argc, char *argv[]){
FILE *fp;
struct Data data[20];
int i, j;
char id[5];
if(argc < 2) return fprintf(stderr, "usage : %s filename\n", argv[0]), 1;
if((fp = fopen(argv[1], "r")) == NULL) return perror(argv[1]), 1;
for(i = 0; i < 20 && fscanf(fp, "%s%s", data[i].id, data[i].name) == 2; i++) ;
if(i == 0) return fprintf(stderr, "data doesn't exist\n"), 1;
qsort(data, i, sizeof(struct Data), (int (*)(const void *, const void *))id_cmp);
for(j = 0; j < i; j++) printf("%s %s\n", data[j].id, data[j].name);
while(printf("search ? (y/n) "), scanf("%*[\t\n]"), getchar() == 'y'){
printf("id : "), scanf("%4s", id);
if((j = search(data, i, id)) >= 0) printf("%s %s\n", data[j].id, data[j].name);
else printf("%s doesn't exist\n", id);
}
return fclose(fp), 0;
}
848 :
841:2007/09/19(水) 14:04:22
会社名ってさらしていいものなんですか?><
でもどうしても1にんじゃできなくて力をかりたいんです><
晒すなよw
ニュースになるぞw
850 :
809:2007/09/19(水) 14:14:52
>>847さんありがとうございます!!これが809-811までのコーディングになるんですか?
すごいです!!
会社名はやっぱさらしちゃまずいですよね^^;
よかった☆
>でもどうしても1にんじゃできなくて力をかりたいんです><
 ̄ ̄
なんだ、日本人じゃないのか。
852 :
809:2007/09/19(水) 14:55:17
それミスっちゃったんです><
1人=1にんでお願いします☆
業務課題は基本的にスレ違い
しかし、研修やった上でこんな課題すら解けないヤツを雇ってる会社があわれだな
>>853 そんなもんじゃねえ?
大学生ですらろくにプログラムも書かずに就職する奴はいるし、ましてや高卒や専門は話にならんよ
それまでのプログラム経験がどうとかじゃなくて、研修受けてるのに課題が解けないのがまずいんだろ。
給料ドブに捨ててるみたいなもんだからな。
こりゃFizzBuzz解けないレベルかなぁ
無経験で就職なんて珍しくも無いが
プログラミングってダメな人は本当にダメだね
>>809 研修中に分からない事をさも分かるかのような顔をして
その場だけ切り抜けても後で自分を含め周囲も迷惑するだけ
しったかしておいて後で猛勉強するタイプでもなさそうだ
向いてないなら取り返しがつかなくなる前に早めに諦めたほうがいいよ
暇つぶし希望
>>809 このスレを見ている人は類似スレも見てるからね
>>858 20x20 ライフゲーム
画面の右端と左端、上端と下端は繋がっているものとする
1000世代まで標準出力に出力する
>>860 俺は
>>858ではないけど
それって球状になるんだよね?
あれ?ならないのか?
なってないようなきもするなw
>>861 三次元にするとトーラスになる
平たく言うとドーナツ型
ドーナツ型でもよさそう
[1] 授業単元: 暇つぶし
[2] 問題文(含コード&リンク):
整数の配列が与えられる。このとき、配列から隣り合う要素を
選ばないように要素を何個か選び、それらの積が最大になるようにせよ。
例:
[3,1,1,-4,1,5] → 15(3,5 を選んだ)
[3,1,1,-4,1,-5] → 60(3,-4.-5 を選んだ)
[3,-1,1,-4,1,5] → 20(-1,-4,5 を選んだ)
[3] 環境: お任せ
[4] 期限: 9月24日
[5] その他の制限: 他の課題を優先
>>862 あああああ
そっかwww
ドーナツ型になるよなw
ありがと。
>>864 #include<stdio.h>
#include<limits.h>
int array_check(int array[], int array_size, int current, int is_valid)
{
int a, b;
if(array_size<=0)
{
if(is_valid) return current;
else return INT_MIN;
}
a=array_check(&array[1], array_size-1, current, is_valid);
b=array_check(&array[2], array_size-2, current*array[0], 1);
return a>b?a:b;
}
int main(void)
{
int array[]={3, 1, 1,-4, 1, 5};
// int array[]={3, 1, 1,-4, 1,-5};
// int array[]={3,-1, 1,-4, 1, 5};
// int array[]={-1};
printf("%d\n", array_check(array, sizeof(array)/sizeof(array[0]), 1, 0));
return 0;
}
867 :
864:2007/09/19(水) 19:05:18
>>866 array の長さが30〜40くらいが限界かな?
暇があればもう少し効率の良いものを考えてみてください
( 入力例:
int array[100];
for (int i = 0; i < 100; ++i) array[i] = i % 4 - 2;
のとき 16777216 )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
static int cur[20][20], prev[20][20];
void print(void){
int i, j;
char *ele = " *";
system("CLS");
for(i = 0; i < 20; putchar('\n'), i++)
for(j = 0; j < 20; j++) putchar(ele[cur[i][j]]);
}
int get_sum(int i, int j){
return prev[(i + 19)%20][(j + 19)%20] + prev[(i + 19)%20][j] + prev[(i + 19)%20][(j + 1)%20]
+ prev[i][(j + 19)%20] + prev[i][(j + 1)%20]
+ prev[(i + 1)%20][(j + 19)%20] + prev[(i + 1)%20][j] + prev[(i + 1)%20][(j + 1)%20];
}
void rule(void){
int i, j, sum;
for(i = 0; i < 20; i++)
for(j = 0; j < 20; j++)
if((sum = get_sum(i, j)) >= 3 && prev[i][j] == 0) cur[i][j] = 1;
else if(prev[i][j] == 1 && (sum == 2 || sum == 3)) cur[i][j] = 1;
else cur[i][j] = 0;
}
int main(void){
int i, j;
for(i = 0; i < 20; i++) for(j = 0; j < 20; j++) prev[i][j] = rand()/(RAND_MAX + 1.0)*2;
for(i = 0; i < 2000; i++) rule(), print(), memcpy(prev, cur, sizeof(cur)), Sleep(10);
return 0;
}
>>868 if((sum = get_sum(i, j)) >= 3 && prev[i][j] == 0) cur[i][j] = 1;
↓
if((sum = get_sum(i, j)) == 3 && prev[i][j] == 0) cur[i][j] = 1;
じゃないかな?
知識のない状態で作ろうとするのが無理。作ろうとする努力はいいことだから
もうちょっと勉強してこよう
面目ございません
>>867 int array[200];
for (int i = 0; i < 200; ++i) array[i] = i % 4 - 2;
のとき 1073741824
で合ってる?
876 :
874:2007/09/19(水) 22:16:30
>>874 は間違ってたよ
オーバーフローしてた orz
878 :
874:2007/09/19(水) 22:28:03
>>867 int array[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; ++i) array[i] = i % 4 - 2;
とすると
ARRAY_SIZE=110 のとき 268435456
ARRAY_SIZE=120 のとき 1073741824
ARRAY_SIZE=130 のとき 4294967296
ARRAY_SIZE=140 のとき 17179869184
ARRAY_SIZE=150 のとき 274877906944
ARRAY_SIZE=160 のとき 1099511627776
ARRAY_SIZE=170 のとき 4398046511104
ARRAY_SIZE=180 のとき 17592186044416
ARRAY_SIZE=190 のとき 281474976710656
ARRAY_SIZE=200 のとき 1125899906842624
で合ってる?
879 :
デフォルトの名無しさん:2007/09/19(水) 23:16:32
それぞれの変数ポインタをつかいA Bを交換するプログラムを作成
#include<stdio.h>
int min()
int a=12, b=8,wrk,*p_a =&a,*p_b = &b,*p_wrk = &wrk:
ですここからわかりませんお願い致します
何だこの芸術的なプログラムは?
>>1を見て出直せ
void swap( int * a, int * b ) {
int temp;
temp=*a;
*a = *b;
*b = temp;
}
これをわかっている、というのが凄いw
このスレに居る誰一人として、
>>879のプログラムは判らんだろう。
おそらく
>>879は机上コーディング・机上実行なんだろうよ。
>>879が実行した気になればOKなんじゃね?
886 :
864:2007/09/20(木) 05:44:04
どこまでゆとれば気が済むんだ
889 :
874:2007/09/20(木) 09:32:30
>>890 int num[]={0,0,-3,1,-2};
とか
int num[]={-1,-1,3};
とか
>>874 だが
使うのは直前の 6 つの値だけだから
>>874 に計算の途中経過を保存するための配列はいらないのには同意
途中で計算が合ってるかどうか訳がわからなくなったから、すべて残しておいた
ちなみに
>>890 に
>>891 を入力すると
int num[]={0,0,-3,1,-2}; -> 0
int num[]={-1,-1,3}; -> -1
になるよ
そういう入力を考えなくても良ければ
>>874 ももう少しだけ簡単にできる
[1] 授業単元:趣味
[2] 問題文(含コード&リンク):与えられた行列Aが対角化できるか判定する。
対角化できる必要十分条件は一次独立な固有ベクトルがDim(A)個存在する事
[3] 環境:なんでも
[4] 期限: 無期限
[5] その他の制限:行列Aは配列でも構造体でも。
>>893 > テキストファイルから1行ずつ読み込み
1行の最大桁数が明示されていないのでオレには難しい
ってことで題意を無視してみた
#include <stdio.h>
int main(void){
int moji, is_top=1, count=0;
FILE *fp;
fp=fopen("4947.txt", "r");
if(fp==NULL) return 1;
while((moji=fgetc(fp))!=EOF){
if(is_top && moji=='a') count++;
is_top=0;
if(moji=='\n') is_top=1;
}
fclose(fp);
printf("%d\n", count);
return 0;
}
string使えよ・・・
>>894 「Numeical Recipes in C」っていう本ににあったような気がする
スペルミスがあるかも
Numerical Recipes だな
899 :
864:2007/09/20(木) 14:35:38
>>874 正解です。
>>890 未使用の場合の更新が落ちてるのだと。
以下は想定解です:
#include <cstdio>
using namespace std;
int main() {
const int n = 200;
double x[n];
for (int i = 0; i < n; ++i)
x[i] = i % 4 - 2;
double a = x[0], b = x[0], c = 1, d = 1;
for (int i = 1; i < n; ++i) {
double a_ = a, b_ = b, e = x[i];
a = max(a_, max(e*c, e*d));
b = min(b_, min(e*c, e*d));
c = max(c, a_);
d = min(d, b_);
}
printf("%.0f\n", a);
}
>>900 どこの学校か晒して欲しいね。
問題の権利は何かと面倒で、たとえば宿題にそのまんま
転用するのは色々と問題があるんだけどな。
ただ東京大学ってとこに噛みついとるだけちゃうかと
>>900 ググレカス
東大のwikiに載ってるよ。
本番でF問題解けなくて俺涙目。
転用っていうか公式じゃないの?
問題自体は公式だけれど、それを勝手に自校の宿題として
使っているようであれば問題だよ。
非公式の練習会くらいなら問題ないだろうけどさ。
>>906 UVA, PKU は ACM に許可を取ってるよ。
910 :
デフォルトの名無しさん:2007/09/20(木) 17:14:36
[1] 授業単元:プログラミング技術
[2] 問題文(含コード&リンク):四則(加減乗除)演算を関数としてもっているプログラム。
実数と整数の両方に対応し、式と結果を表示する。
[3] 環境
[3.1] OS:WindowsVista
[3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5
[3.3] 言語:C言語
[4] 期限:2007/09/27(木)
[5] その他の制限:関数,scanfを使います。
>>910 どんな形式の入力で、どんな結果を出せばいいんだ
>>912 いまのところACM/ICPCの問題では事例が無いけど
万が一ということが怖いのです。
ということで、例えば少しオフィシャルっぽい国内模擬練習会なんかは、
問題はすべてオリジナルで作り、類題がないこともチェックしてます。
(もちろん参加者にとって初見の問題にするという意味もあるんだけど)
>>912 宿題程度が槍玉にされることはあんまないだろ
でも正式な試験とかだと許可云々が厳しくなるな
横断歩道で信号無視してんのと車乗って信号無視してるくらいの違いになる
915 :
910:2007/09/20(木) 18:00:34
入力する値は2つで良いので、
入力=>a
加減乗除選択
入力=>b
a○b=c
みたいな感じでしょうか。
関数は4つ必要みたいです。
918 :
915:2007/09/20(木) 18:20:08
四則のいずれかを選択して、switch文で判断して関数を呼び出そうかと思ってます。
このあたりで苦戦中してます。
>>918 どうやって選択させるのかって聞いてるんだ
920 :
915:2007/09/20(木) 18:30:45
int x;
printf(1.+ 2.- 3.* 4./);
scanf("%d",&x);
switch(x){
case 1:
+の関数呼び出し
〜(case 4まで)
}
できるかわかりませんが、このような形です。
【質問テンプレ】
[1] 授業単元:コンピュータ2及び実習
[2] 問題文(含コード&リンク):次の問題を解くプログラムを書く
・ビリヤード台が置いてある
・台の左下端の座標は(0,0)、右上端の座標は(2,1)とする。
・位置(x0,y0)に手玉がある。
・手玉を諸速度(V0x,V0y)で突き出す。 ※手玉の位置、初速度はscanfを使って入力する。
○問題
・手玉はどこに衝突するか。(衝突位置の座標を表示する、20回のパンクを考慮して21箇所回答)
・ただし、ポケットに落ちることは考えない。
[3] 環境
[3.1] OS: Linux
[3.3] 言語: C
[4] 期限:特になし
[5] その他の制限:特になし
どこに向かって突くのか分からないから、レールにぶつかるとしか答えようがない
初期位置とベクトルを入力したとき、どこで跳ね返るかを求めるプログラムを書けってことだろ。
日本語読めるようになってから書き込めよ
じゃぁお前プログラム書いてやれよ。
ベクトルなんか書いてねーじゃん
どこ?どこに書いてあるの?
ねえ教えて?
早く!早く教えて?
どこに書いてあるのかな?
ん?恥ずかしがらないでいいから教えて?
ね、ね?
それともあぶり出しかな?
おーい、早くおしえてよ!
問題文が曖昧なことが多いなこのスレ
>初速度はscanfを使って入力する
って書いてあるのに
>どこに向かって突くのか分からないから
とかいう奴には、どんなに詳しく書いても曖昧だろw
>手玉を初速度(V0x,V0y)で突き出す
これがベクトルになるって話
ベクトルの意味わかってないんだろ。
わかるよ
要するに、第一象限くらいの話でしょ
二つの整数を読み込んで、後者が前者の約数かを表示するプログラムを表示しなさい。
等価演算氏や関係演算子が、1あるいは0の値を生成することを確認するプログラムを作成せよ。
整数地を読みこんで、その絶対値を表示しなさい。
ただ思うことは
>>921の台ってちいさすぎね?ww
なんでいきなり加速してんだ
恥ずかしいレスした奴が流そうと必死なのか?
1] 授業単元:C言語
[2] 問題文:
二つの整数を読み込んで、後者が前者の約数かを表示するプログラムを表示しなさい。
等価演算氏や関係演算子が、1あるいは0の値を生成することを確認するプログラムを作成せよ。
整数値を読みこんで、その絶対値を表示しなさい。
[3] 環境
[3.1] OS:windows
[3.2] コンパイラ名とバージョン: (bcc32)
[3.3] 言語: C
[4] 期限: (2007年9月22日まで)
[5] その他の制限:
1.二つの整数を読み込んで、後者が前者の約数かを表示するプログラム。
2.等価演算氏や関係演算子が、1あるいは0の値を生成することを確認するプログラム。
3.整数値を読みこんで、その絶対値を表示するプログラム。
943 :
912:2007/09/20(木) 20:17:18
>>913-914 レスサンクス。やんない方がいい事みたいだな。
これだけだとなんなので、
>>941の1つめ
#include <stdio.h>
int main(void){
int a,b;
printf("整数値を2つ入力して下さい>");
scanf("%d %d",&a,&b);
if(b!=0 && a%b==0){
printf("%dは%dの約数です。",b,a);
}else{
printf("%dは%dの約数ではありません。",b,a);
}
return 0;
}
>>941 > 等価演算氏や関係演算子が、1あるいは0の値を生成する
これってC的にはどうなの?
1って保証あったっけ?
aが0の場合、0以外のbが全部約数になるけど、いいんかね?
>>941 2つめ
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
printf("%d",(n>>(sizeof(n)*8-1))?~n+1:n);
return 0;
}
947 :
946:2007/09/20(木) 20:28:26
3つめだった
948 :
デフォルトの名無しさん:2007/09/20(木) 20:29:03
/*読み込んだ整数値の符号を判定*/
#include <stdio.h>
int main(void)
{
int no1,no2;
puts("二つの整数を入力してください。");
printf("整数1:"); scanf("%d",&no1);
printf("整数2:"); scanf("%d",&no2);
if(no2%no1)
puts("後者は前者の約数ではありません。");
else
puts("後者は前者の約数です。");
return (0);
}
>>944 疑問に思ったら仕様書を確認しような。以下 ANSI ISO/IEC 9899, 1999 から引用。
6.5.8 - 6
Each of the operator < (less than), > (greater than), <= (less than
or equal to), and >= (greater than or equal to) shall yield 1 if the
specified relation is true and 0 if it is false. The result has type int.
6.5.9 - 3
The == (equal to) and != (not equal to) operators are analogous to the
relational operators exept for their lower precedence. Each of the
operator yields 1 if the specified relation is true and 0 if it is false.
The result has type int. For any pair of operand, exactly one of the
relations is true.
>>941 二つ目
#include <stdio.h>
int main(void)
{
int i;
for(i=0; i<2; i++) printf("%d %d %d ", i == 0, i > 0, i < 1);
return 0;
}
/*1か0を生成*/
#include <stdio.h>
int main(void)
{
int no1;
printf("整数を入力してください。:");
scanf("%d",&no1);
if (no1 == 0)
puts("0");
else
puts("1");
return (0)
}
?
確実に0か1かを返すプログラムを提供してくれたんだと思うよ
>整数値を読みこんで、その絶対値を表示しなさい。
は、
-8とか-10と入力したら、
絶対値は、8です、とか10ですとか表示するプログラムのことです。
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
printf("絶対値は%dです", n < 0 ? -n : n);
return 0;
}
printf("%d",n>0?n:-n);
どっちでもいいだろ
958 :
デフォルトの名無しさん:2007/09/20(木) 21:10:38
【質問テンプレ】
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):int型で10個の要素を持つ配列に順次キーボードから整数を入力していく(入力データに関する
範囲チェックも行う)。10個の要素全てにデータを入力したら、配列の内容を降順にソートし、その内容を表示する。
また、10個の要素の合計、平均、最大値、最小値を求めて表示するプログラムの作成。
[3] 環境
[3.1] OS:(Windows Vista Business)
[3.2] コンパイラ名とバージョン:Microsoft Visual Studio 2005
[3.3] 言語: C
[4] 期限: ([2007年09月21日まで]
[5] その他の制限:
@配列に対する入力・出力は繰り返しのアルゴリズムで処理すること
A整数値しか入力されないものとし、入力データに大して「0以上かつ100以下」の範囲チェックを行う。
範囲外のデータが入力された場合はエラーメッセージを出力し、再入力を行う。
Bソートのアルゴリズムはfor文の2重ループで処理すること
C平均は小数点以下2桁で表示し、合計、平均、最大値、最小値は小数点の位置を合わせて表示する
書き込みのタイミングが遅れただけなんだけど?
960 :
デフォルトの名無しさん:2007/09/20(木) 21:11:15
【質問テンプレ】
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
以下の実行結果を表示するプログラムの作成
[実行結果]
国語 数学 英語 | 合計
-------------------+------
55 67 75 | 197
30 41 55 | 126
90 85 88 | 263
77 75 72 | 224
95 65 89 | 249
[3] 環境
[3.1] OS:(Windows Vista Business)
[3.2] コンパイラ名とバージョン:Microsoft Visual Studio 2005
[3.3] 言語: C
[4] 期限: ([2007年09月20日まで]
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
あらかじめ以下の二次元配列を定義しておくこと
int ten[5][3] = {
{55,67,75}
{30,41,55}
{90,85,88}
{77,75,72}
{95,65,89}
};
961 :
デフォルトの名無しさん:2007/09/20(木) 21:12:42
【質問テンプレ】
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
半角英数字を一文字入力し、入力された英字で始まる曜日を検索して表示するプログラム
[3] 環境
[3.1] OS:(Windows Vista Business)
[3.2] コンパイラ名とバージョン:Microsoft Visual Studio 2005
[3.3] 言語: C
[4] 期限: ([2007年09月20日まで]
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
@あらかじめ以下の二次元配列を定義しておく
char week[7][10] = {
"Sunday"
"Monday"
"Tuesday"
"Wednesday"
"Thursday"
"Friday"
"Saturday"
};
A入力された文字で始まる曜日がなければ「頭文字が一致する曜日はありませんでした」と表示する。
B入力された文字で始まる曜日があれば「頭文字が一致するのは以下の通りです」と表示し、
その次の行から頭文字が一致する曜日を全て表示する。
962 :
デフォルトの名無しさん:2007/09/20(木) 21:16:05
【質問テンプレ】
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
金額を入力し、入力された金額の金種計算を行うプログラムの作成
[実行結果]()内はキーボードから入力
金額を入力:(10000000)
金額は「1〜9999999」の範囲で入力してください
金額を入力:(38999)
金種計算
------------------
10000 | 3
5000 | 1
2000 | 1
1000 | 1
500 | 1
100 | 4
50 | 1
10 | 4
5 | 1
1 | 4
[3] 環境
[3.1] OS:(Windows Vista Business)
[3.2] コンパイラ名とバージョン:Microsoft Visual Studio 2005
[3.3] 言語: C
[4] 期限: ([2007年09月20日まで]
[5] その他の制限:@金種計算で必要な配列データは各自で最適だと思うものを用意する
963 :
デフォルトの名無しさん:2007/09/20(木) 21:17:21
【質問テンプレ】
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
万年カレンダー(グレゴリオ暦)を表示するプログラムの作成
[実行結果]()内はキーボードからの入力
万年カレンダー
年を入力:(12345)
年は「1〜9999」の範囲で入力してください。
年を入力:(2006)
月を入力:(15)
月は「1〜12」での範囲で入力してください。
月を入力:(11)
2006年11月のカレンダー
----------------------------
sun mon tue wed thu fri sat
----------------------------
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
----------------------------
964 :
デフォルトの名無しさん:2007/09/20(木) 21:19:12
[3] 環境
[3.1] OS:(Windows Vista Business)
[3.2] コンパイラ名とバージョン:Microsoft Visual Studio 2005
[3.3] 言語: C
[4] 期限: ([2007年09月20日まで]
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
グレゴリオ暦の規則
@ 西暦の年数が4で割り切れ、かつ100で割り切れない年を閏年とする。
A 西暦の年数が400で割り切れる年も閏年とする。
B 西暦1年1月1日を月曜日とする
カレンダーに必要な配列データなどは各自で最適だと思うものを用意すること
なんか一気に来た
>>962 #include<stdio.h>
int main(void){
int a[]={10000,5000,2000,1000,500,100,50,5,1};
int y,i;
while(1){
printf("金額を入力:");
scanf("%d",&y);
if(y<1||y>9999999)
printf("金額は「1〜9999999」の範囲で入力してください\n");
else
break;
}
printf("金種計算\n------------------\n");
for(i=0;i<9;i++){
printf("%5d | %d\n",a[i],y/a[i]);
y%=a[i];
}
return 0;
}
新学期始まったんだなw
>>963 #include<stdio.h>
int f(int y,int m,int d){
if(m<3) y--,m+=12;
return y*365+y/4-y/100+y/400+(m+1)*306/10+d-428;
}
int main(void){
int y,m,d;
printf("万年カレンダー\n");
//グレゴリオ暦は1582年10月15日から
while(1){
printf("年を入力:",y); scanf("%d",&y);
if(y<1||y>9999) printf("年は「1〜9999」の範囲で入力してください。\n");
else break;
}
while(1){
printf("月を入力:",m); scanf("%d",&m);
if(m<1||m>12) printf("月は「1〜12」での範囲で入力してください。\n");
else break;
}
printf("\n%d年%d月のカレンダー\n----------------------------\n"\
" sun mon tue wed thu fri sat\n----------------------------\n",y,m);
for(d=0;d<f(y,m,1)%7;d++) printf(" ");
for(d=1;d<=f(y,m+1,1)-f(y,m,1);d++){
printf("%4d",d);
if(f(y,m,d)%7==6) printf("\n");
}
printf("\n----------------------------\n");
return 0;
}
969 :
デフォルトの名無しさん:2007/09/20(木) 22:32:02
1] 授業単元:C言語
[2] 問題文:
最初300個ある商品が、毎日何個かランダムに減っていき、
残り75個になったら、その3日後に250個たされるプログラムを作りなさい。
[3] 環境
[3.1] OS:windows
[3.2] コンパイラ名とバージョン: (bcc32)
[3.3] 言語: C
[4] 期限: (2007年9月22日まで)
[5] その他の制限:
よろしくお願いします。
減り幅限定しないのか?
971 :
969:2007/09/20(木) 22:35:44
>970
すいません減り幅は、0〜50です。
よろしくお願いします。
75個未満はいいのか?
973 :
969:2007/09/20(木) 22:39:59
>972
何度もすいません。
75個以下になったらです。
デバッグに3日以上かかるがいいのか?
975 :
969:2007/09/20(木) 22:48:37
>974
できるだけ早くお願いしたいんですけど。。。
終了条件ないと永遠に終わらないんだけど。
977 :
969:2007/09/20(木) 22:54:20
>976
そのとおりですね。
5回250個足したら終了でお願いします。
問題文
最初300個ある商品が、毎日何個かランダムに減っていき、
残り75個になったら、その3日後に250個たされるプログラムを作りなさい。
すいません減り幅は、0〜50です。
75個以下になったらです。
単語の抽出
最初 300個 商品 毎日 何個 ランダム
残り 75個 3日後 250個
減り幅 0〜50
75個以下
乱数の精度は?
980 :
969:2007/09/20(木) 23:11:51
>979
0〜50の間であればいいんですけど。。。
>>969 #include<stdio.h>
#include<stdlib.h>
int main(void)
{
int num, prev_num, dec_num, inc_times=0, inc_day=0, day;
num=prev_num=300;
for(day=1;inc_times<3;day++)
{
if(day==inc_day) num+=250, inc_times++;
dec_num=rand()%51;
if(dec_num>num){
printf("\n!!!%d 日目に商品が %d 個不足しました!!!\n", day, dec_num-num);
dec_num=num;
}
num-=dec_num;
if(num<=75 && day>=inc_day) inc_day=day+3;
printf("%2d日目 商品数:%3d->%3d %+4d\n", day, prev_num, num, num-prev_num);
prev_num=num;
}
return 0;
}
>>981 の訂正
for(day=1;inc_times<3;day++)
↓
for(day=1;inc_times<5;day++)
>>937 これも酷いな……。
こっちまでブルーになる。
2×3=6ドットしかないのか
単位がmなら何も不思議じゃない
C#の問題は書いていいの?
C#の問題といてくれるスレはないの?
無いよ
自分でやれカス
無いよ
>>961 #include<stdio.h>
main(){
int ten[5][3] = {
{55,67,75}
{30,41,55}
{90,85,88}
{77,75,72}
{95,65,89}
};
printf("国語 数学 英語 | 合計 \n"
"-------------------+------ \n"
"55 67 75 | 197 \n"
"30 41 55 | 126 \n"
"90 85 88 | 263 \n"
"77 75 72 | 224 \n"
"95 65 89 | 249 \n"
);
}