・情報の後だしはやめましょう。
・解答をもらったら、反応してあげると解答者も大喜びです。人間だもの。
・テンプレは仕様書のようなもんで、フォーマットを守りましょう。しかし、必要な情報は漏らさないようにね。
・
>>1 乙
3 :
デフォルトの名無しさん :2009/06/08(月) 18:30:59
C言語 で特定の関数が返す値を表示させるには? testpg() があり、これは、ファイルをスキャン(日付の更新を確認するプログラムです。) コマンドライン上から、#testpg file として、使用します。 このプログラムは、スキャンして日付の更新があれば、1を返し、なければ、7を返します。 さて、Cのプログラムで、この7という帰り値を表示させたいのですが、どういうプログラムを書いてやればいいでしょうか?
cin、coutを使う使わないも、入れた方がいいかもね
なんでC言語とC++を別々のスレッドにしないの。
[1] 授業単元: [2] 問題文(含コード&リンク): 下記の実行結果になるプログラムを作成 abc + cba = 1333となるa,b,cを求めるプログラム 変数は下記を使用 int a ←ループカウンタ int b ←ループカウンタ int c ←ループカウンタ 【実行結果】 3桁の数字の2つの和が1333になるパターンを表示 419+914=1333 518+815=1333 617+716=1333 716+617=1333 815+518=1333 914+419=1333 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: [3.3] 言語:C [4] 期限: 今日中 [5] その他の制限: 三重for文を使用 よろしくお願いします
軽く疑問なんだけど、
>>8 みたいなパズル性の高い問題(難易度が高いって意味じゃないよ)ができるからって、それって実際にプログラム関連の業務に役立つの?
引き出しが多くなることはいいことだ 頭が柔軟なことはいいことだ レベル
13 :
デフォルトの名無しさん :2009/06/08(月) 19:53:31
>>8 #include<stdio.h>
int main(void){
int a=1,b=1,c=1,d,e;
for(a=1;a<=9;a++){
for(b=1;b<=9;b++){
for(c=1;c<=9;c++){
d=100*a+10*b+c;
e=a+10*b+100*c;
if(d+e==1333){
printf("%d+%d=%d\n",d,e,d+e);
}
}
}
}
return 0;
}
>>12 やっぱりそうなんだ
ところで
>>8 くらいだと現役のプログラマの人なんかみんな一瞬でできちゃったりするもんなの?
15 :
デフォルトの名無しさん :2009/06/08(月) 19:59:53
>>8 はa,b,c以外の変数作っちゃいけないのかな
ならこれで
#include<stdio.h>
int main(void){
int a,b,c;
for(a=1;a<=9;a++){
for(b=1;b<=9;b++){
for(c=1;c<=9;c++){
if((100*a+10*b+c)+(a+10*b+100*c)==1333){
printf("%d%d%d+%d%d%d=1333\n",a,b,c,c,b,a);
}
}
}
}
return 0;
}
>>前974 >>前980 nCnでオーバーフローするから。 int combination(int n,int r){ int a; a=n-r, if(a==0) a=1;
18 :
デフォルトの名無しさん :2009/06/08(月) 20:41:04
>>17 オーバーフローじゃなくてゼロ除算だろ
直すべきはfactorial
int factorial(int x){
int i, f=1;
for(i=x; i>=1; --i) f *= i;
return f;
}
20 :
デフォルトの名無しさん :2009/06/08(月) 20:57:40
>>18 #include <stdio.h>
int capital = 0;
int lower = 0;
int number = 0;
int other = 0;
void count(int c)
{
if ('A' <= c && c <= 'Z') capital++;
else if ('a' <= c && c <= 'z') lower++;
else if ('0' <= c && c <= '9') number++;
else other++;
}
void print(void)
{
int i;
printf("capital : "); for (i = 0; i < capital; i++) printf("*"); printf("\n");
printf("lower : "); for (i = 0; i < lower; i++) printf("*"); printf("\n");
printf("number : "); for (i = 0; i < number; i++) printf("*"); printf("\n");
printf("other symbol: "); for (i = 0; i < other; i++) printf("*"); printf("\n");
}
int main()
{
int c;
while ((c = getchar())!=EOF) count(c);
print();
return 0;
}
棒グラフにするなら、起点は揃えたいな
>>22 こんな感じで。動作は保障しない。今回は読み違いしてないといいが。。。
#include <stdio.h>
int main(){
int i=0,n=0,sum=0;
puts("どんどん整数を入力してね♪(ただし、-9999で終了)");
do{
printf("%d回目:",i+1);
scanf("%d",&n);
if(n == -9999) break;
sum+= n;
i++;
}while(1);
printf("合計:%d\n",sum);
printf("平均:%.2f",i==0 ? 0.0:sum/i);
return 0;
}
sum/iのところdoubleにキャストしなきゃだね
27 :
23 :2009/06/08(月) 22:00:00
あら、抜けがあったか。申し訳ない。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): クイックソート、バブルソート、選択ソートの三種のソート関数 それぞれ、void qusort(int[]), busort(int[]) sesort(int[]),を作れ。 並び順は、降順。ソートした結果は引数配列と同じ配列に返してやる。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C (ただし、C++コンパイラ互換コード) [4] 期限: ([2009年06月14日まで] [5] その他の制限: qsort()などの常にあるソート関数は使わない よろしくおねがいします。
"組", 名前,数字,数字, 名前,数字,数字, 名前,数字,数字, "組", 名前,数字,数字, 名前,数字,数字, 名前,数字,数字, みたいな感じで一塊になってる部分が連続してるファイルを読み込んで処理したいのですが fscanfで名前,数字,数字,の部分を処理するプログラムはできたのですが"組"の部分はどういう感じでやればよいのですか? fscanfだと型が合ってないと無限ループになるので"組"の行を読み込んですんなりと下の行に行くやり方がわかりません
>>29 fgets で一行読む
sscanf の返値でフォーマットチェックする
こんな時に正規表現があれば・・・!
C/C++って文字列がどんどん足されていくみたいな感じでしたっけ?何か関数を使わないといけませんか?
strcopyか
>>30 この場合ってもし返り値が同じだったらどうすれば良いんですかね?
>>9 ・while(EOF == iKara)をwhile(EOF != iKara)に修正
while(EOF == jKara)をwhile(EOF != jKara)に修正
・トランザクションに同じコードがある場合ループでi++をl++に修正
・&dを%dに修正
&sを%sに修正
・fprintfに改行"\n"をつける
・実行例のマスタで社員番号を全角→半角に修正、全角空白を半角に修正
でとりあえず出力はされる
[1] 授業単元:Linux
[2] 問題文(含コード&リンク):
サンプルコード
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9385.txt に手を加え、パス検索機能を追加する。
例えば、/bin/ls と入力することで動いていたが、lsだけで実行可能とする。
>ls
>ls?r
>date?I
>gcc-oexp1exp1.c
>./exp1
>./exp1 1 この6つのコマンドを実行し、実行結果を提出する。
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語:C
[4] 期限: 明日中にはお願いします。
[5] その他の制限: わかりやすい内容でお願いします。
>>39 35行目を修正でいいんじゃない?
35c35
< if(execv(argv[0],argv[])==(-1)){
---
> if(execvp(argv[0],argv)==(-1)){
関数 execlp() と execvp() は、指定されたファイル名がスラッシュ (/) を含んでいない場合、シェルと同じ動
作 で実行可能なファイルを探索する。検索パスは環境変数 PATH で指定されたパスである。
>>41 ウホッ!
約10KBの構造体をそのまま関数引数や戻り値にするところが豪気だねw
でもプログラムはすごくわかりやすくて性格のいい人が書いたのではという
印象を持った。
>>39 whileの中の
p=(char *)&command;
がかなりヤバげに見えるんだが。
キャストもアンドもいらない。
>>41 i[n]に0〜9でなく0〜99を割り当てたら、効率良くね?
>>44 >>41 が実装したのはBCD
それじゃただの多倍長
効率はいいが実装が面倒、特に除算
階乗を使う、とかいう糞縛りがなければnCrの答えはパスカルの三角形をDPで作った方が速い
多倍長演算の肝は、自然数をどう表現するか。 自然数 10000を10進で表現するか、16進で表現するか。2進で表現するか。または1234進数とか その解釈で色々と実装が変わってくる。 PCは2進が効率良いから2進がベーすで、人がわかりやすいようにバイトで数字を表記する。
47 :
46 :2009/06/09(火) 00:25:12
BCDぐぐってみた。 こういう表現もあるんだねぇ。
BCDは通常、頻繁にそれを文字?(????表現)に直すニーズが ありながらも、???な計算が必要な(もっぱら??関係)用途に 用いられる。桁数が?えるとそれを???に変換する処理コストは バカにならない。???に直すのに便利な形式が取られるのが普通。 なんで殆どの場合??のベキ乗進法が取られる。
49 :
39 :2009/06/09(火) 01:15:05
>>40 execvpとしてみたのですが、
>gcc -o exp1 exp1.cでとても長いエラーが出力されます。
テストですので、hello worldで普通に実行できましたのでソースが悪い訳じゃないと思います。
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 姓,名,年齢,郵便番号,電話番号の各データをメンバとする構造体配列を下記のように宣言し その構造体配列にキーボードからデータを逐次入力して,最大100名のデータを格納できるようにしなさい。 但し,入力の終了は,姓入力の際にnullと入力することによって判定しなさい。 また,入力が終了した時点で,格納された複数名のデータをすべて出力するようにしなさい。 #define MAXREC 100 struct namelist { char last_name[21], first_name[21]; int age; char zip[9], tel[13]; } meibo[MAXREC]; また、入力が終了した時点で,格納された複数名のデータを郵便番号順に出力するようにプログラムを変更しなさい。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6月9日23:59 [5] その他の制限:特になし
51 :
デフォルトの名無しさん :2009/06/09(火) 01:32:42
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 共用体を用いて、2バイト整数の上下バイトを入れ換えて暗号化する関数 short encode(short)を作り キーボードから入力した整数を暗号化/復号化するプログラムを作りなさい [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限:6月10日 [5] その他の制限: main関数の部分は次のコードを用いなさい。 short encode(short); main() { int n, m, k; while (1) { printf("整数を入力して下さい(終了は0) = "); scanf("%d", &n); if (n == 0) break; m = encode(n); /* 暗号化 */ printf("\n\t%d を暗号化すると %d になります。\n", n, m); k = encode(m); /* 復号化 */ printf("\n\t%d を復号化すると %d になります。\n\n", m, k); } }
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 整数係数の多項式について,その次数と係数をキーボードから入力して連結リストに格納し 次に格納された多項式を画面に出力する。 そして、xの実数値をキーボードから入力して多項式の値を求めるプログラムを作れ。 出力例 整数次数の多項式を入力します! 最大次数を入力してください:5↵ 小さい次数から整数係数を順に入力してください X^0の整数係数:-1↵ X^1の整数係数:2↵ X^2の整数係数:3↵ X^3の整数係数:0↵ X^4の整数係数:0↵ X^5の整数係数:-1↵ 多項式は次の通り -X^5+3X^2+2X-1 Xの値を入力してください:0.8↵ 多項式の値は 2.192320 です [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限:6月10日 [5] その他の制限: なし
54 :
◆N8hH7z85ug :2009/06/09(火) 04:25:21
>>49 何故かgcc固有のインクルードパスを無効と判定するみたい。
-vで出力みると違いがでるね。
原因とか回避方法はわからない。宿題テーマとは離れてしまうかも?
>>54 #include <stdio.h>
int is_non_wordc(int c)
{
if (0x30 <= c && c <= 0x39) /* 数字 */
return 0;
if (0x40 <= c && c <= 0x5a) /* 大文字英字 */
return 0;
if (0x61 <= c && c <= 0x7a) /* 小文字英字 */
return 0;
return 1;
}
int main(void)
{
char word[100];
int i = 0, c;
while ((c = getchar()) != EOF) {
if (!is_non_wordc(c)) { word[i++] = c; }
else { word[i] = '\0'; if (i != 0) printf("%s\n", word); i = 0; }
}
return 0;
}
fscanfの引数の場合分けがうまくいかないんだけどどうして? 引数がfloatとcharで20こあって"%d%f・・・・・",hairetu,&suuji・・・・とあるんだけど返り値=1にした時しかうまくいかない switchにしてcase20はおkだけどcase 2とかdefaultにはcaseが正しくありませんってなる
62 :
デフォルトの名無しさん :2009/06/09(火) 15:03:43
65 :
デフォルトの名無しさん :2009/06/09(火) 15:50:26
>>62 #include <iostream>
using namespace std;
template<class T, int N> class Counting {
T* array_;
public:
Counting(T* Array) { array_ = Array; }
T sum()
{
T result = 0; for (int i = 0; i < N; ++i) result += array_[i];
return result;
}
T ave() { return sum() / N; }
void modify(int index, T value) { array_[index] = value; }
};
int main()
{
const int s1 = 5, s2 = 3;
int a[s1] = { 1, 2, 3, 4, 5 };
Counting<int, s1> ca(a);
cout << ca.sum() << " " << ca.ave() << "\n";
ca.modify(2, 10);
cout << ca.sum() << " " << ca.ave() << "\n";
double b[s2] = { 1.2, 2.5, 3.5 };
Counting<double, s2> cb(b);
cout << cb.sum() << " " << cb.ave() << "\n";
cb.modify(1, 4.8);
cout << cb.sum() << " " << cb.ave() << endl;
return 0;
}
67 :
66 :2009/06/09(火) 15:52:06
解決済みでしたね。ごめんなさい。
>>051 unionを使った暗号化と複合化。
#include <stdio.h>
short encode(short);
main()
{
int n, m, k;
while (1) {
printf("整数を入力して下さい(終了は0) = ");
if(scanf("%d", &n) != 1) { scanf("%*s"); continue; }
if (n == 0) break;
m = encode(n); /* 暗号化 */
printf("\n\t%d を暗号化すると %d になります。\n", n, m);
printf("\n\t0x%04hx を暗号化すると 0x%04hx になります。\n", n, m);
k = encode(m); /* 復号化 */
printf("\n\t0x%04hx を復号化すると 0x%04hx になります。\n", m, k);
printf("\n\t%d を復号化すると %d になります。\n\n", m, k);
}
}
short encode(short data) {
union {
short sdata;
struct {
char cdata1, cdata2;
} c;
} u;
char tmp;
u.sdata = data;
tmp = u.c.cdata1, u.c.cdata1 = u.c.cdata2, u.c.cdata2 = tmp;
return u.sdata;
}
69 :
デフォルトの名無しさん :2009/06/09(火) 16:59:14
70 :
デフォルトの名無しさん :2009/06/09(火) 18:18:19
1] 授業単元: c++ [2] 1次元配列a[1]〜a[10]の各要素に任意の数値を格納した後すべて加算した合計値を表示せよ。 [3] 環境 [3.1] OS: XP [3.2] turbo c [3.3] c++ [4] 今週金曜日まで。 [5] まだ習いはじめて一年なのでそんなには進んでません。
71 :
66 :2009/06/09(火) 18:25:46
>>70 #include <iostream>
using namespace std;
int main()
{
double a[11];
a[0] = 0;
for (int i = 1; i <= 10; ++i) {
cout << "input a[" << i << "] > ";
cin >> a[i];
a[0] += a[i];
}
cout << "total: " << a[0] << endl;
return 0;
}
72 :
デフォルトの名無しさん :2009/06/09(火) 18:27:21
73 :
デフォルトの名無しさん :2009/06/09(火) 18:29:51
74 :
デフォルトの名無しさん :2009/06/09(火) 19:43:45
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):最大256文字の文字列を入力し、単語数を出力しなさい。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6月11日 8:00 [5] その他の制限:最大256文字の文字列を引数とし、最初の単語の文字数を返す関数を作成し、それを用いる。
>>75 #include <stdio.h>
#include <math.h>
int main(void)
{
int fst;
int scond;
int n;
long ans;
puts("2つの整数を入力してください。");
printf("1個目 : "); scanf("%d", &fst);
printf("2個目 : "); scanf("%d", &scond);
do {
printf("選択してください。【 加算 =>0,減算 =>1,乗算 =>2,余り =>3,除算 >=4,べき乗 =>5 】"); scanf("%d", &n);
switch (n) {
case 0: ans = fst + scond; break;
case 1: ans = fst - scond; break;
case 2: ans = fst * scond; break;
case 3: if (scond != 0) ans = fst % scond; else { puts("0で除算できません!"); return 1; } break;
case 4: if (scond != 0) ans = fst / scond; else { puts("0で除算できません!"); return 1; } break;
case 5: ans = (long)pow(fst, scond); break;
default: puts("入力値エラー 0〜5までの数字を入力してください。");
}
} while (n < 0 || n > 5);
printf("答えは%dです。", ans);
return 0;
}
78 :
デフォルトの名無しさん :2009/06/09(火) 20:38:03
1] 授業単元: c++ [2] 1次元配列a[1]〜a[10]の各要素に任意の数値をキーボードから格納した後、偶数値のみ表示しろ [3] 環境 [3.1] OS: XP [3.2] turbo c [3.3] c++ [4] 今週金曜日まで。
>>78 #include <iostream>
int main()
{
int a[11];
for (int i = 1; i < 11; ++i) {
std::cout << "a[" << i << "]: "; std::cin >> a[i];
}
std::cout << "---- even number ----" << '\n';
for (int i = 1; i < 11; ++i) {
if (a[i] % 2 == 0) std::cout << "a[" << i << "]: " << a[i] << '\n';
}
std::cout << std::endl;
return 0;
}
81 :
54 ◆N8hH7z85ug :2009/06/09(火) 20:57:11
>>57 ありがとうございます
ですがget_word()という関数を作り、関数ungetc()も使ってmain関数を
int main(void)
{
char word[100];
int c;
while( (c = getchar()) != EOF ) {
if( is_non_wordc(c) == 0 ) {
ungetc(c, stdin);
get_word(word);
printf("%s\n", word);
}
}
return(0);
}
のようにしたいのですが
期限は少し遅れても大丈夫なので
>>54 を再度よろしくお願いします
>>81 main()は絶対そうじゃないとダメなの?
それ絶対あってる?
素人の俺も問題に挑戦しても良い? 間違ってる可能性大なんですが、可能なら答え合わせをして欲しい。
84 :
54 ◆N8hH7z85ug :2009/06/09(火) 21:13:54
>>82 はい
指定されました
main関数はコピペしたのですがどこかおかしいでしょうか
私もis_non_wordcに渡すのは&cなのではないか?と思ったのですがここでしょうか
練習をかねてやってる人多いから全然構わないよ 間違っててもそんなの気にする人いない
>>84 >私もis_non_wordcに渡すのは&cなのではないか?と思ったのですがここでしょうか
そこじゃない。
・ungetc()が意味分からん
・get_word()にwordだけ渡していったいどうしろというんだ
と書いているうちにちょこっと思いついたからコンパイルしてみる。
87 :
デフォルトの名無しさん :2009/06/09(火) 21:25:12
>>80 ありがとうございます。
std::cout << "a[" << i << "]: "; std::cin >> a[i];
}
std::cout << "---- even number ----" << '\n';
はまだならっていないのでscanfなどを使ったものに置き換えられないでしょうか?
判定に使ったcを戻して、それ先頭にwordに読みこんでくんだろ
>>83 容赦ない突っ込み入る事もあるよ。
特にgetsとかw
int get_word(char *p) { int i, ch; for(i=0; !is_non_word(ch=getchar()); i++) p[i] = ch; p[i] = '\0'; return i; }
>>87 条件付け足すくらいなら詳細なテンプレと分かりやすい問題文に書き直してくれ
for(int i;;) を習っていないので、とか言われたらC89仕様に直す手間がかかる
>>78 は出力フォーマットが不明でどうコーディングしていいか分からない
92 :
デフォルトの名無しさん :2009/06/09(火) 21:40:26
そういうつっこみって現場でもそうなのか揚げ足取りなのかどうなのよ?
>>87 c++ じゃないのか? cなのか?
>[3.3] c++
//#include <iostream>
#include <stdio.h>
int main()
{
int i;
int a[11];
for (i = 1; i < 11; ++i) {
// std::cout << "a[" << i << "]: "; std::cin >> a[i];
printf("a[%d]: ", i); scanf("%d", &a[i]);
}
// std::cout << "---- even number ----" << '\n';
printf("---- even number ----\n");
for (i = 1; i < 11; ++i) {
if (a[i] % 2 == 0)
// std::cout << "a[" << i << "]: " << a[i] << '\n';
printf("a[%d]: %d\n", i, a[i]);
}
// std::cout << std::endl;
printf("\n");
return 0;
}
94 :
54 ◆N8hH7z85ug :2009/06/09(火) 21:46:21
情報の小出しになってしまってすみません 関数get_word()についてのフローチャートがあったのですが、うまくフローチャートを書く自信が無かったのと、ここの皆さんなら理解してくれるだろうと思い込み勝手に省略してしまいました すみません うまく書けるかどうか分かりませんがこんな感じです ・関数get_word()についてのフローチャート 単語切り出し get_word() ↓★ c = getchar() ↓ 文字cはEOF? →yesの場合'\n'を末尾に付加→関数終了 ↓no 文字cは単語文字? is_non_wordc() →noの場合'\n'を末尾に付加→関数終了 ↓yes 文字cを格納 ポインタ処理 カウンタ処理 ↓ ★の部分に戻る 全体構成についてのフローチャートもありましたがこれはmain関数を見てもらえは分かると思います 必要なら書きますので宜しくお願いします
96 :
83 :2009/06/09(火) 21:50:54
>>74 に挑戦したけど結局できなかった・・・
>>89 getsでつまずきましたw
int first_word_len(char s[256]) {
int len = 0, i;
for (i=0; s[i]; i++) {
if (len && s[i] == ' ') break;
len++;//先頭の空白もカウント
}
return len;
}
int word_cnt(char s[256]) {
int cnt = 0, word_len, total_len; char temp[256];
strcpy(temp, s);
while (1) {
word_len = first_word_len(temp);
if (word_len) {
total_len += word_len;
memset(temp, '\0', 256);
memcpy(temp, &s[total_len], 256 - total_len);
cnt++;
} else { break; }
}
return cnt;
}
int main() {
int cnt;
//getsで受け取ると失敗する
//char s[256]; gets(s);
char s[256] = "Hello World word3 word4 word5";
cnt = word_cnt(s);
printf("cnt: %d\n", cnt);
}
>>87 #include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
using namespace std;
struct odd : public unary_function< int, bool > {
result_type operator() ( const argument_type& i ){
return i % 2 == 1;
}
};
int main() {
vector< int > v;
copy( istream_iterator< int >( cin ), istream_iterator< int >(), back_inserter( v ) );
remove_copy_if ( v.begin(), v.end(), ostream_iterator< int >( cout, " " ), odd() );
return 0;
}
98 :
54 ◆N8hH7z85ug :2009/06/09(火) 22:15:44
>>83 問題を解くのはダレの迷惑にもならないし、能力アップにはもってこい。
発表するかは君しだい。がんばってくれ。
100 :
83 :2009/06/09(火) 22:31:38
どうでもいいと思うが修正しました
int first_word_len(char s[256])
{
int len = 0, i = 0;
while (s[i] == ' ')
{
len++;
i++;
}
for (; s[i]; i++)
{
if (s[i] == ' ') break;
len++;
}
return len;
}
>>99 頑張ります!
I'mの単語数っていくつなんかねぇとか、20-years-oldは1単語なのか?とか、 Yes, I do.の", "の部分が単語の長さを返す関数だときれいに処理できないよなぁとか、 色いろ考えてやめた。色いろ考えるのは楽しかったw
>>74 >>96 で?
>>100 は何の修正?コメントがないよ。
#include <stdio.h>
int word_len(char *s) {
int i;
for (i=0; s[i] != '\0' && s[i] != '\n'; i++) {
if (i != 0 && s[i] == ' ') break; // 単語の前の空白は1個のみ可。それ以上は1単語。
}
return i;
}
int word_cnt(char *s) {
char *temp = s;
int cnt, len;
for (cnt = 0; len = word_len(temp); cnt++) {
temp += len;
}
return cnt;
}
int main() {
char s[256+2] = "Hello World word3 word4 word5";
fgets(s, 256+2, stdin); // 256+'\n'+'\0'
printf("word cnt: %d\n", word_cnt(s));
}
103 :
デフォルトの名無しさん :2009/06/09(火) 23:04:56
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9401.txt[3] 環境
このプログラムのvoidポインタなどを参考にする。
まず、int ,char,long,float型どれを入力するか決め、その型の値を入力(このプログラムと同じような形で入力)
値表示して、その値のアドレスを入力。そのあと、残りの3つの型で出力する。
例 int ,123を入力
Printing int 123
Printing data at location: 01D70C44(アドレス)
Data as char :
Data as int : 123
Data as long : 8069185
Data as float : 0.00
(それぞれの型に応じた出力)
[3.1] OS Windows
[3.2]VisualC++
[3.3] 言語 C
[4] 期限:6月11日
[5]
>>前863 1〜256文字の文字列を入力し、その単語数を出力する。 #include <stdio.h> int word(char *s) { // 先生>ここから、 int size = 0; while(*s && *s != '\n') { if(*s++ == ' ') break; // 先頭の空白を含まない長さ。 size++; } return size; } // 先生>ここまでは、変更しない事。 int word_cnt(char *s) { char *temp = s; int cnt, len; for (cnt = 0; len = word(temp); cnt++) { temp += len + 1; // 後尾の空白を1個のみと仮定する。 } return cnt; } int main() { char s[256+2] = "Hello World word3 word4 word5"; fgets(s, 256+2, stdin); // 256+'\n'+'\0' printf("word cnt: %d\n", word_cnt(s)); }
106 :
デフォルトの名無しさん :2009/06/09(火) 23:16:18
108 :
83 :2009/06/09(火) 23:46:12
>>102 >>100 の修正は単語前の空白を複数許可に変更しました
memcpyとかめちゃめちゃ無駄なことをしてたんですね。
>>102 の temp += len; の行で完全に濡れた。ポインタでなおしてきます・・
動作は保障しないの人今日も頑張ってるのか
112 :
デフォルトの名無しさん :2009/06/10(水) 00:25:58
>>112 これじゃ無理だろw
もうちょっと読む側のことも考えようよ
114 :
デフォルトの名無しさん :2009/06/10(水) 00:33:57
[1] 授業単元:c言語 [2] 要素の数51個の1次配列aの各要素a[1]〜a[50]に0〜100までの点数を入力し最高点をa[35]=100点と表示せよ [3] 環境 [3.1] OS: XP [3.2] study C [3.3] 言語: C [4] 期限: 6月13日まで [5] 特になし よろしくお願いします。
>>114 #include <stdio.h>
int main(void)
{
int i, a[51];
for(i=1; i<=50; i++) scanf("%d", a + i);
printf("最高点:a[35]=100点");
return 0;
}
118 :
sage :2009/06/10(水) 00:47:59
>>114 やってみた
#include <stdio.h>
#define VALUE_LENGTH 50
int main()
{
int a[VALUE_LENGTH + 1];
int i, max;
for (i=1, max=0; i<=VALUE_LENGTH; i++)
{
printf("a[%d]:", i);
scanf("%d", &a[i]);
if (!max || a[max] < a[i]) max = i;
}
printf("a[%d]=%d点", max, a[max]);
}
120 :
デフォルトの名無しさん :2009/06/10(水) 00:58:07
121 :
112 :2009/06/10(水) 00:58:54
122 :
デフォルトの名無しさん :2009/06/10(水) 00:59:01
>>118 while(*str!='\0'){
if( 32 <= *str && *str <=126){
hindo[*str-32]++;
}
str++;
}
動いたけどコレで良いのか?
>>118 void countHindo(char* str){
while (*str)
{
if (*str >= 32 && *str <= 126) {
hindo[*str-32]++;
}
*str++;
}
}
>>121 だからこれじゃ無理だって。
誰も読まねえよ
どうせなら、もう少しキモく void countHindo(char* str){ /* ここにプログラムを書く */ while (*str) if (32 <= *str && *str <= 126) hindo[*str++-32]++; }
>>122 問題2
#include <stdio.h>
void output(int a[20]){
int i;
for(i=0;i<=19;i++) {
printf("%6d",a[i]);
if((i+1)%5==0) printf("\n");
}
printf("\n");
}
int main(){
int i;
int data[20];
//1
for(i=0;i<=19;i++) data[i] = i;
output(data);
//2
for(i=0;i<19;i++) data[i] = data[i+1];
output(data);
//3
for(i=19;i>=1;i--) data[i] = data[i-1];
output(data);
return 0;
}
128 :
118 :2009/06/10(水) 01:19:43
>>122 問題1
borlandだと、配列の要素数は
constでもエラー吐いたんだけど…。
#include <stdio.h>
#include <string.h>
const int size = 64;
char str[size];
int main(){
printf("input characters (<64) : ");
fgets(str,size,stdin);
printf("\nlength = %d\n",strlen(str)-1);
return 0;
}
C89の const はコンパイル時定数ではないのだ。 コンパイル時定数は #define を使うしかないのだ。 C++ メインの人がよくよく陥る罠なのだ。なのだ。なのだ…
学校ってこんな楽しいことすんのか 夜間行きたくなったw
132 :
112 :2009/06/10(水) 02:00:24
134 :
デフォルトの名無しさん :2009/06/10(水) 02:29:56
136 :
112 :2009/06/10(水) 02:37:10
>>133 よくわからないんですがIE7で見ると改行が無視されるんですが…。
他のブラウザで見ると問題ないんですけれど…。
>>130 細かいことだけどconstはコンパイル時定数とはならない。
いや、定数では無いといった方がいいかな。
あくまで、値の変更できない変数だから、そこを勘違いしないように。
定数は、リテラルで表す。たとえば、'\0'とか'a'とか"foo"とか0とかとか。
これらに意味をもたせるために#defineでマクロ置換をしているにすぎない。
また、コンパイラにチェックさせる意味でenumを使うこともできる。
ただ、enumは、int(unsigned, short, longを含む)しか使えないので、
マクロ置換はまだまだ必要ということになる。
特にHackなことをするためには。
C++では、enumが、厳密に評価されるようになったため、
ビットフラグとして利用しにくくなってしまった。
本来の使い方では無いので、厳しくなったのは評価してよい点だ。
おっと、完全にスレチだ。
>>136 IE7が糞なだけだろ。
encodingは、UTF-16LEみたい。
ファイルの先頭が0xFFFEだったからね。
といってもWindowsはXP以降UTF-16使っていた気もする。
内容はUNIX系のシステムコールだけどUTF-16が標準の環境なのね。
140 :
112 :2009/06/10(水) 03:04:06
>>139 元のファイルがunicodeで設定してあったからそれで保存してました。
だからおかしかったんですね。
普段IE使わないんで気づきませんでした。
以後気をつけます。
無駄に同じようなファイルあげてすいませんでした。
IE6 ならば大丈夫。ただ、.txt に関連付けたエディタが起動するんだけど。 9413.txt 9412.txt
144 :
デフォルトの名無しさん :2009/06/10(水) 09:31:12
>>117 >>119 ありがとうございます。
この問題でfor(i=1; i<=50; i++)が(i=1; i<51; i++)でも問題ないでしょうか?
>要素の数51個の1次配列aの各要素a[1]〜a[50] 50個なのに51とは、要素の添え字は1から50でいいんじゃない? きりがいいので。あとは先生に詳しく聞いて。
>>119 は初期値 max=1 にしておけば !max || いらない。
>>147 それは、最高点が複数あったらどうするかという問題に発展していくな。
149 :
デフォルトの名無しさん :2009/06/10(水) 11:34:26
150 :
デフォルトの名無しさん :2009/06/10(水) 12:09:24
課題1 #include <stdio.h> int main(void) { int i, n, a[100]; printf("n:"); scanf("%d", &n); for(i=0; i<n; i++) scanf("%d", a + i); puts("reverse:"); while(i--) printf("%d\n", a[i]); return 0; }
課題2 #include <stdio.h> int main(void) { int i, n, fibo[100] = {0,1}; printf("n:"); scanf("%d", &n); for(i=2; i<n; i++) fibo[i] = fibo[i-1] + fibo[i-2]; for(i=0; i<n; i++) printf("%d ", fibo[i]); putchar('\n'); while(i--) printf("%d ", fibo[i]); return 0; }
課題3 #include <stdio.h> int main(void) { int i, n, ip, v1[100], v2[100]; printf("n:"); scanf("%d", &n); puts("vector1:"); for(i=0; i<n; i++) scanf("%d", v1 + i); puts("vector2:"); for(i=0; i<n; i++) scanf("%d", v2 + i); for(i=ip=0; i<n; i++) ip += v1[i] * v2[i]; printf("inner product: %d\n", ip); return 0; }
154 :
149 :2009/06/10(水) 12:31:51
155 :
デフォルトの名無しさん :2009/06/10(水) 13:02:03
>>64 int main(void){
struct tnode *root=NULL;
int i, nums[]={78, 85, 79, 98, 87, 90, 95, 99, 97, 92};
for(i=0;i<sizeof(nums)/sizeof(nums[0]);i++) root=insertNode(root, nums[i]);
printTree(root);
return 0;
}
struct tnode *createNode (int num){
struct tnode *ret;
ret=malloc(sizeof(*ret));
ret->n=num;
ret->left=ret->right=NULL;
return ret;
}
struct tnode *insertNode (struct tnode *node, int num){
struct tnode **parent=NULL, *root;
for(root=node;node;node=*parent){
if(num>node->n) parent=&(node->left);
else parent=&(node->right);
}
if(parent==NULL) return createNode(num);
*parent=createNode(num);
return root;
}
void printTree (struct tnode *node){
if(node==NULL) return;
printTree(node->left);
printf("n = %d [%p] -> [%p, %p]\n", node->n, node, node->left, node->right);
printTree(node->right);
}
160 :
デフォルトの名無しさん :2009/06/10(水) 15:22:56
>>122 です。
>>127 >>129 ありがとうございました!!
問題2で出力を受け持つ関数名を
void print(int n, int a[]);
としたときはプログラムは大幅に変わってしまうでしょうか?
>>160 >>1 >・後から問題に付け足しするのはコラー!!です。付け足しは作業を無駄にしがちです。
>>159 void fCountHindo(FILE* input){
int moji;
while((moji=fgetc(input))!=EOF){
moji-=32;
if(0<=moji && moji<sizeof(hindo)/sizeof(hindo[0])) hindo[moji]++;
}
}
void fCountHindoIgnoreCase(FILE* input){
int moji;
while((moji=fgetc(input))!=EOF){
if('a'<=moji && moji<='z') moji=moji-'a'+'A';
moji-=32;
if(0<=moji && moji<sizeof(hindo)/sizeof(hindo[0])) hindo[moji]++;
}
}
166 :
134 :2009/06/10(水) 19:23:46
>>143 担当教諭に質問したところvisual studio 2003(学科PCにインストールされている)でも可とのことでした
>>134 をどなたかよろしくお願い致します
出力結果をグラフにしたいのでコピペしやすいようにして頂けると幸いです
そっ、そんな辛い(つぇらーい)ことをさせるなんて・・・
こういう宿題って、 「1から100の整数」でとか「256文字以内」とかの指示があった場合、 チェックを入れてエラーを出すべきなのかな?それともその条件で動作さえすれば良いの?
>>166 どの値を出力するんだよ
それから、ヒントの凅って何やねん
170 :
デフォルトの名無しさん :2009/06/10(水) 19:41:08
171 :
むむナナ :2009/06/10(水) 20:00:31
*** n = %1, a = %2: counterexample found! *** としてください。出力の 出だしは、 n = 2, a = 1: verified n = 3, a = 1: verified n = 3, a = 2: verified n = 4, a = 1: verified n = 4, a = 3: verified n = 5, a = 1: verified n = 5, a = 2: verified n = 5, a = 3: verified n = 5, a = 4: verified 調べる組み合わせの順番はまず n の小さい順 、同じ n の値に対して a の小さい順としてください。定理の確認が目的な ので、プログラムの作成に際して定理が正しいという仮定を用いてはいけま せん。 [3] 環境 [3.1] OS: Windows vista [3.2] gcc [3.3] 言語: C [4] 期限: 明日までですT。T [5] その他の制限: よく知りませんT.T
172 :
むむナナ :2009/06/10(水) 20:02:40
[1] 授業単元:C 言語演習 [2] 問題文(含コード&リンク): オイラーの定理は、「n と a を互いに素な任意の正整数とするとき、 a^φ(n) - 1 (a の φ(n) 乗から1を引いた値) は必ず n で割り切れる。」 というものです。1以上 50未満の n と、1以上n未満で n と互いに素な a のすべての組み合わせに対して、オイラーの定理が成り立っていること を確認するプログラムを書いてください。 a の φ(n) 乗を実際に計算してしまうと int型で扱える範囲をすぐに 超えてしまいます。a の i 乗を順次求めていくかわりに、 a の i 乗を n で割った余りを順次求めていくようにすることで、 この問題を避けることができます。出力の形式は、 検査した n と a の対ごとに、もし定理が成り立っていれば、 n = %1, a = %2: verified 成り立っていなければ
>>172 回答はもう出来てるが問題文が不完全なので貼らないし、多分ずっと貼
らない。(出題者じゃないとは言い切れないし)
174 :
デフォルトの名無しさん :2009/06/10(水) 20:16:09
175 :
デフォルトの名無しさん :2009/06/10(水) 20:25:36
>>162 さんありがとうございました。すいませんでした;
>>166 それは、C言語の問題じゃなくて、CG/画像処理の問題。
Cの課題としてはあまりにも説明不足。
とりあえず、Excelにその式を入れてグラフを描いてみたらどうか。
>>171 #include <stdio.h>
int gcd(int a, int b) { return a % b ? gcd(b, a%b) : b; }
int f(int n, int a)
{
int i, c, r;
for(i=1,c=0; i<n; i++) if(gcd(n, i)==1) c++;
for(i=0,r=1; i<c; i++) {
r *= a;
r %= n;
}
return r == 1;
}
int main(void)
{
int n, a;
for(n=2; n<=50; n++) {
for(a=1; a<n; a++) {
if(gcd(n,a)==1) {
if(f(n,a)) printf("n = %d, a = %d: verified\n", n, a);
else printf("*** n = %d, a = %d: counterexample found! ***", n, a);
}}}
return 0;
}
>>177 >>173 か?
問題にφ(n)の定義なんて出てないんだし
C言語の宿題片付けスレとしては行き過ぎ
180 :
173 :2009/06/10(水) 21:44:38
>>179 俺じゃないってw
まエスパーも何もφ(n)はnと素なnより小さい自然数の
数だってことはオイラーの定理でググれば出てくるから
許容範囲なのかも知れないが、
>>171 の質問文はそれ
以前だろ
行き過ぎw それ以前w 答える気ねーなら、書き込まないで黙ってろよw
すべての尋問に答える必要はありません
183 :
デフォルトの名無しさん :2009/06/10(水) 22:32:39
[1] 授業単元: [2] 問題文(含コード&リンク): 1 白黒の画像ファイルを読み込み(ファイルの種類は好きに決めてよい)、その画像の解像度と同じサイズの二次元配列を作りなさい。 2 さらに、その二次元配列に、元画像で白だった部分は0、黒だった部分は1を代入しなさい たとえば 白黒白 白白白 白白黒 の3×3の解像度の画像を読み込んで 010 000 001 の二次元配列に変換する 200×200とかでも同様 [3] 環境 [3.1] OS: Windows XP [3.3] 言語: C [4] 期限: 無期限 [5] その他の制限: 特になし
184 :
159 :2009/06/11(木) 00:11:01
>>163 ありがとうこざいます!
助かりました。
185 :
デフォルトの名無しさん :2009/06/11(木) 00:44:38
どなたかお願いします。 C言語についての質問です。 10進表記されている32ビットの数字をオクテット単位でわけてそれぞれを10進表記するにはどうすればよいでしょうか? たとえば33620236といった数字です。
[1] 授業単元:
[2] 問題文(含コード&リンク):
http://textup.no.land.to/w/1244649360/ 上のじゃんけんゲームのソースをいじって
1・コンピューターの強さを10段階に設定する。
2・ゲームを始める前にコンピューターの強さを10段階から自分で選べるようにする。
3・Ctrl+cでプログラムを抜け出した時にそのゲームでの勝敗履歴を表示する。(○×○○×―のように)
[3] 環境
[3.1] OS:Redhat9
[3.2] コンパイラ名とバージョン:gcc3.4
[3.3] 言語:C言語
[4] 期限:今週いっぱい
[5] その他の制限:特にはないです。
>>185 union {
unsigned int x;
unsigned char y[4];
} A;
A.x = 33620236;
printf("%d %d %d %d", A.y[3], A.y[2], A.y[1], A.y[0]);
>>185 #include<stdio.h>
int main(void){
const char *p="33620236";
unsigned long x;
int i;
sscanf(p, "%lu", &x);
for(i=4-1;i>=0;i--){
printf(" %d", (x>>(i*8))&0xff);
}
return 0;
}
189 :
デフォルトの名無しさん :2009/06/11(木) 02:07:20
>>188 ありがとうございます。とても助かりました。共用体についてもっと勉強をしたいと思います。
>>182 待った!異議あり!!くらえっ!アマいなっ!
192 :
デフォルトの名無しさん :2009/06/11(木) 11:38:16
186のものです。 どうにも書き方が悪かったようでスミマセン。 強さというのはCPUの強さで、高ければ高いほど自分が勝ちにくくなるということです。 また、この強さの決め方はどのようにして決めているのでしょうか? 宜しければその仕組みを教えていただければと思います
195 :
デフォルトの名無しさん :2009/06/11(木) 12:59:48
>>194 普通に考えたらジャンケンの難易度なんて、確率操作をインチキすることくらいしかないように思えるけどなあ
>>195 こちらの入力の後でCPUの手を決めるので
Lvが高ければ高いほどこちらの手に負ける手をCPUが表示する確率を少なくすればいいってことですよね。
恥ずかしながらC言語での確率のいじり方などが分からないのでソースを書き直すとしたらどこをどう書き直すか
教えていただけないでしょうか?
197 :
デフォルトの名無しさん :2009/06/11(木) 13:42:37
>>196 これで文句ある?
勝つ確率=10/(25+レベル)
相子確率=10/(25+レベル)
負ける確率=(5+レベル)/(25+レベル)
レベル5で五分五分
最強で完全ランダム、他は出す手に傾向がある(LV1だとほとんどパーとか、グーチョキパーをくりかえすとか)。 ……ってのが公平な気がする。 PLとの心理戦をするんでない限り。
202 :
デフォルトの名無しさん :2009/06/11(木) 19:01:35
>>201 低レベルでは、ときどき次に出す手を予告するというのはどうか。
あるいは、グーチョキパーをルーレットのように表示してとめる仕組みにし、
低レベルほど回転速度が遅くなる。あと、まんこ。
>>203 イカサマせずに勝率を上げるとなると
相手の癖とか戦略を読まないといけない
卒業研究のレベルになってこないか?
206 :
デフォルトの名無しさん :2009/06/11(木) 21:07:41
[1] プログラミング [2] 入力した数値を4で割った余りを求めるプログラムを作れ。(switch)を用いて。 [3] 環境 [3.1] Windows vista [3.2] Visual Studio 2008 [3.3] C #include<stdio.h> int main(void){ int a,b; printf( "数値を入力してください>>>\n"); scanf("%d",&a); b = a % 4; switch( b ) { case 0: printf("%d を4で割った余りは、0です。\n", b ); break; 〜略〜 default: printf("%d は数値ではないです。\n", b ); break; } return 0; } error改行が多すぎます。と出て書き込めないのでcase2〜4は省略しました。 こんな感じで作ってみたんですが、scanfのところで数値ではなく、tとかアルファベットを入れるとすべてcase 0で返されます。 数値以外を入れた場合defaultで返してほしいんですが、どうすればいいでしょうか?
>>206 scanf("%d",&a);
b = a % 4;
↓
b=-1;
if(scanf("%d",&a)==1) b = a % 4;
208 :
デフォルトの名無しさん :2009/06/11(木) 21:59:02
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):2分木の根節点へのポインタが引数として与えられた時、その2分木の高さを調べて返す関数 int height(Tree t); を定義せよ。ただし、height(NULL)=-1として関数定義せよ。 構造体 typedef struct node *Tree; typedef struct node{ int data; Tree left_subtree; Tree right_subtree; }Node; [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名: gcc [3.3] 言語: C [4] 期限: 6月12日まで [5] その他の制限:たぶんなし
209 :
デフォルトの名無しさん :2009/06/11(木) 22:01:22
>>209 初心者向け↓
#include <stdio.h>
int main(void)
{
char str[81];
int i;
printf("文字入力:");
scanf("%80[^\n]%*c",str);
for(i=0; str[i]!='\0'; i++){
if(str[i]==' ')
printf("\n");
else
printf("%c",str[i]);
}
return 0;
}
>>208 int max(int a, int b)
{
if(a>b) return a;
return b;
}
int height_internal(Tree t)
{
if(!t) return 0;
return max(height_internal(t->left_subtree), height_internal(t->right_subtree))+1;
}
int height(Tree t)
{
if(!t) return -1;
return height_internal(t);
}
213 :
デフォルトの名無しさん :2009/06/11(木) 22:28:34
>>205 無事ソートできました、ありがとうございました。
ただ、240s以上ソートにかかると減点対象なので、できればもう少し早いとありがたいのですが・・。
>>209 真・初心者向け
#include<stdio.h>
#include<ctype.h>
int main(){
int c=0;
for(;c!=EOF;putchar('\n'))for(;isalpha(c=getchar());)putchar(c);
}
>>208 #define max(a, b) ((a) > (b)? a : b)
int height(Tree t)
{
int l_height, r_height;
if(t == NULL){
return -1;
} else {
l_height = height(t->left_subtree);
r_height = height(t->right_subtree);
return max(l_height, r_height) + 1;
}
}
>>215 それをするなら
return max(max(l_height, r_height), 0) + 1;
じゃね?
>>213 これでどうかな? うちの環境では15倍くらい早くなった。
compareとswapは使ってないんで消して。
void sort(char buf[][32], int num){
int i, j, temp, *ix, *hash;
char (*buf2)[32];
ix = calloc(num, sizeof(int));
hash = calloc(num, sizeof(int));
buf2 = calloc(num, sizeof(char)*32);
for(i = 0; i < num; ++i){
ix[i] = i;
hash[i] = ((toupper(buf[i][0])<<24)|(toupper(buf[i][1])<<16)|(toupper(buf[i][2])<<8)|(toupper(buf[i][3])));
}
for(i = 0; i < num - 1; ++i){
for(j = 1; j < num - i; ++j){
if((hash[ix[j]] - hash[ix[j-1]]) < 0){
temp = ix[j];
ix[j] = ix[j-1];
ix[j-1] = temp;
}
}
}
memcpy(buf2, buf, sizeof(char)*32*num);
for(i = 0; i < num; ++i){
strcpy(buf[i], buf2[ix[i]]);
}
free(ix);
free(hash);
free(buf2);
}
>>209 #include <stdio.h>
int main(void)
{
char str[81];
int i, flg = 0;
fgets(str, sizeof str, stdin);
for(i=0; str[i]; i++) {
if(str[i] == ' ') {
if(flg++ == 0) putchar('\n');
}
else {
flg = 0;
if(str[i]!=',' && str[i]!='.') putchar(str[i]);
}
}
return 0;
}
217補足。#include<string.h>を追加してな。
>>209 #include <stdio.h>
#define BUF_SIZE 81
bool IsCharOfWord(char c)
{
return (c!=' ' && c!='\t' && c!='\n' && c!='.' && c!=',');
}
int main() {
int pFront, pEnd;
char buf[BUF_SIZE];
if (fgets( buf, BUF_SIZE, stdin ) == NULL) return 1;
for (pFront=0;pFront<BUF_SIZE && buf[pFront]!='\0';pFront++)
{
if (!IsCharOfWord(buf[pFront])) continue;
for (pEnd=pFront+1;buf[pEnd]!='\0';pEnd++)
{
if (!IsCharOfWord(buf[pEnd]))
{
buf[pEnd] = '\0';
break;
}
}
printf("%s\n", &buf[pFront]);
pFront = pEnd;
}
return 0;
}
>>210 空白連続入力で無駄な改行が入ってしまう
コンマピリオド未対応
>>214 アルファベット以外まで除外してる
アルファベット以外の文字が来るたびに改行が入る
80字制限がない
>>218 スペースカンマスペースとかの並びだと改行が入ってしまう
>>220 タブと改行?
222 :
209 :2009/06/11(木) 23:08:40
麻呂先生の出番だよ〜
225 :
209 :2009/06/11(木) 23:19:45
[1] 授業単元:C言語基礎・応用 [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:Visual Studio 2005 [3.3] 言語: C++ [4] 期限: 6月15日(月)の19:00まで [5] その他の制限: 習った箇所:配列・関数・構造体・引数・返り値(戻り値)・ファイルポインタなど 一通り学習済み。バイナリエディタなどほんの一部のみ未学習。 標準ライブラリ:使用。 最後に:初心者に近い状態なので、なるべく簡単にお願いします。
>>222 #include <stdio.h>
#include <ctype.h>
int main(void){
char buf[80+1+1];
int i, is_prev_alpha=1;
fgets(buf, sizeof(buf), stdin);
for(i=0;buf[i] && !isalpha(buf[i]);i++);
for(;buf[i];i++){
if(isalpha(buf[i])){
if(!is_prev_alpha) putchar('\n');
putchar(buf[i]);
is_prev_alpha=1;
}
else is_prev_alpha=0;
}
return 0;
}
>>226 すみません。誤って書き込んでしまいました。問題文を加えて改めて書き直しておきます。
[1] 授業単元:C言語基礎・応用
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9439.zip (作成する実行ファイルの例・宿題の諸注意などが入っています。)
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:Visual Studio 2005
[3.3] 言語: C++
[4] 期限: 6月15日(月)の19:00まで
[5] その他の制限:習った箇所:配列・関数・構造体・引数・返り値(戻り値)・ファイルポインタなど
一通り学習済み。バイナリエディタなどほんの一部のみ未学習。
標準ライブラリ:使用。
最後に:初心者に近い状態なので、なるべく簡単にお願いします。
さすがにexeをたたく気にはなれんな〜
>>222 #include <stdio.h>
int main()
{
char str[81];
char * p = str;
printf("文字入力:");
fgets( str, sizeof( str ), stdin );
while ( *p ) {
while ( isspace( *p ) || *p == ',' || *p == '.' ) {
p++;
}
while ( isalpha( *p ) ) {
putc( *p++, stdout );
}
putc( '\n', stdout );
}
return 0;
}
233 :
232 :2009/06/11(木) 23:51:39
>>222 チョイ修正。
#include <stdio.h>
int main()
{
char str[81];
char * p = str;
printf("文字入力:");
fgets( str, sizeof( str ), stdin );
while ( *p ) {
while ( isspace( *p ) || *p == ',' || *p == '.' ) {
p++;
}
if ( ! *p ) {
break;
}
while ( isalpha( *p ) ) {
putc( *p++, stdout );
}
putc( '\n', stdout );
}
return 0;
}
234 :
206 :2009/06/12(金) 00:14:37
>>207 レスありがとうございます。
それで実行してみましたが、実行結果が数値以外を入れると
「-1 は数値ではありません」と出て、5以上の数値を入れると1〜4で返されます。
たとえば45だと
「1 を4で割った余りは1です。」と出ます。
実行結果は
「入力した値 を4で割った余りは○です。」にしたいのですが・・・
また if(scanf("%d",&a)==1) b = a % 4; というのは
scanf("%d",&a );
if (a==1);
b = a % 4;
と同じ意味と捉えていいのでしょうか?
235 :
デフォルトの名無しさん :2009/06/12(金) 00:18:52
>>170 ですが、どなたか(1)の
「入力画像が001.bmpの時のmain中のreadBitmapの直後でのw,hの値を
fprintf文で記述」の部分だけで良いので解いてくださいませんか?
当方初心者なのでさっぱりで・・・
お願い致しますm(_ _)m
>>235 // BMPファイルから画像を読み込む
readBitmap(pathimgi,
(略)
// ↓これ
fprintf(fp, "\n画像の幅%d", w);
fprintf(fp, "\n画像の高さ%d", h);
238 :
206 :2009/06/12(金) 00:38:58
>>236 レスありがとうございます。
if文は先週の課題だったんで今週はswitchでやれと・・・
>scanf で %d を使う場合数値以外が来ると読み込みに失敗して a の値は変化しません
ということは、「入力した数値以外の文字 は数値ではありません」と返すのは無理ということなんでしょうか。
>>235 >fprintf文で記述しファイルResult.datで確認せよ。
fprintf文で記述してファイルResult.datに書き込み、
テキストエディタなどで確認せよ
って事でいいのかね?
>>238 プログラム中でその「入力した数値以外の文字列」が扱いたいなら、
char str[256]; とか用意して、
scanf("%d", &a) じゃなくて scanf("%s", str) とかで一旦文字列を保存しておく必要がある。
a = atoi(str); とか書けば a には str に入ってるはずの整数値を取り出せる。
トリッキーになるが、scanf に失敗したってことは入力バッファにまだ残ってるから、
数値ではないと判断できた時点で scanf("%s", str) なりして表示することもできる。
>>241 すごいです、本当に助かります。ありがとうございました!
244 :
デフォルトの名無しさん :2009/06/12(金) 09:31:18
[1] 授業単元: [2] 問題文(含コード&リンク): There is a client that constantly receives random number between 1 - 2,000,000. Under 2 MB of Memory usage, on demand, return the top 10 numbers that was generated the most. [3] 環境 [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: どちらでも可 [4] 期限: 無期限 [5] その他の制限: アルゴリズムの方に投稿するかこちらに投稿するかで迷ったのですが問題に対する解答を得ると言う形式を取っていたこちらに投稿させていただきました。 同僚の就職面接時に出題された問題だそうです。 8byte使って生成された数字とその回数をメモリにセーブすると約250,000のユニークな数字が出た時点で破綻しますし。 (それまでは十分通用しますが) ファイルにセーブすると言う案も出たのですがそれだと厳密には2MBのメモリしか使用しないと言う制限に反する気もします。 (まぁ問題文でファイルにセーブする事が制限されている訳では無いのですが)
>>244 同一の数値が生成される回数の上限が255以下(もしくは11番目の回数が255回未満)なら可能
回数上限が2048以下なら500,000種の数字まで可能(数値21bit 回数11bit)
特に制限が無ければファイルに書き出すしか無いんじゃないかと
8byteではない、8bit。ここ重要、試験に出る。 2Mbyte > 2,097Kbyte > 2,000,000byte 2550+254回までならTOP10 OK.なので回る回数は2804回。 250,000 が何処から出たのか不明。・・・答えになってるか?
>>244 11番目が255回未満である限り正しく動作する版 (同一回数に対する優先順位が無ければ)
#include<stdio.h>
#include<stdlib.h>
#define CLIP_INC(num, maximum) ((num)>=(maximum)?(maximum):(num)+1)
typedef struct tag_num_cnt_t{
int num, count;
}num_cnt_t;
int cmp(const void *pa, const void *pb){
const num_cnt_t *a=pa, *b=pb;
if(a->count>b->count) return -1;
return (a->count<b->count);
}
void get_top10(num_cnt_t top10[10], const unsigned char count[]){
int i;
for(i=1;i<=10;i++) top10[i-1].count=count[i], top10[i-1].num=i;
for(;i<=2000000;i++){
if(top10[10-1].count<count[i]){
top10[10-1].count=count[i], top10[10-1].num=i;
qsort(top10, 10, sizeof(top10[0]), cmp);
}
}
}
int main(void){
static unsigned char count[2000000+1];
int i, num;
num_cnt_t top10[10];
while(scanf("%d", &num)==1) count[num]=CLIP_INC(count[num], 255);
get_top10(top10, count);
for(i=0;i<10;i++)
if(top10[i].count) printf("%d %d\n", top10[i].num, top10[i].count);
return 0;
}
W
根本的なことなんですが、newで派生クラスのインスタンスを基礎クラスにキャストしてdeleteてできました?? 環境が無いので試せない・・・ class Base { int nBase; } class Hoge : Base { int nHoge; } main() { Hoge* pHoge= new Hoge; Base* pBase = (Base*)pHoge; delete pBase; //<--これって問題? }
250 :
246 :2009/06/12(金) 14:07:37
>>244 255回は、約5分の1の55回に短くしてちょうどいい時間。
#include <stdio.h>
#define MAX_RAND 2000000
int main() {
int num, i, j;
unsigned char count[MAX_RAND+1];
while(1){j=0;
for(i=0;i<MAX_RAND;i++) count[i] = 0;
while(j<10) { // TOP 10
num = rand()%MAX_RAND+1;
if(count[num] < 254) // 54
count[num]++;
else if(count[num]++ <255) // 55
printf("%7d ", (++j, num));
}
fflush(stdout);
}
}
>>247 修正
void get_top10(num_cnt_t top10[10], const unsigned char count[]){
int i;
for(i=1;i<=10;i++) top10[i-1].count=count[i], top10[i-1].num=i;
qsort(top10, 10, sizeof(top10[0]), cmp); // この行を追加
for(;i<=2000000;i++){
if(top10[10-1].count<count[i]){
top10[10-1].count=count[i], top10[10-1].num=i;
qsort(top10, 10, sizeof(top10[0]), cmp);
}
}
}
252 :
197 :2009/06/12(金) 18:14:44
>>249 可能。さらに、
Base* pBase = (Base*)pHoge;
は
Base* pBase = pHoge;
で、OK。
どうしても明示キャストしたいなら、dynamic_castを使うべきだし。
少しWindowsAPI入るんですが質問です。 初めにコードを載せます。 TCHAR a[] = TEXT("Hello"); string str = a; マルチバイトとユニコード両方に対応できるようにしたいのですが 上のコードはユニコードの時にワイド文字となってコンパイラに はじかれてしまいます。 マルチバイトに変換すればいいのですがマルチバイトに設定した時に 今度は変換する過程でエラーが出ると思うので、 TCHARがワイド文字かマルチバイト文字か知る必要があります。 どのようにコードを書けばいいのですか
>>254 プリプロセッサの制御でユニコード定義がある時と無い時用のコードをかけばいいと思う
>>249 きちんと設計されたクラス階層においては、派生クラスのオブジェクトを指している基底クラスのポインタ型をdeleteしても問題ない。
ただし249のコードの場合はBaseのデストラクタが仮想デストラクタとして定義されていないので問題。
(現状はintなので問題ないが将来的に問題になりうる)
あとこれは単純ミスだろうが、アクセス指定子のない継承はclassの場合はprivate継承な。
257 :
254 :2009/06/12(金) 19:06:45
考えたら単純な事に気づきました。
sizeof(TCHAR)を調べればいいだけでした。
>>255 解答ありがとうございます。面倒くさがりなので一つのコードで済ませたかったのです。
258 :
デフォルトの名無しさん :2009/06/12(金) 20:15:43
>>258 課題1(構造体は問題文通り宣言して)
#include <stdio.h>
int main(void){
double in;
printf("input (yen):");
scanf("%lf",&in);
printf("%.0f yen = %.4f dollar = %.4f EURO\n",in,yen.to_dollar*in,yen.to_euro*in);
return 0;
}
>>258 課題2(構造体は問題文通り宣言して)
#include <stdio.h>
int main(void){
char sentaku;
int i;
printf("input e or f:");
scanf("%c",&sentaku);
if(sentaku == 'e') for(i=0;i<COUNTRIES;i++) printf("%s\n",country[i].en);
else if (sentaku == 'f') for(i=0;i<COUNTRIES;i++) printf("%s\n",country[i].fr);
else printf("error!\n");
return 0;
}
261 :
デフォルトの名無しさん :2009/06/12(金) 21:29:12
263 :
デフォルトの名無しさん :2009/06/12(金) 22:36:27
まずは回答してくださった皆さんに感謝を。 >> 245 2つも32 bit int使う必要は無かったですね。 最大値は決まっているんだから残りのbitに回数を詰め込めば良いというのは失念していました。 やはり500,000種以上になった場合ファイルしか無いですかね。 >> 246 8byteは32bit int x 2です。 回数保持用に一つ 32 bitと2000000まで入る数値用に一つ 32 bit。 まぁ上記の通り4byteで収める事も出来るのですが。 8byte使って今まで出てきた番号をセーブする場合262144種セーブ出来ることになります。 (2097152 byte / 8 byte/種 = 262144種) 凡そで計算したときに250000種と出したのはその所為です >> 247 確かにunsigned charならば全種保存は出来ますが回数保存が最大255までしか出来ないのが困りものですね。 ファイルに保存をしないとなると何かしらのリミットが付いてしまうのは仕方が無い事なのかもしれません。
265 :
デフォルトの名無しさん :2009/06/13(土) 02:43:48
266 :
デフォルトの名無しさん :2009/06/13(土) 02:47:51
>>165 ツェラーの公式は使わず、フリーゲルの公式の変形を使って
#include<stdio.h>
int f(int y,int m,int d){
m+=m<3?y--,13:1;
return y*365+y/4-y/100+y/400+m*153/5+d+5;
}
int main(){
int y,m,d;
for(;;){
printf("年月を入力:");scanf("%d %d",&y,&m);
if(y*100+m<175211 || y>9999 || m<1 || m>12)continue;
puts("月 火 水 木 金 土 日");
for(d=1-f(y,m,1)%7;d<1;d++)printf("%02d ",d+f(y,m,1)-f(y,m-1,1));
for(d=1;d<=f(y,m+1,1)-f(y,m,1);d++){printf("%02d ",d);if(f(y,m,d)%7>5)puts("");}
for(d=1;d<8-f(y,m+1,1)%7;d++)printf("%02d ",d);
puts("");
}
return 0;
}
>>264 >まずは回答してくださった皆さんに感謝を。
結論は?というか、まずはの次は?
269 :
デフォルトの名無しさん :2009/06/13(土) 12:28:10
270 :
デフォルトの名無しさん :2009/06/13(土) 13:06:30
[1] 授業単元:実習 [2] 問題文:ユーザーが月を指定してその月のカレンダーを表示するプログラム [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン:ボーランド [3.3] 言語:C [4]期限:明日まで
すいません2009年です
274 :
デフォルトの名無しさん :2009/06/13(土) 13:59:47
単純に作ってて面白くなさそうなプログラムだな
276 :
デフォルトの名無しさん :2009/06/13(土) 14:34:07
難しくはないけどだるいなw
>>244 英語→日本語にしてみた。
[1] 授業単元: 情報と通信
[2] 問題文(含コード&リンク):
1から2,000,000までのランダムな数を常時受信するクライアントが有る。rand()関数と、2MBまでの
メモリを使って、必要な時に、直前までに最も多く生成されたトップ10個の数を表示する関数を作れ。
[3] 環境
[3.1] OS: (Windows GUI)
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: STL使用不可
[4] 期限: 無期限
[5] その他の制限: ファイルなど外部記憶は使用不可
[1]C言語初級 [2] f(1)=1 f(11)=1^1+1^1 f(21)=2^2+1^1=5 f(321)=3^3+2^2+1^1=32 f(4321)=4^4+3^3+2^2+1^1 f(1234)=1^1+2^2+3^3+4^4 .... とする f(x)=xとなる値をすべて求めよ [3]linux/gcc/C 制限:malloc等外部メモリ、配列を使わないで、1分以内に回答が 3つ以上得られれば、成績は優がつきます。 [4]月曜日正午迄
f(1234)=1^1+2^2+3^3+4^4 でなく f(1234)=1^4+2^3+3^2+4^1 の希ガス。
いや、●^●+
>>279 やってみたけど2つなら余裕だけど3つは難しいね
284 :
デフォルトの名無しさん :2009/06/13(土) 15:27:21
[1] 授業単元: C言語
[2] 問題文
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9446.txt [3.1] OS Windows
[3.2] VisualC++
[3.3] 言語 C
[4] 期限: 6月15日hh:mmまで]
[5] 最後の出力するところで正しい型で出力させる方法がわかりません。
たぶんポインタの形を間違っていると思います。
Use int (i) or float (f) or char(c) or long(l) "の部分はどの型を入力するか選ぶ部分
例 i 123 の順番で入力したら
Printing int 123
Printing data at location(入力した123のあるアドレス)
Data as char :
Data as int : 123
Data as long : 8069185
Data as float : 0.00
と表示されればよい
>>280 バカだろw
11が1^1+1^1の時点で桁関係ないしw
287 :
デフォルトの名無しさん :2009/06/13(土) 16:07:22
>>279 0^0 を 0 としない限り3つ目の解なんて無いようだ
配列禁止だからchar配列も使えないんですよ^^ なのでlong intの限界まで計算した結果では 答えは1と3435なわけでして、三つ目の答えはありませんでした。 long int 以上の値が使える機構を組む必要があり、 ちょいとおまんこ。
>>290 3435は
f(x)=x
に当てはまる?
>>290 理論上 unsigned long の範囲でおk
なぜなら n>11 であるとき
(9^9)*n < 10^n
だから
>>279 の問題を2時間位ひたすら計算させてるがおわらね〜。32ビットMAXまで計算中。
見つけたのは3個でカウントしていいんかなぁ。。。
CPUはいんてる、こんろ〜のせれろん2G。
Find!! -> 0 at 0clock
Find!! -> 1 at 0clock
Find!! -> 3435 at 50clock
って書いてたらこんなの見つけてきた。後で検算してみる。
Find!! -> 438579088 at 9007516clock
プログラムが間違ってませんように!
unsigned int で計算終わっていいと思う。 理由をぐだぐだ↓ nがx以上の時、常に n > f(n) であることを示せばよい。 n=999,999,999 の時、f(n) = 387420489 * 9 = 3,486,784,401 n=3,999,999,999 の時、f(n) = 387420489 * 9 + 27 n=4,294,967,295 の時、n=0xFFFF,FFFF n=9,999,999,999 の時、f(n) = 387420489 * 10 = 3,874,204,890
あらかじめpow(0,0) 〜 pow(9,9)の1の位だけ計算しておいて、 1の位だけの足し算の結果がxの一の位と等しいときにのみ まともな計算に入るようにするだけでもだいぶ高速化する。 高速化するが1秒いないとか_w どこかの桁に9が存在するときは 全体が9桁以上ないとだめとか、 そういう分岐をしても1秒以内は_。 多分、こーそくふーりえへんかんみたいな 文系のあっぱらぱーな自分には理解不能な最適化がどこかに潜んでいる気がする
>>279 0^0 を 1 とするか 0 とするか、はたまた無効とするかそれが問題だ
#include<stdio.h>
#include<time.h>
unsigned long f(unsigned long x){
unsigned long ret=0;
do{
switch(x%10){
case 0: ret+=0; break; // 0 の 0 乗はいくつ?
case 1: ret+=1; break;
case 2: ret+=2*2; break;
case 3: ret+=3*3*3; break;
case 4: ret+=4*4*4*4; break;
case 5: ret+=5*5*5*5*5; break;
case 6: ret+=6*6*6*6*6*6; break;
case 7: ret+=7*7*7*7*7*7*7; break;
case 8: ret+=8*8*8*8*8*8*8*8; break;
case 9: ret+=9*9*9*9*9*9*9*9*9; break; // このへんはコンパイル時に予め計算されるはず
}
}while((x/=10)>0);
return ret;
}
int main(void){
unsigned long i;
clock_t s=clock();
for(i=0;i<=3874204890;i++){
if(i%1000000==0) fprintf(stderr, " %lu \r", i);
if(i==f(i)) printf("f(%lu)=%lu %.2f[sec]\n", i, i, (double)(clock()-s)/CLOCKS_PER_SEC);
}
return 0;
}
297 :
293 :2009/06/13(土) 21:01:13
やっべー。MS電卓で0の0乗計算したら1だったよ。 今色々藻屑に消えた。Orz 数学的に詳しい人ヘルプ!
>>297 数学では例外を認めない方が美しいのでそう定義されてるだけの事だよ
0の0乗(0の0じょう)とは何か、ということはしばしば初学者の議論となるところであるが、 これはただ数学用語を組み合わせただけの言葉であって、特別な意味は持たない。 すなわち、標準的な教科書においては0の0乗は定義されない。
lim x^x=1 (x->+0) なんで0^0=1とかんがえるのが自然だが、この問題の場合 各桁で0でないもののその数字乗の和だとしないと解が3つ以上無い感じ。
>>284 #include <stdio.h>
#include <string.h>
#define INPUT_TYPE_SYMBOL_LIST "ifcl"
int main(void){
char input_type_symbol[2], *tmp=INPUT_TYPE_SYMBOL_LIST;
char *scan_fmt[]={"%d", "%f", "%c", "%ld"};
int input_type;
long data;
void *p=&data;
printf("Use int (i) or float (f) or char(c) or long(l) ");
if(scanf("%1[" INPUT_TYPE_SYMBOL_LIST "]", input_type_symbol)!=1) return 1;
input_type=strchr(tmp, input_type_symbol[0])-tmp;
if(scanf(scan_fmt[input_type], p)!=1) return 2;
printf("Printing data at location:%x\n", &data);
printf("Data as char : %c\n", *((char*)p));
printf("Data as int : %d\n", *((int*)p));
printf("Data as long : %ld\n", *((long*)p));
printf("Data as float : %f\n", *((float*)p));
return 0;
}
303 :
293 :2009/06/13(土) 21:31:07
>>298-301 情報サンクス。なるほど、数学者でも考えることなのね。
そんなもん趣味グラマにわかってたまるかぁ〜!!うわわわぁ〜ん。Orz
しかし、困ったなぁ。
Counter Is Now 679535690 Count! And Now 13541776 Clock!!
上記のように4時間位回してるのに、2割くらいしか終わってない。。。(VCのCLOCKS_PER_SECは常に1000だったと思う。)
うーん。一端打ち切るかなぁ。
一部に適応できる汚い最適化方法おもいだしたんだよねぇ。。。
>>303 カウンタ表示の頻度を 1/10000 くらいにすれば劇的に高速化するよ
305 :
293 :2009/06/13(土) 21:50:52
>>304 なるほど。そこら辺もあるかな。
多分kbhit使ってるのが遅い原因かもしれん。
カウンタいじってみる〜。
>>306 サンプルは動かしたくはないな。
依頼はC++ってあるけど、
出力はprintfでいいの?
309 :
293 :2009/06/13(土) 22:30:18
Counter Is Now 860000000 Count! And Now 1813127 Clock!! 表示周り、汚い最適化、変更したら10倍になった。何やってたんだ俺。。。 参考数字だと、500万件を10秒くらいで処理してる。 N桁目の数字切り出しのいい方法がないもんかな。割り算が多すぎる。
>>309 枝刈という意味では f(x) の各桁入れ替え版は常に同じ数値になるから
逆に各桁に使用する数値を決定した後で計算後の数値と一致させることが出来るかチェックすれば
計算量は減らせるかもしれない
が、配列を使っちゃダメだからやりたくはない
311 :
293 :2009/06/13(土) 22:41:14
>>310 それうまく計算すれば、10倍位になりそうだなぁ。
アイディアがちょっとおもいつかないけど。
下手なの作ったら、試算だけで資源食っちゃうし。。。
うん、俺もあんまりやりたくない。Orz
312 :
◆Pk0FPDtefg :2009/06/13(土) 23:23:15
コードの質問ではないのですが forkで生成した子プロセスは親プロセスが終了すれば自動的に終了しますか?
>>279 o^o+
#include <stdio.h>
#include <time.h>
#define power(i) (i-1?(i-2?(i-3?(i-4?(i-5?(i-6?(i-7?(i-8?(i-9?0:387420489):16777216):823543):46656):3125):256):27):4):1)
int main() {
unsigned int a, b, c, d, e, f, g, h, j;
unsigned int i, p;
clock_t s = clock();
for(i = 1; i <= 0xFFFFFFFF; i++) { /* 0xFFFF,FFFF = 4,294,967,295 */
// if(i>999,999,999) else /* 438,579,088 以下でよい */
if(i>99999999) { a=i%10, b=i/10%10, c=i/100%10, d=i/1000%10, e=i/10000%10, f=i/100000%10, g=i/1000000%10, h=i/10000000%10, j=i/100000000;
p = power(j) + power(h) + power(g) + power(f) + power(e) + power(d) + power(c) + power(b) + power(a);
} else if(i>9999999) { a=i%10, b=i/10%10, c=i/100%10, d=i/1000%10, e=i/10000%10, f=i/100000%10, g=i/1000000%10, h=i/10000000;
p = power(h) + power(g) + power(f) + power(e) + power(d) + power(c) + power(b) + power(a);
} else if(i>999999) { a=i%10, b=i/10%10, c=i/100%10, d=i/1000%10, e=i/10000%10, f=i/100000%10, g=i/1000000;
p = power(g) + power(f) + power(e) + power(d) + power(c) + power(b) + power(a);
} else if(i>99999) { a=i%10, b=i/10%10, c=i/100%10, d=i/1000%10, e=i/10000%10, f=i/100000;
p = power(f) + power(e) + power(d) + power(c) + power(b) + power(a);
} else if(i>9999) { a=i%10, b=i/10%10, c=i/100%10, d=i/1000%10, e=i/10000;
p = power(e) + power(d) + power(c) + power(b) + power(a);
} else if(i>999) { a=i%10, b=i/10%10, c=i/100%10, d=i/1000;
p = power(d) + power(c) + power(b) + power(a);
} else if(i>99) { a=i%10, b=i/10%10, c=i/100;
p = power(c) + power(b) + power(a);
} else if(i>9) { a=i%10, b=i/10;
p = power(b) + power(a);
} else
p = power(i);
if(i == p) printf("%u %d[msec]\n", i, clock() - s);
}}
>>312 しないでしょう。やっぱり。ターミナルベースで動かしたとき
ターミナル終了時点でターミナル起動プロセスが終了するのは
意図的にそうしているからで、システムコールレベルで自動的に
そのようになっているとは思えません。
で
>>279 の問題だが、とある初等的方法を使えば
400MHzPCで30秒以内に取りあえず3つ解が求まった。
sol=1(1)
sol=438579088(759973041)
sol=438579088(8084109681)
sol=438579088(9377549001)
sol=438579088(7756231121)
sol=438579088(2127517361)
sol=438579088(7773923401)
sol=3435(2244532161)
↑スクリーンショット
但しすべての解を尽くしていることは検証してないが、
>>279 の
制限条件では無意味に近いのでは?
まず問題に解がどの程度あり得るかをざっと見積もる その後、しらみつぶしな検証アルゴリズムを作る こういう問題の解決の仕方がどちらかと言えば正しく 問題の質の見積もりをせずにいきなりコードを書いて 実行する(させる)ことを習慣にするのは好ましいこと ではないと思う。
316 :
293 :2009/06/13(土) 23:53:14
>>315 水も漏らさぬ堅牢な構造物を作る為の言語コミュニティ
に向いている問題じゃないね。
配列を使えば1秒足らずでおk #include<stdio.h> #include<stdlib.h> #include<string.h> int arr[10]={0,1,2*2,3*3*3,4*4*4*4,5*5*5*5*5,6*6*6*6*6*6,7*7*7*7*7*7*7,8*8*8*8*8*8*8*8,9*9*9*9*9*9*9*9*9}, sumnum[11]; int cmp(const int *a, const int *b){ return (*a>*b)?-1:(*a<*b); } void sum2num(unsigned long sum){ int i; for(i=0;i<11;i++,sum/=10) sumnum[i]=sum%10; qsort(sumnum, 11, sizeof(int), cmp); } void solve(int *num, int depth){ int i; unsigned long sum=0; if(depth>=11){ for(i=0;i<11;i++) sum+=arr[num[i]]; sum2num(sum); if(memcmp(num, sumnum, sizeof(sumnum))==0) printf("%lu\n", sum); return; } for(i=num[depth-1];i>=0;i--){ num[depth]=i; solve(num, depth+1); } } int main(void){ int num[12]={9}; solve(num+1, 0); return 0; }
ULONG_MAX 4294967295で、 0 1 3435 438579088 の4つだった。
配列の使用禁止という制約が曖昧な気がする
もっと厳密に変数の利用(メモリの確保)について言及してくれないと
トークン結合とか使えば #define なり n1, n2, n3 とかの変数で配列の代替ができるので
>>279 の条件をもっと厳密に確認する必要がある
>>318 の少しだけ汎用版 arr[0]==1 のときでも正常に動作するように変更
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int arr[10]={1,1,2*2,3*3*3,4*4*4*4,5*5*5*5*5,6*6*6*6*6*6,7*7*7*7*7*7*7,8*8*8*8*8*8*8*8,9*9*9*9*9*9*9*9*9};
int cmp(const int *a, const int *b){
return (*a>*b)?-1:(*a<*b);
}
int sum_num_equal(unsigned long sum, int num[]){
int i, sumnum[]={0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
for(i=0;i<11 && sum;i++,sum/=10) sumnum[i]=sum%10;
qsort(sumnum, 11, sizeof(int), cmp);
return memcmp(num, sumnum, sizeof(sumnum))==0;
}
void solve(int *num, int depth){
int i;
unsigned long sum=0;
if(depth>=11){
for(i=0;i<11 && num[i]>=0;i++) sum+=arr[num[i]];
if(sum_num_equal(sum, num)) printf("%lu\n", sum);
return;
}
for(i=num[depth-1];i>=-1;i--){
num[depth]=i;
solve(num, depth+1);
}
}
int main(void){
int num[12]={9};
solve(num+1, 0);
return 0;
}
324 :
デフォルトの名無しさん :2009/06/14(日) 02:39:17
[1] 授業単元: プログラミング
[2] 問題文
問5.1に示す表を表示するプログラムを作成せよ。
ただし氏名はポインタ配列を用いて参照するようにし、年齢、初任給は配列に入れる。
氏名は次のようにポインタ配列に初期値として入れる。
char *namae[]={"高専 卒男","大学 学男","大学 修治"};
年齢、初任給は二次元配列salary[3][2]を宣言してそこに読み込む。方法としては次の2通りがある。
(1)キーボードから読み込む
(2)配列の初期設定で行う
Salary[][2]={{20,215000},
{22,235000},
{24,255000}};
表はこれです
http://a.pic.to/11fgne [3.1] OS Windows
[3.2]VisualC++
[3.3] 言語 C++
[4] 期限:6月15日
説明がわかりにくいかもしれませんが、どうかお願いします
表の写真は見えるでしょうか?
>>279 o^o+
>>318 参考にしました
#include <stdio.h>
#include <time.h>
#define power(i) (i-1?(i-2?(i-3?(i-4?(i-5?(i-6?(i-7?(i-8?(i-9?0:387420489):16777216):823543):46656):3125):256):27):4):1)
int cmp(const char *a, const char *b){
return (*a<*b)?-1:(*a>*b);
}
int main() {
struct { char num1, num2, num3, num4, num5, num6, num7, num8, num9, num10, num11; } sumnum;
unsigned int a, b, c, d, e, f, g, h, j, k;
unsigned int sum, sumsort, p; /* 0xFFFF,FFFF = 4,294,967,295 */
clock_t s = clock();
sumnum.num11 = '\0';
for(a = 0; a <= 4; a++) { // 1
for(b = a; b <= 9; b++) { // 2
for(c = b; c <= 9; c++) { // 3
for(d = c; d <= 9; d++) { // 4
for(e = d; e <= 9; e++) { // 5
for(f = e; f <= 9; f++) { // 6
for(g = f; g <= 9; g++) { // 7
for(h = g; h <= 9; h++) { // 8
for(j = h; j <= 9; j++) { // 9
for(k = j; k <= 9; k++) { // 10
sum = power(j) + power(h) + power(g) + power(f) + power(e) + power(d) + power(c) + power(b) + power(a);
p = k+j*10+h*100+g*1000+f*10000+e*100000+d*1000000+c*10000000+b*100000000+a*1000000000;
sprintf((char*)&sumnum, "%010d", sum);
qsort(&sumnum, 10, sizeof(char), (void*)cmp);
sscanf((char*)&sumnum, "%u", &sumsort);
if( sumsort == p) printf("%u %d[msec]\n", sum, clock() - s);
}}}}}}}}}}
}
#include <stdio.h> #include <time.h> #define power(i) (i-1?(i-2?(i-3?(i-4?(i-5?(i-6?(i-7?(i-8?(i-9?0:387420489):16777216):823543):46656):3125):256):27):4):1) int cmp(const char *a, const char *b){ return (*a<*b)?-1:(*a>*b); } int main() { struct { char num1, num2, num3, num4, num5, num6, num7, num8, num9, num10, num11; } sumnum; unsigned int a, b, c, d, e, f, g, h, j, k; unsigned int sum, sumsort, p; /* 0xFFFF,FFFF = 4,294,967,295 */ clock_t s = clock(); sumnum.num11 = '\0'; for(a = 0; a <= 4; a++) { // 1 for(b = a; b <= 9; b++) { // 2 for(c = b; c <= 9; c++) { // 3 for(d = c; d <= 9; d++) { // 4 for(e = d; e <= 9; e++) { // 5 for(f = e; f <= 9; f++) { // 6 for(g = f; g <= 9; g++) { // 7 for(h = g; h <= 9; h++) { // 8 for(j = h; j <= 9; j++) { // 9 for(k = j; k <= 9; k++) { // 10 sum = power(k) + power(j) + power(h) + power(g) + power(f) + power(e) + power(d) + power(c) + power(b) + power(a); p = k+j*10+h*100+g*1000+f*10000+e*100000+d*1000000+c*10000000+b*100000000+a*1000000000; sprintf((char*)&sumnum, "%010u", sum); qsort(&sumnum, 10, sizeof(char), (void*)cmp); sscanf((char*)&sumnum, "%u", &sumsort); if( sumsort == p) printf("%u %d[msec]\n", sum, clock() - s); }}}}}}}}}} }
これで
>>279 は学校で人気者だろw
1分どころか1秒いないに回答4つでてるし。
配列を使わないという制限がある件について
330 :
デフォルトの名無しさん :2009/06/14(日) 13:19:21
>>330 課題1
#include <stdio.h>
int calc_max(int a[],int num){
int i,max = a[0];
for(i=1;i<num;i++){
if(max < a[i]) max = a[i];
}
return max;
}
int main(void){
int data[256];
int i,n;
printf("n: ");
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&data[i]);
}
printf("max: %d\n",calc_max(data,n));
return 0;
}
>>330 課題2
#include <stdio.h>
int main(void){
int a[2][3],b[2][3];
int i,j;
for(i=0;i<2;i++) for(j=0;j<3;j++){
printf("a[%d][%d] = ",i,j);
scanf("%d",&a[i][j]);
}
for(i=0;i<2;i++) for(j=0;j<3;j++){
printf("b[%d][%d] = ",i,j);
scanf("%d",&b[i][j]);
}
printf("\na + b:\n");
for(i=0;i<2;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j] + b[i][j]);
}
printf("\n");
}
return 0;
}
>>330 課題3
#include <stdio.h>
int main(void){
int a[2][3];
int i,j;
for(i=0;i<2;i++) for(j=0;j<3;j++){
printf("a[%d][%d] = ",i,j);
scanf("%d",&a[i][j]);
}
printf("\naT:\n");
for(j=0;j<3;j++){
for(i=0;i<2;i++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
335 :
>>324 :2009/06/14(日) 15:17:50
助けてください 問題の書き方が駄目でしょうか?
>>335 表の写真の通りに画面表示するのは難しいだろうな。
きっとそこまで要求してないと思うが?
>>324 iomanip については使い方を知らないので他の人に頼む
#include<iostream>
//#include<cstdio>
int main(void){
char *namae[]={"高専 卒男","大学 学男","大学 修治"};
int Salary[][2]={{20,215000},
{22,235000},
{24,255000}};
for(int i=0;i<3;++i){
std::cout << namae[i] << " " << Salary[i][0] << " " << Salary[i][1] << std::endl;
// printf("%s %d %d\n", namae[i], Salary[i][0], Salary[i][1]);
}
return 0;
}
338 :
112 :2009/06/14(日) 16:00:08
>>142 ありがとうございます。
ただ課題2がそれだと子プロセスを無限に生成して実行例通りにうまくいきませんでした。
自分で出来る限りやってみたんですがうまくいかなかったのでどなたかもう一度課題2をお願いします。
339 :
112 :2009/06/14(日) 16:00:21
>>142 ありがとうございます。
ただ課題2がそれだと子プロセスを無限に生成して実行例通りにうまくいきませんでした。
自分で出来る限りやってみたんですがうまくいかなかったのでどなたかもう一度課題2をお願いします。
X.Org Wiki を見ていたところ、コードのアップロードに
便利そうなサイトを見つけたんだが、使ってみないか?
ttp://pastebin.com/ 現行では、直接書き込むかアップロードするかなんだが、
自動で色をつけてくれて見やすいなど、結構使い勝手がいいです
ttp://pastebin.com/pastebin.php?help=1 によると
○ And this is all free?
It will always be free, our hosting and maintenance costs are paid for through advertising.
(広告費で費用をまかなってるからいつもフリーだよ)
○ Can I get the source?
The source code to this site is available under a GPL licence. You can download it here
(ライセンスは GPL なので、このサイト自身のソースもダウンロードできるよ)
みたいな感じで、日本語が使えないことを除けば、問題はなさそうだし
#誰か日本語対応バージョン書いてほすぃ
怪しげなサイト。2ch並かそれ以上。
342 :
デフォルトの名無しさん :2009/06/14(日) 17:35:41
名前 値段 産地 りんご 100円 青森県 みかん 60円 和歌山県 ぶどう 150円 山梨県 みたいな感じのテキストファイルがあるんですけど、 これをfscanfで1行ずつ読み取って値段の合計を表示するプログラムを作るにはどうすればいいんですか?
EXCELに読み込んでΣって書いてあるボタンをぽちっ^^
>>279 #include <stdio.h>
unsigned int mtable[]={0,1,2*2,3*3*3,
4*4*4*4,5*5*5*5*5,6*6*6*6*6*6,7*7*7*7*7*7*7,8*8*8*8*8*8*8*8,
9*9*9*9*9*9*9*9*9};
unsigned int ff(int *a){
int i,j;unsigned int result=0;
for(i=1;i<=9;i++)result+=mtable[i]*a[i];return result;
}
int *f(int *a){
unsigned int r;static int x[10],*res=&(x[0]);int i;
r=ff(a);for(i=0;i<10;i++)x[i]=0;
while(r){x[r %10]++;r/=10;}return res;
}
int main(void){
int a[10],*cal,m,i;
for(m=1;m<=10;m++)
for(a[9]=m;a[9]>=0;a[9]--)for(a[8]=m-a[9];a[8]>=0;a[8]--)
for(a[7]=m-a[9]-a[8];a[7]>=0;a[7]--)for(a[6]=m-a[9]-a[8]-a[7];a[6]>=0;a[6]--)
for(a[5]=m-a[9]-a[8]-a[7]-a[6];a[5]>=0;a[5]--)for(a[4]=m-a[9]-a[8]-a[7]-a[6]-a[5];a[4]>=0;a[4]--)
for(a[3]=m-a[9]-a[8]-a[7]-a[6]-a[5]-a[4];a[3]>=0;a[3]--)
for(a[2]=m-a[9]-a[8]-a[7]-a[6]-a[5]-a[4]-a[3];a[2]>=0;a[2]--)
for(a[1]=m-a[9]-a[8]-a[7]-a[6]-a[5]-a[4]-a[3]-a[2];a[1]>=0;a[1]--){
if(a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]!=m)continue;
cal=f(a);
for(i=1;i<=9;i++)if(a[i]!=cal[i])goto skip;
printf("Sum=%u¥n",ff(a));
skip:;
}}
346 :
デフォルトの名無しさん :2009/06/14(日) 18:01:02
>>344 すいません。
[1] 授業単元:C言語実習
[2] 問題文:
「演習1を利用し、数値データファイルを1行ずつ読み込み、
合計を計算して表示するプログラムを作成しなさい。 」
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:CPad for Borland C++Compiler バージョン2.31
[4] 期限:2009年06月15日まで
[5] その他の制限:fscanfを利用、演習1を利用
ちなみに演習1というのは「データファイルdata.txtを1行ずつ読み込み(fgetsを利用)表示するプログラムを作成せよ」
というもので、data.txtの中は
名前 値段 産地
りんご 100円 青森県
みかん 60円 和歌山県
ぶどう 150円 山梨県
↑です。
よろしくお願いします。
演習1の回答を載せたほうがいいでしょうか?
>>346 乱暴だけど答えは出る
#include <stdio.h>
void main(void)
{
FILE *fp;
char name[256], price[256], from[256];
int sum = 0;
fp = fopen("nurupo.txt", "r");
if(fp == NULL)
exit(0);
while( fscanf(fp, "%s %s %s", &name, &price, &from ) != EOF ){
sum += atoi( price );
}
printf( "合計:%d\n", sum );
fclose(fp);
}
348 :
デフォルトの名無しさん :2009/06/14(日) 18:15:48
>>347 返答ありがとうございます
それを実行すると結果は60になったのですが、それってあってるのでしょうか?
ちなみに演習1は
#include<stdio.h>
#include<stdlib.h>
int main(void){
FILE *fp;
char s[20];
if((fp=fopen("data.txt","r"))==NULL){
printf("ファイルがオープンできません。\n");
exit(1);
}
while(fgets(s,20,fp)!=NULL){
printf("%s",s);
}
fclose(fp);
return(0);
}
こんな感じです。
あとEOFっていうのはまだ習ってないです。
最初に書かなくてすいません。
>>348 テキストのデータがまずいと思う
文字列の間に入れる空白は統一しないと
名前 値段 産地
りんご 100円 青森県
みかん 60円 和歌山県
ぶどう 150円 山梨県
↑これをテキストに貼り付けて試して
350 :
デフォルトの名無しさん :2009/06/14(日) 18:30:49
>>349 なるほど!
ちゃんと合計がでました、ありがとうございます。
EOFの意味も自己解決しました。
あと、何度も申し訳ないのですが……
while( fscanf(fp, "%s %s %s", &name, &price, &from ) != EOF ){
sum += atoi( price );
}
の部分の atoi(price); というのがよくわかりません。
どなたか解説してくれないでしょうか。
おそらく知らないということは習ってないと思うので、できればその部分を他のやり方で教えてほしいです。
本当に何度もすいません。どなたかよろしくお願いします。
atoiは文字列を数値に変換する関数 変換できなかったら0、途中で数字じゃない文字列が入ってたら途中までを変換する これ使わないで自作すると糞めんどくさい処理になるけど・・・
>>346 じゃないけどやっぱここのスレは勉強になりまくるわ。例題と回答がどんどん出てくるし。
どこが糞めんどくさいんだ? int atoi(const char *s) { int ret = 0; while ('0' <= *s && *s <= '9') ret = 10*ret + *s++ - '0'; return ret; }
354 :
デフォルトの名無しさん :2009/06/14(日) 18:47:40
>>351 解説ありがとうございます。理解しました。
そんなに複雑な処理になってしまうのならやめておいたほうがよさそうですねw
でもおかげでなんとかなりそうです。本当にありがとうございました。
>>353 それはそうだけど、さすがにそのコードは書けなくない?
レベル的に一文字ずつ取得してif文で分岐とか考えてた
>>346 これならどうだ!
#include<stdio.h>
int main(void){
char buf[1024];
int sum=0, price;
FILE *fp;
char *filename="data.txt";
fp=fopen(filename, "r");
if(fp==NULL) return 1;
fgets(buf, sizeof(buf), fp); // 一行目は読み捨てる
while(fscanf(fp, "%*s %d円 %s", &price, buf)==2){
sum+=price;
}
fclose(fp);
printf("\n計 %d 円\n", sum);
return 0;
}
>>356 見て気付いたけど
while( fscanf(fp, "%s %s %s", &name, &price, &from ) != EOF ){
じゃなくて
while( fscanf(fp, "%s %s %s", name, price, from ) != EOF ){
だ
前スレ 511 をやる人いないの? どの程度処理時間がかかるのか興味があるんだが…
>>360 概算なら出せる。
約 読む時間*5+書く時間 = 処理時間
ソートタイムそのものは、全体のアクセス時間に比べればわずか。
ミスた 約 読む時間*50+書く時間 = 処理時間 ソートタイムそのものは、全体のアクセス時間に比べればわずか。
363 :
279 :2009/06/14(日) 20:47:31
>>360 D:\work\126511>timer "mkfile 1"
Duration time is 55.80 seconds
D:\work\126511>timer "copy 1000MB.txt 1000MB2.txt"
1 個のファイルをコピーしました。
Duration time is 53.70 seconds
D:\work\126511>timer "sort /M 30000 /T E:\tmp 1000MB.txt /O 1000MB3.txt"
Duration time is 101.20 seconds
mkfile は
>>665 のソースを元に、最初に引数でsrandを実行するようにしたもの。
sort は Windows標準のコマンド
366 :
360 :2009/06/14(日) 21:37:29
>>365 thx
sort ってめちゃくちゃ早いですね
これより早くできる気がしない
>>366 時間から推測するに、
入力ファイルの読込み+ワークへの出力+ワークからの入力+出力ファイルへの出力
なんではと思う。ワークからの入力時にOSのキャッシュが効くんじゃないかな。
プログラムで使用するメモリーサイズは指定できるが、こういうのは、許されるかな?
>>358 これは、ちょっと加工が必要。
http://pastebin.com/m599a713d [m599a713d.c.html]
<pre>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <strings.h>
[1]番外 [2] sortコマンドのアルゴリズムを要約 ☆メモリは例えば320Mバイトしか使用出来ない ☆テンポラリファイルを作ることは許可 ☆標準入力からの入力に堪えること。 ☆標準出力に出力すること ☆ホンモノのようにタブ区切りの特定項目の組み合わせについてソート しろとかそういう面倒なことまでは不要 ☆出来ればサンプルコード [3] 日本語。サンプルコードはC/C++どっちでもいいよ [4]無期限だがこのスレ(127)が終わるまでとしとこ
>>369 宿題でないならスレ違い
限られたメモリでの巨大ファイルのソートのやり方が知りたいなら
マージソートで検索すれば良いだけ
きわめて一般的な手法で人に解かせる意味はない
>>370 前スレ
>>511 で出された問題の延長?期限なしなので宿題かどうかは不明。
関心ある奴が継続して取り組んでいるかな?
確かに一般的手法はあるんだろうが、ちょい静観して。
[1] 授業単元:C言語 [2] 問題文(含コード&リンク):do-while分の問題です。数を入力し、1から入力値まで"*"で会談を表示する [3] 環境 [3.1] OS: WindouwsVISTA [3.2] コンパイラ名とバージョン: VC9.0 [3.3] 言語: C言語 [4] 期限:無期限(授業の復習) [5] その他の制限:習ったのはprintf,int,float,while,do-while,for,switch(現在習っている命令)です #include<stdio.h> main(){ int a,i; i = 1; printf("行数は?"); scanf("%d",&a); do{ printf("*****\n"); i++; }while(i<a); } というプログラムを入力しているのですが、うまくいきません どうすればいいんでしょうか?
>>372 #include<stdio.h>
int main(){
int a, i, j;
printf("行数は?");
scanf("%d",&a);
for(i = 0; i < a; i++){
for(j = 0; j <= i; j++){
printf("*");
}
printf("\n");
}
return 0;
}
>>374 すいません、do-whileで作らなければいけないんです……
あーあ、会談ですごく悩んだわ。。。こんなんだからいつまでたっても初心者だわ。
>>372 #include <stdio.h>
int main()
{
int a,i,j;
i = 0;
printf("行数は?");
scanf("%d",&a);
do {
j = 0;
do {
printf("*");
j++;
}while(j<=i);
printf("\n");
i++;
}while(i<a);
return 0;
}
>>373 #include <stdio.h>
int main(void)
{
double d[] = {50.5, 75.0, 62.0, 65.5, 80.0, 95.0, 90.5, 87.0, 80.0, 99.5};
double sum, *ptr = d;
int i, n;
n = sizeof(d) / sizeof(double); /* n = 10; */
for(i = 0, sum = 0.0; i < n; i++){
sum += *(ptr + i);
}
printf("%f", sum / n);
return 0;
}
>>377 ありがとうございます。
コンパイルして実行したら、確かにできました
ありがとうございました!
>>378 無事うまくできました!
ありがとうございました!
[1] 数値計算法 [2] f(x)=cos(5sin(2πx+1)),0<x<1.0 1.台形則を用いて数値積分せよ。分点の数を倍々に増やしていくと積分値がどのように変化するのか 2.シンプソン則を用いて数値積分せよ。積分値の収束の様子を示せ。 [3] 環境 [3.1] Windows [3.2] Cpad for Borland [3.3] C++ [4] 期限:本日am:11:00まで [5] ソース提出なし。変化のグラフを提出。fprintで出力したい。
>>381 俺含め通勤時間+勤務時間でほとんどの人は沈没だな。
南無。
>>383 これ、fを求める関数にして、aを0.0、bを1.0にして、
最後にIを表示すれば、1回分の数値積分になる。
「分点の数を倍々に」というのは、さらにループを被せないといけないが、
グラフだけ出せばいいなら、とりあえず人間が入力して何回分かやれば。
>>381 台形則
#include<stdio.h>
#include<math.h>
#define PI 3.1415926535897932384626433832795
double f(double x){
return cos(5*sin(2*PI*x+1));
}
double integral(double (*f)(double), double s, double e, long div){
long i;
double x, delta, sum;
delta=(e-s)/div;
sum=(f(s)+f(e))/2;
for(i=1;i<=div-1;i++){
x=s+delta*i;
sum+=f(x);
}
sum*=delta;
return sum;
}
int main(void){
long i, div;
FILE *fp=stdout;
for(i=0;i<=20;i++){
div=1<<i;
fprintf(fp, "div=%ld integral=%g\n", div, integral(f, 0.0, 1.0, div));
}
return 0;
}
387 :
デフォルトの名無しさん :2009/06/15(月) 10:30:58
[1]c言語 [2]scanf により n を受け取り, 要素数 n の乱数配列を生成し表示するプログラムを作成せよ. ただし, 配列の要素を表示するときは一行につき 10 個ずつ表示するようにせよ. [3]windows 動的なオブジェクトの生成でお願いします。 期限は今日中です。
388 :
381 :2009/06/15(月) 10:32:34
>>381 シンプソン則
double integral(double (*f)(double), double s, double e, long div){
long i;
double x, delta, sum, t;
if(div<2) return -1;
delta=(e-s)/div;
sum=(f(s)+f(e));
for(i=1,t=0.0;i<div;i+=2){
x=s+delta*i;
t+=f(x);
}
sum+=t*4;
for(i=2,t=0.0;i<div;i+=2){
x=s+delta*i;
t+=f(x);
}
sum+=t*2;
sum*=delta/3;
return sum;
}
390 :
デフォルトの名無しさん :2009/06/15(月) 10:42:20
[1]c言語 [2]二次元ベクトルを表す配列 double x[2] と角度 degree を受け取り, ベクトル x を degree 度回転させたベクトル を返す関数 double* rotation( int degree, double x[] ) を作成せよ. 三角関数は math.h を include すれば使える. (ヒント calloc を使う) [3]環境 [3.1]windows [3.2]c言語 [4]期限、今日の14時30分まで [5]ポインタを用いる。 お願いします。
>>387 動的なオブジェクトの生成ってどういう意味?
392 :
デフォルトの名無しさん :2009/06/15(月) 10:48:55
393 :
デフォルトの名無しさん :2009/06/15(月) 10:49:39
>>391 すいませんとくに意味はないです。ただポインタをもちいてお願いします。
>>390 double* rotation(int degree, double x[]){
double *y, theta;
y=calloc(sizeof(double),2);
theta=M_PI*degree/180;
y[0]=x[0]*cos(theta)-x[1]*sin(theta);
y[1]=x[0]*sin(theta)+x[1]*cos(theta);
return y;
}
>>387 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int i, n, *x;
srand(time(NULL));
printf("Input n : ");
scanf("%d", &n);
x=malloc(sizeof(*x)*n);
for(i=0;i<n;i++) x[i]=rand();
for(i=0;i<n;i++){
if(i && i%10==0) printf("\n");
printf(" %d", x[i]);
}
free(x);
return 0;
}
396 :
デフォルトの名無しさん :2009/06/15(月) 11:00:16
397 :
デフォルトの名無しさん :2009/06/15(月) 11:01:20
>>どうもです。
398 :
デフォルトの名無しさん :2009/06/15(月) 11:02:38
>>394 y=calloc(2, sizeof(double));
じゃない?
402 :
デフォルトの名無しさん :2009/06/15(月) 12:23:08
>>324 >>402 #include<iostream>
using std::cin;
using std::cout;
#define MAX_NUM 10
int main(void){
int i, num;
char ch;
char *namae[MAX_NUM];
int Salary[MAX_NUM][2];
for(num=0; num<MAX_NUM; num++) {
namae[num] = new char[80];
cout << "氏名を入力して下さい(改行で終了)";
cin.getline(namae[num], 80);
if(*namae[num] == '\0') break;
cout << "年齢を入力して下さい";
cin >> Salary[num][0];
cout << "初任給を入力して下さい";
cin >> Salary[num][1];
cin.get(ch);
}
cout << "\n 氏 名 |年 齢| 初任給\n";
for(i=0; i<num; i++) {
cout << " ";
cout.width(10);
cout << namae[i]
<< " | " << Salary[i][0]
<< " | " << Salary[i][1] << std::endl;
}
for(i=0; i<num; i++) delete namae[i];
}
407 :
デフォルトの名無しさん :2009/06/15(月) 18:50:27
>>404 ひとつめ
#include<stdio.h>
int pow2(int no);
int main(void){
int a,b,no;
printf("整数Aを入力してください\n");
scanf("%d",&a);
printf("何ビットシフトしますか?\n");
scanf("%d",&no);
b=pow2(no);
printf("A × (2の%d乗)=%d\n",no,a*b);
printf("A ÷ (2の%d乗)=%d\n\n",no,a/b);
printf("A<<%d = %d\n",no,a*b);
printf("A>>%d = %d\n\n",no,a/b);
printf("符号無し整数%dの左右%dビットシフトは、\n2の%d乗での乗算や除算と等しいです。",a,no,no);
return 0;
}
int pow2(int no){
int a=1;
while(no!=0){
a=a*2;
no--;
}
return a;
}
[1] 授業単元:For文 [2] 問題文:整数1〜10までの累計(1+2+3・・・・9+10=55) [3.1] OS: XP [3.2] Turbo C++ [3.3] C++ 簡単だと思いますがアホなんでわかりません。 #include <iostream.h> #include <conio.h> void main(){ int i, goukei; goukei=0; for (i = 0; i < 10; i++) { goukei=i+goukei+1; } cout<<goukei<<endl; getch( ); } こんなん思いつきましたがもっとスマートな方法はありますか??
まじでwhile(no!で吹いた。
>>408 1から10までなら i=1; i<=10; / goukei += i; の方が、
取り立ててスマートというわけではないが読みやすいと思う
413 :
デフォルトの名無しさん :2009/06/15(月) 19:59:44
414 :
デフォルトの名無しさん :2009/06/15(月) 20:01:54
お願い致しますm(__)m 3日ぐらい悩んでます…自分ではあってるかわかりませんがここまでやりました #include <stdio.h> int main() { int i, m, p; int count; printf("\nmの値を入力してください"); scanf("%d",&m); count = 0; for(i=m%7;p=m%6;){ if (i==5){ if (p!=2){ count++;} ;} ;} printf("今日から%dの間には仏滅でない日曜日が%d日ある",m,count); getch(); return 0; }
>>407 すいません
関数 unsigned pow2 を使ってないので使って書いてほしいです
418 :
デフォルトの名無しさん :2009/06/15(月) 21:43:32
[1] 授業単元 C言語
[2] 問題文
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9462.txt 結果の例 最初にどの型で入力するか入力、そのあとその型の値を入力
(例はintで入力のとき)
Printing int 123 (入力した値)
Printing data at location: 01D70C44 (アドレス)
この下の4つは最初に入力した値をほかの方で出力したときの値
Data as char :
Data as int : 123
Data as long : 8069185
Data as float : 0.00
[3] 環境 [3.1] OS Windows
[3.2] コンパイラ名とバージョン:VisualC++
[3.3] 言語: C
[4] 期限: 6月16日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限 voidポインタを使わなければならない。これだと結果がおかしいのでこのプログラムの修正です
>>418 すくなくとも %l じゃなくて %ld
で、どこがおかしいの?
420 :
デフォルトの名無しさん :2009/06/15(月) 21:56:08
>>419 %lを%ldと直したら解決できました。ありがとうございます。
>>413 六曜もしくは旧暦の算出ができないとどうにもならんと思うぞ
422 :
デフォルトの名無しさん :2009/06/15(月) 22:47:03
#include <iostream> using namespace std; int main() { const float pi = 3.141592; float a; cout << "半径を入力してください(単位(cm)) /n"; cin >> a; cout << "半径" << a << "(cm)の円の円周は" << 2.0 * a * pi; cout << "(cm)で、円の面積は" << a * a * pi << "(平方cm)です/n"; このプログラムの途中にpi=2.5;を挿入して、コンパイルするとどうなるか。 このプログラムのどこに入れたらいいんですか。これは?
>>422 int main()
の前にいれてみては?www
>>422 プログラムを作れという問題じゃなくて、
「どうなるか」っていう問題だから、
思いつくいろいろなところに入れて、
どうなるか調べて、まとめて書けばいい。
問題文の意味を理解する日本語の問題。
425 :
デフォルトの名無しさん :2009/06/15(月) 23:09:27
普通に考えて const float pi = 3.141592; const float pi = 2.5; じゃないの?
>>425 No
構文エラーとか
文字列リテラルの中に入れるとか
あるでしょ
428 :
デフォルトの名無しさん :2009/06/15(月) 23:12:59
以下のように出力されるプログラムを作成せよ 年齢を入力してください 16 生まれた年を入力してください 1986 好きな数字を入力してください 7 あなたは1986年生まれの16才で、7が好きですね 台形の面積を求めるプログラムを作成せよ 上底を入力してください。(単位はcm) 3 下底を入力してください。(単位はcm) 4 高さを入力してください。(単位はcm) 5.0 台形の面積は17.5平方cmです。 誰か助けてください。
こういう問題を解く場合にそなえ、名著「ライトついていますか?」を読んでおくといい。
430 :
デフォルトの名無しさん :2009/06/15(月) 23:13:59
>>425 ですが、言い忘れてしまいました。
こういうのって一筋縄でいくならconst float pi = 3.141592;の下に入れるはずですよね
431 :
デフォルトの名無しさん :2009/06/15(月) 23:20:38
>>428 ですが
書き始めは
#include <iostream>から始めるっぽいです。
あと、上の問題(年齢の方の問題)をcinを一度だけつかって実現せよっていうのも問題にありました
432 :
デフォルトの名無しさん :2009/06/15(月) 23:22:08
>>425 なんでそう思うの?
プログラムの途中にpi=2.5;を挿入しろと書いてあるんだから、
まずやってみて、どうなるか自分の目で確かめればいい。
たぶん出題者の意図は、constの意味が分かってるかどうかだけど、
それにしても、正解例はひとつだけじゃない。
>>426 いや、pi=2.5;を挿入しろと言ってるんだから、
もしそれなら、2行目のconst floatはいらないよ。
"pi=2.5;"; {pi=2.5;} こんなんか
435 :
デフォルトの名無しさん :2009/06/15(月) 23:34:28
>>428 みたいなあまりにも基本的な問題は、教えるべきか悩むなあ。
これ分からなかったら、今後ずっと全部コピペ解答し続けるしかないもん。
まあ、ほかの誰かが解答するかな。
>>428 #include <iostream>
using namespace std;
int main(){
cout << "年齢を入力してください\n" << 16 << endl;
cout << "生まれた年を入力してください\n" << 1986 << endl;
cout << "好きな数字を入力してください\n" << 7 << endl;
cout << "あなたは1986年生まれの16才で、7が好きですね" << endl;
}
437 :
デフォルトの名無しさん :2009/06/15(月) 23:53:39
#include <iostream> using namespace std; int main() { pi = 2.5; pi = 3.141592; float a; cout << "半径を入力してください(単位(cm)) /n"; cin >> a; cout << "半径" << a << "(cm)の円の円周は" << 2.0 * a * pi; cout << "(cm)で、円の面積は" << a * a * pi << "(平方cm)です/n"; このプログラムの途中にpi=2.5;を挿入して、コンパイルするとどうなるか。 じゃあこうなるんですか
438 :
デフォルトの名無しさん :2009/06/16(火) 00:10:40
内容: [1] 授業単元: プログラミング論 [2] 問題文(含コード&リンク): 入力ストリームから読み込んだデータ文字列を、データベースに格納する前にスタックに一時的に格納するプログラムを作成する。 このときデータをまとめたデータ文字列を一つづつスタックへプッシュしたりポップしたりする家庭がわかるプログラムを作成する。 なおスタックを実現するライブラリは、スタックのための別のヘッダにまとめる [3] 環境 [3.1] OS: Windows vista [3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5 [3.3] 言語: C [4] 期限: 2009年6月16日13:00まで
439 :
デフォルトの名無しさん :2009/06/16(火) 00:12:19
#include <stdio.h> #include <stdlib.h> typedef struct { int max; /* スタックのサイズ */ int ptr; /* スタックポインタ */ int *stk; /* スタック(の先頭要素へのポインタ) */ } Stack; int StackAlloc(Stack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(int))) == NULL) { s->max = 0; /* 配列の確保に失敗 */ return (-1); } s->max = max; return (0); }
440 :
デフォルトの名無しさん :2009/06/16(火) 00:13:04
>>433 2行目のconst floatだけがいらないんですか?
それともその行のconst floatpi = 3.141592; 自体がいらないんですか。
というか、僕が書いた、上のでいいんですかね
441 :
# :2009/06/16(火) 00:15:00
void StackFree(Stack *s) { if (s->stk != NULL) { free(s->stk); s->max = s->ptr = 0; } } int StackPush(Stack *s, int x) { if (s->ptr >= s->max) return (-1); s->stk[s->ptr++] = x; return (0); } int StackPop(Stack *s, int *x) { if (s->ptr <= 0) /* スタックは空 */ return (-1); *x = s->stk[--s->ptr]; return (0); }
442 :
# :2009/06/16(火) 00:15:59
int StackPeek(const Stack *s, int *x) { if (s->ptr <= 0) /* スタックは空 */ return (-1); *x = s->stk[s->ptr - 1]; return (0); } int StackSize(const Stack *s) { return (s->max); } int StackNo(const Stack *s) { return (s->ptr); } int StackIsEmpty(const Stack *s) { return (s->ptr <= 0); } int StackIsFull(const Stack *s) { return (s->ptr >= s->max); } void StackClear(Stack *s) { s->ptr = 0; }
443 :
デフォルトの名無しさん :2009/06/16(火) 00:17:22
int main(void) { Stack s; if (StackAlloc(&s, 100) == -1) { puts("スタックの確保に失敗しました。"); return (1); } while (1) { int m, x; printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s)); printf("(1) プッシュ (2) ポップ (0) 終了:"); scanf("%d", &m); if (m == 0) break;
444 :
# :2009/06/16(火) 00:21:08
switch (m) { case 1: printf("データ:"); scanf("%d", &x); if (StackPush(&s, x) == -1) puts("スタックへのプッシュに失敗しました。"); break; case 2: if (StackPop(&s, &x) == -1) puts("ポップできません。"); else printf("ポップしたデータは%dです。\n", x); break; } } StackFree(&s); return (0); } このプログラムを書き換えて作る 二次元配列を用いた場合どこをどう変えるか分かりません 教えてください 連張りすみませんでした
445 :
デフォルトの名無しさん :2009/06/16(火) 00:23:29
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 次のフォーマットで,ある人の1日ごとの仕事時間を入力すると,日数と仕事の合計時間を出力するプログラムをつくりなさい。 ただし,仕事時間の入力データが不正な場合(hh:mmの入力で,hh>23やhh<0やmm>59やmm<0の場合)は再入力をさせるようにしなさい。 また,終了は0:0とします。 <出力例> 日 数 17 日 合計時間 104 時間 23 分 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc3,4 [3.3] 言語: c言語 [4] 期限:6月17日
446 :
デフォルトの名無しさん :2009/06/16(火) 00:27:40
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): キーボードから入力された1行(空白で区切られた正整数並びの文字列)を項に分解して,i番目の項の整数値を配列要素d[i-1]に累算しながら格納するプログラムをつくりなさい。 ただし,配列dの要素数は10として宣言し,10項目より多い入力の場合は11項目以降を棄却しなさい。 1行の入力には関数fgetsを用いなさい。 fgetsは改行文字も取り込む点に注意して,入力の終了は「改行のみの入力」で判定しなさい。 [3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 6月16日 23:59 [5] その他の制限: なし
>>437 const float pi = 3.141592;
って定義されたあとに
pi = 2.5;
を入れてコンパイルするとどうなりますか?
或いは
pi = 2.5;
を
const float pi = 3.141592;
の前に挿入してコンパイルするとどうなりますか?
などを自分で試して、実際どうなるか、どうしてそうなるのかを考えてくださいていう宿題だろ。
その問題に答えはなくて、constの役割を学習して来いってことだと思うよ。
448 :
デフォルトの名無しさん :2009/06/16(火) 00:39:13
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 以下のコードはいずれも間違っています。 どこに間違いがあるかを指摘して,修正を施しなさい。 階乗を計算するコード: int factorial(int n) { int fac; fac = 1; while (n--) fac *= n; return fac; } 文字列の文字を1行に1文字ずつ表示するコード: i = 0; do { putchar(s[i++]); putchar('\n'); } while (s[i] != '\0'); コピー元からコピー先へ文字列を複写するコード: void strcpy(char *dest, char *src) { int i; for (i = 0; src[i] != '\0'; i++) dest[i] = src[i]; } [3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限: 6月16日 23:59 [5] その他の制限: 特になし
449 :
デフォルトの名無しさん :2009/06/16(火) 00:57:36
>>432 旧暦の (月+日)%6 で六曜が分かるんだよ
で、どうやって六曜を取得するかって話
課題としては適切ではないように思える
>>448 上 nを引くタイミングが早い。
中 s[0]が'\0'なら暴走する。
下 '\0'がコピペされん。
>>413 今日の曜日と六曜を入力出来るようにすればいい。
先勝,友引,先負,仏滅,大安,赤口
----------------------------------
.月曜 .火曜0.水曜1.木曜2.金曜3.土曜4
(日曜).月曜6.火曜7.水曜8.木曜9.金曜0
.土曜1(日曜).月曜3.火曜4.水曜5.木曜6
.金曜7.土曜8(日曜).月曜0.火曜1.水曜2
.木曜3.金曜4.土曜5(日曜).月曜7.火曜8
.水曜9.木曜0.金曜1.土曜2(日曜).月曜4
.火曜5.水曜6.木曜7.金曜8.土曜9(日曜)
.月曜1.火曜2.水曜3.木曜4.金曜5.土曜6
0-4:0
5-11:1 (6) 7-13 (+2)
12-18:2 (6) 14-20 (+2)
19-25:3 (6) 21-27 (+2)
26-32:3 (6) 21-27 (-5)
33-39:4 (6) 28-34 (-5)
40-46:5 (6) 35-41 (-5)
#include <stdio.h>
int main() {
int N, M;
do{ printf("N=");
if(scanf("%d", &M) == 1) break;
scanf("%*s");
} while(!0);
printf(" ");
for(N=0; N<=M; N++) {
if((N+2)%7==0) puts("");
printf("%2d:%2d ", N, N/42*5 + ((N%42<=25)?(N%42+2)/7:(N%42-5)/7) );
}
}
453 :
デフォルトの名無しさん :2009/06/16(火) 01:55:53
>>453 #include <stdio.h>
#define NMAX 15
main(){
int a[NMAX];
int i, j;
for(i=0; i<NMAX; i++) {
printf("%d>", i+1);
if(scanf("%d", &a[i]) != 1) scanf("%*s"), i--;
if(a[i]<0) break;
}
j=i; puts("");
for(i=0; i<j; i++) printf("%d ",a[i]);
}
457 :
# :2009/06/16(火) 08:56:02
438の問題誰かお願いします;;
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): n*n行列A、Bをそれぞれキーボード から入力し、積を求めろ。 行列の大きさnもキーボードから入力せよ。多次元配列を使ってください。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: Cのみ [4] 期限: 明日 [5] その他の制限: 配列ぐらいまでしかわかってません よろしくお願いします。。
>>458 #include <stdio.h>
#define N 8
int main(void)
{
double A[N][N], B[N][N], C[N][N];
int i, j, k, n;
printf("input n >> "); scanf("%d", &n);
if (n > N) n = N;
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) { printf("input A(%d, %d) >> ", i, j); scanf("%lf", &A[i][j]); }
}
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) { printf("input B(%d, %d) >> " , i, j); scanf("%lf", &B[i][j]); }
}
for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) C[i][j] = 0;
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
for (k = 0; k < n; ++k)
C[i][j] += A[i][k] * B[k][j];
return 0;
}
461 :
# :2009/06/16(火) 10:57:23
>>459 ありがとうございます
ですが、できれば参考プログラムを元にして作っていただけたらうれしいです
あと、C++言語ではなくC言語でお願いします
すみません;;
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):catをシステムコールとライブラリ関数で作り直す [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: C [4] 期限: 2009年6月18日23:59まで [5] その他の制限: システムコールの方はreadとwriteを使うとのことです。 困っています!よろしくお願いします!!
>>446 i番目の項の整数値を配列要素d[i-1]に累算しながら格納する 6月16日23:59
>>445 日数と仕事の合計時間を出力する 6月17日
>>438-444 (CODE)
>>459 (9467)
>>461 入力ストリームから読み込んだデータ文字列を、データベースに格納する前にスタックに一時的に格納する
>>416 (9461) ラジアン。 6月18日
>>404 (9458) ラジアン。 6月19日
>>364 (9455) 巡回セールスマン問題。最短経路長をもった閉路と閉路長を比較する。 6月16日
>>226 >>230 (9439) (EXE)ファイルから問題文を読み込み、10問(3択)を解いていく。 6月15日(月)19:00
>>183 画像の解像度と同じサイズの二次元配列を作りなさい。 なし
>>170 (9423,9424)
>>235 >>237 >>239 画像情報処理4問。 6月11日
>>073 (9399) 3次元上の格子点をarray<int, 3> で表すとする.点を要素に持つベクトルを用意し,大きさn を入力する。 6月9日
>>072 (9398) 3次元上の1点をarray<double, 3> で表すとする.2つの点を受け取ってそれらの内積(inner_product) を返す関数を作成 6月9日
>>前511>>前516
>>369 一行1000バイト以下のテキストファイルをソートするプログラム。 なし
>>446 #include <stdio.h>
#define N 10
#define M 256
int main(void)
{
int d[N];
char b[M];
int i;
for (i = 0; i < N; ++i) d[i] = 0;
while (*fgets(b, M, stdin) != '\n') {
int i = 0, j = 0, k = 0;
do {
while ('0' <= b[j] && b[j] <= '9') {
if (k) d[i] = d[i] * 10 + b[j] - '0';
else { d[i] += b[j] - '0'; k = 1; }
j++;
}
i++, j++;
k = 0;
} while (b[j] != '\n' && i < N);
}
return 0;
}
>>464 #include <stdio.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265
#endif
#define N_ANG 100
int main(void)
{
double ang_sin[N_ANG][2], ang0, ang1;
int i, n;
printf("始点の角度(deg)? : "); scanf("%lf", &ang0);
printf("終点の角度(deg)? : "); scanf("%lf", &ang1);
printf("分割数? : "); scanf("%d", &n);
for (i = 0; i < n + 1; ++i) {
ang_sin[i][0] = ang0 + (ang1 - ang0) / n * i;
ang_sin[i][1] = sin(M_PI * ang_sin[i][0] / 180);
}
for (i = 0; i < n + 1; ++i)
printf("%10.6f\t%10.6f\n", ang_sin[i][0], ang_sin[i][1]);
return 0;
}
467 :
デフォルトの名無しさん :2009/06/16(火) 12:22:30
>>466 申し訳ありません。
#ifndef、#endifの二つは習って無いので使わずに書くことはできますでしょうか?
468 :
デフォルトの名無しさん :2009/06/16(火) 12:26:35
[1] 授業単元:プログラミングT [2] 問題文(含コード&リンク):「12以下の自然数nを入力して下さい。」と画面に出力し、キーボードからnに値を入力する。 そしてn!(nの階乗)を計算して表示するプログラムを作成せよ。 ただしn!=1×2×3×・・・× (n-1)×nであり、「n」の入力はmain関数内で行い、『引数をnとし、その階乗を計算して画面に出力する(戻り値は無し)』関数を作成し、main関数内で使用せよ。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語:C [4] 期限:2009年6月19日10時 [5] その他の制限:関数に入ったばかりです。よろしくお願いします。
>>467 #include <stdio.h>
#include <math.h>
#define PI 3.14159265
#define N_ANG 100
/* あとから付け足すなクズ */
int main(void)
{
double ang_sin[N_ANG][2], ang0, ang1;
int i, n;
printf("始点の角度(deg)? : "); scanf("%lf", &ang0);
printf("終点の角度(deg)? : "); scanf("%lf", &ang1);
printf("分割数? : "); scanf("%d", &n);
/* 習ってないものを使っちゃいけないなら習ったものを全部書け */
for (i = 0; i < n + 1; ++i) {
ang_sin[i][0] = ang0 + (ang1 - ang0) / n * i;
ang_sin[i][1] = sin(PI * ang_sin[i][0] / 180);
}
for (i = 0; i < n + 1; ++i)
printf("%10.6f\t%10.6f\n", ang_sin[i][0], ang_sin[i][1]);
return 0;
}
>>445 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 16
int main(void)
{
char buff[BUFFSIZE];
int hour = 0, minute = 0;
while (1) {
int hh, mm;
printf("input >> ");
if (!fgets(buff, BUFFSIZE, stdin)) break;
hh = atoi(strtok(buff, ":"));
mm = atoi(strtok(NULL, ":"));
if (hh == 0 && mm == 0) break;
if (hh > 23 || hh < 0 || mm > 59 || mm < 0) continue;
minute += mm; if (minute >= 60) { minute -= 60; hour++; }
hour += hh;
}
printf("日 数 %4d 日\n", hour / 24);
printf("合計時間 %4d 時間\n", hour);
printf(" %4d 分\n", minute);
return 0;
}
472 :
デフォルトの名無しさん :2009/06/16(火) 12:30:37
[1] 授業単元:プログラミングT [2] 問題文(含コード&リンク): 上記のプログラムで、階乗の計算結果を表示したら再び「12以下の自然数nを入力して下さい。」と画面に出して計算をし続けるプログラムに変更せよ。 ただし負の数を入力した場合にはプログラムが終了するものとし、『nの階乗を計算・表示する関数』を必ず使うこと。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語:C [4] 期限:2009年6月19日10時 [5] その他の制限:上記=468の問題です。よろしくお願いします。
473 :
# :2009/06/16(火) 12:34:33
>>468 #include <stdio.h>
long f(int n) { return (n <= 1)? 1: f(n - 1) * n; }
int main(void)
{
int n;
printf("12以下の自然数nを入力して下さい。"); scanf("%d", &n);
if (n <= 12) printf("%d! = %d\n", n, f(n));
return 0;
}
>>472 #include <stdio.h>
long f(int n) { return (n <= 1)? 1: f(n - 1) * n; }
int main(void)
{
int n;
while (1) {
printf("12以下の自然数nを入力して下さい。"); scanf("%d", &n);
if (n < 0) break;
if (n <= 12) printf("%d! = %d\n", n, f(n));
}
return 0;
}
問題をちゃんと呼んでなかった。
>>474 は無視して。
>>468 #include <stdio.h>
long f(int n) { return (n <= 1)? 1: f(n - 1) * n; }
void PrintFactorial(int n) { printf("%d! = %d\n", n, f(n)); }
int main(void)
{
int n;
printf("12以下の自然数nを入力して下さい。"); scanf("%d", &n);
if (n <= 12) PrintFactorial(n);
return 0;
}
>>472 #include <stdio.h>
long f(int n) { return (n <= 1)? 1: f(n - 1) * n; }
void PrintFactorial(int n) { printf("%d! = %d\n", n, f(n)); }
int main(void)
{
int n;
while (1) {
printf("12以下の自然数nを入力して下さい。"); scanf("%d", &n);
if (n < 0) break;
if (n <= 12) PrintFactorial(n);
}
return 0;
}
476 :
デフォルトの名無しさん :2009/06/16(火) 13:41:12
[1] 授業単元:アルゴリズム [2] 問題文(含コード&リンク):滑降シンプレックス [3] 環境 [3.1] Windows [3.2] コンパイラ名とバージョン: [3.3] 言語:C++ [4] 期限:6月19日 [5] その他の制限:各点の大きさを比べるところまでは出来ました。 その後の最良点、2番目に良い点を結びその中点を最悪点が通る部分が分かりません。 WEB上では完成してあるアルゴリズムがあるのですが自分には難しく、計算時間がかかってもいいので分かりやすい関数でと思い書き込みました。 よろしくお願いします。
>・問題文は、出題されたまま全文を書いてください。 問題文がたった9文字とは凄い課題だな
478 :
デフォルトの名無しさん :2009/06/16(火) 15:55:05
[1] 授業単元:応用プログラミング [2] 問題文(含コード&リンク):http: //kansai2channeler.hp.infoseek.co.jp/cgi- bin/joyful/img/9470.txt [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C/C++ [4] 期限:本日23:00までですが、2日以内なら遅れてもいいそうです。 [5] その他の制限: 特にありません。 三問ありますが、どうぞよろしくお願いします。
>>478 1問目は意味が分からないので2と3だけ
(8_5)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, n;
int *r;
printf("n = "); scanf("%d", &n);
r = malloc(n * sizeof(int));
for (i = 0; i < n; ++i) r[i] = rand();
for (i = 0; i < n; ++i) {
printf(" %d", r[i]);
if ((i + 1) % 10 == 0) printf("\n");
}
free(r);
return 0;
}
(8_6)
double deg2rad(double degree) { const double PI = 3.141592535898; return degree * PI / 180; }
double *rotation(int degree, double x[])
{
double *y = calloc(2, sizeof(double));
y[0] = x[0] * cos(deg2rad(degree)) - x[1] * sin(deg2rad(degree));
y[1] = x[0] * sin(deg2rad(degree)) + x[1] * cos(deg2rad(degree));
return y;
}
480 :
デフォルトの名無しさん :2009/06/16(火) 16:51:07
>>479 ありがとうございました。
一問目は自分で対応したいと思います。
お疲れ様でした。
[1] 授業単元:ソフトウェア演習C [2] 問題文: 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、 この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で小さい単語のみがあり、その右の部分木にはより大きい単語のみがあるように保持される。 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発してそのノードに格納されている単語と新しい単語を比較する。 二つが一致したら、それで良い。 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、そうでなければ右の子供が調べられる。 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、また実際にはその子供のないところがそれを置く場所である。 このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を定義せよ。この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと出会う。 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、親ノードに埋め込まれる。 この関数を利用し、以下のテキストをコマンド実行時の引数として与えられたファイルを入力して二分探索木を生成し、単語と頻度のリストを表示するプログラムを作成せよ。 文章: University was founded in April 1998 at Iwate, which is situated in the northeastern part of Japan. University consists of four faculties Software and Information Science, Nursing, Social Welfare, and policy Studies, and additionally other educational supporut centers. [3] 環境 [3.1] OS:Unix [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: C [4] 期限: 2009年06月18日13:00まで [5] その他の制限: アルゴリズム論とデータ構造の序盤です。特に指定はないです。 長文になってしまい、申し訳ありません よろしくお願いします
>>482 #include <stdio.h>
int main(void)
{
char *c = "★ ★\n ★ ★\n ★\n ★ ★\n★ ★\n";
int i;
if (c == NULL) return 1;
for (i = 0; c[i] != '\0'; ++i) printf("%c", c[i]);
return 0;
}
484 :
食う負名無 :2009/06/16(火) 20:46:12
プログラミング初心者でアホアホなのでよろしくお願いします。 [1] 授業単元: C++ [2] 問題文: 次の2つのプログラミングは参照渡しのものであるが、値渡しでプログラミングを作り直しなさい。(←実引数が変更を受けないことを確かめよ) (1) #include<iostream.h> void irekae(int& a, int& b); main(){ int a,b; a=10; b=1; irekae(a,b); cout<<"a="<<a<<"b="<<b<<endl;} void irekae(int& a, int& b) {int temp; temp=a; a=b; b=temp;} (2) #include<iostream.h> void irekae(int& a, int& b) {int temp; temp=a; a=b; b=temp;} main(){ int a,b; a=10; b=1; irekae(a,b); cout<<"a="<<a<<"b="<<b<<endl;} [3] 環境 [3.1] OS: WindowsXP [3.3] 言語: C++ [4] 期限: 6月18日0時 (17日の24時)
違いがわからない俺アホス
↑訂正 9行目:MAX_LEN -> MAX_LEN+1
>>484 両方とも void irekae(int& a, int& b) を void irekae(int a, int b) にかえるだけだと思われ
思ったんだけど両方とも同じ問題じゃない?
489 :
食う負名無 :2009/06/16(火) 21:04:46
>>488 注意書き??ヒント??のようなところには『関数main で関数irekae を呼び出し a,bを入れ換えると(2)ではmainの中の実引数は入れ換わるが
(1)の実引数は入れ替わらない』と書かれています。
自分本当の初心者なので参照渡しと値渡しの違いも分からないのですが。。。
教えてください。
490 :
初物 :2009/06/16(火) 21:08:36
お願いしいますm(__)m [1] 授業単元: C++を使ったプログラミング [2] 問題文: 10個の数が与えられた時、その最大値を求める関数saidaiを作成して、 関数mainで10個の変数をキーボードから入力し、関数saidaiを呼び出して最大値を求め、 その最大値を関数mainで表示させるプログラムを作成しなさい。(※下記の例を参考にしても良い) #include <iostream.h> int saidai(int a[]) { -文(宣言や最大値の計算)- return max; } main() { int a[10]; -文(宣言や値の入力)- max=saidai(a); cout<<"最大値"<<'\t'<<max<<endl; } [3] 環境 [3.1] OS: WindowsXP [3.3] 言語:C++ [4] 期限: 6/17 18:00
>>490 #include <iostream>
using namespace std;
int saidai(int a[])
{
int max = a[0];
for (int i = 1; i < 10; ++i) if (max < a[i]) max = a[i];
return max;
}
int main()
{
int a[10];
int max;
for (int i = 0; i < 10; ++i) { cout << "a[" << i << "] = "; cin >> a[i]; }
max = saidai(a);
cout << "最大値\t" << max << endl;
return 0;
}
492 :
初物 :2009/06/16(火) 21:31:19
[1] 授業単元:情報処理T [2] 問題文(含コード&リンク):サブルーチンを使用した成績処理のプログラムを基に、それにさらに 構造体を取り込んだプログラムを作成しなさい。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: TurboC [3.3] 言語: どちらでも可 [4] 期限: 2009年6月28日 [5] その他の制限:#include<stdio.h>の形で始まるようにお願いします。 よろしくお願いします。
495 :
食う負名無 :2009/06/16(火) 21:54:18
484 お願いします。
>>495 >>488 だいたい、こういう「どうなるか」とか「確かめよ」という問題は、
正しいプログラムを作る話とは限らないんだよ。
うまく行かないのを「確かめよ」ということだ。
497 :
デフォルトの名無しさん :2009/06/16(火) 22:06:40
>>496 問題文にプログラミングを作り直せと書かれているんだから正しいプログラムを作れってことだろ??
というかそれができないから
>>484 は質問してんじゃない?
499 :
デフォルトの名無しさん :2009/06/16(火) 22:13:28
>>497 >>496 に書いた「正しい」というのは、
問題文に対する正解と言う意味じゃなくて、
プログラムが意味のある処理をする意味で、正しいということ。
>>484 の問題の意図は、わざと間違ったプログラムを作れということで、
わざと間違ったプログラムを作ると、それが正解。
ともかく、正解はもう出てる。
>>488 エディタで置換すればいいだけだ。
>>482 #include <stdio.h>
void main(void)
{
int i, j;
int n = 5;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (j == i || j == n-1-i) {
printf("★");
} else {
printf(" ");
}
}
printf("\n");
}
}
501 :
デフォルトの名無しさん :2009/06/16(火) 22:15:34
>>494 わかりにくくて申し訳ありませんでした。
サブルーチンを使っているプログラムなら何でもいいのでそこに構造体を取り込んだプログラムを作成せよという問題です。
それだけではわかりにくいだろうということで例として成績処理のプログラムをサブルーチンを使って作成して、それに構造体をという教授からの指示でした。
プログラム自体はなんでもいいのでサブルーチンと構造体を使用したものをお願いいたします。
503 :
デフォルトの名無しさん :2009/06/16(火) 22:19:55
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):[0,1]の一様乱数をを発生させるプログラムを作成しなさい。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:Visual Studio [3.3] 言語:C++ [4] 期限:6月22日まで [5] その他の制限:特になし
>>493 #include<stdio.h>
#include<stdlib.h>
typedef struct tag_student_t{
int id, score[3];
}student_t;
double average(student_t *student){
double ave=0.0;
int i;
for(i=0;i<3;i++) ave=(ave*i+student->score[i])/(i+1);
return ave;
}
int main(void){
student_t student[5];
int i, j;
for(i=0;i<5;i++){
student[i].id=i+1;
for(j=0;j<3;j++) student[i].score[j]=rand()%101;
}
for(i=0;i<5;i++){
printf("\nid:%d average:%-6.2f", student[i].id, average(&student[i]));
for(j=0;j<3;j++) printf(" %3d", student[i].score[j]);
}
return 0;
}
505 :
デフォルトの名無しさん :2009/06/17(水) 00:48:16
[1] 授業単元: C言語 [2] 問題文 (1) 文字列を受け取る関数(charポインタを使用) その文字列の一番最後の文字を消去する関数を作る。 (2) 文字列を受け取る関数(charポインタ使用) その文字列の一番最初の文字を消去する関数を作る。 (3)文字列を入力し、ある文字を入力。その文字列の中にその入力した文字がいくつあるかを数える関数。 例 文字列 asdfgvbfdcaa 文字aと入力したら 3となる その関数は二つのパラメータをもち、一つ目は文字列へのポインタ、二つ目は数えた文字の数である。[3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VisualC++; [3.3] 言語:C [4] 期限:6月19日 [5] その他の制限:問題文の指示のポインタは使用すること
>>503 一様乱数
#include <iostream>
#include <stdlib.h>
#include <time.h>
using std::cout;
int main(void) {
srand((unsigned int)time(0));
cout << rand()/(double)RAND_MAX << std::endl; // [0,1]
}
>>505 #include<stdio.h>
void remove_last_char(char *str){
if(str==NULL || *str=='\0') return;
for(;*(str+1);str++);
*str='\0';
}
void remove_first_char(char *str){
if(str==NULL || *str=='\0') return;
for(;(*str=*(str+1));str++);
}
int count_char(const char *str, int moji){
int count;
for(count=0;*str;str++) if(*str==moji) count++;
return count;
}
int main(void){
char buf[]="Hello good-morning. Mike.";
puts(buf);
remove_last_char(buf);
puts(buf);
remove_first_char(buf);
puts(buf);
printf("%d\n", count_char(buf, 'o'));
return 0;
}
508 :
デフォルトの名無しさん :2009/06/17(水) 01:14:47
文字列操作系の問題はパズルみたいで面白いね void delete_last_char(char *str) { if (!str || !*str) return ; while (*str++ = *(str+1)?*str:'\0'); } void delete_first_char(char *str) { if (!str || !*str) return ; while (*str++=*(str+1)) ; } int count_char(const char *str, const char c) { int count = 0; if (!str || !*str) return 0; while (count+=*str==c?1:0, *str++) ; return count; }
>>504 助かりました。ありがとうございました。
>>506 の(3)の問題文をよく読んでるかい?
>一つ目は文字列へのポインタ、二つ目は数えた文字の数である。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
2つ目の引数は「文字」じゃなくて「文字数」っぽいよ
>>505 >>507 じゃないけど
>>511 を反映してcount_charだけ書いてみた
#include<stdio.h>
void count_char(const char *str, int *count){
char moji;
printf("文字を1文字入力してください\n> ");
scanf("%c", &moji);
for(*count=0;*str;str++) if(*str==moji) (*count)++;
}
int main(void){
char buf[]="Hello good-morning. Mike.";
int *n;
puts(buf);
count_char(buf, n);
printf("%d\n", *n);
return 0;
}
514 :
デフォルトの名無しさん :2009/06/17(水) 08:41:22
[1]授業単元:プログラミング演習1 [2]問題文:画面より入力した成績データをファイルに登録する。 画面より入力する項目は以下のとおり。 ・生徒コード、数字6桁、数字であること。 ・氏名、文字列20文字、1字以上、20字以内 ・国語(点数)、数字3桁、数字であること、0<=点数<=100 ・算数(点数)、国語と同じ ・社会(点数)、国語、算数と同じ 生徒コードに999999が入力されたら終了する。 [3]環境 [3.1]OS:Windows [3.2]コンパイラ名とバージョン:C machine [3.3]言語:C [4]期限:明日 [5]その他の制限:入力は、gets()にて行い、ファイルに出力する。 期限ギリギリですが、よろしくお願いします。
515 :
デフォルトの名無しさん :2009/06/17(水) 08:48:23
518 :
デフォルトの名無しさん :2009/06/17(水) 10:08:00
>>516 ありがとうございます。
でも、点数や文字数などの判定はどうするんでしょうか?
>>518 スマン、判定も必要だったのか
その場合、点数とかは指定された桁数で入力しないといけないの?
たとえば、国語の点数で
「85」と入力 => エラー
「085」と入力 => 成功
みたいな
>>513 nは実体で定義してポインタ渡しじゃないとダメじゃね?
>>517 >>520 ほんとだ
指摘thx
#include<stdio.h>
void count_char(const char *str, int *count){
char moji;
printf("文字を1文字入力してください\n> ");
scanf("%c", &moji);
for(*count=0;*str;str++) if(*str==moji) (*count)++;
}
int main(void){
char buf[]="Hello good-morning. Mike.";
int n;
puts(buf);
count_char(buf, &n);
printf("%d\n", n);
return 0;
}
>>516 UTF-8 だとIE6で文字化けする。SJISならいい。
523 :
デフォルトの名無しさん :2009/06/17(水) 12:00:21
>>519 桁は関係ないけど、0の三ケタ(000)は通らないようにしてほしいです。
524 :
デフォルトの名無しさん :2009/06/17(水) 12:34:19
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): Q1:1 から10 までの数を,fprintf 関数を用いてファイルnumber.txt に書き込むプ ログラムをつくりなさい。但し,各数字のあとに改行'\n'を挿入すること Q2:作成したファイルの最後に文字列「Number File」を追加するプログラムも作りなさい。 fopen関数を用いてモードaを利用すること Q3:作成したファイルを読み込んで表示するプログラムを作りなさい fscanを利用すること [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語: C言語 [4] 期限: 6月20日 [5] その他の制限:なし
525 :
デフォルトの名無しさん :2009/06/17(水) 12:39:23
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク): 英語の文(最大80文字の文字列)をキーボードから入力し、文を構成する単 語(空白で区切られている)を1行に一つづつ表示するプログラムを作成せよ。 空白が2個以上連続してもうまく動作するようにすること。また、コンマ(,)、 ピリオド(,)は表示する単語に含めないこと。 (実行例) ・入力 This is a pen. ・出力 This is a pen [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:6月17日12時くらいまで よろしくお願いします。
>>524 Q1
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("number.txt", "w");
int i;
for (i = 1; i <= 10; ++i) fprintf(fp, "%d\n", i);
fclose(fp);
return 0;
}
Q2
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("number.txt", "a");
fprintf(fp, "Number FILE");
fclose(fp);
return 0;
}
>>524 Q3
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("number.txt", "r");
char s;
while (fscanf(fp, "%c", &s) != EOF) putchar(s);
fclose(fp);
return 0;
}
>>514 strncmp(buff,"00",2) を使う。付け足しをどこに入れるかは問題とする。
do {
puts("生徒コードを入力(999999を入力で終了)");
gets(code);
sts = sscanf(code,"%6d%c",&student_code,&dmy); // dmy 数字の後に文字が付く場合
if(sts == 1 && strlen(code) == 6 && student_code>=0)
break;
puts("数字6桁");
} while (1);
if (student_code == 999999) break;
do {
puts("名前を入力");
gets(name);
if(*name != '\0' && strlen(name) <= 20) break;
puts("1〜20文字まで");
} while (1);
do {
puts("国語の点数を入力"); gets(buff);
sts = sscanf(buff,"%d%c",&kokugo,&dmy);
if(sts == 1 && kokugo>=0 && kokugo<=100)
break;
puts("0点〜100点");
} while (1);
>>525 #include <stdio.h>
#include <string.h>
#define BUFFSIZE 128
#define DELIMITER " \n\t,."
int main(void)
{
char buff[BUFFSIZE];
char *p = strtok(fgets(buff, BUFFSIZE, stdin), DELIMITER);
while (p) { puts(p); p = strtok(NULL, DELIMITER); }
return 0;
}
531 :
デフォルトの名無しさん :2009/06/17(水) 17:59:48
画像を20度ずつ回転させるプログラムの宿題がだされました. open cvの画像回転サンプルプログラムをfor文で変形できますか. 教えてください..
532 :
デフォルトの名無しさん :2009/06/17(水) 18:23:39
>>529 STSとDMYの使い方がわからないんですが…
>>532 >>529 じゃないが、STSがstsのことを指してるならstatusのことだと思うよ
DMYがdmyのことを指してるならdummyのことだと思うよ
535 :
デフォルトの名無しさん :2009/06/17(水) 19:58:14
課題で行き詰まってしまいました。
外部のtxtファイルから英文を読み込み、単語ごとに配列に格納する関数(もしくはメイン文での処理)をお願いします。
txtの中身は
>>481 のような文章です。
空白、ピリオド、コロン、改行は格納する単語には含まれません。
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: C
[4] 期限: 2009年06月18日13:00まで
>>535 #include <stdio.h>
#include <string.h>
#define BUFFSIZE 128
#define ARRAYSIZE 8192
#define DELIMITER " \n\t,."
int main(void)
{
char buff[BUFFSIZE];
char array[BUFFSIZE][ARRAYSIZE];
int i = 0;
while (fgets(buff, BUFFSIZE, stdin)) {
char *p = strtok(buff, DELIMITER);
while (p) { strcpy(array[i++], p); p = strtok(NULL, DELIMITER); }
}
return 0;
}
539 :
デフォルトの名無しさん :2009/06/17(水) 20:09:56
>>536 getcでファイルから1文字ずつ受け取り、
if文で空白、ピリオド、コロン、改行をはじいて単語を表示させるところまではできたんですが、
その受け取った文字列を単語として扱うところで行き詰まってます。
単語の文字数をカウントして、単語配列の要素数に当てはめるまではいいんですが、
その後どうすればいいのか・・・orz
>>538 char array[ARRAYSIZE][BUFFSIZE];
こうじゃね?
>>539 単語を入れるのに配列が必要で、たくさんの単語を入れるのに配列が必要なので
2次元配列を使うのがわりと楽だし、素直。
単語を取得することができてるなら後はそれを詰めるだけだよ。
あと少しがんばれ
>>539 区切り文字ってあるでしょ?
それを受け取ったらそこで区切られれて単語が一個出来上がってる計算になるわけだ。
後で表示なりの処理が必要なら、どこかのバッファに一端保存しておいて、後でがんばる。
>>538 が
>>535 にスルーされてしまったので書き直してみました。
#include <stdio.h>
#define BUFFSIZE 128
#define ARRAYSIZE 8192
int main(void)
{
FILE *fp = stdin; /* fopen("data.txt", "r"); */
char array[ARRAYSIZE][BUFFSIZE];
int i = 0, j = 0, c;
while ((c = getc(fp)) != EOF) {
if (c == ' ' || c == ',' || c == '.' || c == '\n') {
array[i++][j] = '\0';
j = 0;
}
else
array[i][j++] = c;
}
/* { int k; for (k = 0; k < i; ++k) puts(array[k]); } */
fclose(fp);
return 0;
}
545 :
デフォルトの名無しさん :2009/06/17(水) 20:52:24
>>544 ありがとうございます。
参考にしてがんばります!
546 :
529 :2009/06/17(水) 20:59:08
>>532 >STSとDMYの使い方がわからないんですが…
#define MAX_CODE_LEMGTH 6
#define MAX_NAME_LEMGTH 20
int main()
char buff[BUFF_SIZE];
int student_code, sts;
char code[MAX_CODE_LEMGTH+1], name[MAX_NAME_LEMGTH+1], dmy;
レミングスかとおもった
548 :
デフォルトの名無しさん :2009/06/17(水) 22:16:09
[1] 授業単元: プログラミング論 [2] 問題文(含コード&リンク): C言語で三目並べをするプログラムの作成 C言語で三目並べ(いわゆる○×)をするプログラムを作成する。 条件 ・コンピュータの手はランダムに決定するものとする(空いているところに打つ) ・盤面を表現する配列は3×3の二次元配列とし、グローバルに宣言する ・以下のような関数を作成すること:盤の表示、○×を打つ、3つ並んだかチェック ・他にも必要に応じて関数を宣言すること ヒント集 ・マスの状態は空:0 ○:1 ×:2など数値で定義するとよい。 ・char stone[3][3]={"-","○","×"};などと宣言しておくと便利? ・9マスしかないので、9マス打ち切ったら終了→このとき勝敗が決まっていなければ引き分け ・ループの考え方は2通りできる 1.先手後手がセットで1ループ、9マス目に先手が打ったらbreak 2.先手、後手それぞれ1ループ,nマス目は、n%2=0なら先手、n%2=1な ら後手 ・三目並んだかのチェックは工夫のしどころ ・手盤の人の石だけチェックする ・打ったところの縦横は必ずチェック、斜めはどうする? ・作っていく順 ・石の入力+盤面表示、コンピュータの手番、3つ並んだかチェック、勝敗表示 ・石の入力+盤面表示、3つ並んだかチェック、勝敗表示、コンピュータの手番 [3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン: Visual Studio [3.3] 言語: C++ [4] 期限: 2008年6月29日 [5] その他の制限: 上記の旨
549 :
デフォルトの名無しさん :2009/06/17(水) 22:29:47
[1] 授業単元: C [2] 問題文(含コード&リンク): char型の取りうる値の範囲は-128〜127である。この 範囲をこえるとどうなるか試しなさい (a)char型変数に-128を代入し、そこから1をひくと変数の内容はいくつになるか (b)char型変数に127を代入し、そこへ1を足すと変数の内容はいくつになるか なお、上記の動作をするプログラムをコンパイルしようとすると「this decimal constant is unsigned only in ISO C90」のような警告が表示されることがある。故意に範囲を超えようとしているので、 今回に限りこの警告を無視してもよい。 [3] 環境 [3.1] OS Linux [3.2]gcc [3.3]c [4]2009年6月19日 [5] まだ初めて2日です。変数と式ってとこでみんなが何やってるか わからない状態です。
>>548 [4] 期限: 2008年6月29日
2008年?
551 :
デフォルトの名無しさん :2009/06/17(水) 22:59:52
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): cos(x)とx軸で囲まれる領域において、xがa〜bの区間の面積を台形積分で求めるプログラムを作成しなさい。 なお、aとbは引数として与えるようにすること。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語:C [4] 期限: 2008年6月22日 [5] その他の制限:そこまで理系な頭じゃないもので、問題文の意味が分からない状態です。 ネットで調べても台形公式の例なら出てくるんですが、cos(x)とx軸で囲まれた・・・のところが分かりません。 よろしくお願いします。
553 :
551 :2009/06/17(水) 23:03:16
2008年→2009年です。すいません。
554 :
デフォルトの名無しさん :2009/06/17(水) 23:06:57
さっきから宿題多くね?とおもってたら宿題スレだったワロス
556 :
デフォルトの名無しさん :2009/06/17(水) 23:12:00
[1] 授業単元: C [2] 問題文(含コード&リンク):六科目の試験の得点を入力すると、合計点と平均点を出力するプログラムを作成せよ [3] 環境 [3.1]LInux [3.2] gcc [3.3]C [4]2009年6月18日 [5]scanfぐらいまでしかならってないです。お願いします
「実際の応用プログラムでは」ソートロジックなんかとんと書かんなw
>>551 // ∫[a,b] |cos(x)|dx の意味だと解釈して
#include <stdio.h>
#include <math.h>
double f(double x) {
return abs(cos(x));
}
int integral(double a, double b)
{
int i;
int n = 100;
double h = (b - a) / n;
double sum = 0.0;
for (i = 0; i < n; i++) {
double x = a + h * i;
sum += (f(x) + f(x+h)) / 2;
}
return sum;
}
int main()
{
printf("%f\n", integral(0, 3.14));
return 0;
}
>>558 ミスった
#include <stdio.h>
#include <math.h>
double f(double x) {
return fabs(cos(x));
}
double integral(double a, double b) {
int i;
int n = 100; // 分割数
double h = (b - a) / n; // 刻み幅
double sum = 0.0;
for (i = 0; i < n; i++) {
double x = a + h * i;
sum += (f(x) + f(x+h)) * h / 2;
}
return sum;
}
int main() {
printf("%f\n", integral(0, 3.14));
return 0;
}
560 :
デフォルトの名無しさん :2009/06/17(水) 23:20:39
[1] 授業単元: C [2] 問題文(含コード&リンク):アルファベットの小文字を大文字に変換するプログラムを作成せよ ヒント: 'a'〜'z'は連続した文字コードが割り当てられている。'A'〜'Z'も連続した文字コードが割り当てられている。すなわち、'a'の文字コード にある定数を足す(または引く)と'A'になり、'b'にその定数を足す(または引く)と'B'になる。この定数さえ求められれば、簡単に計算できることがわかる。 定数は、'a'や'A'を使えば計算できる。 [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]2009年6月18日 [5]scanfぐらいまでしかならってません。なにもわからない初心者ですお願いします
>>560 書いただけ。
char toupper(char c) {
if(c>='a'&&c<='z') return c+'A'-'a';
else return c;
}
>>557 だからソートアルゴリズムも問わないってなってんだとおもった
563 :
デフォルトの名無しさん :2009/06/17(水) 23:34:11
[1] 授業単元: C [2] 問題文(含コード&リンク):コンピューターは2進数で計算をおこなうため、2のn乗の和で表現できる数値の表現は得意である。 しかし0.1のような数値は2のn乗の和で表現できないため、どうしても誤差が発生する。実際にどれくらいの誤差が出るか試せ (a)float型の変数num1に1を、num2へ0を代入せよ (b)num2に0.1を足す文を10回書け。1行で書かないこと。 (c)num1とnum2の差がどれだけあるか表示せよ。ただし、%fそのままではその差が表示されないので、 小数点以下を23桁程度表示できるように指定すること。 [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]2009年6月18日 [5]素人です、お願いします
有効桁23桁?? floatの有効桁は23ビットだから7桁弱だろ?写し間違い?
お前こそ何を言っているんだ
7桁精度だから小数第7位以下に誤差が出る。 printfが%fで表示する際にdoubleの15桁くらいまで頑張ってくれる。 足して小数点以下22〜23桁を表示する。
>>566 足す理由はよく分からないが
無効桁まで表示したいだけじゃないか?
>>556 for文を習ってないなら、
scanfとsum =の2行を6回書いてください。
#include <stdio.h>
int main(void){
int i,temp,sum=0;
double ave;
for(i=0;i<6;i++){
scanf("%d",&temp);
sum = sum + temp;
}
ave = sum/6.0;
printf("sum = %d, ave = %f\n",sum,ave);
return 0;
}
>>567 頭7桁は0.000000だから。「小数点以下」ってとこ読み落としてる?
570 :
564 :2009/06/18(木) 00:06:15
orz でも23桁は無理じゃね?
%eならわかる
>>563 #include<stdio.h>
int main(void){
float num1=1.0, num2=0.0;
num2+=0.1;
num2+=0.1;
num2+=0.1;
num2+=0.1;
num2+=0.1;
num2+=0.1;
num2+=0.1;
num2+=0.1;
num2+=0.1;
num2+=0.1;
printf("%.23f\n", num1-num2);
return 0;
}
>>572 こういう風に単純に同じのコピペしたコードって
volatileつけないと最適化されてしまったりしない?
「num2+=0.1f;」としなくて良いかどうかは、問題文からは分からないな。 まー、誤差が二通り出るのも含めて学習意図かもしれないが。
>>549 #include <stdio.h>
int main(void){
char a = -128;
char b = 127;
printf("char[-128] = %4d\n",a);
a--;
printf("char[-129] = %4d\n",a);
printf("char[ 127] = %4d\n",b);
b++;
printf("char[ 128] = %4d\n",b);
return 0;
}
577 :
デフォルトの名無しさん :2009/06/18(木) 01:17:42
>>534 皆さんありがとうございます。
無事に提出できそうです。
580 :
デフォルトの名無しさん :2009/06/18(木) 02:44:49
【質問テンプレ】 [1] 授業単元: プログラミング演習 [2] 問題文: 人の名前(ローマ字)を検索(部分一致)することができるプログラムを作成せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 今日の午前 [5] その他の制限: 検索できる機能が充実していれば他は特にないです。よろしくお願いします。
>>580 exec*()とgrep(1)かregex.hを利用する。
strstr()でもいいかもしれないが、やる気がしない。
今、プリプロセッサをハック中だから無理無理絶対無理。
execとgrepてw ハックがんばってね
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク): 英語の文(最大80文字の文字列)をキーボードから入力し、文を構成する単 語(空白で区切られている)を1行に一つづつ表示するプログラムを作成せよ。 空白が2個以上連続してもうまく動作するようにすること。また、コンマ(,)、 ピリオド(,)は表示する単語に含めないこと。 (実行例) ・入力 This is a pen. ・出力 This is a pen [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: Visual C++ [3.3] 言語: C [4] 期限: 2009年6月19日12:00まで [5] その他の制限: なし お願いします。
おかと違いの質問だったら申し訳ありませんが・・・ 配列の取得(コピー)メソッドを作成した場合↓ class Hoge { vector<int> m_aData; public: vector<int> getData() { return m_aData; } void getData(vector<int>& aData) { aData = m_aData; } }; int main() { Hoge hoge; vector<int> aData00, aData01; aData00 = hoge.getData(); //@ hoge.getData( aData01 ); //A } 上記の@とAの場合、 @はm_aDataのコピーのコピーをaData00に格納している Aはm_aDataのコピーを格納している で正しいですか? @はgetData()のreturn時にコピーが返され、それをさらに、aData00にコピー渡しすると思っていいます。
>>583 #include <stdio.h>
#define BUFF_SIZE (80 + 1)
int main()
{
int i;
char buff[BUFF_SIZE];
printf("英文を入力してください(80字以内)\n> ");
fgets(buff, BUFF_SIZE, stdin);
for(i = 0; buff[i] != '\0'; i++) {
if(buff[i] == ' ') {
puts("");
while((i + 1) < BUFF_SIZE && buff[i + 1] == ' ')
i++;
}
else if(!(buff[i] == ',') && !(buff[i] == '.')) {
printf("%c", buff[i]);
}
}
return 0;
}
>>584 マルチスレッド対応でリアルタイム処理可能かどうかに
関わってくる問題なので処理系依存
>>583 #include <stdio.h>
#define INPUT_LEN 80
int main(void)
{
char input[INPUT_LEN + 2];
int i, ls;
fgets(input, INPUT_LEN + 2, stdin);
for (i = 0, ls = 0; input[i]; ++i)
{
if (ls && input[i] == ' ') {
fputc('\n', stdout);
ls = 0;
}
else if (input[i] != ' ' && input[i] != ',' && input[i] != '.' && input[i] != '\n') {
fputc(input[i], stdout);
ls = 1;
}
}
}
588 :
デフォルトの名無しさん :2009/06/18(木) 11:59:35
590 :
デフォルトの名無しさん :2009/06/18(木) 14:55:54
【質問テンプレ】 [1] 授業単元:応用数学 [2] 問題文(含コード&リンク): 1.e^xをx=1,5,10,15,20,-1,-5,-10,-15,-20について、次のテイラー展開で計算し、math.hの関数exp(x)の結果と比較せよ。 e^x=1+x+x^2/2!+x^3/3!+… 2.関数fのxにおける微分は以下のように定義される:f'(x)={f(x+h)-f(x)}/h 上の式を適応してx=1におけるf(x)=e^xの微分値を計算し、e=2.71828183と比較して誤差を計算せよ。 ただし、h=10^0,10^1,10^2,…,10^11とすること。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: borland c++ [3.3] 言語: C++ [4] 期限: 6/18(木)24:00まで [5] その他の制限: 特になし よろしくお願いします。
591 :
デフォルトの名無しさん :2009/06/18(木) 16:06:43
1] 授業単元: C [2] 問題文(含コード&リンク):試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する プログラムを作れ90〜100A+80〜89A70〜79B60〜69C0〜59Fそれ以外error [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月19 [5]素人です
592 :
デフォルトの名無しさん :2009/06/18(木) 16:11:54
1] 授業単元: C [2] 問題文(含コード&リンク):入力した文字の種類を表示するプログラムを作成せよ。ただし、表示は次に従うとする 入力キーA〜Z 表示メッセージ 英大文字です 入力キーa〜z 表示メッセージ 英小文字です 入力キー0〜9 表示メッセージ 数字です 上記以外 表示メッセージ その他のキャラクターです [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月19まで [5]
593 :
デフォルトの名無しさん :2009/06/18(木) 16:16:44
1] 授業単元: C [2] 問題文(含コード&リンク):会員番号に基づき5つのグループA,G,P,Q,Uに分けたい。会員番号を5で割ったあまりが0ならAグループ、 1ならGグループ、2ならPグループ、3ならQグループ、4ならUグループとする。会員番号を入力するとグループ名を出力するプログラムを switch文を使って作れ。また、0や負の数が入力されたらエラーを表示して終了するようにすること [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月19日 [5]お願いします
594 :
デフォルトの名無しさん :2009/06/18(木) 16:32:28
>>591 問題文の通りに作ったけど、Cの次がFっておかしい気がする
#include<stdio.h>
int main(void){
int a;
printf("点数を入力してください\n");
scanf("%d",&a);
if(a>100||a<0){
printf("error");
}
else if(a>=90){
printf("A+");
}
else if(a>=80){
printf("A");
}
else if(a>=70){
printf("B");
}
else if(a>=60){
printf("C");
}
else if(a>=0){
printf("F");
}
}
>>592 ctype.h
isupper が真、入力キーA〜Z
islower が真、入力キーa〜z
isdigit が真、入力キー0〜9
isalnum が偽、上記以外
>>593 #include<stdio.h>
int main(void){
long id=0;
char *group_name[]={"A", "G", "P", "Q", "U"};
printf("\n会員番号を入力してください : ");
scanf("%ld", &id);
if(id<=0){
printf("\nエラー\n");
return 1;
}
switch(id%5){
case 0:
case 1:
case 2:
case 3:
case 4:
printf("グループ%s\n", group_name[id%5]);
break;
}
return 0;
}
597 :
180 :2009/06/18(木) 16:45:45
>>591 # include <stdio.h>
void tensu(int n);
int main(){
int n;
printf("点数...");
scanf("%d", &n);
tensu(n);
return 0;}
void tensu(int a)
{
if(a > 100)
printf("error");
else if(a >= 90)
printf("評価...A+\n");
else if(a >= 80)
printf("評価...A\n");
else if(a >= 70)
printf("評価...B\n");
else if(a >= 60)
printf("評価...C\n");
else if(a >= 0)
printf("評価...F\n");
else
printf("error\n");}
//先客がいたとはw
>>594 大学の成績評価だと60未満は単位をFailしたってことだろ。
598 :
デフォルトの名無しさん :2009/06/18(木) 16:53:33
>>598 #include<stdio.h>
unsigned gcd(unsigned m, unsigned n){
unsigned x;
while((x=m%n)) m=n, n=x;
return n;
}
int main(void){
unsigned a=60, b=20, c=16;
printf("%u\n", gcd(gcd(a, b), c));
return 0;
}
600 :
デフォルトの名無しさん :2009/06/18(木) 17:04:27
>>599 すいませんが、初心者なのでunsignedというのが解りません。
なるべく難しいものを使わずに、教えて下さい。
>>600 unsigned をすべて int にすればおk
unsignedはunsigned int のこと
603 :
デフォルトの名無しさん :2009/06/18(木) 17:17:50
必死で作ってみたけど
>>599 のほうがいいのかな
でもキーボードからの入力って要件を満たしてるから一応書いとく
#include<stdio.h>
int gcd(int m,int n);
int main(void){
int a,b,c,yakusuu1,yakusuu2;
printf("数値を3つ入力してください。\n");
scanf("%d%d%d",&a,&b,&c);
if(b==0){
b=a;
}
if(c==0){
c=a;
}
yakusuu1=gcd(a,b);
yakusuu2=gcd(yakusuu1,c);
printf("%d",yakusuu2);
return 0;
}
int gcd(int m,int n){
int r1=1;
while(r1!=0){
r1=m%n;
m=n;
if(r1==0){
break;
}
n=r1;
}
return n;
}
printf("数値を3つ入力してください。\n"); scanf("%d%d%d",&a,&b,&c); 要件を満たしてるとはいえ、これはちょっとと思わなくもないけど
605 :
デフォルトの名無しさん :2009/06/18(木) 17:48:40
じゃあどういう風にすればもっとよいのか
>>605 printf("a...");
scanf("%d",&a);
printf("b...");
scanf("%d",&b);
printf("c...");
scanf("%d",&c);
ヨッシーが産まれた
608 :
デフォルトの名無しさん :2009/06/18(木) 19:11:08
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 整数データを節点に持つ2分木は、 typedef struct node *Tree; typedef struct node { int data; Tree left_subtree; Tree right_subtree; } Node; と定義された構造体を木の節点としてポインタで 繋げることによって表すことができる。この様に表された 2分木の根節点へのポインタが引数として与えられた時、 その2分木の高さを調べて返す関数 int height(Tree t); を定義せよ。ただし、height(NULL) = -1を用いる。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日 [5] その他の制限:特になし
610 :
デフォルトの名無しさん :2009/06/18(木) 19:51:34
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 4つのCソースファイルaaa.c,bbb.c,xxx.c,yyy.cが用意されたディレクトリ 内で、2種類のコンパイル gcc -o ax aaa.c xxx.c -lm gcc -o bxy bbb.c xxx.c yyy.c を効率よく行うためのMakefileを書け。もちろんo.ファイルも生成する。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日 [5] その他の制限:今日中にお願いします。 よろしくお願いします。
ヘッダファイルがないんだね
ヘッダファイルw 依存関係に必要とは限らないからな
あれ?ヘッダファイルって言葉おかしかった? まあ、.hがないならないで.c間の依存関係が必要だと思うんだけど
>>610 make によって書き方が違うからよく分かんない
$(CC) って書いたり $* の書き方が違ったりする
CC=gcc
.SUFFIXES: .c .o
ax: aaa.o xxx.o
${CC} -o $@ $* -lm
bxy: bbb.o xxx.o yyy.o
${CC} -o $@ $*
.c.o:
${CC} -c $<
[1] 授業単元: C初心者コース [2] 問題文(含コード&リンク):試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する プログラムを作れ90〜100A+80〜89A70〜79B60〜69C0〜59Fそれ以外error [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月19日 [5]if文(gotoは論外)while do while for等 ループ文を使ってはいけないそうです
618 :
610 :2009/06/18(木) 21:11:40
自分で作ってみたのが下のものなんですが、o.ファイルが作られませんでした。 どうでしょう? これを何とかならないでしょうか? CC = gcc SRCS_AX = aaa.c xxx.c SRCS_BXY = bbb.c xxx.c yyy.c ax: ${SRCS_AX} ${CC} -o ax ${SRCS_AX} -lm bxy: ${SRCS_BXY} ${CC} -o bxy ${SRCS_BXY} aaa.o: aaa.c ${CC} -c aaa.c -lm bbb.o: bbb.c ${CC} -c bbb.c xxx.o: xxx.c ${CC} -c xxx.c yyy.o: yyy.c ${CC} -c yyy.c
>>615 デバッグあんまりしてないから、検算してね!
あと、動作は保障しない。
#include <stdio.h>
int main(){
int Point=0;
puts("Input Point");
scanf("%d",&Point);
switch(Point/10){
case 10:case 9: puts("Your Rank Is A+");break;
case 8: puts("Your Rank Is A");break;
case 7: puts("Your Rank Is B");break;
case 6: puts("Your Rank Is C");break;
case 5:case 4:case 3:case 2:case 1:case 0:
puts("Your Rank Is F");break;
default:
puts("Errer:Out Of Range");break;
}
return 0;
}
>>618 順番に見ていったらいい。
axを作るよ
aaa.c xxx.c が更新されてるなら
${CC} -o ax ${SRCS_AX} -lm
(更新されてないなら何もしない)
aaa.oを作るよ、という動機(依存関係)がかかれていないから
aaa.o: aaa.cのルールは使われない
make aaa.o とやれば作られるが、そういう話でもない。
>>618 教科書 P.316 例14.7を参考にしてみては?
622 :
>>615 :2009/06/18(木) 22:05:53
[1] 授業単元:c++ [2] 問題文:√(x)をsqrtを使わず、足し算掛け算でもとめるプログラム。 r1*r2=xとおいて、考える。while文を使う。 [3] 環境 [3.1] OS: Windows xp [3.3] 言語: C++ [4] 期限: 2009年6月22日 [5] その他の制限:sqrtをつかわない。 お願いします(><) 自分でも考えてみましたがどうしてもうまくいかないので・・・
>>623 二分法かニュートン法使うしかないな
他の方法は収束が遅すぎる
>>623 #include <stdio.h>
int main()
{
double x = 2.0;
double r1 = 0, r2 = x;
double m = x / 2;
int n = 100;
while (n--) {
if (m * m - x < 0) {
r1 = m;
} else {
r2 = m;
}
m = (r1 + r2) / 2;
}
printf("%f\n", m);
return 0;
}
これじゃあ、x < 1 でうごかねー、訂正。 #include <stdio.h> int main() { double x = 0.25; double r1 = 0, r2 = (x < 1.0) ? 1.0 : x; int n = 100; while (n--) { double m = (r1 + r2) / 2; if (m * m - x < 0) { r1 = m; } else { r2 = m; } } printf("%f\n", (r1+r2)/2); return 0; }
627 :
デフォルトの名無しさん :2009/06/19(金) 00:33:09
【質問】 #define square(x) x*x 4 ではなくて #define square(x) (x*x) と定義しなければならない理由を教えて下さい
#define square (x) (x) * (x) だろ
つまりこのマクロに x++ とかを与えた時にどうなるか考えてみるとよい
>>590 1.
#include <stdio.h>
#include <math.h>
#define TAYLOR_EXPANSION_TARM 50
double e_Taylor(double x, int max_tarm);
double factorial(int i);
double x_in[] = {1.0, 5.0, 10.0, 15.0, 20.0, -1.0, -5.0, -10.0, -15.0, -20.0};
int main(void)
{
int i;
int x_size = sizeof(x_in)/sizeof(x_in[0]);
printf("Taylor expansion term number : %d\n", TAYLOR_EXPANSION_TARM);
puts("x,exp(x),e_Taylor(x),error");
for (i = 0; i < x_size; i++)
{
double e_lib_value = exp(x_in[i]);
double e_Taylor_value = e_Taylor(x_in[i], TAYLOR_EXPANSION_TARM);
printf(
"%d,%e,%e,%e\n",
(int)x_in[i], e_lib_value, e_Taylor_value, e_Taylor_value-e_lib_value
);
}
return 0;
}
>>590 double e_Taylor(double x, int max_tarm)
{
double value = 0.0;
int i;
for (i = 0; i < max_tarm; i++)
{
value += pow(x, (double)i) / factorial(i);
}
return value;
}
double factorial(int n)
{
double value = 1.0;
int i;
for (i = n; i > 0; i--)
{
value *= (double)i;
}
return value;
}
[1] 授業単元: 情報基礎 [2] 問題文(含コード&リンク): 正整数nを超えない奇数の和を求める関数oddsum()を作成する。 nは引数としてこの関数に渡す。 この関数を用い、いくつかの整数を入力し、それぞれに関するoddsum()を計算するプログラムを作成せよ。 データの終わりは0または不の数が現れたことで判定する。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: C++builder [3.3] 言語: C [4] 期限: 2009年6月19日13:00まで [5] その他の制限:なし よろしくお願いします。
635 :
デフォルトの名無しさん :2009/06/19(金) 02:55:21
[1] 授業単元: C
[2] 問題文(含コード&リンク):int型のとりうる値の範囲は-2147483648(=-2の31乗)〜2147483647(=2の31乗-1)である。
>>549 の問題と
同様に、範囲をこえるとどうなるか試しなさい。
なお、上記の動作をするプログラムをコンパイルしようとすると、「this decimal constant is unsigned only in ISO C90」のような警告がひょうじsれることがある。
故意に範囲を越えようとしているので、今回に限りこの警告を無視してもよい。
「3] 環境
[3.1]linux
[3.2] gcc
[3.3]C
[4]
[5]5月20日
637 :
デフォルトの名無しさん :2009/06/19(金) 03:00:41
>>635 #include<stdio.h>
int main(void){
int i,a=1;
for(i=1;i<33;i++){
printf("%d\n",a);
a=a*2;
}
return 0;
}
638 :
デフォルトの名無しさん :2009/06/19(金) 03:03:39
すいません>556の問題なんですが。表示は 例 国語の得点:83 数学の得点:100 英語の得点:98 化学の得点86 物理の得点:90 世界史の得点80 合計点は537点です 平均点は89.5点です のように表示したいんですが、どなたか関数を使わずにする書き方ご教授お願いします。
639 :
デフォルトの名無しさん :2009/06/19(金) 03:05:19
>>560 の問題なんですが
>>561 のようにやってもできないんですが、
どなたか丁寧に教えていただけないでしょうか?
641 :
デフォルトの名無しさん :2009/06/19(金) 03:12:04
すいません
>>592 の問題なんですが。
表示結果の例として
判別したい文字:H
英大文字です
判別したい文字:ж
その他のキャラクターです
と表示されるようにしたいんですが、どなたかご教授お願いします。
>>635 期限過ぎてるなw
#include <stdio.h>
int main(void){
int smallest = -2147483648; /* int型のとりうる最小値 */
int largest = 2147483647; /* int型のとりうる最大値 */
printf("int(-2147483648) = %d\n", smallest); /* int型のとりうる最小値を表示 */
smallest--; /* 1だけ減算(下限をこえる) */
printf("int(-2147483649) = %d\n",smallest); /* 下限をこえた値を表示 */
printf("int(2147483647) = %d\n",largest); /* int型のとりうる最大値を表示 */
largest++; /* 1だけ加算(上限をこえる) */
printf("int(2147483648) = %d\n",largest); /* 上限をこえた値を表示 */
return 0;
}
644 :
デフォルトの名無しさん :2009/06/19(金) 03:19:53
>>638 #include<stdio.h>
int main(void){
int kokugo,suugaku,eigo,kagaku,buturi,sekaisi,sum;
double ave;
printf("国語の点数…\n");
scanf("%d",&kokugo);
printf("数学の点数…\n");
scanf("%d",&suugaku);
printf("英語の点数…\n");
scanf("%d",&eigo);
printf("化学の点数…\n");
scanf("%d",&kagaku);
printf("物理の点数…\n");
scanf("%d",&buturi);
printf("世界史の点数…\n");
scanf("%d",&sekaisi);
sum=kokugo+suugaku+eigo+kagaku+buturi+sekaisi;
ave=(double)sum/6;
printf("合計点は%dです。\n",sum);
printf("平均点は%4.1fです。",ave);
return 0;
}
645 :
デフォルトの名無しさん :2009/06/19(金) 03:40:04
すいません
>>593 の問題についてなんですが表示結果の例として
会員番号:3524
Uグループです。
会員番号:0
会員番号が適切ではありません。
のように作れと書いてあるんですが、
>>596 のように書いたんですがうまくいかないです。
あと
>>596 のlongとかreturn1の意味がわからないんですが・・。素人なものなんで何が何かわからない状態です
どなたかご教授お願いします。
注文が多いとスルーされるよ
648 :
デフォルトの名無しさん :2009/06/19(金) 03:53:14
[1] 授業単元: C [2] 問題文(含コード&リンク):正の整数nについて、1の二乗+2の二乗+3の二乗+・・・・・nの二乗の値を求めるプログラムを作成せよ。ただし、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例として 正の整数:17 1から17までの2乗和は1785です。 正の整数:0 [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月20日まで [5]繰り返しまでです
649 :
デフォルトの名無しさん :2009/06/19(金) 03:59:23
>>648 #include<stdio.h>
int main(void){
int a=0,n,i;
printf("n…\n");
scanf("%d",&n);
if(n<=0){
return 0;
}
for(i=1;i<=n;i++){
a=a+i*i;
}
printf("%d",a);
return 0;
}
650 :
デフォルトの名無しさん :2009/06/19(金) 04:01:55
[1] 授業単元: C [2] 問題文(含コード&リンク):キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示するプログラムを作成せよ 。なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。また、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例 正の整数:7 1******* 2****** 3***** 4**** 5*** 6** 7* のように作れとのことです。 [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月20日 [5]繰り返しまでです、関数まではいっていません、お願いします
>>650 宿題ためこみすぎじゃね?
あと全角の処理って面倒なんだぜ
652 :
デフォルトの名無しさん :2009/06/19(金) 04:14:50
[1] 授業単元: C [2] 問題文(含コード&リンク):キーボードから入力されたせいの整数n(0〜15)を2進数(4ビット)で出力するぷ8炉グラムを作成せよ。 ただし、表示は下位ビットからでよい。また、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例 正の整数:12 整数12を2進数表記すると下位ビットより0011となります 正の整数:3 整数3を2進数表記すると下位ビットより1100となります。 正の整数:5 整数5を2進数表記すると下位ビットより1010となります 正の整数:0 ヒント nを2で割った商と余りを求める。余りが2進数の最下位ビットである。商を2で割ったときの余りが最下位から2番目のビットになる。 以下同様に計算する。 [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月20日 [5]繰り返しまでです、よろしくお願いします
653 :
デフォルトの名無しさん :2009/06/19(金) 04:19:12
>>650 #include<stdio.h>
int main(void){
int n,m,i,j;
printf("n…");
scanf("%d",&n);
m=n;
if(n<=0){
return 0;
}
printf("正の整数:%d\n",n);
for(i=0;i<=m;i++){
if(i<m)printf("%d",m-n+1);
for(j=1;j<=n;j++){
printf("*");
if(j==n){
printf("\n");
}
}
n--;
}
return 0;
}
654 :
デフォルトの名無しさん :2009/06/19(金) 04:31:08
>>652 #include<stdio.h>
int main(void){
int n,m,a=0,b=0,c=0,d=0;
printf("n…");
scanf("%d",&n);
if(n<=0)return 0;
printf("正の整数:%d\n",n);
m=n;
if(n%2==1){
a=1;
}
n=n/2;
if(n%2==1){
b=1;
}
n=n/2;
if(n%2==1){
c=1;
}
n=n/2;
if(n%2==1){
d=1;
}
printf("整数%dを2進数表記すると下位ビットより%d%d%d%dとなります。",m,a,b,c,d);
return 0;
}
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 前回の課題の関数を用いて今日から1万日先が何年何月何日であるか求めるプログラムを作りなさい。 関数は以下 int leapyear(int year){ if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } else return0; } [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語:C [4] 期限:6月27日 [5] その他の制限: 関数まで。 お願いします。
658 :
デフォルトの名無しさん :2009/06/19(金) 05:09:56
659 :
デフォルトの名無しさん :2009/06/19(金) 05:15:31
あ、ごめん日付の表示がおかしかったわ
660 :
デフォルトの名無しさん :2009/06/19(金) 05:28:25
661 :
デフォルトの名無しさん :2009/06/19(金) 05:34:32
あれ、6月31日って出ちゃった・・・ もういいや、めんどくせ〜 役に立てなくてごめんね
>>633 ただの634につられて書いただけ。
int oddsum(int n) {
int sum=0; // default:(else) が無いので初期化
if(n%4 == 3) sum = (n+1)*(n+1)/4;
else if(n%4 == 0) sum = n*n/4;
else if(n%4 == 1) sum = (n-1)*(n-1)/4 + n;
else if(n%4 == 2) sum = (n-2)*(n-2)/4 + n-1;
return sum; // 戻るのは1箇所
}
>>662 これでおk
int m=(n+1)/2;
return m*m;
>>627 return pow((double)x,2);
>>561 #include <stdio.h>
#include <string.h>
char toupper(char c) {
if(c>='a'&&c<='z') return c+'A'-'a';
else return c;
}
int main(void) {
char *a="This M!.";
int i, l;
l = strlen(a);
for(i=0;i<l;i++)
putchar( toupper(a[i]) );
}
>>627 square(a+b)ってやったら、どっちもダメだなあ。
>>664 >if(c>='a'&&c<='z') return c+'A'-'a';
ここがダメ
667 :
デフォルトの名無しさん :2009/06/19(金) 12:59:20
668 :
デフォルトの名無しさん :2009/06/19(金) 13:27:46
コンピュータを3目並べ(いわゆる○×)をするプログラムを作成しなさい コンピュータの手はランダムに決定するものとする(空いてるところに打つ) 盤面を表現する配列は3×3の二次元配列とし、グローバルに宣言する。 以下のような関数を宣言すること 盤の表示、○×を打つ、3つ並んだかチェック。
669 :
デフォルトの名無しさん :2009/06/19(金) 13:40:36
内容: [1] 授業単元: プログラミング論 [2] 問題文(含コード&リンク): 1からnまでの整数値の和を再帰的に求めるプログラムを作成する [実行結果の例] 1からnまでの整数値の和を計算します nの値を入力してください:100 1から100までの整数値の和は5050です [3] 環境 [3.1] OS: Windows vista [3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5 [3.3] 言語: C [4] 期限: 2009年6月23日13:00まで
670 :
デフォルトの名無しさん :2009/06/19(金) 13:42:09
参考プログラム /* 階乗値を再帰的に求める */ #include <stdio.h> /*--- 整数値nの階乗を返却 ---*/ int factorial(int n) { if (n > 0) return (n * factorial(n - 1)); else return (1); } int main(void) { int x; printf("整数を入力せよ:"); scanf("%d", &x); printf("%dの階乗は%dです。\n", x, factorial(x)); return (0); }
671 :
デフォルトの名無しさん :2009/06/19(金) 13:43:51
>>669 >>670 の差分 (最低限: 関数名やコメント printf の内容はノータッチ)
-- return (n * factorial(n - 1));
++ return (n + factorial(n - 1));
-- return (1);
++ return (0);
関数名かえろよw
[1] 授業単元:プログラム [2] 4*3行列Aと 3*5行列B の各要素をキーボードから入力し、 C = A*B を計算し、表示するプログラムを作成せよ。 [3] 環境 [3.1] OS:Linux [3.2] gcc [3.3] 言語:C [4] 期限: 2009年6月19日16:00まで [5] 特になす ぼすけて…orz
>>656 コマンド引数で日数を指定するようにした。
#include <stdio.h>
int leapyear(int year){
if(year%400 == 0) return 1;
else if(year%4 == 0 && year%100 != 0) return 1;
else return 0;
}
void addmonth(int *day, int *month, int *year){
*day = 1; (*month)++;
if(*month > 12) {
*month = 1; (*year)++;
}
}
int main(int argc, char *argv[]){
int year, month, day, a=0, max_days;
int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(argc != 2) {puts("Usage: exefile 10000"); return 1;}
max_days = atoi(argv[1]);
printf("今日は西暦何年 何月 何日? ");
scanf("%d%d%d",&year,&month,&day);
while(a<max_days) {
a++; day++;
if(month == 2 && leapyear(year)) {
if(day > 29) addmonth(&day, &month, &year);
} else {
if(day > month_days[month-1]) addmonth(&day, &month, &year);
}
}
printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day);
}
>>674 #include <stdio.h>
int main(void)
{
double a[4][3], b[3][5], c[4][5];
int i, j, k;
for(i=0; i<4; i++) for(j=0; j<3; j++) scanf("%lf", &a[i][j]);
for(i=0; i<3; i++) for(j=0; j<5; j++) scanf("%lf", &b[i][j]);
for(i=0; i<4; i++) {
for(j=0; j<5; j++) {
c[i][j] = 0;
for(k=0; k<3; k++) c[i][j] += a[i][k] * b[k][j];
printf("%f ", c[i][j]);
}
putchar('\n');
}
return 0;
}
test
[1] 授業単元:情報基礎B [2] 問題文(含コード&リンク): 1から10までの任意の数字を入力すると、 1から50までの範囲でその数字の倍数を出力するプログラムを作成せよ。 ただし、入力された数字が1から10の範囲外の場合は"Input Error"と表示させる。 また、数字を5つおきに改行するなど、各自で工夫点を入れること。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:コンパイルするときにccというコマンドを使っていますが…。よくわかりません [3.3] 言語: C [4] 期限: 2009年06月25日13:00まで [5] その他の制限:初心者です。printf scanf if for などの構文や関数を習いました。
初歩的なことしか習ってないのに、いきなりこんな宿題が出ました。 解説もできればお願いしたいです。
>>681 #include <stdio.h>
int main()
{
int num, ret, i, disp;
ret = scanf("%d", &num);
if (ret!=1 || num<=0 || num>10)
{
printf("Input Error");
return 1;
}
disp = 0;
for (i=1; i<=50; i++)
{
if (i%num!=0) continue;
disp++;
printf("%2d", i);
if (disp%5==0)
{
printf("\n");
}
else
{
printf(" ");
}
}
return 0;
}
685 :
684 :2009/06/19(金) 21:05:08
解説 scanfで数値読み取り scanfは返り値が読み取った値の個数なので この場合1以外は読み取れなかったことを示す 1<=num<=10の条件と一緒に判断してエラー表示 メインループ1から50まで順番に回す 倍数かどうかは%演算(あまりを求める)で==0のときで判断 dispはいくつ表示したかを把握するためのカウンタ 5の倍数で改行を入れる こんなもん?
#include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 10000 #define MAX 50 #define LINEFEED 4 int main() { double d = 0.0, maxim; int count = 0; char buffer[ BUFFERSIZE ]; /* 1から10の範囲内の数字なら小数点でもOKよ */ for (;;) { printf( "1から10までの数字いっこ入れる :" ); scanf( "%s", &buffer ); d = atof( buffer ); if ( 0 < d && d <= 10 ) { break; } printf ( "比類なきinput Error\n" ); } /* 小数点の誤差がアレだから回りくどい方法で表示するわ */ maxim = d; do { printf( "%16.4f", maxim ); maxim += d; if ( ++count % LINEFEED == 0 ) { printf ( "\n" ); } } while ( maxim <= MAX ); return 0; }
689 :
デフォルトの名無しさん :2009/06/19(金) 23:49:21
691 :
デフォルトの名無しさん :2009/06/20(土) 01:08:36
#include <iostream> using namespace std; int main(){ cout << "年齢を入力してください\n" << 16 << endl; cout << "生まれた年を入力してください\n" << 1986 << endl; cout << "好きな数字を入力してください\n" << 7 << endl; cout << "あなたは1986年生まれの16才で、7が好きですね" << endl; return0; } 上の問題にcinを一度だけ使って表現せよ あと、次のような割り勘プログラムを作成せよ 御勘定を入力してください 23000 割り勘する人数を入力してください 7 1人当たり3285円で端数が5円出ます。 誰か助けてくれませんか?
>>691 #include <iostream> // 問1 これかな?
using namespace std;
int main(void){
int umare, toshi, suuji;
cout << "年齢を入力してください\n";
cout << "生まれた年を入力してください\n";
cout << "好きな数字を入力してください\n";
cin >> toshi >> umare >> suuji;
cout << "あなたは"<<umare<<"年生まれの"<<toshi<<"才で、"<<suuji<<"が好きですね" << endl;
}
#include <iostream> // 問1 こっちかも?
using namespace std;
int main(void){
cout << "年齢を入力してください\n" << 16 << endl
<< "生まれた年を入力してください\n" << 1986 << endl
<< "好きな数字を入力してください\n" << 7 << endl
<< "あなたは1986年生まれの16才で、7が好きですね" << endl;
}
#include <iostream> // 問2
using namespace std;
int main(void) {
int kingaku, ninzu, warikan, amari;
cout <<"御勘定を入力してください\n"; cin >>kingaku;
cout <<"割り勘する人数を入力してください\n"; cin >>ninzu;
warikan = (kingaku/ninzu+5)/10*10;
amari = kingaku - warikan * ninzu;
cout <<"1人当たり"<< warikan <<"円で端数が"<< amari<<"円出ます。"<<endl;
}
1] 授業単元:情報リテラシ [2] 問題文: a行a列の数値を.exeの時に入力し、 対角要素を並びかえをするプログラムを作れ。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: 不明です [3.3] 言語:C言語でお願いします。 [4] 期限: 2009年6月22日まで よろしくお願いします。
>>699 #include<stdio.h>
#define a 5
int main(void){
int matrix[a][a];
int i, j, t;
for(i=0;i<a;i++){
for(j=0;j<a;j++) matrix[i][j]=i*10+j;
}
for(i=0;i<a;i++){
for(j=0;j<a;j++) printf(" %02d", matrix[i][j]);
printf("\n");
}
for(i=0;i<a;i++){
for(j=i+1;j<a;j++){
t=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=t;
}
}
printf("\n");
for(i=0;i<a;i++){
for(j=0;j<a;j++) printf(" %02d", matrix[i][j]);
printf("\n");
}
return 0;
}
>>699 転置行列ではないので合ってると思う。一回の走査で入れ替えられないものか。
#include <stdio.h>
int main() {
int n, i, j, sts;
float *a, tmp;
do {
printf("matrixの行数=列数は?");
if((sts = scanf("%d", &n)) == EOF) return 0;
if(sts == 1) break;
scanf("%*s");
} while(1);
if((a = malloc(n*n*sizeof(float))) == NULL) return 1;
printf("%d行*%d列のデータを入力\n",n,n);
for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%f", &a[i*n+j]);
puts("入力したデータは:");
for(i=0;i<n;i++) {
for(j=0;j<n;j++) printf("%f\t", a[i*n+j]);
puts("");
}
for(i=0;i<n/2;i++) for(j=0;j<n;j++) {
tmp = a[i*n+j]; a[i*n+j] = a[(n-1-i)*n+j]; a[(n-1-i)*n+j] = tmp;
}
for(i=0;i<n;i++) for(j=0;j<n/2;j++) {
tmp = a[i*n+j]; a[i*n+j] = a[i*n+(n-1-j)]; a[i*n+(n-1-j)] = tmp;
}
puts("対角要素を入れ替えたデータは:");
for(i=0;i<n;i++) {
for(j=0;j<n;j++) printf("%f\t", a[i*n+j]);
puts("");
}
}
702 :
700 :2009/06/20(土) 14:41:18
転置行列じゃなかったのか・・・ 700は無しで
>>667 (Linux)xclock -update 1 を何個か起動し、 指定された間隔で一つずつSIGTERMで停止させる 6月24日
>>588 (Linux)execl()を使用。execl()を使用 6月24日12:00
>>689 Nearest Addition 法(最近追加法)を用いて巡回セールスマン問題を解く 6月21日
>>364 巡回セールスマン問題。最短経路長をもった閉路と閉路長を比較する 6月16日
>>476 滑降シンプレックス 6月19日 6月19日
期限が過ぎたもの
>>462 catをシステムコールとライブラリ関数で作り直す 6月18日23:59
>>593 >>645 会員番号に基づき5つのグループに分ける 6月19日
>>592 >>641 入力した文字の種類を表示 6月19日
>>590 x=1におけるf(x)=e^xの微分値を計算 6月18日24:00
>>580 人の名前(ローマ字)を検索(部分一致) 6月18日午前
>>438-444 >>461 入力ストリームから読み込んだデータ文字列を、データベースに格納する前にスタックに一時的に格納する 6月16日13:00
>>226 >>230 >>332 (EXE)ファイルから問題文を読み込み、3択を解いていく 6月15日(月)19:00
705 :
デフォルトの名無しさん :2009/06/20(土) 17:42:25
age
707 :
デフォルトの名無しさん :2009/06/21(日) 00:03:56
>>698 問1が二つ書いてあるんですが、どっち書けばいいんですか?
本当は、問1が
以下のように出力されるプログラムを出力せよ
年齢を入力してください
16
生まれた年を入力してください
1992
好きな数字を入れてください
8
って問題ですがそれは合ってると思うから書きました。
しかし、問2が、『上の問題をcinを一度だけ使って実現せよ』って問題なんですが…
あと()の中のvoidっているんですか?そしてreturn0;は必要ないんでしょうか
708 :
デフォルトの名無しさん :2009/06/21(日) 00:19:44
授業単元: [2] 問題文: 問@成績集計プログラム 入力件数nをキーボードより入力し、n人分のテストデータを入力する。 その際、合計点、最高点、最低点を求め、最後に平均点を計算しそれぞれを出力するプログラムを作成せよ。 ただし、平均点は実数型とし小数点第2位まで出力する。 平均点以外の変数は整数型とする。 問A棒グラフ出力プログラム 値2つを入力し、*を横に並べて棒グラフ状に出力するプログラム。 大きい値の方の棒グラフが上に来るようにすること。 (値として0〜50までしか入力されないものとする) [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン: Windows Visual Studio 2008 [3.3] 言語: C [4] 期限:6月23日 [5] その他の制限:初心者なので解説があるとうれしいです。何かを使ってはいけないという制限はありません
709 :
708 :2009/06/21(日) 00:21:08
抜けていましたが授業単元はC言語です よろしくおねがいします
710 :
デフォルトの名無しさん :2009/06/21(日) 00:26:40
次のように入力、出力できるようなプログラムを作成せよ アルファベットを3つ入力してください a b c キーボードからa、b、cが入力されました←a、b、cは上の文字 #include <iostream> using namespace std; int main(){ return0; } はなんか鉄板みたいなんですよね
711 :
698 :2009/06/21(日) 00:27:35
>>707 >>691 のC++ソース間違ってるよ。
#include <iostream> // 問1
using namespace std;
int main(){
int umare, toshi, suuji;
cout << "年齢を入力してください\n" ; cin >> umare;
cout << "生まれた年を入力してください\n" ; cin >> toshi;
cout << "好きな数字を入力してください\n" ; cin >> suuji;
cout << "あなたは" << umare <<"年生まれの" << toshi << "才で、" << suuji << "が好きですね" << endl;
return 0;
}
#include <iostream> // 問2
using namespace std;
int datain() {
int data;
cin >> data;
return data;
}
int main(){
int umare, toshi, suuji;
cout << "年齢を入力してください\n" ; umare = datain();
cout << "生まれた年を入力してください\n" ; toshi = datain();
cout << "好きな数字を入力してください\n" ; suuji = datain();
cout << "あなたは" << umare <<"年生まれの" << toshi << "才で、" << suuji << "が好きですね" << endl;
return 0;
}
712 :
デフォルトの名無しさん :2009/06/21(日) 00:27:58
>>710 #include <iostream>
using namespace std;
int main(){
cout << "アルファベットを3つ入力してください" << endl;
char a, b, c;
cin >> a; cin >> b; cin >> c;
cout << "キーボードから" << a << "、" << b << "、" << c <<
return0;
}
714 :
デフォルトの名無しさん :2009/06/21(日) 00:34:39
>>711 ごめんなさいありがとうございます。しかし、
問1の問題と問2の問題ってこうやって続けて書かないとダメですか。
//問1って書かないとダメですか。
cin を一度しか使えないという制約を守るため istream &customcin = cin; と書くのはどうだろう。
途中で送信してしまった return 0; の上はこれに置き換えて cout << "キーボードから" << a << "、" << b << "、" << c << "が入力されました←a、b、cは上の文字" << endl;
なんだ釣りか
>>708 問1
#include<stdio.h>
int main(void){
int i, n=0, score=0, total=0, maximum=0, minimum=0;
printf("\n入力件数 : ");
scanf("%d", &n);
if(n<=0) return 1;
for(i=0;i<n;i++){
printf("\n%d 人目の得点 : ", i+1);
scanf("%d", &score);
if(!i) maximum=minimum=score;
total+=score;
if(maximum<score) maximum=score;
if(minimum>score) minimum=score;
}
printf("合計点 %d\n最高点 %d\n最低点 %d\n", total, maximum, minimum);
printf("平均点 %.2f\n", (double)total/n);
return 0;
}
>>708 問2
#include<stdio.h>
int main(void){
int i, a, b;
printf("\na : ");
scanf("%d", &a);
printf("\nb : ");
scanf("%d", &b);
printf("\na : ");
for(i=0;i<a;i++) printf("*");
printf("\nb : ");
for(i=0;i<b;i++) printf("*");
printf("\n");
return 0;
}
720 :
デフォルトの名無しさん :2009/06/21(日) 00:43:33
>>716 cin >> a; cin >> b; cin >> c;はいいんですか。aとかの次って,じゃなくて;でよいんですか
>>715 #define Cout cin
でよくね?
722 :
デフォルトの名無しさん :2009/06/21(日) 00:46:01
さらしあげ
>>720 「○○じゃなくて△△でよいんですか」
って言いたいだけだろ
724 :
デフォルトの名無しさん :2009/06/21(日) 00:49:16
725 :
デフォルトの名無しさん :2009/06/21(日) 00:49:57
>>724 ですすみません。2って言うのは問2ってことです。
726 :
デフォルトの名無しさん :2009/06/21(日) 00:54:06
>>698 #include <iostream>
using namespace std;
int main() {
int kingaku, ninzu, warikan, amari;
cout <<"御勘定を入力してください\n"; cin >>kingaku;
cout <<"割り勘する人数を入力してください\n"; cin >>ninzu;
warikan = (kingaku/ninzu+5)/10*10;
amari = kingaku - warikan * ninzu;
cout <<"1人当たり"<< warikan <<"円で端数が"<< amari<<"円出ます。"<<endl;
}
でやったら、
御勘定を入力してください
23000
割り勘する人数を入力してください
7
1人当たり3290円で端数が-30円出ます。ってなるんですが、間違ってますか?
>>725 #include <iostream>
#define Cout cin
using namespace std;
int main()
{
int okanjou, ninzuu;
cout << "御勘定を入力してください" << endl;
Cout >> okanjou;
cout << "割り勘する人数を入力してください" << endl;
Cout >> ninzuu;
cout << "1人当たり" << okanjou / ninzuu << "円で端数が" << okanjou % ninzuu << "円出ます。" << endl;
return 0;
}
728 :
デフォルトの名無しさん :2009/06/21(日) 00:59:50
>>727 入れていけないわけではないですが、cinをひとつだけ入れよというのは
>>691 にもあるように割り勘の問題ではないですよ。
729 :
698 :2009/06/21(日) 01:00:16
731 :
デフォルトの名無しさん :2009/06/21(日) 01:04:04
>>729 そうですか。すみませんでした。でも、cinを一度だけ使ってと言うのは2番の問題なんで、これはcinって入れなくてもいいんですが、入れてもできるんですか。
そして、
>>727 でcoutを大文字小文字分けているのは何でですか教えてください。
そもそも
>>691 の例題は出力がおかしいのだ。
一人当たり3285円とあるが、それを7倍してみよ。
23000円には足りないのだ!
つまり、店員は怒り出すし、警察を呼ばれてしまう可能性すらある。
>>698 はそこまで考えた上で、
ちゃんと全員が払うべき額と、それで返ってくる額まで算出している。
ただしい。
733 :
デフォルトの名無しさん :2009/06/21(日) 01:13:19
734 :
デフォルトの名無しさん :2009/06/21(日) 01:16:27
>>732 「1人当たり3285円です。ただし一人だけ5円多く出してもらいます。」
ならよかったのにね。
736 :
デフォルトの名無しさん :2009/06/21(日) 01:17:21
>>727 #define Cout cin っていらなくないんですか?必要ですか?
>>735 一円単位で計算しておいてそれはひどいw
もうだめだこのスレwww
739 :
698 :2009/06/21(日) 01:31:18
>>736 Cout は #define Cout cin で宣言してるから使うことが出来る。
#include <iostream> // 問2 using namespace std; int main(void) { int kingaku, ninzu, warikan, amari; cout <<"御勘定を入力してください\n"; cin >>kingaku; cout <<"割り勘する人数を入力してください\n"; cin >>ninzu; warikan = kingaku/ninzu; amari = kingaku - warikan * ninzu; cout <<"1人当たり"<< (amari?warikan+1:warikan) <<"円でおつりが"<< (amari?ninzu-amari:0)<<"円出ます。"<<en } こうじゃね?
#include <iostream> // 問2 using namespace std; int main(void) { int kingaku, ninzu, warikan, amari; cout <<"御勘定を入力してください\n"; cin >>kingaku; cout <<"割り勘する人数を入力してください\n"; cin >>ninzu; warikan = kingaku/ninzu + (kingaku%ninzu?1:0); amari = warikan * ninzu - kingaku; cout <<"1人当たり"<< warikan <<"円でおつりが"<< amari<<"円出ます。"<<endl; } こっちのがいいか。
742 :
デフォルトの名無しさん :2009/06/21(日) 03:45:58
[1] 授業単元: C [2] 問題文(含コード&リンク):年r%の複利でy円を借り、n年後に一括返済する場合の返済額を計算するプログラムを作成せよ ただしr%の複利でn年借りた場合の利率を計算する部分を関数として作成すること。 表示結果の例 利率(r):7.5 金額(y):1000000 期間(n):2 返済金額は1155625 ヒント:返済金額はy(1+r/100)のn乗円である。r%の複利でn年間の利率(1+r/100)のn乗を計算する関数 float interest(float r, int n)を作る。そしてmain()からinterest()を呼び出し、返された値にyを掛けて返済額を求める。 [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月21日 [5]関数までです。お願いします
743 :
デフォルトの名無しさん :2009/06/21(日) 04:06:35
[1] 授業単元: C [2] 問題文(含コード&リンク):じゃんけんゲームを作成せよ。ただし、main()は下記のものを用いよ。具体的には、get_hand_player(), print_hand(),judge()をついかすればよい。 表示結果の例 じゃんけんぽん(1-3):1 コンピューター:グー あなた:グー あいこ じゃんけんぽん(1-3):2 コンピューター:パー あなた:チョキ あなたの勝ち! じゃんけんぽん(1-3):3 コンピュータ:チョキ あなた:パー 私の勝ち!
>>742 #include <stdio.h>
float interest(float r, int n) {
float ret = 1;
while (n--)
{
ret*=(1+r/100);
}
return ret;
}
int main() {
float r;
int y, n;
printf(" 利率(r):"); scanf("%f", &r);
printf(" 金額(y):"); scanf("%d", &y);
printf("期間(n):"); scanf("%d", &n);
printf("返済金額は%d\n", (int)(y * interest(r, n)));
return 0;
}
746 :
デフォルトの名無しさん :2009/06/21(日) 04:19:56
↑の続きです int main() { int computer,player; srandom((unsigned long)time(NULL)); while(1){ computer = random() % 3+1; player = get_hand_player(); printf("コンピューター"); print_hand(computer); printf("あなた:") print_hand(player); switch(judge(computer,player)) case -1: printf("私の勝ち!\n\n"); break; case 0: printf("あいこ\n\n") break; case 1: printf("あなたの勝ち!\n\n") } } } [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月21日 [5]関数までです
747 :
デフォルトの名無しさん :2009/06/21(日) 04:28:14
[1] 授業単元: C [2] 問題文(含コード&リンク):うるう年なら返り値1を、そうでないなら0を返す関数int leapYear(int year)をつくり、この関数を 用いて2001年から2999年までの間にうるう年が何年あるか計算するプログラムを作成せよ。 表示結果の例 2001 leap = 0 2002 leap = 0 2003 leap = 0 2004 leap = 1 ・・・ ←省略 2999 leap = 0 242回です。 ヒント:うるう年とは、4で割り切れる年のことである。ただし、100で割り切れる年はうるう年ではなく、400で割り切れる年はうるう年である。 [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月21日 [5]関数までです
748 :
デフォルトの名無しさん :2009/06/21(日) 04:32:24
[1] 授業単元: C
[2] 問題文(含コード&リンク):
>>747 で作成したleapYear()関数を利用し、今日から10000日先は何年何月何日かを求めるプログラムを作りなさい。
ヒント:10000日から各月の日数をひいていく。翌月に進むとmonth=month+1とし、12月を過ぎるとyear=year+1,month=1とする。引いた日数がマイナス(0以下)になるまでこれを繰り返す。なお、2008年5月27日の10000日後は2035年10月13日である。
[3] 環境
[3.1]linux
[3.2] gcc
[3.3]C
[4]6月21日
[5]関数までです、よろしくお願いします
749 :
デフォルトの名無しさん :2009/06/21(日) 04:43:38
[1] 授業単元: C [2] 問題文(含コード&リンク):表示入力から正の整数値を読み込み、0がにゅうりょくされたらそれらの整数を小さい順に表示するプログラムを作成せよ。 表示結果の例 正整数:17 正整数:3 正整数:9 正整数:4 正整数:0 入力された整数は小さい順に0,3,4,9,17です。 ヒント:数字を読み込む毎に、それまでに入力された数値が格納された配列の最後の要素から先頭に向かって順に大小の比較を行う。 読み込んだ数字の法が小さかったら、既に記憶されている配列の要素をひとつずつずらし、配列の1つ前の要素と比較を行う。 読み込んだ数字の方が大きかったら、比較した要素の次の場所を代入し、次に入力される数字の処理へ移る。 [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4]6月21日 [5]配列までです
750 :
デフォルトの名無しさん :2009/06/21(日) 04:55:37
[1] 授業単元: C [2] 問題文(含コード&リンク):行列A(l行m列9と行列B(m行n列)の積C(l行n列)を求めるプログラムを作成せよ。 表示結果の例 lとmを入力してください:23 行列Aを入力してください >2 4 8 >7 3 3 nを入力してください(m = 3):4 行列Bを入力してください >4 5 2 7 >5 6 2 8 >1 2 3 6 C= 36 50 36 94 46 59 29 91 ヒント:行列AとBを2次元配列(例えば、matrixA[MAX_SIZE][MAX_SIZE].ただし、MAX_SIZEは適切にdefineされているとする) で宣言する。このとき、行列Aのi行j列の要素は、C言語ではmatrixA[i-1][j-1]に記憶させることに注意する。matrixBについても同様。 このときmatrixCは次のように計算できる。 matrixA[i][0]*matrixB[0][j]+matrixA[i][1]*matrixB[1][j]+・・・・ +matrixA[i][m-1]*matrixB[m-1][j] [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4] [5]
>>743 int get_hand_player()
{
int hand;
printf("じゃんけんぽん(1-3):");
do {
scanf("%d", &hand);
} while (hand < 1 || 3 < hand);
return hand;
}
void print_hand(int hand)
{
char hand_table[][7] = {"グー", "チョキ", "パー"};
printf("%s\n", hand_table[hand-1]);
}
int judge(int computer, int player)
{
int judge_table[] = {0, 1, -1};
if (computer > player) {
return judge_table[computer - player];
} else {
return -judge_table[player - computer];
}
}
752 :
デフォルトの名無しさん :2009/06/21(日) 05:08:49
>>749 #include<stdio.h>
int main(void){
int a[255],b,i=0,j,k;
while(i<255){
printf("正整数:\n");
scanf("%d",&a[i]);
if(a[i]==0) break;
else if(a[i]<0){
printf("正の整数ではありません");
return 0;
}
i++;
}
for(k=0;k<=i;k++){
for(j=0;j<=i;j++){
if(a[j]>a[j+1]){
b=a[j];
a[j]=a[j+1];
a[j+1]=b;
}
}
}
printf("入力された整数は小さい順に");
for(j=0;j<=i;j++){
printf("%d,",a[j]);
}
printf("です。");
return 0;
}
>>707 問3
#include <iostream>
using namespace std;
int main(void) {
int kingaku, ninzu, warikan, amari;
int tanni = 1, hasuu[7] = {1,5,10,50,100,500,1000};
string hasu = "Y";
cout <<"御勘定を入力してください\n"; cin >>kingaku;
cout <<"割り勘する人数を入力してください\n"; cin >>ninzu;
cout <<"端数にしますか(Y)、それとも釣りにしますか(N)\n"; cin >>hasu;
cout <<"最小単位は幾らで切り上げますか(1:1,2:5,3:10,4:50,5:100,6:500,7:1000)\n"; cin >>tanni;
tanni = hasuu[tanni-1];
if(hasu == "N" || hasu == "n") {
warikan = (kingaku/ninzu + (kingaku%(ninzu*tanni)?tanni:0))/tanni*tanni;
amari = warikan * ninzu - kingaku;
cout <<"1人当たり"<< warikan <<"円で釣りが"<< amari<<"円出ます。"<<endl;
} else if(hasu == "Y" || hasu == "y") {
warikan = (kingaku/ninzu)/tanni*tanni;
amari = kingaku - warikan * ninzu;
cout <<"1人当たり"<< warikan <<"円で端数が"<< amari<<"円出ます。"<<endl;
}
}
>>747 #include <stdio.h>
int leapYear(int year){
if(year%400 == 0) return 1;
else if(year%4 == 0 && year%100 != 0) return 1;
else return 0;
}
int main() {
int n, count=0;
for(n=2001;n<=2999;n++) if(leapYear(n)) {printf("%d ",n); count++;}
printf("\ntotal:%d times",count);
}
しつこくて申し訳ありませんが、
どなたか分かる方いらっしゃいましたら
>>706 をお願いします。
757 :
708 :2009/06/21(日) 14:27:13
758 :
デフォルトの名無しさん :2009/06/21(日) 16:08:03
759 :
デフォルトの名無しさん :2009/06/21(日) 16:10:15
[1] 授業単元: C [2] 問題文(含コード&リンク):行列A(l行m列9と行列B(m行n列)の積C(l行n列)を求めるプログラムを作成せよ。 表示結果の例 lとmを入力してください:23 行列Aを入力してください >2 4 8 >7 3 3 nを入力してください(m = 3):4 行列Bを入力してください >4 5 2 7 >5 6 2 8 >1 2 3 6 C= 36 50 36 94 46 59 29 91 ヒント:行列AとBを2次元配列(例えば、matrixA[MAX_SIZE][MAX_SIZE].ただし、MAX_SIZEは適切にdefineされているとする) で宣言する。このとき、行列Aのi行j列の要素は、C言語ではmatrixA[i-1][j-1]に記憶させることに注意する。matrixBについても同様。 このときmatrixCは次のように計算できる。 matrixA[i][0]*matrixB[0][j]+matrixA[i][1]*matrixB[1][j]+・・・・ +matrixA[i][m-1]*matrixB[m-1][j] [3] 環境 [3.1]linux [3.2] gcc [3.3]C [4] 6月21日まで [5] 配列までです、お願いします
761 :
デフォルトの名無しさん :2009/06/21(日) 16:33:17
>>741 ()の中のvoidっているんですか?すみません
>>761 別になくてもいいよ
あと、端数をおつりに変えてるから
763 :
デフォルトの名無しさん :2009/06/21(日) 17:37:53
764 :
デフォルトの名無しさん :2009/06/21(日) 17:58:54
>>691 の僕が作った1番上のプログラムにcinを入れるのってどうなるんですか
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 診断プログラムを作ろう 「計算ドリル」。質問文全てを一つの文字列配列に格納し、その順番に表示しましょう。正解するたびに、 tokuten を増やすことで、最後に「あなたは 5 問正解です」みたいな結果を表示させることが出来ます。 char questions[6][100]={ “12×(3+4)=”, “(1+1÷9)×9=”, “(29−5)÷(17−11)=”, “2の10乗=”, “(3×9+44÷2)のルート=”, “8の階乗=”}; ソースプログラム、変数の意味、工夫した点を書きなさい [3] 環境 [3.1] OS: Windows vista [3.2] コンパイラ名とバージョン: borland c++ [3.3] 言語: C++ [4] 期限: 6/21(木)23:00まで [5] その他の制限: 特になし よろしくお願いします
>>764 作ったというより
>>436 のコピペでしょ
こうじゃなくて・・・という反応を期待していたのにスルーされただけの話
767 :
デフォルトの名無しさん :2009/06/21(日) 18:25:28
>>766 そうなんですが、これのどこにcinを入れればいいのかなと思って
>>765 #include <iostream>
#include <string>
#define MAX_Q 6
int main()
{
int tokuten = 0;
int index = 0;
std::string input;
char questions[MAX_Q][100]={
"12×(3+4)=", "(1+1÷9)×9=",
"(29−5)÷(17−11)=", "2の10乗=",
"(3×9+44÷2)のルート=", "8の階乗="
};
char answer[MAX_Q][100]={
"84", "9",
"4", "1024",
"7", "40320"
};
while( index < MAX_Q ){ std::cout << "第" << index << "問!" << std::endl; std::cout << questions[index] << "?" << std::endl; std::cout << "回答:"; getline(std::cin, input, '\n'); if( 0 == input.compare( answer[index] ) ){ std::cout << "正解!" << std::endl; ++tokuten; }else std::cout << "ばーか!" << std::endl; ++index; std::cout << std::endl; } std::cout << "あなたの成績は" << tokuten << "点でした!" << std::endl; }
>>767 -
>>711 問1
#include <stdio.h> //
>>759 #define MAX_SIZE 20
int main() {
float a[MAX_SIZE][MAX_SIZE], b[MAX_SIZE][MAX_SIZE], c[MAX_SIZE][MAX_SIZE];
int i, j, k, l, m, n, sts;
printf("lとmを入力してください:");
if((sts = scanf("%d%d", &l, &m)) == EOF) return 1;
if(l>MAX_SIZE || m>MAX_SIZE) {puts("MAX_SIZE OVER!"); return 1;}
printf("行列Aを入力してください\n");
for(i=0; i<l; i++) {
printf("%d行目>", i+1);
for(j=0; j<m; j++) scanf("%f", &a[i][j]);
}
printf("nを入力してください(m = %d):", m);
if((sts = scanf("%d", &n)) == EOF) return 1;
if(n>MAX_SIZE) {puts("MAX_SIZE OVER!"); return 1;}
printf("行列Bを入力してください\n");
for(i=0; i<m; i++) {
printf("%d行目>", i+1);
for(j=0; j<n; j++) scanf("%f", &b[i][j]);
}
printf("行列C =\n");
for(i=0; i<l; i++) {
for(j=0; j<n; j++) {
c[i][j] = 0;
for(k=0; k<m; k++) c[i][j] += a[i][k] * b[k][j];
printf("%g\t", c[i][j]);
}
putchar('\n');
} return 0;
}
771 :
デフォルトの名無しさん :2009/06/21(日) 18:37:38
前置き、後置きインクリメント、前置き、後置デクリメントを確かめるようなプログラムを作成せよ。 #include <iostream> using namespace std; int main() { return 0; } はそれでいいと思うんですが肝心な中身はどうすればいいか教えてください
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
>>768 >>769 本当にありがとうございました!
でも今気づいたら依頼のとこの言語間違えてましたorzせっかく作っていただいたのに申し訳ないですm(__)m
すみません、
>>773 に補足です。
グラフの始点は節0で終点は節(節の数-1)です。
>>765 ミスってたのではりなおします
何度もすいませんm(__)m
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
診断プログラムを作ろう
「計算ドリル」。質問文全てを一つの文字列配列に格納し、その順番に表示しましょう。正解するたびに、
tokuten を増やすことで、最後に「あなたは 5 問正解です」みたいな結果を表示させることが出来ます。
char questions[6][100]={
“12×(3+4)=”, “(1+1÷9)×9=”,
“(29−5)÷(17−11)=”, “2の10乗=”,
“(3×9+44÷2)のルート=”, “8の階乗=”};
ソースプログラム、変数の意味、工夫した点を書きなさい
[3] 環境
[3.1] OS: Windows vista
[3.2] コンパイラ名とバージョン: borland c++
[3.3] 言語: C
[4] 期限: 6/21(木)23:00まで
[5] その他の制限: 特になし
よろしくお願いします
777 :
デフォルトの名無しさん :2009/06/21(日) 19:54:50
>>776 礼はいらない。
#include <stdio.h>
#include <string.h>
#define MAX_Q 6
int main() {
int tokuten = 0, index = 0;
char input[100];
char questions[MAX_Q][100]={
"12×(3+4)=", "(1+1÷9)×9=",
"(29−5)÷(17−11)=", "2の10乗=",
"(3×9+44÷2)のルート=", "8の階乗="
};
char answer[MAX_Q][100]={
"84", "9",
"4", "1024",
"7", "40320"
};
while( index < MAX_Q ){
printf("第%d問\n%s\n回答:", index+1, questions[index]);
fgets(input, 100, stdin);
input[strlen(input)-1] = '\0';
if( !strcmp(input, answer[index]) ){
printf("正解!\n");
tokuten++;
} else
printf("ばーか!\n");
index++;
printf("\n");
}
printf("あなたの成績は%d点でした。\n", tokuten);
return 0;
}
779 :
デフォルトの名無しさん :2009/06/21(日) 21:11:06
#include <iostream>
using namespace std;
int main() {
int kingaku, ninzu, warikan, amari;
cout <<"御勘定を入力してください\n"; cin >>kingaku;
cout <<"割り勘する人数を入力してください\n"; cin >>ninzu;
warikan = kingaku/ninzu + (kingaku%ninzu?1:0);
amari = warikan * ninzu - kingaku;
cout <<"1人当たり"<< warikan <<"円で端数が"<< amari<<"円出ます。"<<endl;
return 0;
}
作ってもらったやつ、
>>691 にある問題の通りにでなくて、端数が2円って出るんですが、ダメなんですかねそれだと
781 :
デフォルトの名無しさん :2009/06/21(日) 21:21:03
>>780 #define Cout cin 使ってやるのってすごい高等テクニックだったりしないんですか?
783 :
デフォルトの名無しさん :2009/06/21(日) 22:11:04
C++なんですが次のように入力出力できるようなプログラムを教えてくれませんか 品物の単価を入力してください 100 品物の個数を入力してください 3 税率を%で入力してください 5 合計金額は税込みで315円(税抜きで300円)
std::coutを使って文字を出力して、std::cinを使って入力内容を取得して、 税込み、税抜き金額を計算して出力するような感じ ちなみに税込み金額っていうのは単価×個数×(100+税率)÷100で計算できるよ
[1] 授業単元: 数値解析学 [2] 問題文(含コード&リンク): ガウス・ジョルダンを使ってn元連立1次方程式を解き 係数マトリクスの逆行列とその解を表示するプログラムを作れ。 [3] 環境 [3.1] OS: Windows Vista [3.2] コンパイラ名とバージョン: VC++ [3.3] 言語: CでもC++でも可 [4] 期限: 2009/6/23 [5] その他の制限: C言語の入門書に載っているレベルから逸脱しなければ特に制限はありません。 数値を入力させて(もしくはtxtなどから読み込み)解くプログラムでお願いします。
787 :
785 :2009/06/21(日) 22:28:13
ログ読んできた。 吊ってくる λ...
>>784 今の国の法律では内税表示が義務付けられているから、
単価100円のものは「税込みで」100円でないといけない。
つまり、単価100円のものを3個売ると、
税込み300円であり、税抜きは286円だ。
789 :
デフォルトの名無しさん :2009/06/21(日) 22:45:41
>>778 お礼を言わずにはいられない!
ありがとうございました!
>>788 ああそっか、内税になったんだった。
すっかり忘れてた。ありがとん
>>691 (問題) が、
>>428 (解答) のコピペだったことには驚いた。
>って問題ですがそれは合ってると思うから書きました。
796 :
793 :2009/06/22(月) 01:27:48
>>783 の宿題
#include <iostream>
using namespace std;
int main(void) {
int tanka, kosuu, goukei; float ritu;
cin >> tanka >> kosuu >> ritu;
cout<<endl<<endl;
cout<<"品物の単価を入力してください\n"<<tanka<<endl;
cout<<"品物の個数を入力してください\n"<<kosuu<<endl;
cout<<"税率を%で入力してください\n"<<ritu<<endl;
goukei = tanka * kosuu;
cout<<"合計金額は税込みで"<< goukei*(1+ritu/100) <<"円(税抜きで"<< goukei <<"円) "<<endl;
cout<<endl<<endl;
cout<<"合計金額は税込みで"<< goukei <<"円(税抜きで"<< goukei/(1+ritu/100) <<"円) "<<endl;
}
797 :
デフォルトの名無しさん :2009/06/22(月) 01:39:59
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 下記のような電話帳がある。これをランダムファイルname_tel.txtに書き込むプログラムをつくりなさい。 Ichiro Suzuki 03-1111-2222 Hanako Yamato 042-387-5555 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語:C [4] 期限:20090624 [5] その他の制限: 1人毎のデータを下記のような単位(レコード)で記録する。 名と姓,電話番号の2項目についてそれぞれscanf関数を用いて入力する。 また,データ入力の終了はCtrl-dとする。 データの書き込みは1人毎のデータをまとめて書式指定して,fprintf関数を用いて行うこと
100円(税抜96円)のものを100個買った場合って、税込み10000円で、税抜き9600円なのかな
税抜きの金額は、買い物の合計/1.05なので、税額は477円。
なるほど。
んじゃ
>>796 の下のやつであってんのかな
801 :
デフォルトの名無しさん :2009/06/22(月) 03:19:11
だれか
>>580 の質問やってもらえませんか?
期限は気にしなくていいのでお願いします。
#include <stdio.h> #include <string.h> #define N 3 #define LENGTH 100 int main() { const char database[N][LENGTH] = { "ichirou", "jirou", "hanako" }; char query[LENGTH]; while (printf("> "), scanf("%s", query) != EOF) { int i; printf("---検索結果---\n"); for (i = 0; i < N; i++) { if (strstr(database[i], query)) { printf("%s\n", database[i]); } } printf("--------------\n"); } return 0; }
>>801 もうひとつ、問題がはっきりしないんだよね。
鍵を与えて文章の中の名前らしきローマ字名を切り抜くのか。
ローマ字の字並びの定義も必要なのか。
姓・名の間にスペースが入らないこともあり得るのか、とか。
>>803 検索氏名が Futaro Yamada だとして
文の中にamaが出てきたら適合するとか、
そういう意味じゃないの?
806 :
デフォルトの名無しさん :2009/06/22(月) 16:07:42
807 :
デフォルトの名無しさん :2009/06/22(月) 16:11:17
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク):http: //kansai2channeler.hp.infoseek.co.jp/cgi- bin/joyful/img/9511.txt [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C/C++/ [4] 期限: 明日6月23日 20:00まで [5] その他の制限: 特にありません 4問あります。 どうぞよろしくお願いします。
>>806 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int calc(double *x,double *y);
double a, b, c, d;
int main(){
double x, y;
printf("x:");
scanf("%lf",&x);
printf("y:");
scanf("%lf",&y);
calc(&x, &y);
printf("x + y = %.0lf\n",a);
printf("x - y = %.0lf\n",b);
printf("x * y = %.0lf\n",c);
printf("x / y = %.2lf\n",d);
return 0;}
int calc(double *x,double *y){
a = *x + *y;
b = *x - *y;
c = *x * *y;
d = *x / *y;
return 0;}
整数って書いてあんのにdoubleでうけるのはなんで?
calcにアドレスを渡すのは何で?
812 :
810 :2009/06/22(月) 17:18:13
>>806 str1[i] != str2[i] じゃなくて
*(str1 + i) != *(str2 + i)
だった
流れにのってみる hogeとhageがsameってなったんだけどなんで?
814 :
810 :2009/06/22(月) 17:28:58
for (i = 0; str1[i] != '\0'; i++){ if (str1[i] != str2[i]){ return 0; } } return 1; } これでおk
815 :
810 :2009/06/22(月) 17:32:42
for (i = 0; str1[i] != '\0'; i++) → for (i = 0; str1[i] != '\0' || str2[i] != '\0'; i++) ね またまちがえてた。 なんどもごめんねw
str2の方が短かった場合は、str1のナルじゃない文字と、str2のナル文字を比較して、 結局は異なるという結果が返るから問題ないよ
そんなことないわごめんwww
なんかグダグダすぎんな。
819 :
デフォルトの名無しさん :2009/06/22(月) 18:46:40
Visual Studio 2005で、入力した数字が一秒ごとに1減っていくタイマーを作りたいのですが#include <windows.h>じゃなく#include <time.h>を使った方法を教えてもらえませんか?
821 :
デフォルトの名無しさん :2009/06/22(月) 18:57:13
823 :
デフォルトの名無しさん :2009/06/22(月) 19:02:34
>>821 こんな感じで。動作は保障しない。
ちょっと汚い実装になったが勘弁してくれ。
#include <stdio.h>
#include <time.h>
int main(){
time_t Limit,Now;
int Count=0;
printf("何秒前からカウントしますか? ");
scanf("%d",&Count);
Now = time(NULL);
while(Now == time(NULL));
Now = time(NULL);
Limit = time(NULL) + Count;
printf(" %d秒前\n",Limit - Now);
while(Limit>Now){
if(Now == time(NULL)) continue;
Now = time(NULL);
printf(" %d秒前\n",Limit - Now);
}
return 0;
}
825 :
デフォルトの名無しさん :2009/06/22(月) 19:39:01
>>824 わざわざありがとうございます。残念ながら動きませんでした
これってtime_tを使わずは無理ですか?
えーっとunsigned intにしても多分動くよ。
827 :
デフォルトの名無しさん :2009/06/22(月) 19:44:43
>>827 多分だが、動きませんでしたという主張が間違えている
なんじゃそら。 stdinになんか不純物混ざってないか?
831 :
デフォルトの名無しさん :2009/06/22(月) 19:57:40
解決しました ありがとうございましたm(__)m
832 :
デフォルトの名無しさん :2009/06/22(月) 19:58:32
void insertion(int a[], int n) { int i, j, k, tmp; for(i=1; i<n; i++) { tmp = a[i]; for(j=i; j>0 && a[j-1]>tmp; j--) { for(k=0; k<n; k++) { if(k==j || k==j-1) printf("(%2d) ", a[k]); else printf(" %2d ", a[k]); } putchar('\n'); swap(int, a[j], a[j-1]); } if(j==i) { for(k=0; k<n; k++) { if(k==j) printf("[%2d] ", a[k]); else printf(" %2d ", a[k]); } putchar('\n'); } } }
>>835 Cで何か作れってわけでなし。スレチじゃね?
動かした結果及び動作の説明をするんでしょ?
837 :
デフォルトの名無しさん :2009/06/22(月) 22:08:42
キーボードから入力した数値の段数を持つ逆ピラミッドを表示するプログラム。 例えば3と入力した時、 ***** *** * となるようなプログラムです。 どうか早急にお願いします。
>>837 #include <stdio.h>
void replace(int a);
int main()
{
int a;
printf("数字を入れてね...");
scanf("%d",&a);
replace(a);
}
void replace(int a)
{
int i,j;
for(j = a; a >= 0; a--){
for(i = 0; i < a; i++){
printf("*");
}
printf("\n");
}
}
[1] C言語 [2]1〜5の数字の組み合わせをを2次元配列index[][]に格納し、表示しなさい。 [3] 環境 [3.1] Windows [3.2] Visual C++ [3.3] C [4] 期限: 2009年6月25日20:00まで [5] メソッドを使わず、main文の中forループを使い作成すること
>>837 こうかな
#include "stdio.h"
int main()
{
int i, j, pyramid, ret, num;
printf("数字を入力してください: ");
ret = scanf("%d", &num);
if (ret != 1)
{
printf("入力が不正です\n");
return 1;
}
pyramid = num * 2 - 1;
for (i=0; i<num; i++)
{
for (j=0; j<pyramid; j++)
{
if (j>=i && j<pyramid-i)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
844 :
デフォルトの名無しさん :2009/06/22(月) 23:21:28
845 :
デフォルトの名無しさん :2009/06/22(月) 23:22:40
>>796 本当に助けてください。コンパイルのサイトでコンパイルしたら変な風に出てきました。
品物の単価を入力してください
-1084811224
品物の個数を入力してください
0
税率を%で入力してください
3.99994e-34
合計金額は税込みで0円(税抜きで0円)
合計金額は税込みで0円(税抜きで0円)
自分の環境で、コンソール使って打ち込んでみた方が良い。 万一そのサイトしか使えなかったら、cinの行をコメントアウトして tanka = 1980; kosuu = 5000; ritu = 12.5; とか数値を入力してみてコンパイルしてもらうと安心できるかな。
847 :
デフォルトの名無しさん :2009/06/22(月) 23:33:21
>>580 の者ですが、
>>804 の方がおっしゃってるように一致した場合を検索するプログラムをを願いします。
説明不足でどうもすみませんでした。
>>842 ほい。配列の名前間違えたけど。
#include <stdio.h>
int main(void){
int i,j,retsu=0;
int data[25][2];
for(i=1;i<=5;i++){
for(j=1;j<=5;j++){
data[retsu][0] = i;
data[retsu][1] = j;
retsu++;
}
}
for(i=0;i<25;i++){
for(j=0;j<2;j++){
printf("%2d",data[i][j]);
}
putchar('\n');
}
return 0;
}
849 :
デフォルトの名無しさん :2009/06/22(月) 23:36:39
>>845 #include <iostream>
using namespace std;
int main(void) {
int tanka, kosuu, goukei;
float ritu;
cout<<"品物の単価を入力してください"<<endl;
cin >> tanka;
cout<<"品物の個数を入力してください"<<endl;
cin >> kosuu;
cout<<"税率を%で入力してください"<<endl;
cin >> ritu;
goukei = tanka * kosuu;
cout<<"合計金額は税込みで"<< goukei*(1.0+ritu/100.0) <<"円(税抜きで"<< goukei <<"円) "<<endl;
cout<<"合計金額は税込みで"<< goukei <<"円(税抜きで"<< goukei/(1.0+ritu/100.0) <<"円) "<<endl;
}
あいうえお /*かきくけこ*/ さしす/*せそ なにぬ*/ねの というファイル(test.txt)から文字数、改行数、コメント文字数をカウントし、出力するプログラムです。 お願いいたします。
すいません、テンプレ忘れてました。 [1] 授業単元:プログラミング演習 [2] 問題文:以下のファイル(test.txt)から文字数、改行数、コメント文字数をカウントし、出力する あいうえお /*かきくけこ*/ さしす/*せそ なにぬ*/ねの [3] 環境 [3.1] OS: Windows [3.2] Visual Studio 2005 [3.3] 言語: C [4] 期限: 明日中 [5] その他:特になし よろしくお願いします。
855 :
842 :2009/06/23(火) 00:10:03
>>848 せっかくやっていただいたのに申しわけありません。
格納する配列はn行5列の状態で格納しなければいけませんでした。
(1,1,1,1,2)
(1,1,1,1,3)
のような感じです。
説明不足で申し訳ありませんでした。
文字数って地味に難題だよなw 文字コード指定無しだし
>>857 それ組み合わせじゃなくて、順列じゃね?
861 :
デフォルトの名無しさん :2009/06/23(火) 01:24:44
以下のように出力されるプログラムを作成せよ 年齢を入力してください 16 生まれた年を入力してください 1986 好きな数字を入力してください 7 あなたは1986年生まれの16才で、7が好きですね
862 :
861 :2009/06/23(火) 01:25:29
#include <iostream> using namespace std; int main(){ int age,year,number; cout << "年齢を入力してください" << endl; cin >> age; cout << "生まれた年を入力してください" << endl; cin >> year; cout << "好きな数字を入力してください" << endl; cin >> number; cout << "あなたは" << year << "年生まれの" << age << "才で、" << number << "が好きですね" << endl; return0; } 上の問題のプログラムにcinを一回だけ用いて表現せよってどうすればいいんですか。本当に誰か教えてください
863 :
796 :2009/06/23(火) 01:27:29
答えがあるのに、自分で×だしてるだけ。 #include <iostream> using namespace std; int main(){ int age,year,number; cin >> age >> year >> number; cout << "年齢を入力してください\n" << age <<endl; cout << "生まれた年を入力してください\n" << year <<endl; cout << "好きな数字を入力してください\n" << number <<endl; cout << "あなたは" << year << "年生まれの" << age << "才で、" << number << "が好きですね" << endl; return0; }
>>860 は組み合わせの間違い。
疲れてるのかな…俺。
866 :
デフォルトの名無しさん :2009/06/23(火) 01:34:42
>>863 やっぱりおかしいですかね。
>>864 ありがとうございます。それもコンパイルすると結果同じになりますよね?
867 :
862 :2009/06/23(火) 01:46:47
年齢を入力してください 生まれた年を入力してください 好きな数字を入力してください あなたは134539285年生まれの134539136才で、-1079911224が好きですね 僕が作ったやつだって、そのコンパイルにかけると上のように出るんです。本当に誰か助けてください。数字も入れてないのに何で勝手に最後の数字だけ変な風に出てくるんですか
>>866 意味不明
私の推理では、1970年生まれで現在40歳近い。
0004: int age=16,year=1986,number=7;
0010: return 0;
>>842 は
>>855 を見るにこうだと思うんだが。
「1〜5の数字の組み合わせ」という言葉だけで一意に特定するのは難しい。ところで「をを」って流行りなん?
#include <stdio.h>
/*
数字1つ 5
数字2つ 1:4、2:3、3:2、4:1 各10
数字3つ 1:1:3、1:2:2、1:3:1、2:1:2:、2:2:1、3:1:1 各10
数字4つ 1:1:1:2、1:1:2:1、1:2:1:1:、2:1:1:1 各5
数字5つ 1
5+10*4+10*6+5*4+1 = 126
*/
#define N (126)
int main(){
int i0, i1, i2, i3, i4, index[N][5], i = 0;
for(i0 = 1; i0 <= 5; ++i0)
for(i1 = 1; i1 <= i0; ++i1)
for(i2 = 1; i2 <= i1; ++i2)
for(i3 = 1; i3 <= i2; ++i3)
for(i4 = 1; i4 <= i3; ++i4){
index[i][0] = i0;
index[i][1] = i1;
index[i][2] = i2;
index[i][3] = i3;
index[i++][4] = i4;
}
for(i0 = 0; i0 < i; ++i0)
printf("(%d,%d,%d,%d,%d)\n", index[i0][4],index[i0][3],index[i0][2],index[i0][1],index[i0][0]);
return 0;
}
870 :
862 :2009/06/23(火) 01:54:13
>>868 すみません。でも僕がやって元々のやつは何もデータ入れてなくても結論だけ出ますよね
>>870 何もデータを入れなくとも、というのはどういうことをやるの?
パソコンにC++入ってれば、それ使うべき。
873 :
862 :2009/06/23(火) 02:02:38
>>871 862で書いたのを863のでコンパイルしたら、
年齢を入力してください
生まれた年を入力してください
好きな数字を入力してください
あなたは134539285年生まれの134539136才で、-1079911224が好きですね
って出るんですが、年齢も生まれた年も好きな数字も入れてないのにこんな風に出ちゃいます
ちゃんとcinに値を入れられる環境でやれば?
ちなみに
>>862 はコンパイル通らなかったよ
875 :
862 :2009/06/23(火) 02:16:16
>>861 の問題もじゃあ誰か教えてください。だって、違うんですよねorz
ってことは次のも違うし
876 :
864 :2009/06/23(火) 02:22:18
テンプレ書かない子ってのはこういう感じなんだな。
878 :
874 :2009/06/23(火) 02:31:32
>>875 コンパイル通らなかったのは別の話だよ。
>>862 そのままだと「結論だけ出ます」という状態にはならなかったでしょ?
で、それが原因で入力できないのではないよ。
だから「値を入れられる環境でやれば?」と言った。
879 :
デフォルトの名無しさん :2009/06/23(火) 02:45:22
881 :
デフォルトの名無しさん :2009/06/23(火) 06:24:42
>>881 お待たせ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9521.txt 入力用データは↓のようなものを想定(ファイル名はdata.txt)
000001,hogehogehogehogehoge,080,090,095,070
000002,fugafugafugafugafuga,065,080,045,100
000003,piyopiyopiyopiyopiyo,095,100,100,100
000004,punipunipunipunipuni,025,000,010,060
883 :
882 :2009/06/23(火) 09:02:32
884 :
デフォルトの名無しさん :2009/06/23(火) 10:50:01
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): List型を継承し、StackクラスとQueueクラスを作成する (ただし、実行されている様子がわかるmain関数も記述すること) [3] 環境 [3.1] OS:Windows [3.3] 言語: C++ [4] 期限: 6月26日23時59分 [5] その他の制限:C++習い始めて2ヶ月です どうかよろしくお願いします・・・。
886 :
デフォルトの名無しさん :2009/06/23(火) 11:27:46
そうです。
>[5] その他の制限:C++習い始めて2ヶ月です で?制限はなんなんだ? 「○○は習ってないから使わないでください」っていうなら 使ってるテキストの習ったところを全部うpしろよ
888 :
デフォルトの名無しさん :2009/06/23(火) 12:19:11
>>883 ありがとうございます。
ちなみにMAXを使わないでソートする方法はどうするんでしょうか?
889 :
デフォルトの名無しさん :2009/06/23(火) 12:21:42
制限は特にありません。すみません
890 :
デフォルトの名無しさん :2009/06/23(火) 12:31:56
891 :
882 :2009/06/23(火) 12:42:58
>>888 いまいち質問の意図がわからないのだけど、
MAXってsort_students()の中のmaxのこと?
892 :
デフォルトの名無しさん :2009/06/23(火) 13:06:02
>>891 そうですね。一人ずつ比較していくやり方なんですが…
説明がへたですいません。
893 :
882 :2009/06/23(火) 13:49:58
894 :
デフォルトの名無しさん :2009/06/23(火) 14:51:55
通りましたよ
896 :
デフォルトの名無しさん :2009/06/23(火) 14:58:57
ありがとうございます。何て出ました
897 :
デフォルトの名無しさん :2009/06/23(火) 15:08:32
>>893 ありがとうございました!
無事に間に合いそうです!
898 :
デフォルトの名無しさん :2009/06/23(火) 15:22:10
C++で前置き後置きインクリメント、前置き後置きデクリメントを確かめるようなプログラムを作成して 結果も記せ 今コンパイルがパソコンできないのでありません。誰か助けてください
899 :
デフォルトの名無しさん :2009/06/23(火) 15:40:39
903 :
デフォルトの名無しさん :2009/06/23(火) 16:54:18
[1]c++ [2]5個の実数型データを配列bに入力してから、最大値max、最小値min、合計kei、平均値heikinを求めなさい。 [3] [3.1] xp [3.2] turbo c 5.01 [3.3] c++ [4] 期限:今週末 [5] お願いします
904 :
デフォルトの名無しさん :2009/06/23(火) 16:57:14
>>902 確認できました。 ありがとうございました!
905 :
デフォルトの名無しさん :2009/06/23(火) 17:25:06
[1]c++ [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例である。 --- (2)配列nの内容 --- 100000000 010000000 001000000 000100000 000010000 000001000 000000100 000000010 000000001 [3] [3.1] xp [3.2] turbo c 5.01 [3.3] c++ [4] 期限:今週末 [5] お願いします
906 :
デフォルトの名無しさん :2009/06/23(火) 17:36:05
[1]c++ [2]下記のように各要素同士の加算をしなさい 1 2 3 7 8 9 8 10 11 4 5 6 + 4 5 6 = 8 10 12 7 8 9 1 2 3 8 10 11 [3] [3.1] xp [3.2] turbo c 5.01 [3.3] c++ [4] 期限:今週末 [5] お願いします
907 :
デフォルトの名無しさん :2009/06/23(火) 17:45:00
[1]c++ [2]要素の数51の1次配列aの各要素 a[1]〜a[50]に、0〜100点までの点数を入力した後、 最低点を"a[27]=5点"と表示しなさい [3] [3.1] xp [3.2] turbo c 5.01 [3.3] c++ [4] 期限:今週末 [5] お願いします
909 :
デフォルトの名無しさん :2009/06/23(火) 17:51:41
[1]c++ [2]要素の数51の1次元配列a[1]〜a[50]に、0〜100点までの点数を入力した後、 点数の高い順(降順)にa[45]=100,a[15]=98,……a[32]=5 縦に表示しなさい。 [3] [3.1] xp [3.2] turbo c 5.01 [3.3] c++ [4] 期限:今週末 [5] お願いします
910 :
デフォルトの名無しさん :2009/06/23(火) 17:54:26
911 :
デフォルトの名無しさん :2009/06/23(火) 18:00:23
[1]c++ [2]要素の数51の1次元配列a[1]〜a[50]に、0〜100点までの点数を入力した後、 最高点と最低点および平均点を同時に求めて表示するプログラムを作りなさい。 [3] [3.1] xp [3.2] turbo c 5.01 [3.3] c++ [4] 期限:今週末 [5] お願いします
>>894 パソコン室て何だよ。コンパイルや実行が自分で出来ない環境なのか?
それなのに実行結果が知りたいとは、何を提出するつもり。
>>868 で答え終ってるから、もう一度読んでソース修正してみて。
こんなとこで宿題丸投げする人間が自宅に実行環境整えると思えるのが理解できないw
>>912 PCが置かれている教室などはあるが、学校に通ったことないのか?w
最近は中学校くらいからあるんだっけ? いい年したおっさんで大学行ってないとかかな。
そのパソコン室のパソコンではgccとかbcc32とか入ってないのか?
919 :
デフォルトの名無しさん :2009/06/23(火) 19:36:07
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):二分木を用いて小さい順にソートする関数 void sort(int x[], int size)を作りたい。 ソートするデータとしてint型配列に格納した整数を関数に渡している。 なお、出来た二分木を中間順に走査して再帰的にアルゴリズムを作ること。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 明日まで よろしくお願いします。
921 :
デフォルトの名無しさん :2009/06/23(火) 21:03:03
922 :
デフォルトの名無しさん :2009/06/23(火) 21:12:45
923 :
699 :2009/06/23(火) 21:33:24
699で質問したものです。 701さんの回答で、 if((a = malloc(n*n*sizeof(float))) == NULL) return 1; の部分がエラーになってしまい(line 11 で'int'から'float *'への指定です。:`='演算子) コンパイラできませんでした。 どうしたらいいのか分からないです。 回答よろしくお願いします。
>>23 malloc.hをインクルード。いや今はstdlib.hだっけ?まあどっちかだ。たぶん
926 :
920 :2009/06/23(火) 22:30:55
ここは2ちゃんねる。 解答が正しいかどうかの動作確認は、依頼者の責任だろう。 そもそも、入力して出力するだけで計算もifもないプログラムにこんなに…。
>>923 エスパーだが、
コンパイラはVCだろうけど、ソースの拡張子がcppなせいで出来ない。
ソースの拡張子をcにすると通ると思う。
930 :
デフォルトの名無しさん :2009/06/24(水) 00:59:35
>>922 画像処理4問。画像全体のRGB各成分における平均輝度値を計算する 6月24日
>>919 二分木を用いて小さい順にソートする 6月23日
>>905 2問。2次元配列n[10][10]の対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。6月28日
>>854 文字数、改行数、コメント文字数をカウントし、出力する 6月22日
>>844 画像処理3問。X座標が奇数であるすべてのピクセルを白にした画像を生成する。 6月23日
>>835 2問。(2)操作終了後にどのようなヒープができるか,図のように示せ 6月23日
>>797 ランダムファイルname_tel.txtに書き込む 6月24日
>>795 座席指定予約 なし
>>777 画像処理3問。画像の左半分を黒くした画像を生成 6月22日
>>773 ダイクストラ法を使って最短経路を表示せよ 6月21日の正午
>>771 >>898 前置き、後置きインクリメント、前置き、後置デクリメントを確かめるようなプログラムを作成せよ。 不明
>>730 2問。操作終了後にどのようなヒープができるか,図のように示せ 6月22日
>>706 ヒープソートとクイックソートを完成させる 6月21日 12:00
>>588 (Linux)execl()を使用。execv()を使用。 6月24日12:00
>>183 画像の解像度と同じサイズの二次元配列を作りなさい。 なし
932 :
デフォルトの名無しさん :2009/06/24(水) 12:24:05
>>932 数学はド素人なのであってるかはわからない。Orz
プロットは自分でやるものと解釈している。
ほ、ほんとに動作は保障しないんだからね。
#include <stdio.h>
#include <math.h>
double F(double x,double v,double t){
return -x + pow(-v,3)+1+cos(t);
}
int main(){
for(double t=0.0;t<10.0;t+=0.1){
printf("t=%lf F=%lf\n",t,F(1.0,-0.5,t));
}
return 0;
}
[1] 授業単元: プログラミング [2] 問題文: #include<stdio.h> struct Data{ int eng,math,info; double av; }; int main(void){ int i; double e_av=0.0, m_av=0.0, i_av=0.0; struct Data kojindata[3]; 「ここに3人分のデータの入力・計算・出力」 printf("英語の平均点:%4.2lf\n",e_av/3.0); printf("数学の平均点:%4.2lf\n",m_av/3.0); printf("情報の平均点:%4.2lf\n",i_av/3.0); return 0; } [3] 環境 [3.1] OS: (WindowsXP [3.2] コンパイラ名とバージョン:すみません、わからないです。 [3.3] 言語: C [4] 期限: 23日の6時 [5] その他の制限:特になし よろしくお願いします。
937 :
デフォルトの名無しさん :2009/06/24(水) 14:14:07
>>936 ですが日付が23日ではなく24日です。
すみません。
938 :
デフォルトの名無しさん :2009/06/24(水) 14:46:26
>>936 求められてる出力が不明だけど、
iが宣言されてるあたりからすると、こんな感じ?
for(i=0;i<3;i++){
printf("%d人目のデータを入力してください。\n",i+1);
printf("英語の点数:");
scanf("%d",&kojindata[i].eng);
printf("数学の点数:");
scanf("%d",&kojindata[i].math);
printf("情報の点数:");
scanf("%d",&kojindata[i].info);
kojindata[i].av=(kojindata[i].eng+kojindata[i].math+kojindata[i].info)/3.0;
printf("%d人目の平均点:%4.2lf\n",i+1,kojindata[i].av);
e_av+=kojindata[i].eng;
m_av+=kojindata[i].math;
i_av+=kojindata[i].info;
}
940 :
939 :2009/06/24(水) 15:26:29
やべ、デバッグに使った変数消すの忘れた。 適時対処願いたい。
授業単元 プログラミング製作実習 問題文 上底,下底。高さ、それぞれの値をキーボードから4回入力し4つの台形の面積の合計を求めよ。 コンパイラ gcc os ソラリス 言語 c その他条件 単純に大きさの違う4つ台形の面積の合計を求めてください。if文やfor文を使わないようお願いします。ひとつひとつの台形の面積を表示するようにしてください。お願いします。
>>942 #include <stdio.h>
void daikei(){
float jyoutei, katei, takasa, menseki;
static int number=0;
printf("台形<%d>\n", ++number);
printf("台形の上底の長さは?"); scanf("%f", &jyoutei);
printf("台形の下底の長さは?"); scanf("%f", &katei);
printf("台形の高さは?"); scanf("%f", &takasa);
menseki = (jyoutei+katei)*takasa/2.0F;
printf("台形の面積は:%f\n", menseki);
}
int main() {
daikei();
daikei();
daikei();
daikei();
}
944 :
デフォルトの名無しさん :2009/06/24(水) 16:40:15
>>943 台形4つの合計が出てない。
#include <stdio.h>
float daikei(int number){
float jyoutei, katei, takasa, menseki;
printf("台形<%d>\n", number);
printf("台形の上底の長さは?"); scanf("%f", &jyoutei);
printf("台形の下底の長さは?"); scanf("%f", &katei);
printf("台形の高さは?"); scanf("%f", &takasa);
menseki = (jyoutei+katei)*takasa/2.0F;
printf("台形の面積は:%f\n", menseki);
return menseki;
}
int main() {
printf("台形4つの合計面積は:%f\n", daikei(1)+daikei(2)+daikei(3)+daikei(4));
}
945 :
884 :2009/06/24(水) 16:41:00
>>925 さん有難うございます
しかし提出したら先生に「pop関数とpush関数をつくり、main関数内で動作させ
その様子が分かるようなソースを作れ」と言われ跳ね返されてしまいました・・。
お手数ですがこの条件に沿うように修正していただけないでしょうか。
>>944 + 演算子は左結合だけど,関数の呼び出しの順番は不定だったはずだから
そこは分離するといいのでは
>>945 条件は満たしていると思うが違うのか?
違うならどう違う?
>>938 レスありがとうございます。
無事出力が上手くいきました。
ありがとうございました。
>>946 関数の呼び出しの順番
printf("%f %f %f %f\n台形4つの合計面積は:%f\n", daikei(1),daikei(2),daikei(3),daikei(4), 0);
>>949 だと確実にでたらめに。
>>944 では関数の返却値コピーのところで副作用完了点が発生して
ちゃんと1,2,3,4の順に。
ますらお。
>>905 #include <iostream>
using std::cout;
const int SIZE = 10;
int main(void) {
int n[SIZE][SIZE];
int i, j;
cout.width(1);
for(i=0;i<SIZE;i++) for(j=0;j<SIZE;j++) n[i][j] = 1;
for(i=0;i<SIZE;i++) {
for(j=0;j<SIZE;j++) cout<<n[i][j];
cout<<'\n';
}
cout<<'\n';
for(i=0;i<SIZE;i++) for(j=0;j<SIZE;j++) {
n[i][j] = 0;
if(i==j) n[i][j] = 1;
}
for(i=0;i<SIZE;i++) {
for(j=0;j<SIZE;j++) cout<<n[i][j];
cout<<'\n';
}
}
952 :
デフォルトの名無しさん :2009/06/24(水) 18:27:38
953 :
デフォルトの名無しさん :2009/06/24(水) 18:52:02
>>854 しめきりは過ぎてる。VS C++
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
wchar_t c;
int c_count = 0, l_count = 0, f_count = 0, comment_f = 0;
setlocale( LC_CTYPE, "" );
while((c = getwchar()) != WEOF) {
c_count++;
if(c == '\n') l_count++;
if(! comment_f && c == '/') { // コメントの開始か?
putwchar(c); // '/' を一旦処理終了する
if((c = getwchar()) == WEOF) break; // 次の文字を読み込む
c_count++;
if(c == '\n') l_count++;
else if(c == '*') { comment_f = 1; f_count--; }
}
if(comment_f && c == '*') { // コメントの終了か?
if(comment_f) f_count++;
putwchar(c); // '*' を一旦処理終了する
if((c = getwchar()) == WEOF) break; // 次の文字を読み込む
c_count++;
if(c == '\n') l_count++;
else if(c == '/') { comment_f = 0; f_count--; }
}
if(comment_f) f_count++;
putwchar(c);
}
l_count++;
wprintf(L"\n文字数=%d 行数=%d コメント文字数=%d\n", c_count, l_count, f_count);
}
956 :
884 :2009/06/24(水) 19:48:25
>>954 さん
ちょうど今具体的にどうすれば良いかメールで尋ねていて、返信がきましたので要約してみます
まずListクラスに値と次のヘッダアドレスを入れる場所を作る。
メインに書いても問題ないが、関数にまとめたほうがよい。(同じ工程を繰り返すので)
作る関数は
Listクラス
・値を入れる場所を生成し、値を入れ、一つ前の値に連結する
・連結して入れた値を表示する
スタッククラス
・プッシュ
・ポップ
キュークラス
・エンキュー
・デキュー
とのことです。
>>956 もしかしてC++じゃなくてCの課題なんじゃないの?
>>956 うわ、線形リストも自作するのかマンドクセ・・・
しょうがないので最後まで付き合う。明日までに作る
[1] 授業単元:統計学入門 [2] 問題文(含コード&リンク): 1. 1回の試行において、1,2,3,4が出る確率がそれぞれ0.4 0.3 0.2 0.1とする。 (1)この試行を2回繰り返した場合の合計の確率分布をもとめ、平均と標準偏差を求めよ。 (2)この試行を2回繰り返した場合の・・・・ (3)この試行をNかい繰り返した場合の・・・・ 2.母集団A{3,4,7}は3つの要素からなる。ここで繰り返し復元抽出(取り出しては元に戻す)を行うものとし、 (1)2回の復元抽出の結果得られる合計の平均と標準偏差を求めよ。 (2)3回の・・・・ (3)4回の・・・・ (4)N階の・・・・ [3] 環境 [3.1] OS:WindowsVista [3.2] コンパイラ名とバージョン: BCC [3.3] 言語: C [4] 期限: 6月27日正午 [5] その他の制限:ソースの提示は無しなので、制限無し。 結果と、計算過程がソースから分かるようなプログラムだとありがたいです。
960 :
884 :2009/06/24(水) 20:12:58
>>957 いえ、C++の授業です
>>958 申し訳ありません、授業聞けかったばっかりに・・・。
当方も教科書代わりにと買わされたC++実践プログラミングを読んでなんとか理解しようとしているのですが
理解力がなく質問できる相手が近くにいないので期日に間に合いそうにありません、すみません。
宿題バレ回避のためにメールでソース受け取るのってアリでしょうか?
962 :
デフォルトの名無しさん :2009/06/24(水) 21:12:53
それは作ってくれた人次第じゃないの
俺はここの解答の常連だが、こんな長いパートスレなんだし 目つけられててもおかしくないと思うからその方がいいとは前々から思ってたw 次スレにでもテンプレにメールで送って欲しいか否かの項目追加してくれてもかまわんよ 俺は、だけどな
秘匿主義になると回答の妙が見れなくなって寂しいなぁ。 なぁ。死ぬときは一緒だろ?へへ。
>>961 それだと質問者の方もメールとかにしないとあんま意味ないだろw
まあ初歩の授業だったら同じ時期に同じような範囲やってるだろうし
完全に特定はできんだろうけどw
俺は独学で勉強中だからこのスレを勉強に使ってるから
正解のソースが見れなくなると少し寂しいかもわからんね
何かと深刻なトラブルの原因になるので、コードだけのメール 直接転送だけはやめたほうがいいと思う。 コードがある程度公開されることによる最小限の問題チェックがされる 担保が無くなるんで。(現状のやり方(CodePadを含む)が良いとも言えないが)
このスレの答えはたまにとんでもない間違いとか、嫌がらせの悪ふざけまじってるから、 勉強するときには注意が必要だぜ。 最近はそういうのに突っ込む人も減って、スルーされてるしな。
それにしてもあんまり身にならないような宿題出すとこもあるんだなあ って思いながらニヤニヤ見てる
C++ で list クラス作れっていうのもすごいな。 STLとの整合性とろうと思うと、並大抵の努力じゃないぞ。
stlとの整合とる必要は別にないと思うが しかしlist継承してstackとqueue作れって どこのjavaだよって感じだな 回答者がどう頑張ってもクソ汚い構造になる
>>971 >>956 を読んだ感じだと、mainは「pushして中身表示、popして中身表示」って感じじゃないかなぁ。
こんなイメージ↓
【スタック】
初期状態:(空)
1をpush:[1]
2をpush:[1][2]
pop:[1]
pop:(空)
デストラクタはvirtualじゃないとNG、
Listがpop_head()とpop_tail()をpublicにしてるのもNGだと思う。
(それを継承するStackがpop_tail()をインタフェイスに持つのはおかしい。)
コンテナ、双方向イテレータ、コンテナアダプタと大変高度なプログラムを要求する教師である。
C++初心者っぽいしなあ
だが世の中にはとんでもな糞学校があるのも事実 こういう業界だし
978 :
701 :2009/06/24(水) 23:51:00
>>923 C++でコンパイルすると、型の不一致でコンパイルエラーになるようだ。
if((a = malloc(n*n*sizeof(float))) == NULL) return 1;
↓修正↓
if((a = (float*)malloc(n*n*sizeof(float))) == NULL) return 1;
#include <stdlib.h>または<malloc.h>
の追加も必要。
学校より教師じゃねえかなあ 俺が通ってた専門の糞教師が自分は分かってることをいいことに 適当な説明を1時間して向こう1ヶ月は課題やる時間でーすで授業終わってたし
>>978 えっ今までわからなかったのか
君には宿題を与えよう
C++にはstd::sortがあるがそれを使わず敢えて
qsort()を使ってソートするプログラムが書けるか?
ここは宿題を出すスレじゃねー梅
984 :
デフォルトの名無しさん :2009/06/25(木) 02:10:16
[1] 数値計算 [2] ボールの軌道を計算する。直径12cmのボール(質量;125g)を毎時85kmの速度で地上から50度上方へ発射する。 1.オイラー法とルンゲクッタ方を用いて地上に落下するまでの軌道を計算せよ。 2.空気抵抗が速度の二条に比例して働くとすると、軌道はどのように変化するか。ルンゲクッタ方を用いよ。 抵抗係数は0.42、空気の密度を1.23kg/m^3とする。 3.実験結果に対する考察を行え。 (4.)考察しなきゃいけないので、着眼点とか教えてもらえるとネ申 [3] 環境 Windows vista C++ [4] 本日の午前8:00 [5] いちよ本人が理解しないとまずい 助けてくれたらうんこもらす
>>985 >>1 ・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
すごくねむい
>>986 問題文全てでコレだけds。。。
m*dv/dt=mg
g=9.81m/s^2
v=85km/h=23.61m/s
v1=v*sin50/180 \vをベクトル分解したときの上向きの速さ
v2=v*cos50/180 \vをベクトル分解したときの横向きの速さ
を使って、地面からの高さh1と
横に進んだ距離x2をfprintで算出するって問題。
微分方程式を解くのが意味不明。。。
グラフを描きたいです。
2.は1.のソースの式をちょちょっと変えてあげればおkです。
レポート提出は明日ではないので、期限は過ぎても大丈夫。
よろしくお願いします
>>987 調べる素振りすらしないとはすげーな、おまいwww
>>990 kの初期化忘れは致命的だけど、実行は出来るだろう。
992 :
988 :2009/06/25(木) 05:10:48
初期化というのは、k=0;を入れればいいということでしょうか? それでも実行結果はかわらないんですが… 実行できないのではなくて、正整数を入力したあとにnが表示されてくれない状態になります。 for文の中のM>kあたりが怪しい気がするんですが…
k+=1.0/n;
994 :
デフォルトの名無しさん :2009/06/25(木) 06:00:40
できました!ありがとうございました!
>>985 > [5] いちよ本人が理解しないとまずい
言葉にどうこう言うつもりはないが、理解するつもりがあるなら困っている点を上げる方が楽じゃないか?
>>985 面白そうだな。
1ヵ月ぐらい休みがあったらやってみてもいいんだけどなあ。
>>953 「ピラミッドアート」ダイア(中埋め)
#include <stdio.h>
#include <math.h>
void daia1(int m){
int i, j, n;
/* 1->1 2->3 3->5 4->7 */
n = m * 2 - 1;
// if((n&1) == 0) {printf("EVEN NUMBER!"); return;}
for(i=0; i<n; i++) {
/* 2 1 0 1 2 (n/2=2) */
if(i<=n/2) for(j=0; j<(n/2 - i); j++) putchar(' ');
else for(j=0; j<(i - n/2); j++) putchar(' ');
/* 1 3 5 3 1 (n/2=2) */
if(i<=n/2) for(j=0; j<(1+2*i); j++) putchar('*');
else for(j=0; j<1+2*(n-1-i); j++) putchar('*');
/* 2 1 0 1 2 (n/2=2) */
if(i<=n/2) for(j=0; j<(n/2 - i); j++) putchar(' ');
else for(j=0; j<(i - n/2); j++) putchar(' ');
putchar('\n');
}
}
int main() {
int n;
scanf("%d",&n);
daia1(n);
}
>>953 「ピラミッドアート」ダイア型(中抜き)
#include <stdio.h>
#include <math.h>
void daia1(int m){
int i, j, n;
/* 1->1 2->3 3->5 4->7 */
n = m * 2 - 1;
// if((n&1) == 0) {printf("EVEN NUMBER!"); return;}
for(i=0; i<n; i++) {
/* 2 1 0 1 2 (n/2=2) */
if(i<=n/2) for(j=0; j<(n/2 - i); j++) putchar(' ');
else for(j=0; j<(i - n/2); j++) putchar(' ');
putchar('*');
/* 0 1 3 1 0 (n/2=2) */
if(i<=n/2) for(j=0; j<(2*i-1); j++) putchar(' ');
else for(j=0; j<2*(n-1-i)-1; j++) putchar(' ');
if(i != 0 && i != (n-1))putchar('*');
putchar('\n');
}
}
int main() {
int n;
scanf("%d",&n);
daia1(n);
}
>>953 「ピラミッドアート」八角形(中埋め)
数字(2〜9)を入力してください:3
***
*****
*****
*****
***
あってる?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。